混杂设备LED驱动程序(GPIO操作函数实现)


 

mini2440LED对应的IO

LED1

GPB5

LED2

GPB6

LED3

GPB7

LED4

GPB8

低电平有效(点亮)

寄存器:

GPxCON

设置端口功能(00表示输入,01表示输出,10表示特殊功能,11保留不用)

GPxDAT

用于读写数据

GPxUP

用于是否使用内部上拉电阻(0表示无上拉,1表示上拉)

混杂设备驱动

在Linux系统中,存在一类字符设备,它们共享一个主设备号(一定要是10,但次设备号不同,我们称这类设备为混杂设备。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。

Linux内核使用struct miscdevice来描述一个混杂设备

struct miscdevice

{

int minor;//次设备号

const char *name;//设备名

const struct file_operation *fops;//文件操作

struct list_head list;

struct device *parent;

struct device *this_device;

}

Linux内核使用struct miscdevice 函数来注册一个混杂设备驱动

int misc_register(struct miscdevice *misc)

注销一个混杂设备驱动

misc_deregister(&misc);

混杂设备LED驱动程序:

  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/module.h>   
  8. #include <linux/init.h>   
  9. #include <linux/mm.h>   
  10. #include <linux/fs.h>   
  11. #include <linux/types.h>   
  12. #include <linux/delay.h>   
  13. #include <linux/moduleparam.h>   
  14. #include <linux/slab.h>   
  15. #include <linux/errno.h>   
  16. #include <linux/ioctl.h>   
  17. #include <linux/cdev.h>   
  18. #include <linux/string.h>   
  19. #include <linux/list.h>   
  20. #include <linux/pci.h>   
  21. #include <linux/gpio.h>   
  22. #include <asm/uaccess.h>   
  23. #include <asm/atomic.h>   
  24. #include <asm/unistd.h>   
  25.   
  26.   
  27. #define DEVICE_NAME "led"   
  28.   
  29. static unsigned long led_table [] = {  
  30.     S3C2410_GPB(5),  
  31.     S3C2410_GPB(6),  
  32.     S3C2410_GPB(7),  
  33.     S3C2410_GPB(8),  
  34. };  
  35.   
  36. static unsigned int led_cfg_table [] = {  
  37.     S3C2410_GPIO_OUTPUT,  
  38.     S3C2410_GPIO_OUTPUT,  
  39.     S3C2410_GPIO_OUTPUT,  
  40.     S3C2410_GPIO_OUTPUT,  
  41. };  
  42.   
  43. static int mini2440_leds_ioctl(  
  44.     struct inode *inode,   
  45.     struct file *file,   
  46.     unsigned int cmd,   
  47.     unsigned long arg)  
  48. {  
  49.     switch(cmd) {  
  50.     case 0:  
  51.     case 1:  
  52.         if (arg > 4)   
  53.         {  
  54.             return -EINVAL;  
  55.         }  
  56.         s3c2410_gpio_setpin(led_table[arg], !cmd);  
  57.         return 0;  
  58.     default:  
  59.         return -EINVAL;  
  60.     }  
  61. }  
  62. /*文件操作结构体*/  
  63. static struct file_operations dev_fops = {  
  64.     .owner  =   THIS_MODULE,  
  65.     .ioctl  =   mini2440_leds_ioctl,  
  66. /*混杂类型虽然没有open、release这两个设备方法,但内核自动帮你现实*/  
  67. };  
  68.   
  69. static struct miscdevice misc = {  
  70.     .minor = MISC_DYNAMIC_MINOR,//动态的混杂次设备号,系统自己帮你选   
  71.     .name = DEVICE_NAME,  
  72.     .fops = &dev_fops,//关联文件操作   
  73. };  
  74. /*初始化设备驱动*/  
  75. static int __init dev_init(void)  
  76. {  
  77.     int ret;  
  78.   
  79.     int i;  
  80.       
  81.     for (i = 0; i < 4; i++) {  
  82.         s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);//设置输出   
  83.         s3c2410_gpio_setpin(led_table[i], 0);//数据输出0   
  84.     }  
  85. /*注册混杂型字符设备驱动*/  
  86.     ret = misc_register(&misc);//返回0,成功,负数,不成功   
  87.   
  88.     printk (DEVICE_NAME"\tinitialized\n");  
  89.   
  90.     return ret;  
  91. }  
  92.   
  93.   
  94. static void __exit dev_exit(void)  
  95. {  
  96. /*注销混杂型字符设备驱动*/  
  97.     misc_deregister(&misc);//返回0,成功,负数,不成功   
  98.   
  99. }  
  100.   
  101. module_init(dev_init);  
  102. module_exit(dev_exit);  
  103. MODULE_LICENSE("GPL");  
  104. MODULE_AUTHOR("Bai");  
  • 1
  • 2
  • 下一页

相关内容