AM335x(TQ335x)学习笔记——GPIO按键驱动移植

嵌入式系统 时间:2016-11-28来源:网络

其中,linux,code后面对应的是linux标准的键值,可以在linux系统中找到,路径是:/usr/include/linux/input.h。

由于这六个按键使用的是gpio管脚,还需要通过后面的pinmux配置下gpio相关寄存器。同样的,删除gpio矩阵键盘和音量键相关的配置,添加使用TQ335x的配置,修改后的代码片段如下:

  1. &am33xx_pinmux{
  2. pinctrl-names="default";
  3. pinctrl-0=<&clkout2_pin>;
  4. gpio_key_pins:gpio_keys_s0{
  5. pinctrl-single,pins=<
  6. 0x50(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a3.gpio1_20*/
  7. 0x54(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a5.gpio1_21*/
  8. 0x58(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a6.gpio1_22*/
  9. 0x5C(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a7.gpio1_23*/
  10. 0x60(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a8.gpio1_24*/
  11. 0x64(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a9.gpio1_25*/
  12. >;
  13. };
  14. i2c0_pins:pinmux_i2c0_pins{
  15. pinctrl-single,pins=<
  16. 0x188(PIN_INPUT_PULLUP|MUX_MODE0)/*i2c0_sda.i2c0_sda*/
  17. 0x18c(PIN_INPUT_PULLUP|MUX_MODE0)/*i2c0_scl.i2c0_scl*/
  18. >;
  19. };

需要注意的是,pinctrl-0后与矩阵键盘和音量键相关的配置项名称也要删除,对于phandler,目前还没有看懂什么意思,这里先让按键功能正常,之后再去详细的研究dts。学习dts的时候也会来写笔记的。

(3)重新编译dts

与之前编译dts的方法一样:

  1. makeARCH=armCROSS_COMPILE=arm-linux-gnueabi-tq335x.dtb
(4)用新的dtb启动内核

将新的tq335x.dtb拷贝到SD卡的boot目录下(可以直接覆盖掉原来的)并给开发板上电,同时按任意键使u-boot进入命令行模式,使用命令启动内核:

  1. loadmmc0${fdtaddr}/boot/tq335x.dtb
  2. loadmmc0${loadaddr}/boot/zImage
  3. loadmmc0${rdaddr}/boot/ramdisk.img
  4. bootz${loadaddr}${rdaddr}${fdtaddr}
(5)测试按键

从终端上无法直接看到按键效果,不过可以同hexdump命令来测试按键功能是否正常,使用方法如下:

  1. hexdump/dev/input/event0
由于gpio-keys驱动将按键事件映射到了/dev/input/event0设备节点上,因此,对该设备节点使用hexdump工具可以读取到按键事件。执行上述指令后按键,可以从终端上看到输出。我按照上、下、左、右、Enter和ESC的顺序短按这六个键,可以看到如下Log:
  1. @tq335x#hexdump/dev/input/event0
  2. 00000004b7c386df9b400050001006700010000
  3. 00000104b7c386df9b400050000000000000000
  4. 00000204b7c386d80c400080001006700000000
  5. 00000304b7c386d80c400080000000000000000
  6. 00000404b7d386d09f800080001006c00010000
  7. 00000504b7d386d09f800080000000000000000
  8. 00000604b7d386d1005000a0001006c00000000
  9. 00000704b7d386d1005000a0000000000000000
  10. 00000804b7f386d1304000d0001006900010000
  11. 00000904b7f386d1304000d0000000000000000
  12. 00000a04b80386d48e600000001006900000000
  13. 00000b04b80386d48e600000000000000000000
  14. 00000c04b80386df340000a0001006a00010000
  15. 00000d04b80386df340000a0000000000000000
  16. 00000e04b80386dcd6f000c0001006a00000000
  17. 00000f04b80386dcd6f000c0000000000000000
  18. 00001004b81386da2d700070001001c00010000
  19. 00001104b81386da2d700070000000000000000
  20. 00001204b81386db39d00090001001c00000000
  21. 00001304b81386db39d00090000000000000000
  22. 00001404b82386d5aa300020001000100010000
  23. 00001504b82386d5aa300020000000000000000
  24. 00001604b82386d4bf300040001000100000000
  25. 00001704b82386d4bf300040000000000000000
通过hexdump工具看到的数字是16进制的。由于linux的input_event事件定义如下:
  1. structinput_event{
  2. structtimevaltime;
  3. __u16type;
  4. __u16code;
  5. __s32value;
  6. };
结合之前设置的linux,code分析可知,hexdump打印的各列数据含义如下:

第一列:行号

第2~5列:输入事件时间戳,即结构体中的time。

第6列:输入事件类型,即结构体中的type。

第7列:按键的键值,即结构体中的code。

第8列:按键的状态,即结构体中的value,1表示按下,0表示松开。

细心的朋友会发现,按下并松开一个按键后能看到四行数据,这是由于每个input_event后会接一个linux同步事件,从上述log可以看到,同步事件的type,code,value都为0。

到这里,就完成了TQ335x的按键驱动移植。虽然过程很简单,但已经体会到了DTS的好处。对于一些通用的功能,可以不修改内核源码、不重新编译内核,仅修改dts配置就能实现所需的功能,如这里的gpio按键功能。dts方式启动内核有着巨大的优势,必须弄清DTS的编写规则,以后会记录DTS相关的笔记的。

1 2

关键词: AM335x(Q335xGPIO按键驱

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版