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

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

转载于:https://www.cnblogs.com/yxwkf/p/5042492.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员偷偷深爱的9个不良编程习惯

新媒体管家下面这9个编码习惯&#xff0c;虽然在编程规则中是被驳斥的&#xff0c;但我们很多人就是会不由自主地使用它们。我们曾经都做过这样的事情&#xff1a;当妈妈不注意的时候&#xff0c;偷偷地吃糖果零食&#xff0c;然后导致有了蛀牙。同样的&#xff0c;我们都违背过…

emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全

基于 Emacs 的 company 模式并配合 semantic 文法分析器&#xff0c;实现 Emacs 的 C/C 代码自动补全。关于 Emacs 的代码自动补全代码自动补全的功能&#xff0c;对于使用 Emacs 写代码的程序员而言其重要性不言而喻的&#xff0c;但是搜了一些所谓的 “Emacs 完美的 C 自动补…

linux(fedora) 下dvwa 建筑环境

linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站。该服务通过休息install 安装 yum install httpd, mysql, php-mysql, php 假设出现安装的问题。能够先yum search xxx 2.安装完之后&#xff0c;检查安装的状…

c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法

要求&#xff1a;从键盘上输入一元二次方程的三个参数&#xff0c;编程判断并求一元二次方程的实根(a,b,c均为整数)算法分析&#xff1a;一元二次方程是只含有一个未知数&#xff0c;且未知数的最高次数是二次的多项式方程。一元二次方程经过整理都可化成一般形式axbxc0(a≠0)&…

程序员如何优雅度过一生的15个建议

首先&#xff0c;我要说明一下精彩的职业生涯应该是什么样。他们不是这样的一个线性图形&#xff0c;不是每过一个月你就会有对应的成长。&#xff08;就算是普通的职业生涯也不会这样。你不会每个月都有提升。每个月你都会变的好一点&#xff0c;但是每次有提升都是大幅度的&a…

cocos2d-x游戏开发 跑酷(四) 关联与物理世界

原创。转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物&#xff0c;可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样&#xff0c;有实际体积&#x…

kmp算法的c语言,KMP算法 纯C实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己写的KMP算法&#xff1a;int nt[256];void get_next1(char* T, int next[], int tlen){int i 0;int j 1;next[0] -1;while( j {if ( T[i] T[j] ){next[j] 0;i;}else{next[j] i;i 0;}j;}}int Index_KMP1(char* S, cha…

MyBatis多条件查询

1.MyBatis多条件查询1.1&#xff1a;使用实体类 将参数封装成对象接口&#xff1a;public List<User> getUserListByUser(User user);Mapper映射文件&#xff1a;<select id"getUserListByUser" resultType"User" parameterType"User"…

android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...

如何触发广播接收器在GPS开启/关闭&#xff1f;问题描述 投票&#xff1a;35回答&#xff1a;5public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().matches("android.locatio…

sphinx数据文件简析

Sphinx使用的文件包括 “sph”&#xff0c; “spa”&#xff0c; “spi”&#xff0c; “spd”, “spp”&#xff0c; “spm” &#xff0c;还有锁文件&#xff08;.spl&#xff09;。其中sph是系统的配置文件。其它则为索引文件。 l Spi 文件&#xff1a;保存WordId及指向此Wo…

收集一些常用的正则表达式

1 . 校验密码强度密码的强度必须是包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在8-10之间。^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{8,10}$2. 校验中文字符串仅能是中文。^[\\u4e00-\\u9fa5]{0,}$3. 由数字、26个英文字母或下划线组成的字符串^\\w$4.…

C#实现图片的无损压缩

/// <summary>/// 图像缩略图处理/// </summary>/// <param name"bytes">图像源数据</param>/// <param name"compression">压缩质量 1-100</param>/// <param name"thumbWidth">缩略图的宽</para…

部署和调优 1.3 pureftp部署和优化-1

FTP 是 File Transfe Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为 “文传协议” 用于 Internet 上的控制件的双向传输。 可以访问 www.pureftpd.org 官网 切换到下载目录 cd /usr/local/src 下载 wget http://download.pureftpd.org/…

android通知图标变白色,android 7.0通知图标出现白色方块

我使用下面的代码片段在我的Android应用程序中生成通知.private void sendNotification(String contentText, String message) {Intent resultIntent new Intent(this, MainActivity.class);resultIntent.putExtra("clear","clear");resultIntent.setFlag…

sqlserver 查找某个字段在哪张表里

如何查找某个字段属于哪张表&#xff1f;select [name] from [库名].[dbo].sysobjects where id in(select id from [库名].[dbo].syscolumns Where name字段名)

性能

成员嵌套越深&#xff0c;访问速度越慢。location.href 总是快于window.location.href&#xff0c;而后者也要比window.location.href.toString()更快。如果这些属性不是对象的实例属性&#xff0c;那么成员解析还要在每个点上搜索原形链&#xff0c;这将需要更长时间。 functi…

身份证号码有效性检测算法 ( js版 转 C#版 )

C#版#region 检测是否是正确的身份证/// <summary>/// 身份证验证/// </summary>/// <param name"num"></param>/// <returns></returns>public static bool isIdCardNo(string cardid){string num cardid.ToUpper();int[] fac…

android蓝牙移植,平板蓝牙测试与移植一

一&#xff0e;平板蓝牙测试硬件连接&#xff1a;进入系统的”设置”&#xff0c;开启“蓝牙”&#xff1a;可以看到扫描到其他的蓝牙设备&#xff0c;“Bluez”是平板的名称。点击“Bluez”&#xff0c;设置如下&#xff1a;点击要配对的蓝牙设备(手机等)&#xff0c;进行蓝牙…

ASP.NET系列:自定义配置节点的复用

appSettings太简单&#xff0c;为每个程序自定义配置节点太复杂&#xff0c;因此要解决app.config&web.config自定义配置的复用问题。 1.读取不依赖SectionName,根节点可以定义为任何名称。 2.足够简单&#xff0c;配置项采用name value的形式&#xff1b;足够复杂&#xf…

Web的26项基本概念和技术

Web开发是比较费神的&#xff0c;需要掌握很多很多的东西&#xff0c;特别是从事前端开发的朋友&#xff0c;需要通十行才行。今天&#xff0c;本文向初学者介绍一些Web开发中的基本概念和用到的技术&#xff0c;从A到Z总共26项&#xff0c;每项对应一个概念或者技术。Internet…