天嵌 ARM开发社区

 找回密码
 注册
查看: 2607|回复: 10

tq2440 linux如何添加按键驱动

[复制链接]
haoyunp 发表于 2013-1-25 16:39:15 | 显示全部楼层 |阅读模式
本帖最后由 haoyunp 于 2013-1-25 17:00 编辑

我现在需要8个按键,
在drivers/char/EmbedSky_irq.c中,改为:
  1. //#if !defined (CONFIG_SKY2440_IRQ_TEST)
  2. static struct button_irq_desc button_irqs [] = {
  3. {IRQ_EINT0, S3C2410_GPF0, S3C2410_GPF0_EINT0, 0, "KEY1"}, /* K1 */
  4. {IRQ_EINT1, S3C2410_GPF1, S3C2410_GPF1_EINT1, 1, "KEY2"}, /* K2 */
  5. {IRQ_EINT2, S3C2410_GPF2, S3C2410_GPF2_EINT2, 2, "KEY3"}, /* K3 */
  6. {IRQ_EINT3, S3C2410_GPF3, S3C2410_GPF3_EINT3, 3, "KEY4"}, /* K4 */
  7. {IRQ_EINT4, S3C2410_GPF4, S3C2410_GPF4_EINT4, 4, "KEY5"}, /* K5 */
  8. {IRQ_EINT5, S3C2410_GPF5, S3C2410_GPF5_EINT5, 5, "KEY6"}, /* K6 */
  9. {IRQ_EINT8, S3C2410_GPG0, S3C2410_GPG0_EINT8, 6, "KEY7"}, /* K7 */
  10. {IRQ_EINT9, S3C2410_GPG1, S3C2410_GPG1_EINT9, 7, "KEY8"}, /* K8 */
  11. };
  12. //#else
  13. //static struct button_irq_desc button_irqs [] = {
  14. //{IRQ_EINT9, S3C2410_GPG1, S3C2410_GPG1_EINT9, 0, "KEY1"}, /* K1 */
  15. //{IRQ_EINT11, S3C2410_GPG3, S3C2410_GPG3_EINT11, 1, "KEY2"}, /* K2 */
  16. //{IRQ_EINT2, S3C2410_GPF2, S3C2410_GPF2_EINT2, 2, "KEY3"}, /* K3 */
  17. //{IRQ_EINT0, S3C2410_GPF0, S3C2410_GPF0_EINT0, 3, "KEY4"}, /* K4 */
  18. //};
复制代码
  1. //#endif
  2. static volatile char key_values [] = {'0', '0', '0', '0', '0', '0', '0', '0'};
复制代码
保存后重新编译zImage ,结果还是4个按键,请问还需要改动别的地方吗?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-ZQL 发表于 2013-1-26 14:11:58 | 显示全部楼层
看下
struct tq2440_keys_drvdata {
        struct input_dev *input;
        struct mutex disable_lock;
        unsigned int n_buttons;
        int (*enable)(struct device *dev);
        void (*disable)(struct device *dev);
        struct gpio_button_data data[0];
};
这个n_button等于多少?
 楼主| haoyunp 发表于 2013-1-28 09:39:34 | 显示全部楼层
TQ-ZQL 发表于 2013-1-26 14:11
看下
struct tq2440_keys_drvdata {
        struct input_dev *input;

在哪个文件中呢?
 楼主| haoyunp 发表于 2013-1-28 10:13:14 | 显示全部楼层
不知道还需要改动哪,现在还是用的原来的4个按键
 楼主| haoyunp 发表于 2013-1-28 10:18:25 | 显示全部楼层
文件全部代码如下,不知还需要修改哪?第一次改驱动,求教
  1. /*************************************

  2. NAME:EmbedSky_hello.c
  3. COPYRIGHT:www.embedsky.net

  4. *************************************/

  5. #include <linux/module.h>
  6. #include <linux/kernel.h>
  7. #include <linux/fs.h>
  8. #include <linux/init.h>
  9. #include <linux/delay.h>
  10. #include <linux/poll.h>
  11. #include <linux/irq.h>
  12. #include <asm/irq.h>
  13. #include <linux/interrupt.h>
  14. #include <asm/uaccess.h>
  15. #include <mach/regs-gpio.h>
  16. #include <mach/hardware.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/cdev.h>
  19. #include <linux/miscdevice.h>

  20. #define DEVICE_NAME     "IRQ-Test"

  21. struct button_irq_desc {
  22.     int irq;
  23.     int pin;
  24.     int pin_setting;
  25.     int number;
  26.     char *name;       
  27. };

