CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 17051|回复: 14

a20系列开发板gpio模拟input设备keyboard

[复制链接]
发表于 2015-1-22 21:08:02 | 显示全部楼层 |阅读模式
本帖最后由 快乐生活 于 2015-1-22 21:18 编辑

我用的是基于a20的一个开发板,我的IO口PH20,19,18,17,16,14为普通的按键,现在要把这六个按键注册为真正的键盘设备。方法和代码如下。

1.修改linux-sunxi/arch/arm/configs/sun7i_defconfig中的CONFIG_GPIO_SUNXI=y 使能gpio
2.修改fex文件
  1. [gpio_para]
  2. 。。。
  3. gpio_pin_140 = port:PH14<0><default><default><1>
  4. gpio_name_140 = "KEY6"
  5. gpio_pin_141 = port:PH15<0><default><default><1>
  6. gpio_name_141 =
  7. gpio_pin_142 = port:PH16<0><default><default><1>
  8. gpio_name_142 = "KEY5"
  9. gpio_pin_143 = port:PH17<0><default><default><1>
  10. gpio_name_143 = "KEY4"
  11. gpio_pin_144 = port:PH18<0><default><default><1>
  12. gpio_name_144 = "KEY3"
  13. gpio_pin_145 = port:PH19<0><default><default><1>
  14. gpio_name_145 = "KEY2"
  15. gpio_pin_146 = port:PH20<0><default><default><1>
  16. gpio_name_146 = "KEY1"
复制代码
3.建文件xxx.c   下面是代码
4.吧xxx.c文件放在linux-sunxi/driver/gpio文件夹下同时修改这个文件夹下面的Makefile文件
最后一行加上    obj-m    +=  xxx.o
5.重新编译
6.在build/driver/gpio下有个文件xxx.ko
7.在你的a20设备中执行insmod  xxx.ko
8.代码
  1. #include<linux/kernel.h>
  2. #include<linux/module.h>
  3. #include<linux/device.h>
  4. #include<linux/uaccess.h>
  5. #include<linux/interrupt.h>
  6. #include<asm/io.h>
  7. #include<linux/irq.h>
  8. #include<asm/irq.h>
  9. #include<mach/irqs.h>
  10. #include<plat/sys_config.h>
  11. #include<mach/system.h>
  12. #include<linux/slab.h>
  13. #include<linux/gpio.h>
  14. #include<linux/init.h>
  15. #include<linux/fs.h>
  16. #include<asm/atomic.h>
  17. #include<linux/kthread.h>
  18. #include <linux/poll.h>
  19. #include <linux/fcntl.h>
  20. #include <linux/input.h>

  21. #define GPIO_NUM_PH20 146
  22. #define GPIO_NUM_PH19 145
  23. #define GPIO_NUM_PH18 144
  24. #define GPIO_NUM_PH17 143
  25. #define GPIO_NUM_PH16 142
  26. #define GPIO_NUM_PH14 140

  27. static struct pin_desc{
  28.         int irq;
  29.         unsigned char *name;
  30.         unsigned int pin;
  31.         unsigned int key_val;
  32. };

  33. static struct pin_desc pins_desc[6] = {
  34.                 {0,"K1",GPIO_NUM_PH20,KEY_W},
  35.                 {0,"K2",GPIO_NUM_PH19,KEY_S},
  36.                 {0,"K3",GPIO_NUM_PH18,KEY_A},
  37.                 {0,"K4",GPIO_NUM_PH17,KEY_D},
  38.                 {0,"K5",GPIO_NUM_PH16,KEY_M},
  39.                 {0,"K6",GPIO_NUM_PH14,KEY_N},
  40. };

  41. static struct input_dev *buttons_dev;

  42. /* 用户中断处理函数 */
  43. static irqreturn_t buttons_irq(int irq, void *dev_id)
  44. {
  45.         struct pin_desc *pindesc = (struct pin_desc *)dev_id;
  46.         unsigned int pinval;
  47.         pinval = gpio_get_value(pindesc->pin);

  48.         if(pinval)
  49.         {
  50.                 /* 松开 最后一个参数: 0-松开, 1-按下 */
  51.                 input_event(buttons_dev,EV_KEY,pindesc->key_val,0);
  52.                 input_sync(buttons_dev);
  53.         }
  54.         else
  55.         {
  56.                 /* 按下 */
  57.                 input_event(buttons_dev,EV_KEY,pindesc->key_val,1);
  58.                 input_sync(buttons_dev);
  59.         }
  60.         return IRQ_HANDLED;
  61. }


  62. /* 驱动入口函数 */
  63. static int buttons_input_init(void)
  64. {
  65.         int i;
  66.         for(i = 0;i < sizeof(pins_desc)/sizeof(pins_desc[0]);i++)
  67.         {
  68.                 /*5.申请 GPIO 资源*/
  69.                 if (gpio_request(pins_desc[i].pin,"gpio_pin"))
  70.                 {
  71.                         printk("%s request gpio error\n",pins_desc[i].name);
  72.                 }
  73.                 pins_desc[i].irq=gpio_to_irq(pins_desc[i].pin);
  74.         }
  75.         /* 1.分配一个input_dev结构体 */
  76.         buttons_dev = input_allocate_device();
  77.         buttons_dev->name="keyboard";
  78.         /* 2.设置 */
  79.         /* 2.1 设置按键能产生哪类事件 */
  80.         set_bit(EV_KEY,buttons_dev->evbit);
  81.         set_bit(EV_REP,buttons_dev->evbit);

  82.         /* 2.2 设置能产生这类操作的哪些事件 */
  83.         set_bit(KEY_W,buttons_dev->keybit);
  84.         set_bit(KEY_S,buttons_dev->keybit);
  85.         set_bit(KEY_A,buttons_dev->keybit);
  86.         set_bit(KEY_D,buttons_dev->keybit);
  87.         set_bit(KEY_M,buttons_dev->keybit);
  88.         set_bit(KEY_N,buttons_dev->keybit);
  89.         
  90.         /* 3.注册 */
  91.         input_register_device(buttons_dev);

  92.         
  93.         /* 4.硬件相关的设置 */

  94.         /* 4.1 申请中断 */  
  95.         for(i = 0;i < sizeof(pins_desc)/sizeof(pins_desc[0]);i++)
  96.         {
  97.                 request_irq(pins_desc[i].irq, buttons_irq, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, pins_desc[i].name, &pins_desc[i]);
  98.         }
  99.         
  100.         return 0;
  101. }

  102. /* 驱动出口函数 */
  103. static void buttons_input_exit(void)
  104. {
  105.         int i;
  106.         for(i = 0;i < sizeof(pins_desc)/sizeof(pins_desc[0]);i++)
  107.         {
  108.                 free_irq(pins_desc[i].irq, &pins_desc[i]);
  109.         }
  110.         input_unregister_device(buttons_dev);
  111.         input_free_device(buttons_dev);
  112. }

  113. module_init(buttons_input_init);  //用于修饰入口函数
  114. module_exit(buttons_input_exit);  //用于修饰出口函数        

  115. MODULE_AUTHOR("xiaolei");
  116. MODULE_DESCRIPTION("a20-keyboard");
  117. MODULE_LICENSE("GPL");  //遵循GPL协议
