Linux驱动:LED驱动测试


环境:

主机:Fedora 12

目标板:MINI6410

目标板LINUX内核版本:2.6.38


实现功能:

驱动目标板4个LED.

说明:

LED与6410引脚对应连接:

LED1---GPK4

LED2---GPK5

LED3---GPK6

LED4---GPK7


驱动源代码:

led_driver.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/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 <asm/uaccess.h>   
  22. #include <asm/atomic.h>   
  23. #include <asm/unistd.h>   
  24. #include <linux/major.h>   
  25.   
  26. #include <mach/map.h>   
  27. #include <mach/regs-clock.h>   
  28. #include <mach/regs-gpio.h>   
  29.   
  30. #include <plat/gpio-cfg.h>   
  31. #include <mach/gpio-bank-e.h>   
  32. #include <mach/gpio-bank-k.h>   
  33. #include <mach/gpio-bank-h.h>   
  34. #include <mach/gpio-bank-n.h>   
  35. #include <mach/gpio-bank-l.h>   
  36. #include <mach/gpio-bank-p.h>   
  37.   
  38. #include <linux/device.h>   
  39.   
  40. #define DEVICE_NAME "led_driver"   
  41. #define T_MAJORS    700   
  42.   
  43. static struct cdev fun_cdev;  
  44. static dev_t dev;  
  45. static struct class    *led_class;  
  46.   
  47. //功能:初始化IO   
  48. static void init_led(void)  
  49. {  
  50.     unsigned temp;  
  51.   
  52.     //GPK4-7设置为输出   
  53.     temp = readl(S3C64XX_GPKCON);  
  54.     temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));  
  55.     temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);  
  56.     writel(temp, S3C64XX_GPKCON);  
  57. }  
  58.   
  59. //功能:ioctl操作函数   
  60. //返回值:成功返回0   
  61. static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  
  62. {  
  63.     unsigned int temp = 0;  
  64.   
  65.     printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d\n",cmd,arg);  
  66.   
  67.     temp = readl(S3C64XX_GPKDAT);  
  68.     if (cmd == 0)  
  69.     {  
  70.         temp &= ~(1 << (arg + 3));  
  71.     }  
  72.     else  
  73.     {  
  74.         temp |= 1 << (arg + 3);  
  75.     }  
  76.     writel(temp,S3C64XX_GPKDAT);  
  77.       
  78.     return 0;  
  79. }  
  80.   
  81. static struct file_operations io_dev_fops = {  
  82.     .owner = THIS_MODULE,  
  83.     .unlocked_ioctl = led_driver_ioctl,  
  84. };  
  85.   
  86. static int __init dev_init(void)  
  87. {  
  88.     int ret;  
  89.     unsigned temp;  
  90.   
  91.     init_led();  
  92.   
  93.     dev = MKDEV(T_MAJORS,0);  
  94.     cdev_init(&fun_cdev,&io_dev_fops);  
  95.     ret = register_chrdev_region(dev,1,DEVICE_NAME);  
  96.     if (ret < 0) return 0;  
  97.     ret = cdev_add(&fun_cdev,dev,1);  
  98.     if (ret < 0) return 0;  
  99.   
  100.     printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");  
  101.   
  102.     led_class = class_create(THIS_MODULE, "led_class1");   
  103.     if (IS_ERR(led_class))   
  104.     {   
  105.         printk(KERN_INFO "create class error\n");   
  106.         return -1;   
  107.     }   
  108.     device_create(led_class, NULL, dev, NULL, "led_driver");   
  109.   
  110.     return ret;  
  111. }  
  112.   
  113. static void __exit dev_exit(void)  
  114. {  
  115.     unregister_chrdev_region(dev,1);  
  116.   
  117.         device_destroy(led_class, dev);   
  118.         class_destroy(led_class);  
  119. }  
  120.   
  121. module_init(dev_init);  
  122. module_exit(dev_exit);  
  123. MODULE_LICENSE("GPL");  
  124. MODULE_AUTHOR("JDH");  
  • 1
  • 2
  • 下一页

相关内容