或按照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

此链接:http://blog.csdn.net/girlkoo/article/details/41323563

AM335x(TQ335x)学习笔记——GPIO关键驱动移植的更多相关文章

  1. AM335x(TQ335x)学习笔记——GPIO按键驱动移植

    还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...

  2. AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植

    移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...

  3. AM335x(TQ335x)学习笔记——WM8960声卡驱动移植

    经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两 ...

  4. AM335x(TQ335x)学习笔记——Nand&amp;&amp;网卡驱动移植

    移植完毕声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...

  5. AM335x(TQ335x)学习笔记——LCD驱动移植

    TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由 ...

  6. AM335x(TQ335x)学习笔记——触摸屏驱动编写

    前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...

  7. AM335x(TQ335x)学习笔记——挂载Ramdisk

    上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramd ...

  8. AM335x(TQ335x)学习笔记——USB驱动移植

    对于AM335x来讲,TI维护的USB驱动已经非常完善了,本文称之为移植,实际上仅仅是配置内核选项使能USB HOST/OTG功能.废话少说,直接动手开启AM335x的USB驱动配置项. Step1. ...

  9. AM335x(TQ335x)学习笔记——u-boot-2014.10移植

    根据最近移植u-boot-2014.10至TQ335x,基于这样的假设am335x evm移植.不是很多地方需要改变. 因为TI的am335x evm开发了使用eeprom船上保存配置信息.它使用不同 ...

随机推荐

  1. 一个计算器的C语言实现

    今天在读<编译原理及实践>时.看到了一个简单的整数计算器的实现. 依照书上的思路,我略微进行了扩展: 1.从整数计算器扩展到小数计算器. 2.支持除法 3.支持空字符. 执行效果例如以下: ...

  2. Function 详解(一)

    一直想写一系列关于javascript的东西,可惜从申请博客以来就一直抽不出时间来好好写上一番,今天终于熬到周末,是该好好整理一下,那么先从声明函数开始吧; 总所周知,在javascript中有匿名函 ...

  3. Oracle varchar2最大支持长度(转)

    oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...

  4. Linux下一个简单的日志系统的设计及其C代码实现

    1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回 ...

  5. GNU C的使用

    基本语法 gcc [options] [filenames]  说明:  在gcc后面可以有多个编译选项,同时进行多个编译操作.很多 的gcc选项包括一个以上的字符.因此你必须为每个选项指定各 自 ...

  6. python语言学习3 ——第一个python程序

    输入exit即退出,这样写的缺点是没有保存已经写的代码,下次需要重新写

  7. hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)

    对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...

  8. php学习之道:php中soap的使用实例以及生成WSDL文件,提供自己主动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl差别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供 ...

  9. hdu2844(多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:一位同学想要买手表,他有n种硬币,每种硬币已知有num[i]个.已知手表的价钱最多m元,问 ...

  10. Linux for周期运行命令注意事项

    假定for有一些符号循环指令,需要使用()封闭. for i in {1..4}; do (python /data/UGCRobot/manage/Scheduler.py 1.log > / ...