复制代码
回复

使用道具 举报

发表于 2015-1-24 10:45:40 | 显示全部楼层
学习下,顶一个
回复 支持 反对

使用道具 举报

发表于 2015-1-28 14:10:30 | 显示全部楼层
顶~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2015-5-13 14:36:11 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2015-8-6 14:52:10 | 显示全部楼层
我测试了那个,但是少了#include<plat/sys_config.h>你可不可以将这个头文件发送给我一下
回复 支持 反对

使用道具 举报

发表于 2015-10-8 11:45:14 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-10 13:40:01 | 显示全部楼层
xiaolonghun1 发表于 2015-8-6 14:52
我测试了那个,但是少了#include你可不可以将这个头文件发送给我一下

对不起了,这个是很久以前工作需要做的了。   #include<plat/sys_config.h>这个头文件是系统的,不是自己写的头文件,你看下你kernel/inc/下面有没有这个头文件,应该是没有问题的。
回复 支持 反对

使用道具 举报

发表于 2015-11-12 09:34:16 | 显示全部楼层
本帖最后由 简单侶途  于 2015-11-12 11:47 编辑

CONFIG_GPIO_SUNXI=y 怎么找不到的,我是A20平台的cubietruck,还有我编译成功加载驱动,怎么测试都没反应的{:soso_e101:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-16 11:07:57 | 显示全部楼层
简单侶途  发表于 2015-11-12 09:34
CONFIG_GPIO_SUNXI=y 怎么找不到的,我是A20平台的cubietruck,还有我编译成功加载驱动,怎么测试都没反应 ...

怎么会呢?在script.bin里面有的,这一项的宏不打开,gpio的控制就不能用。
回复 支持 反对

使用道具 举报

发表于 2015-11-16 11:17:49 | 显示全部楼层
快乐生活 发表于 2015-11-16 11:07
怎么会呢?在script.bin里面有的,这一项的宏不打开,gpio的控制就不能用。

static struct pin_desc pins_desc[6] = {
                {0,"K1",GPIO_NUM_PH20,KEY_W},
                {0,"K2",GPIO_NUM_PH19,KEY_S},
                {0,"K3",GPIO_NUM_PH18,KEY_A},
                {0,"K4",GPIO_NUM_PH17,KEY_D},
                {0,"K5",GPIO_NUM_PH16,KEY_M},
                {0,"K6",GPIO_NUM_PH14,KEY_N},
};
我想知道为啥每行开头都是0,还有GPIO_NUM_PH18在cubietruck有没有作改动了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-3-29 15:32 , Processed in 0.026512 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部