原帖由 chenxiaoyou8 于 2009-3-12 21:52 发表
在Linux2.6.24驱动开发过程中,编写了一个测试软件;
以下为函数的一部分:
fp=open("dev/driver",2);
if(fp==-1)
...
#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); } |
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |