AM335x(TQ335x)学习笔记——GPIO按键驱动移植
其中,linux,code后面对应的是linux标准的键值,可以在linux系统中找到,路径是:/usr/include/linux/input.h。
由于这六个按键使用的是gpio管脚,还需要通过后面的pinmux配置下gpio相关寄存器。同样的,删除gpio矩阵键盘和音量键相关的配置,添加使用TQ335x的配置,修改后的代码片段如下:
- &am33xx_pinmux{
- pinctrl-names="default";
- pinctrl-0=<&clkout2_pin>;
- gpio_key_pins:gpio_keys_s0{
- pinctrl-single,pins=<
- 0x50(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a3.gpio1_20*/
- 0x54(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a5.gpio1_21*/
- 0x58(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a6.gpio1_22*/
- 0x5C(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a7.gpio1_23*/
- 0x60(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a8.gpio1_24*/
- 0x64(PIN_INPUT_PULLUP|MUX_MODE7)/*gpmc_a9.gpio1_25*/
- >;
- };
- i2c0_pins:pinmux_i2c0_pins{
- pinctrl-single,pins=<
- 0x188(PIN_INPUT_PULLUP|MUX_MODE0)/*i2c0_sda.i2c0_sda*/
- 0x18c(PIN_INPUT_PULLUP|MUX_MODE0)/*i2c0_scl.i2c0_scl*/
- >;
- };
需要注意的是,pinctrl-0后与矩阵键盘和音量键相关的配置项名称也要删除,对于phandler,目前还没有看懂什么意思,这里先让按键功能正常,之后再去详细的研究dts。学习dts的时候也会来写笔记的。
(3)重新编译dts
与之前编译dts的方法一样:
- makeARCH=armCROSS_COMPILE=arm-linux-gnueabi-tq335x.dtb
将新的tq335x.dtb拷贝到SD卡的boot目录下(可以直接覆盖掉原来的)并给开发板上电,同时按任意键使u-boot进入命令行模式,使用命令启动内核:
- loadmmc0${fdtaddr}/boot/tq335x.dtb
- loadmmc0${loadaddr}/boot/zImage
- loadmmc0${rdaddr}/boot/ramdisk.img
- bootz${loadaddr}${rdaddr}${fdtaddr}
从终端上无法直接看到按键效果,不过可以同hexdump命令来测试按键功能是否正常,使用方法如下:
- hexdump/dev/input/event0
- @tq335x#hexdump/dev/input/event0
- 00000004b7c386df9b400050001006700010000
- 00000104b7c386df9b400050000000000000000
- 00000204b7c386d80c400080001006700000000
- 00000304b7c386d80c400080000000000000000
- 00000404b7d386d09f800080001006c00010000
- 00000504b7d386d09f800080000000000000000
- 00000604b7d386d1005000a0001006c00000000
- 00000704b7d386d1005000a0000000000000000
- 00000804b7f386d1304000d0001006900010000
- 00000904b7f386d1304000d0000000000000000
- 00000a04b80386d48e600000001006900000000
- 00000b04b80386d48e600000000000000000000
- 00000c04b80386df340000a0001006a00010000
- 00000d04b80386df340000a0000000000000000
- 00000e04b80386dcd6f000c0001006a00000000
- 00000f04b80386dcd6f000c0000000000000000
- 00001004b81386da2d700070001001c00010000
- 00001104b81386da2d700070000000000000000
- 00001204b81386db39d00090001001c00000000
- 00001304b81386db39d00090000000000000000
- 00001404b82386d5aa300020001000100010000
- 00001504b82386d5aa300020000000000000000
- 00001604b82386d4bf300040001000100000000
- 00001704b82386d4bf300040000000000000000
- structinput_event{
- structtimevaltime;
- __u16type;
- __u16code;
- __s32value;
- };
第一列:行号
第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相关的笔记的。
关键词: AM335x(Q335xGPIO按键驱

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码