mini2440 MP3播放器

发布时间: 2024-06-20
来源: 电子工程世界

按键平台驱动:

platfrom_device.c:

  1. #include   

  2. #include   

  3. #include   

  4. #include   

  5. #include   

  6. #include   

  7. #include   

  8. #include   

  9. #include   

  10. #include   

  11. #include   

  12. #include   

  13. #include   

  14. #include   

  15. #include   

  16. #include   

  17. #include   

  18. #include   

  19. #include    

  20.   

  21. static struct resource key_resource[]=  

  22. {  

  23.     [0] = {  

  24.         .start = IRQ_EINT8,  

  25.         .end = IRQ_EINT8,  

  26.         .flags = IORESOURCE_IRQ,  

  27.     },  

  28.     [1] = {  

  29.         .start = IRQ_EINT11,  

  30.         .end = IRQ_EINT11,  

  31.         .flags = IORESOURCE_IRQ,  

  32.     },  

  33.     [2]= {  

  34.         .start = IRQ_EINT13,  

  35.         .end = IRQ_EINT13,  

  36.         .flags = IORESOURCE_IRQ,  

  37.     },  

  38.     [3] = {  

  39.         .start = IRQ_EINT14,  

  40.                 .end = IRQ_EINT14,  

  41.         .flags = IORESOURCE_IRQ,  

  42.     },  

  43.     [4] = {  

  44.         .start = IRQ_EINT15,  

  45.         .end = IRQ_EINT15,  

  46.         .flags = IORESOURCE_IRQ,  

  47.     },  

  48.     [5] = {  

  49.         .start = IRQ_EINT19,  

  50.         .end = IRQ_EINT19,  

  51.         .flags = IORESOURCE_IRQ,  

  52.     },  

  53. };  

  54.   

  55. struct platform_device *my_buttons_dev;  

  56.   

  57. static int __init platform_dev_init(void)  

  58. {  

  59.     int ret;  

  60.   

  61.     my_buttons_dev = platform_device_alloc("my_buttons", -1);  

  62.   

  63.     platform_device_add_resources(my_buttons_dev,key_resource,6);//添加资源一定要用该函数,不能使用对platform_device->resource幅值   

  64.                                                                 //否则会导致platform_device_unregister调用失败,内核异常。   

  65.   

  66.     ret = platform_device_add(my_buttons_dev);  

  67.   

  68.     if(ret)  

  69.         platform_device_put(my_buttons_dev);  

  70.   

  71.     return ret;  

  72. }  

  73.   

  74. static void __exit platform_dev_exit(void)  

  75. {  

  76.     platform_device_unregister(my_buttons_dev);  

  77. }  

  78.   

  79. module_init(platform_dev_init);  

  80. module_exit(platform_dev_exit);  

  81.   

  82. MODULE_AUTHOR("Z-YP");  

  83. MODULE_LICENSE("GPL");  

platfrom_derver.c:

  1. #include   

  2. #include   

  3. #include   

  4. #include   

  5. #include   

  6. #include   

  7. #include   

  8. #include   

  9. #include   

  10. #include   

  11. #include   

  12. #include   

  13. #include   

  14. #include   

  15. #include   

  16. #include   

  17. #include   

  18.  

  19. #define DEVICE_NAME     "my_buttons"   

  20.   

  21. struct button_irq_desc {  

  22.     int irq;  

  23.     int pin;  

  24.     int pin_setting;  

  25.     int number;  

  26.     char *name;   

  27. };  

  28.   

  29. static struct button_irq_desc button_irqs [] = {  

  30.     {IRQ_EINT8 , S3C2410_GPG(0) ,  S3C2410_GPG0_EINT8  , 0, "KEY0"},  

  31.     {IRQ_EINT11, S3C2410_GPG(3) ,  S3C2410_GPG3_EINT11 , 1, "KEY1"},  

  32.     {IRQ_EINT13, S3C2410_GPG(5) ,  S3C2410_GPG5_EINT13 , 2, "KEY2"},  

  33.     {IRQ_EINT14, S3C2410_GPG(6) ,  S3C2410_GPG6_EINT14 , 3, "KEY3"},  

  34.     {IRQ_EINT15, S3C2410_GPG(7) ,  S3C2410_GPG7_EINT15 , 4, "KEY4"},  

  35.     {IRQ_EINT19, S3C2410_GPG(11),  S3C2410_GPG11_EINT19, 5, "KEY5"},  

  36. };  

  37. static volatile char key_values [] = {'0', '0', '0', '0', '0', '0'};  

  38.   

  39. static DECLARE_WAIT_QUEUE_HEAD(button_waitq);  

  40.   

  41. static volatile int ev_press = 0;  

  42.   

  43.   

  44. static irqreturn_t buttons_interrupt(int irq, void *dev_id)  

  45. {  

  46.     struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;  

  47.     int down;  

  48.   

  49.     // udelay(0);   

  50.     down = !s3c2410_gpio_getpin(button_irqs->pin);  

  51.   

  52.     if (down != (key_values[button_irqs->number] & 1)) { // Changed   

  53.   

  54.     key_values[button_irqs->number] = '0' + down;      

  55.         ev_press = 1;  

  56.         wake_up_interruptible(&button_waitq);  

  57.     }  

  58.       

  59.     return IRQ_RETVAL(IRQ_HANDLED);  

  60. }  

  61.   

  62.   

  63. static int s3c24xx_buttons_open(struct inode *inode, struct file *file)  

  64. {  

  65.     int i;  

  66.     int err = 0;  

  67.       

  68.     for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {  

  69.     if (button_irqs[i].irq < 0) {  

  70.         continue;  

  71.     }  

  72.         err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,   

  73.                           button_irqs[i].name, (void *)&button_irqs[i]);  

  74.         if (err)  

  75.             break;  

  76.     }  

  77.   

  78.     if (err) {  

  79.         i--;  

文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。