  28. //#if !defined (CONFIG_SKY2440_IRQ_TEST)
  29. static struct button_irq_desc button_irqs [] = {
  30.         {IRQ_EINT0,        S3C2410_GPF0,        S3C2410_GPF0_EINT0,        0, "KEY1"}, /* K1 */
  31.         {IRQ_EINT1,        S3C2410_GPF1,        S3C2410_GPF1_EINT1,        1, "KEY2"}, /* K2 */
  32.         {IRQ_EINT2,        S3C2410_GPF2,        S3C2410_GPF2_EINT2,        2, "KEY3"}, /* K3 */
  33.         {IRQ_EINT3,        S3C2410_GPF3,        S3C2410_GPF3_EINT3,        3, "KEY4"}, /* K4 */
  34.         {IRQ_EINT4,        S3C2410_GPF4,        S3C2410_GPF4_EINT4,        4, "KEY5"}, /* K5 */
  35.         {IRQ_EINT5,        S3C2410_GPF5,        S3C2410_GPF5_EINT5,        5, "KEY6"}, /* K6 */
  36.         {IRQ_EINT8,        S3C2410_GPG0,        S3C2410_GPG0_EINT8,        6, "KEY7"}, /* K7 */
  37.         {IRQ_EINT9,        S3C2410_GPG1,        S3C2410_GPG1_EINT9,        7, "KEY8"}, /* K8 */
  38. };
  39. //#else
  40. //static struct button_irq_desc button_irqs [] = {
  41.         //{IRQ_EINT9,        S3C2410_GPG1,        S3C2410_GPG1_EINT9,        0, "KEY1"}, /* K1 */
  42.         //{IRQ_EINT11,        S3C2410_GPG3,        S3C2410_GPG3_EINT11,        1, "KEY2"}, /* K2 */
  43.         //{IRQ_EINT2,        S3C2410_GPF2,        S3C2410_GPF2_EINT2,        2, "KEY3"}, /* K3 */
  44.         //{IRQ_EINT0,        S3C2410_GPF0,        S3C2410_GPF0_EINT0,        3, "KEY4"}, /* K4 */
  45. //};
  46. //#endif
  47. static volatile char key_values [] = {'0', '0', '0', '0', '0', '0', '0', '0'};

  48. static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

  49. static volatile int ev_press = 0;


  50. static irqreturn_t irq_interrupt(int irq, void *dev_id)
  51. {
  52.         struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;
  53.         int down;

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

  55.         if (down != (key_values[button_irqs->number] & 1))
  56.         {
  57.                 key_values[button_irqs->number] = '0' + down;
  58.                 ev_press = 1;
  59.                 wake_up_interruptible(&button_waitq);
  60.         }

  61.         return IRQ_RETVAL(IRQ_HANDLED);
  62. }


  63. static int tq2440_irq_open(struct inode *inode, struct file *file)
  64. {
  65.         int i;
  66.         int err = 0;

  67.         for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++)
  68.         {
  69.                 if (button_irqs[i].irq < 0)
  70.                         continue;
  71.                 err = request_irq(button_irqs[i].irq, irq_interrupt, IRQ_TYPE_EDGE_BOTH,
  72.                           button_irqs[i].name, (void *)&button_irqs[i]);
  73.                 if (err)
  74.                         break;
  75.         }

  76.         if (err)
  77.         {
  78.                 i--;
  79.                 for (; i >= 0; i--)
  80.                 {
  81.                         if (button_irqs[i].irq < 0)
  82.                                 continue;
  83.                         disable_irq(button_irqs[i].irq);
  84.                         free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
  85.                 }
  86.                 return -EBUSY;
  87.         }

  88.         ev_press = 1;

  89.         return 0;
  90. }


  91. static int tq2440_irq_close(struct inode *inode, struct file *file)
  92. {
  93.         int i;

  94.         for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++)
  95.         {
  96.                 if (button_irqs[i].irq < 0)
  97.                         continue;
  98.                 free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);
  99.         }

  100.         return 0;
  101. }


  102. static int tq2440_irq_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
  103. {
  104.         unsigned long err;

  105.         if (!ev_press)
  106.         {
  107.                 if (filp->f_flags & O_NONBLOCK)
  108.                         return -EAGAIN;
  109.                 else
  110.                         wait_event_interruptible(button_waitq, ev_press);
  111.         }

  112.         ev_press = 0;

  113.         err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));

  114.         return err ? -EFAULT : min(sizeof(key_values), count);
  115. }

  116. static unsigned int tq2440_irq_poll( struct file *file, struct poll_table_struct *wait)
  117. {
  118.         unsigned int mask = 0;
  119.         poll_wait(file, &button_waitq, wait);
  120.         if (ev_press)
  121.                 mask |= POLLIN | POLLRDNORM;
  122.         return mask;
  123. }


  124. static struct file_operations dev_fops = {
  125.         .owner        =   THIS_MODULE,
  126.         .open        =   tq2440_irq_open,
  127.         .release        =   tq2440_irq_close,
  128.         .read        =   tq2440_irq_read,
  129.         .poll        =   tq2440_irq_poll,
  130. };

  131. static struct miscdevice misc = {
  132.         .minor = MISC_DYNAMIC_MINOR,
  133.         .name = DEVICE_NAME,
  134.         .fops = &dev_fops,
  135. };

  136. static int __init dev_init(void)
  137. {
  138.         int ret;

  139.         ret = misc_register(&misc);

  140.         printk (DEVICE_NAME" initialized\n");

  141.         return ret;
  142. }

  143. static void __exit dev_exit(void)
  144. {
  145.         misc_deregister(&misc);
  146. }

  147. module_init(dev_init);
  148. module_exit(dev_exit);

  149. MODULE_LICENSE("GPL");
  150. MODULE_AUTHOR("www.embedsky.net");
  151. MODULE_DESCRIPTION("IRQ Test for EmbedSky SKY2440/TQ2440 Board");
