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中的协程及实现
1.协程的概念: 协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来的时候,恢复先前保存的寄存器上下文和栈. 因此,协程能保留 ...
- pytho字符串处理内置方法一览表
序号 方法及描述 1 capitalize()将字符串的第一个字符转换为大写 2 center(width, fillchar) 返回一个指定的宽度 width 居中的字符串,fillchar 为填充 ...
- Linux(CentOS)挂载NTFS格式的U盘、移动硬盘
以下操作均在root下执行的 1.U盘挂载 mkdir /mnt/usb //创建一个目录,用于挂载U盘 fdisk -l //查看系统中挂载的U盘,若系统有一块硬盘sdb1 代表你的U盘,/dev/ ...
- zalenium 应用
zalenium是一个Selenium Grid扩展,用Docker容器动态扩展你的本地网格.它使用docker-selenium在本地运行Firefox和Chrome中的测试,如果需要不同的浏览器, ...
- [Cpp] 面向对象程序设计 C++
初始化列表(包括成员对象初始化) 初始化列表 ( 推荐 ) : 可以初始化任何类型的数据, 不管是不是普通类型还是对象,都建议用. 不再需要在构造器中赋值了, 而且初始化列表比构造函数要早执行. ...
- ASP.NET MVC 5 ABP DataTables (一)
1)ABP DataTables 应用(一) 2) ABP DataTables 应用(二) JS DataTables 这个组件绑定数据必须要有自己的返回数据格式.但是ABP返回的格式直接绑定是错 ...
- python爬虫(2)——编写一个爬虫
一.URL的编码与解码 在python2中包含的urllib和urllib2,都是接受URL请求相关的模块.但是在python3中,却没有urllib2.实际上urllib2的功能在python3中可 ...
- Android Stutio 3.0 - Gradle sync failed
0.Android Studio 权威教程 (url:http://blog.csdn.net/column/details/zsl-androidstudio.html) 1. 项目老是报错: Gr ...
- Redis缓存 序列化对象存储乱码问题
使用Redis缓存对象会出现下图现象: 键值对都是乱码形式. 解决以上问题: 如果是xml配置的 我们直接注入官方给定的keySerializer,valueSerializer,hashKeySer ...
- 微信小程序 页面跳转传递数据
点击view 跳转页面 <view class="album_image" data-album-obj="{{item}}" bindtap=" ...
