AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题。TQ335x有六个用户按键,分别是上、下、左、右、Enter和ESC。开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题,但是浏览driver/input/keyboard目录时意外的发现了gpio-keys.c,大体上看下该驱动程序,其功能是实现了通用的gpio按键。再去看了下DTS,发现DTS中有对gpio-keys的引用,于是猜到,新的内核不需要自己编写输入子系统驱动,可以通过配置DTS直接解决按键问题。本人最终通过实验证实了这个猜想,下面是实验笔记及本人的一些理解。
(1)确定GPIO管脚
通过查看TQ335x的原理图可以看到,TQ335x的6个按键分别接在GPIO1的20~25管脚上,原理图如下:
(2)查看原有的dts配置
进行DTS文件修改之前可以阅读下内核相关文档,在Documentation/devicetree/目录下有很多关于devicetree的记载,其实,这些第一手的资料才是最具参考价值的资料。我还没来得及系统的阅读这些文档,急于实现功能,仅阅读了gpio-key和pinmux相关的部分就开始了修改工作,这是浮躁的表现,大家不要养成这种恶习啊!
通过仔细阅读原dts文件可以发现am335x-evm开发板上有个gpio矩阵键盘和gpio的音量+、音量-键,且矩阵键盘和音量键与TQ335x的按键管脚有冲突,因此,删除这两组配置并重新添加适应TQ335x按键的配置。修改后的DTS代码片段如下:
- gpio_keypad: gpio_keyad@0{
- compatible = "gpio-keys";
- #address-cells = <1>;
- #size-cells = <0>;
- autorepeat;
- switch@1 {
- label = "up";
- linux,code = <103>;
- gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;
- gpio-key,wakeup;
- };
- switch@2 {
- label = "down";
- linux,code = <108>;
- gpios = <&gpio1 21 GPIO_ACTIVE_LOW>;
- gpio-key,wakeup;
- };
- switch@3 {
- label = "left";
- linux,code = <105>;
- gpios = <&gpio1 22 GPIO_ACTIVE_LOW>;
- gpio-key,wakeup;
- };
- switch@4 {
- label = "right";
- linux,code = <106>;
- gpios = <&gpio1 23 GPIO_ACTIVE_LOW>;
- gpio-key,wakeup;
- };
- switch@5 {
- label = "enter";
- linux,code = <28>;
- gpios = <&gpio1 24 GPIO_ACTIVE_LOW>;
- gpio-key,wakeup;
- };
- switch@6 {
- label = "esc";
- linux,code = <1>;
- gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
- gpio-key,wakeup;
- };
- };
其中,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的方法一样:
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tq335x.dtb
(4)用新的dtb启动内核
将新的tq335x.dtb拷贝到SD卡的boot目录下(可以直接覆盖掉原来的)并给开发板上电,同时按任意键使u-boot进入命令行模式,使用命令启动内核:
- load mmc 0 ${fdtaddr} /boot/tq335x.dtb
- load mmc 0 ${loadaddr} /boot/zImage
- load mmc 0 ${rdaddr} /boot/ramdisk.img
- bootz ${loadaddr} ${rdaddr} ${fdtaddr}
(5)测试按键
从终端上无法直接看到按键效果,不过可以同hexdump命令来测试按键功能是否正常,使用方法如下:
- hexdump /dev/input/event0
由于gpio-keys驱动将按键事件映射到了/dev/input/event0设备节点上,因此,对该设备节点使用hexdump工具可以读取到按键事件。执行上述指令后按键,可以从终端上看到输出。我按照上、下、左、右、Enter和ESC的顺序短按这六个键,可以看到如下Log:
- @tq335x #hexdump /dev/input/event0
- 0000000 4b7c 386d f9b4 0005 0001 0067 0001 0000
- 0000010 4b7c 386d f9b4 0005 0000 0000 0000 0000
- 0000020 4b7c 386d 80c4 0008 0001 0067 0000 0000
- 0000030 4b7c 386d 80c4 0008 0000 0000 0000 0000
- 0000040 4b7d 386d 09f8 0008 0001 006c 0001 0000
- 0000050 4b7d 386d 09f8 0008 0000 0000 0000 0000
- 0000060 4b7d 386d 1005 000a 0001 006c 0000 0000
- 0000070 4b7d 386d 1005 000a 0000 0000 0000 0000
- 0000080 4b7f 386d 1304 000d 0001 0069 0001 0000
- 0000090 4b7f 386d 1304 000d 0000 0000 0000 0000
- 00000a0 4b80 386d 48e6 0000 0001 0069 0000 0000
- 00000b0 4b80 386d 48e6 0000 0000 0000 0000 0000
- 00000c0 4b80 386d f340 000a 0001 006a 0001 0000
- 00000d0 4b80 386d f340 000a 0000 0000 0000 0000
- 00000e0 4b80 386d cd6f 000c 0001 006a 0000 0000
- 00000f0 4b80 386d cd6f 000c 0000 0000 0000 0000
- 0000100 4b81 386d a2d7 0007 0001 001c 0001 0000
- 0000110 4b81 386d a2d7 0007 0000 0000 0000 0000
- 0000120 4b81 386d b39d 0009 0001 001c 0000 0000
- 0000130 4b81 386d b39d 0009 0000 0000 0000 0000
- 0000140 4b82 386d 5aa3 0002 0001 0001 0001 0000
- 0000150 4b82 386d 5aa3 0002 0000 0000 0000 0000
- 0000160 4b82 386d 4bf3 0004 0001 0001 0000 0000
- 0000170 4b82 386d 4bf3 0004 0000 0000 0000 0000
通过hexdump工具看到的数字是16进制的。由于linux的input_event事件定义如下:
- struct input_event {
- struct timeval time;
- __u16 type;
- __u16 code;
- __s32 value;
- };
结合之前设置的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相关的笔记的。
AM335x(TQ335x)学习笔记——GPIO按键驱动移植的更多相关文章
- AM335x(TQ335x)学习笔记——GPIO关键驱动移植
或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两 ...
- input子系统学习笔记六 按键驱动实例分析下【转】
转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完毕声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- AM335x(TQ335x)学习笔记——LCD驱动移植
TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由 ...
- AM335x(TQ335x)学习笔记——触摸屏驱动编写
前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...
- AM335x(TQ335x)学习笔记——挂载Ramdisk
上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramd ...
- AM335x(TQ335x)学习笔记——USB驱动移植
对于AM335x来讲,TI维护的USB驱动已经非常完善了,本文称之为移植,实际上仅仅是配置内核选项使能USB HOST/OTG功能.废话少说,直接动手开启AM335x的USB驱动配置项. Step1. ...
随机推荐
- python生成随机图形验证码
使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL impor ...
- javascript:Json 和数组的遍历
首先看代码示例var json={a:1,b:2,c:3}; //json var array={1,2,3}; //数组 alert(json.a); //弹出1 或alert(json['a']) ...
- windows系统下安装Eclipse for PHP
第一步: 如果机器上没有java运行环境,请先安装 第二步: 下载eclipse,下载地址: http://www.eclipse.org/downloads/ 选择对应版本,本人选择的是64位版 ...
- Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器
本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...
- es head插件通过Nginx http basic 限制访问
原文链接: http://www.sojson.com/blog/213.html
- 《Thinking in Java》学习笔记(二)
1.Java方法的重载 如果几个方法都有相同的名字,区分它们就需要重载来完成. 构成重载的种类: 1)形参的个数不同 2) 形参的类型不同 3) 形参的顺序不同 注意,返回值.抛出的异常和修饰符的不 ...
- MySQL完全备份、增量备份与恢复[转]
原文链接:http://www.360doc.com/content/11/1209/09/834950_170836197.shtml 场景:每周日执行一次完全备份,每天下午1点执行增量备份 [ 适 ...
- bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]
4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...
- [2-SAT]【学习笔记】【未完】
这种一看就很2的东西.... 参考资料: 由对称性解2-sat问题 2-sat解法浅析 $SAT$理论: $2-SAT$ 两种形式: $x \in \hat B$ $x \lor y(x,\ y \i ...
- vue2.0 组织机构树形选择组件(类似elementui <el-transfer> 与 <el-tree> 两个标签的结合)
1. 效果图 2. 实现: 三级(部门或人员的树形选择) 3. 模拟数据说明: fake.js name: 显示的名称(同时也是源码中 for 循环单一的key , 如果真实数据存在名字有重 ...