复制代码
亚瑟王 发表于 2013-1-28 10:21:23 | 显示全部楼层
haoyunp 发表于 2013-1-28 10:18
文件全部代码如下,不知还需要修改哪?第一次改驱动,求教

亲,你能确定你的内核中用的按键驱动就是这个驱动吗?因为TQ2440的内核(目前出货的)都是用的另外一份驱动,详情参考:http://www.armbbs.net/forum.php?mod=viewthread&tid=10425
 楼主| haoyunp 发表于 2013-1-28 11:16:03 | 显示全部楼层
亚瑟王 发表于 2013-1-28 10:21
亲,你能确定你的内核中用的按键驱动就是这个驱动吗?因为TQ2440的内核(目前出货的)都是用的另外一份驱 ...

内核为2.6.30.4
在开发板终端执行:
[root@EmbedSky /]# insmod /lib/EmbedSky_irq.ko,
所用按键为:key1--irq_eint1,key2--irq_eint4,key3--irq_eint2,key4--irq_eint0,应该与这个文件是相符的。
我就需要8个按键,功能是需要自定义
亚瑟王 发表于 2013-1-28 11:37:31 | 显示全部楼层
haoyunp 发表于 2013-1-28 11:16
内核为2.6.30.4
在开发板终端执行:
[root@EmbedSky /]# insmod /lib/EmbedSky_irq.ko,

我们光盘的内核中有两套驱动:
1套是作为系统按键来处理的,方法就是上面的帖子里面的。
第二套就是你现在说的这个。
首先要明确你当前的内核中用的哪套,判断方法:make menuconfig时,看配置单配置的哪个?最佳的办法就是取消掉不想要使用的那套。
 楼主| haoyunp 发表于 2013-1-28 12:25:02 | 显示全部楼层
{:1_1:},开心。
谢谢版主,按键添加成功,主要是配置问题
 楼主| haoyunp 发表于 2013-1-28 12:33:55 | 显示全部楼层
tq2440添加按键
1.在drivers/char/EmbedSky_irq.c中,修改
  1. static struct button_irq_desc button_irqs [] = {
  2.         {IRQ_EINT0,        S3C2410_GPF0,        S3C2410_GPF0_EINT0,        0, "KEY1"}, /* K1 */
  3.         {IRQ_EINT1,        S3C2410_GPF1,        S3C2410_GPF1_EINT1,        1, "KEY2"}, /* K2 */
  4.         {IRQ_EINT2,        S3C2410_GPF2,        S3C2410_GPF2_EINT2,        2, "KEY3"}, /* K3 */
  5.         {IRQ_EINT3,        S3C2410_GPF3,        S3C2410_GPF3_EINT3,        3, "KEY4"}, /* K4 */
  6.         {IRQ_EINT4,        S3C2410_GPF4,        S3C2410_GPF4_EINT4,        4, "KEY5"}, /* K5 */
  7.         {IRQ_EINT5,        S3C2410_GPF5,        S3C2410_GPF5_EINT5,        5, "KEY6"}, /* K6 */
  8.         {IRQ_EINT8,        S3C2410_GPG0,        S3C2410_GPG0_EINT8,        6, "KEY7"}, /* K7 */
  9.         {IRQ_EINT9,        S3C2410_GPG1,        S3C2410_GPG1_EINT9,        7, "KEY8"}, /* K8 */
  10. };


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

复制代码
2.make menuconfig
DEVICE Drivers->input device support->keyboards->GPIO Buttons
3.命令行:#make SUBDIR=drivers/char/ modules
4.在drivers/char/目录下,将刚编译完的EmbedSky_irq.ko考到开发板的/lib/目录下,
5.开发板执行命令:[root@EmbedSky /]# insmod /lib/EmbedSky_irq.ko


  
亚瑟王 发表于 2013-1-28 15:04:15 | 显示全部楼层
haoyunp 发表于 2013-1-28 12:33
tq2440添加按键
1.在drivers/char/EmbedSky_irq.c中,修改2.make menuconfig
DEVICE Drivers->input devi ...

亲,你搞错了。彻底的搞反了。
EmbedSky_irq.c对应的配置单是:Device Drivers-》Character devices-》EmbedSky TQ2440 Board IRQ Test(Buttons test)
做成系统按键的配置单才是你帖子中写的那个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-19 10:27 , Processed in 1.062500 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表