AM335x(TQ335x)学习笔记——GPIO关键驱动移植「建议收藏」

AM335x(TQ335x)学习笔记——GPIO关键驱动移植

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

或按照S5PV210学习秩序。我们首先解决的关键问题。TQ335x有六个用户按钮,每个上、下、剩下、对、Enter和ESC。

我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏览driver/input/keyboardgpio-keys.c,大体上看下该驱动程序,其功能是实现了通用的gpio按键。

再去看了下DTS,发现DTS中有对gpio-keys的引用。于是猜到。新的内核不须要自己编写输入子系统驱动,能够通过配置DTS直接解决按键问题。本人终于通过实验证实了这个猜想,以下是实验笔记及本人的一些理解。

(1)确定GPIO管脚

通过查看TQ335x的原理图能够看到,TQ335x的6个按键分别接在GPIO1的20~25管脚上,原理图例如以下:

AM335x(TQ335x)学习笔记——GPIO关键驱动移植「建议收藏」

(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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116684.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • workbench mesh搅拌釜网格划分

    workbench mesh搅拌釜网格划分首先在scdm中创建几何模型导入workbenchmesh中进行划分,导出为msh格式网格即可单击mesh,调整参数,比如修改physics为CFD等 选中geometry第二个body,右击选择suppressbody,此时只剩下一个body 右击mesh,选择insertmethod,选择几何,选择默认参数 单击generatemesh,生成网格 单击第…

  • 深度学习环境配置2——windows下的torch=1.2.0环境配置「建议收藏」

    深度学习环境配置2——windows下的torch=1.2.0环境配置「建议收藏」神经网络学习小记录48——windows下的torch=1.2.0环境配置学习前言环境内容Anaconda安装下载Cudnn和CUDA配置torch环境安装VSCODE学习前言好多人问环境怎么配置,还是出个教程吧。环境内容torch:1.2.0torchvision:0.4.0Anaconda安装最新版本的Anaconda没有VSCODE,如果大家为了安装VSCODE方便可以直接安装旧版的Anaconda,百度网盘连接如下。也可以装新版然后分开装VSCODE。链接:https://pan

  • COM组件原理_Com组件

    COM组件原理_Com组件在COM中,接口就是一个象类,每个接口有一个接口ID(uuid)。一个COM组件通常是连续继承下来的类,比如IUNknow->IDispath->IXX->CXX。这就形成了一个COM组件,当然组件一般是一个钻石继承的样子,这里为了简化原理把他们当成一个串形继承下来。每个COM组件都有一个CLSID(uuid),这个CLSID是注册的时候写进注册表的。这样就可以通过查询注册表中的CLSID

  • TDD和FDD之间的区别(详细)「建议收藏」

    TDD和FDD之间的区别(详细)「建议收藏」本文转载自:https://www.cnblogs.com/chinamcs/archive/2010/04/27/1722156.html作者:chinamcs转载请注明该声明。我们知道FDD和区别+详细+.html’target=’_self’>TDD分别是频分双工和时分双工的英文缩写。FDD系统是指系统的发送和接收数据使用不同的频率,在上行和下行频率之间有双工间隔…

  • linux 内核 – ioctl 函数详解

    linux 内核 – ioctl 函数详解1.概念ioctl是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设ioctl()命令的方式实现。在文件I/O中,ioctl扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析ioctl函数。2.用户空间ioctl#include&…

    2022年10月18日
  • 如何破解运动世界校园模拟器检测

    本文已过时最新版不可用最早用安卓上的PacketCapture抓到http包只要删除对应模拟器文件就可以后来变成了https又对emulatorUrls进行了加密再追加了几个文件就难倒了一批菜鸡软件使用360加固直接逆向难度不小选择曲线救国第一次用Flidder的autoresponder直接把emulatorUrls的值清零返回.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号