用混杂设备实现的Mini6410 LED驱动程序


用混杂设备实现的Mini6410 LED驱动程序:
  1. #include <linux/miscdevice.h>   
  2. #include <linux/delay.h>   
  3. #include <asm/irq.h>   
  4. #include <mach/hardware.h>   
  5. #include <linux/kernel.h>   
  6. #include <linux/module.h>   
  7. #include <linux/init.h>   
  8. #include <linux/mm.h>   
  9. #include <linux/fs.h>   
  10. #include <linux/types.h>   
  11. #include <linux/delay.h>   
  12. #include <linux/moduleparam.h>   
  13. #include <linux/slab.h>   
  14. #include <linux/errno.h>   
  15. #include <linux/ioctl.h>   
  16. #include <linux/cdev.h>   
  17. #include <linux/string.h>   
  18. #include <linux/list.h>   
  19. #include <linux/pci.h>   
  20. #include <asm/uaccess.h>   
  21. #include <asm/atomic.h>   
  22. #include <asm/unistd.h>   
  23.   
  24. #include <mach/map.h>   
  25. #include <mach/regs-clock.h>   
  26. #include <mach/regs-gpio.h>   
  27.   
  28. #include <plat/gpio-cfg.h>   
  29. #include <mach/gpio-bank-e.h>   
  30. #include <mach/gpio-bank-k.h>   
  31.   
  32. #define DEVICE_NAME "leds"   
  33.   
  34. static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  
  35. {  
  36.     switch(cmd) {  
  37.         unsigned tmp;  
  38.     case 0:  
  39.     case 1:  
  40.         if (arg > 4) {  
  41.             return -EINVAL;  
  42.         }  
  43.         tmp = readl(S3C64XX_GPKDAT);  
  44.         tmp &= ~(1 << (4 + arg));  
  45.         tmp |= ( (!cmd) << (4 + arg) );  
  46.         writel(tmp, S3C64XX_GPKDAT);  
  47.         //printk (DEVICE_NAME": %d %d\n", arg, cmd);   
  48.         return 0;  
  49.     default:  
  50.         return -EINVAL;  
  51.     }  
  52. }  
  53.   
  54. static struct file_operations dev_fops = {  
  55.     .owner          = THIS_MODULE,  
  56.     .unlocked_ioctl = sbc2440_leds_ioctl,  
  57. };  
  58.   
  59. static struct miscdevice misc = {  
  60.     .minor = MISC_DYNAMIC_MINOR,  
  61.     .name = DEVICE_NAME,  
  62.     .fops = &dev_fops,  
  63. };  
  64.   
  65. static int __init dev_init(void)  
  66. {  
  67.     int ret;  
  68.   
  69.     {  
  70.         unsigned tmp;  
  71.         tmp = readl(S3C64XX_GPKCON);  
  72.         tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16);  
  73.         writel(tmp, S3C64XX_GPKCON);  
  74.           
  75.         tmp = readl(S3C64XX_GPKDAT);  
  76.         tmp |= (0xF << 4);  
  77.         writel(tmp, S3C64XX_GPKDAT);  
  78.     }  
  79.   
  80.     ret = misc_register(&misc);  
  81.   
  82.     printk (DEVICE_NAME"\tinitialized\n");  
  83.   
  84.     return ret;  
  85. }  
  86.   
  87. static void __exit dev_exit(void)  
  88. {  
  89.     misc_deregister(&misc);  
  90. }  
  91.   
  92. module_init(dev_init);  
  93. module_exit(dev_exit);  
  94. MODULE_LICENSE("GPL");  
  95. MODULE_AUTHOR("muge0913");  

仅供技术交流学习,请勿商用。

相关内容