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. ...
随机推荐
- 事件委托live,delegate,on区别
事件委托 我们知道,DOM在为页面中的每个元素分派事件时,相应的元素一般都在事件冒泡阶段处理事件.在类似 body > div > a 这样的结构中,如果单击a元素,click事件会从a一 ...
- 前段篇:HTML
<!DOCTYPE html> 文件开头统一的标准! HTML包含了两部分: head与body 固定的格式. 一.head部分: head部分分为两部分:meta标签与非meta标签: ...
- jQuery源码逐行分析学习01(jQuery的框架结构简化)
最近在学习jQuery源码,在此,特别做一个分享,把所涉及的内容都记录下来,其中有不妥之处还望大家指出,我会及时改正.望各位大神不吝赐教!同时,这也是我的第一篇前端技术博客,对博客编写还不是很熟悉,美 ...
- BZOJ 1192: [HNOI2006]鬼谷子的钱袋 [娱乐]
题意: n个数分组,使得小于n的每个数都能表示出来,最少几组 就是“最优集合”的超级弱化版.....每次+=now+1 然后一个貌似科学的方法是n二进制拆分 #include <iostream ...
- 移植cjson到windows下编译
#起因 在工作过程中发现需要让Lua支持json库,如果直接用lua版本的json解析器的话效率不够高,所以找了一个用C实现的json库--cjson,据说此库比lua版本的效率高10-20倍.但是c ...
- Django搭建博客网站(一)
Django搭建自己的博客网站(一) 简介 这个系列主要是通过使用Django这个python web框架实现一个简单的个人博客网站.对Django有疑问可以上Django官网查文档. 功能 后台管理 ...
- Jmeter_上传与下载
今天重点说一下Jmeter的上传与下载 1:Jmeter上传文件 首先确认你的文件名称,参数名称,MIME类型,这些可以从接口文档里面获取,或者直接在页面抓包然后从请求头里面查看.注意,此处我的文件路 ...
- 模板方法模式和JDBCTemplate(一)
本篇博客的目录: 一:模板方法模式介绍 二:模板方法模式的简单实现 三:总结 一:模板方法模式的介绍 1.1:模板方法模式的定义 定义:一个操作中的算法的骨架,而将一些步骤延迟到子类中.Templat ...
- Vi/Vim的快捷方式
1 vi/ vim键盘图 2 文字解说 进入编辑模式的6种方式: i在光标前插入 I在行首插入 a在光标后插入 A在行末插入 o在下一行插入 O在上一行插入 删除字符 x 删除当前字符 X 删除前一个 ...
- word在页眉中插入页码
编辑页眉时,插入-页码-当前位置-普通数字