AM335x(TQ335x)学习笔记——GPIO关键驱动移植
或按照S5PV210学习秩序。我们首先解决的关键问题。TQ335x有六个用户按钮,每个上、下、剩下、对、Enter和ESC。
我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏览driver/input/keyboardgpio-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的按键驱动移植。尽管过程非常easy,但已经体会到了DTS的优点。对于一些通用的功能,能够不改动内核源代码、不又一次编译内核。仅改动dts配置就能实现所需的功能,如这里的gpio按键功能。
dts方式启动内核有着巨大的优势。必须弄清DTS的编写规则,以后会记录DTS相关的笔记的。
本文作者:girlkoo
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两 ...
- 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. ...
- AM335x(TQ335x)学习笔记——u-boot-2014.10移植
根据最近移植u-boot-2014.10至TQ335x,基于这样的假设am335x evm移植.不是很多地方需要改变. 因为TI的am335x evm开发了使用eeprom船上保存配置信息.它使用不同 ...
随机推荐
- hadoop源码下载地址
http://svn.apache.org/repos/asf/hadoop/common/branches/
- 如何在Android Studio上使用Github
首先,登陆到Github上并创建一个新repository.在屏幕右上角,点击“+”标记,并且选择“New repository”. 现在完成这个表格以新建一个叫做testproject的新repos ...
- PhoneGap-----Contacts
Everything in the code!!! <!DOCTYPE html> <html> <head> <title>Contact Examp ...
- php中如何开启GD库
php中开启GD库 在浏览器输入启用wamp下的GD库(否则验证码可能不能用) D:\lamp\php\php.ini 文件
- Linux Force DHCP Client (dhclient) to Renew IP Address
http://www.cyberciti.biz/faq/howto-linux-renew-dhcp-client-ip-address/‘m using Ubuntu Linux. How to ...
- STL的一些泛型算法
源地址:http://blog.csdn.net/byijie/article/details/8142859 从福州大学资料里摘下来的我现在能理解的泛型算法 algorithm min(a,b) 返 ...
- MySQL聚合函数、控制流程函数(含navicat软件的介绍)
MySQL聚合函数.控制流程函数(含navicat软件的介绍) 一.navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速.可靠并价格相宜的数据 ...
- OpenGL--第一个OpenGL程序
环境:VS2012 + OpenGL所需文件(其他IDE也可以,不一定要VS2012,VS2010或其他也可以) 步骤: 1.下载Vs2012 2.下载OpenGL所需文件 3.解压缩OpenGL包并 ...
- 在Windows如何解决下Cocos2d-x示例代码TestCpp我找不到lib问题库文件
遇到此问题,首先确定失踪的库文件,然后找到文件夹,库文件. 在编制Cocos2d-x在TestCpp工程,提示缺少lib文件,共同拥有下面2种可靠解决方式: 1.在Cocos2d-x的根文件夹Debu ...
- ASA IPSEC VPN配置
ASA-1配置 : Saved:ASA Version 8.0(2) !hostname ASA-1enable password 8Ry2YjIyt7RRXU24 encryptednames!in ...