歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

混雜設備LED驅動程序(GPIO操作函數實現)

 

mini2440上LED對應的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");  
Copyright © Linux教程網 All Rights Reserved