mini2440上LEDS的驱动程序(含测试程序)

leds_drv.h

[cpp]
  1. #ifndef _MEMDEV_H_   
  2. #define _MEMDEV_H_   
  3. #include <linux/ioctl.h>   
  4. /* 定义幻数 */  
  5. #define MEMDEV_IOC_MAGIC  'k'   
  6. /* 定义命令 */  
  7. #define MEMDEV_IOC_ON   _IO(MEMDEV_IOC_MAGIC, 1)   
  8. #define MEMDEV_IOC_OFF _IO(MEMDEV_IOC_MAGIC, 2)   
  9. #define MEMDEV_IOC_MAXNR 2   
  10. #define LED_ON  0   
  11. #define LED_OFF 1   
  12. #endif                          /* _MEMDEV_H_ */  
leds_drv.c
[cpp]
  1. #include <linux/miscdevice.h>   
  2. #include <linux/delay.h>   
  3. #include <asm/irq.h>   
  4. #include <mach/regs-gpio.h>   
  5. #include <mach/hardware.h>   
  6. #include <linux/kernel.h>   
  7. #include <linux/miscdevice.h>   
  8. #include <linux/delay.h>   
  9. #include <asm/irq.h>   
  10. #include <mach/regs-gpio.h>   
  11. #include <mach/hardware.h>   
  12. #include <linux/kernel.h>   
  13. #include <linux/module.h>   
  14. #include <linux/init.h>   
  15. #include <linux/mm.h>   
  16. #include <linux/fs.h>   
  17. #include <linux/types.h>   
  18. #include <linux/delay.h>   
  19. #include <linux/moduleparam.h>   
  20. #include <linux/slab.h>   
  21. #include <linux/errno.h>   
  22. #include <linux/ioctl.h>   
  23. #include <linux/cdev.h>   
  24. #include <linux/string.h>   
  25. #include <linux/list.h>   
  26. #include <linux/pci.h>   
  27. #include <linux/gpio.h>   
  28. #include <asm/uaccess.h>   
  29. #include <asm/atomic.h>   
  30. #include <asm/unistd.h>   
  31.   
  32. #include "leds_drv.h"   
  33.   
  34. #define DEVICE_NAME "leds"   
  35.   
  36. static unsigned long led_table[] = {  
  37.     S3C2410_GPB(5),  
  38.     S3C2410_GPB(6),  
  39.     S3C2410_GPB(7),  
  40.     S3C2410_GPB(8),  
  41. };  
  42.   
  43. static unsigned int led_cfg_table[] = {  
  44.     S3C2410_GPIO_OUTPUT,  
  45.     S3C2410_GPIO_OUTPUT,  
  46.     S3C2410_GPIO_OUTPUT,  
  47.     S3C2410_GPIO_OUTPUT,  
  48. };  
  49.   
  50. static int s3c2440_leds_ioctl(struct inode *inode,  
  51.                               struct file *file, unsigned int cmd, unsigned long arg)  
  52. {  
  53.   
  54.     /* 检测命令的有效性 */  
  55.     if (_IOC_TYPE(cmd) != MEMDEV_IOC_MAGIC)  
  56.         return -EINVAL;  
  57.     if (_IOC_NR(cmd) > MEMDEV_IOC_MAXNR)  
  58.         return -EINVAL;  
  59.   
  60.     /* 根据命令,执行相应的操作 */  
  61.     switch (cmd)  
  62.     {  
  63.       case MEMDEV_IOC_OFF:  
  64.           s3c2410_gpio_setpin(led_table[arg], LED_OFF);  
  65.           return 0;  
  66.   
  67.       case MEMDEV_IOC_ON:  
  68.           s3c2410_gpio_setpin(led_table[arg], LED_ON);  
  69.           return 0;  
  70.       default:  
  71.           return -EINVAL;  
  72.     }  
  73. }  
  74.   
  75. /*文件操作结构体*/  
  76. static struct file_operations dev_fops = {  
  77.     .owner = THIS_MODULE,  
  78.     .ioctl = s3c2440_leds_ioctl,  
  79. };  
  80.   
  81. static struct miscdevice misc = {  
  82.     .minor = MISC_DYNAMIC_MINOR,  
  83.     .name = DEVICE_NAME,  
  84.     .fops = &dev_fops,  
  85. };  
  86.   
  87. static int __init dev_init(void)  
  88. {  
  89.     int ret;  
  90.   
  91.     int i;  
  92.     /*设置GPIO控制寄存器,GPIO设置为输出模式,默认下灯全灭 */  
  93.     for (i = 0; i < 4; i++)  
  94.     {  
  95.         s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);  
  96.         s3c2410_gpio_setpin(led_table[i], 1);  
  97.     }  
  98.     /*注册混杂型字符设备驱动 */  
  99.     ret = misc_register(&misc);  
  100.   
  101.     printk(DEVICE_NAME "\tinitialized\n");  
  102.   
  103.     return ret;  
  104. }  
  105.   
  106. static void __exit dev_exit(void)  
  107. {  
  108.     /*注销混杂型字符设备驱动 */  
  109.     misc_deregister(&misc);  
  110. }  
  111.   
  112. module_init(dev_init);  
  113. module_exit(dev_exit);  
  114.   
  115. MODULE_AUTHOR("Cried Devil");  
  116. MODULE_LICENSE("GPL");  

相关推荐