- 论坛徽章:
- 0
|
我使用的是Xilinx公司产Emulation Baseboard开发板,自己动手编写了一个Led的驱动程序,而进行的测试
下面是编写的程序,但是我无法创建出节点,请指教
#define LEDSMINOR 0
void __iomem * led_vir_base_add = NULL;
static int LEDSMajor=231;
static long ledstatus=ALL_LEDS;
static int Updateleds(void)
{
int i,j;
for(j=0;j<3;j++)
{ for (i=0;i<8;i++)
{switch(i)
{ case 0: if(ledstatus&0x01)
{ mdelay(1000);
writel(0x01,led_vir_base_add); } //light on
else { mdelay(1000);writel(0x00,led_vir_base_add);}break;
case 1: if(ledstatus&0x02)
{mdelay(1000);writel(0x02,led_vir_base_add);}
else { mdelay(1000);writel(0x00,led_vir_base_add);}break;
case 2: if(ledstatus&0x04)
{mdelay(1000);writel(0x04,led_vir_base_add);}
else {mdelay(1000);writel(0x00,led_vir_base_add);} break;
case 3: if(ledstatus&0x08)
{mdelay(1000);writel(0x08,led_vir_base_add);}
else {mdelay(1000);writel(0x00,led_vir_base_add);} break;
case 4: if(ledstatus&0x10)
{ mdelay(1000);writel(0x10,led_vir_base_add);}
else {mdelay(1000);writel(0x00,led_vir_base_add);} break;
case 5: if(ledstatus&0x20)
{ mdelay(1000);writel(0x20,led_vir_base_add);}
else { mdelay(1000);writel(0x00,led_vir_base_add);}break;
case 6: if(ledstatus&0x40)
{mdelay(1000);writel(0x40,led_vir_base_add);}
else { mdelay(1000);writel(0x00,led_vir_base_add);} break;
case 7: if(ledstatus&0x80)
{ mdelay(1000);writel(0x80,led_vir_base_add);}
else {mdelay(1000); writel(0x00,led_vir_base_add);}break;
}
}
}
return 0;
}
static ssize_t Leds_write(struct file *file,char *buffer,size_t count,loff_t *ppos)
{
copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
Updateleds();
printk("write\n");
return sizeof(ledstatus);
}
static int Leds_open(struct inode *inode,struct file *filp)
{
printk(KERN_INFO"open\n");
try_module_get(THIS_MODULE);
return 0;
}
static int Leds_release(struct inode *inode,struct file *filp)
{
printk(KERN_INFO"release\n");
module_put(THIS_MODULE);
return 0;
}
static struct file_operations leds_fops = {
.owner=THIS_MODULE,
.open=Leds_open,
.write=Leds_write,
.release=Leds_release,
};
struct cdev *my_cdev;
struct class *my_class;
static int __init leds_init(void)
{
int err,devno=MKDEV(LEDSMajor,LEDSMINOR);
long temp;
u32 temp0;
temp=0xffffff00;
led_vir_base_add=ioremap(LED_BANK,0x04);
printk("base=%lx\n",led_vir_base_add);
writel(temp,led_vir_base_add);
temp0=readl(led_vir_base_add);
printk("LED_BANK:%lx\n",temp0);
Updateleds();
/*register the 'dummy_dev' char device*/
my_cdev=cdev_alloc();
cdev_init(my_cdev,&leds_fops);
my_cdev->owner=THIS_MODULE;
err=cdev_add(my_cdev,devno,1);
if(err!=0)
printk("led device register failed!\n");
/*creating your own class*/
my_class = class_create(THIS_MODULE, "led");
if(IS_ERR(my_class)){
printk("Err:failed in creating class.\n");
return -1;
}
/*register your own device in sysfs,and this will cause udevd to create corresponding device node*/
class_device_create(my_class, NULL,devno,NULL,DEVICE_NAME"%d",LEDSMINOR);
printk(DEVICE_NAME " initialized\n");
return 0;
}
static void __exit leds_exit(void)
{
cdev_del(my_cdev);
class_device_destroy(my_class,MKDEV(LEDSMajor,LEDSMINOR));
class_destroy(my_class);
} |
[ 本帖最后由 dreamice 于 2009-3-13 09:08 编辑 ] |
|