ELF 1技术贴|在NXP源码基础上适配开发板的按键功能

本次源代码适配是在NXP i.MX6ULL EVK评估板的Linux内核源代码(特定版本号为Linux-imx_4.1.15)的基础中展开的。

首要任务集中在对功能接口引脚配置的精细调整,确保其能无缝匹配至ELF 1开发板。接下来,我们将详细阐述适配过程中关于按键功能实现的完整步骤。

值得一提的是,ELF 1开发板上预置了标识为K1、K2、K3的三个按键。为了启用这些按键功能,需要在设备树中进行按键配置,以及在内核中完成驱动配置。

01、硬件原理

图片

图片

02、IOMUX配置

从上图可以看出GPIO5_4连接到了连接器的22脚,GPIO5_2连到了34脚,GPIO5_9连接到了43脚。接下来需要找到这几个引脚在软件上的信号名称。在ElfBoard官网硬件资料中的 ELF 1开发板资料包\05-硬件资料\05-4 管脚分配表找到22、34、43引脚的信号名称。

图片

可以看到连接器的34引脚信号名称为SNVS_TAMPER2;22引脚的信号名称为SNVS_TAMPER4;43引脚的信号名称为SNVS_TAMPER9。

因为需要使用这几个引脚控制按键,所以需要把它们复用成GPIO功能,在arch/arm/boot/dts/imx6ull-pinfunc-snvs.h中找到它们的宏定义,分别如下:

图片

然后打开设备树文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts,在&iomux_snvs节点下添加子节点pinctrl_keys:

pinctrl_keys: keysgrp {fsl,pins = <MX6ULL_PAD_SNVS_TAMPER4__GPIO5_IO04     0x80000000MX6ULL_PAD_SNVS_TAMPER2__GPIO5_IO02     0x80000000MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09     0x80000000>;
};

添加后效果如下:

图片

03、添加设备节点

 在根节点下添加:

gpio-keys {compatible = "gpio-keys";pinctrl-names = "default";pinctrl-0 = <&pinctrl_keys>;#address-cells = <1>;#size-cells = <0>;autorepeat;key1 {label = "KEY1";linux,code = <KEY_ENTER>;gpios = <&gpio5 4 GPIO_ACTIVE_LOW>;};key2 {label = "KEY2";linux,code = <KEY_UP>;gpios = <&gpio5 2 GPIO_ACTIVE_LOW>;};key3 {label = "KEY3";linux,code = <KEY_DOWN>;gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;};};

添加后效果如下:

 

gpio-keys的compatible属性值为“gpio-keys”,用于驱动匹配。pinctrl-name属性值为“default”,定义了pincrtl的名字为“default”。

pinctrl-0的属性值为<&pinctrl_keys>,就是引用了之前在iomux_snvs中定义的pinctrl_keys也就是说,在此处对iomux_snvs的配置进行了引用,类似函数的调用。status属性值设置为“okay”,表示LED设备可用。

接下来三个子节点,分别对应三个具体按键。子节点的lable标签属性是可选的。linux,code属性表示键值,在include/dt-bindings/input/input.h文件中有其宏定义。

#define KEY_ENTER    28
#define KEY_UP      103
#define KEY_DOWN    108

gpios属性值指定了具体的GPIO引脚以及引脚的极性配置。如:gpios = <&gpio1 10 GPIO_ACTIVE_LOW>。

指定是GPIO1_IO10引脚,极性是GPIO_ACTIVE_LOW,就是指高电平有效还是低电平有效,需要根据具体电路配合使用。

04、配置按键驱动编译进内核

在根目录下使用make menuconfig命令,在如下路径查看是否有配置:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig

找到以下位置,Keyboards驱动默认已经编译进内核。

-> Device Drivers
->Input device support
->Keyboards

图片

05、编译测试

由于使用build.sh全编译时间太长,我们可以将build.sh当中的第4行注释掉:

图片

编译内核并拷贝到开发板:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage   root\@172.16.0.175:/run/media/mmcblk1p1/
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/

进行sync操作后重启开发板:

图片

使用cat /proc/bus/input/devices命令查看key设备对应的event事件:

root@ELF1:~# cat /proc/bus/input/devices

图片

可以看到其对应的是event2,如果连接了其他设备,比如触摸屏,event事件可能会有变化,请以实际为准。

终端输入evtest命令,选择event number为2,然后分别按键K1,K2,K3,会看到上报数据。

root@ELF1:~# evtest

图片

可以看到KEY1上报的键值是28,KEY2上报的键值是103,KEY3上报的键值是108,与在设备树中配置的键值一致。

至此,已在NXP提供的源代码基础上成功完成了对ELF 1开发板按键功能的适配工作,期待这一实践教程能够切实为屏幕前的小伙伴带来实质性指导

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

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

相关文章

什么是C语言?

什么是C语言&#xff1f; 一、C语言简介1.学习C语言必记重点 二、C语言的优点三、C语言的价值1.列举C语言实例 三、C语言程序1.C语言程序扩展名2.C语言程序编辑器 一、C语言简介 C语言是一种较早的程序设计语言&#xff0c;诞生于1972年的贝尔实验室。 1972 年&#xff0c;Denn…

浅谈Redis和分布式系统

浅谈Redis Redis用于存储数据&#xff0c;且在内存当中进行存储。 但是在日常编写代码中&#xff0c;定义一个变量也就属于在内存当中存储一个数据。 Redis主要会在分布式系统当中发挥重要作用&#xff0c;如果只是单机程序&#xff0c;直接通过变量存储数据的方式会比使用Re…

Linux的进程调度实现

经常被问到进程的调度算法有哪些&#xff0c;什么先进先出、短进程优先、时间片轮转、多级反馈多列等等算法能说一大堆&#xff1f;那具体的&#xff0c;linux内核使用了什么样的算法&#xff0c;且来探究一下。 本文所引用源码基于linux内核2.6.34版本。 目录 调度器类 从 s…

【兔子机器人】修改GO电机id(软件方法、硬件方法)

一、硬件方法 利用上位机直接修改GO电机的id号&#xff1a; 打开调试助手&#xff0c;点击“调试”&#xff0c;查询电机&#xff0c;修改id号&#xff0c;即可。 但先将四个GO电机连接线拔掉&#xff0c;不然会将连接的电机一并修改。 利用24V电源给GO电机供电。 二、软件方…

15. 三数之和 - 力扣

1. 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 …

机器学习-pytorch1(持续更新)

上一节我们学习了机器学习的线性模型和非线性模型的机器学习基础知识&#xff0c;这一节主要将公式变为代码。 代码编写网站&#xff1a;https://colab.research.google.com/drive 学习课程链接&#xff1a;ML 2022 Spring 1、Load Data&#xff08;读取数据&#xff09; 这…

代码随想录(day2)——数组

Leetcode.977 有序数组的平方&#xff1a; 题目如下&#xff1a; 对于本题&#xff0c;可以采用双指针的方法进行解答&#xff0c;如果笔者写的几篇关于题解的文章有幸被读者浏览的话&#xff0c;会发现&#xff0c;针对数组问题&#xff0c;很大一部分是使用双指针来解决的。…

UE5.2 SmartObject使用实践

SmartObject是UE5新出的一项针对AI的功能&#xff0c;可为开发者提供如公园长椅、货摊等交互对象的统一外观封装&#xff0c;如UE的CitySample&#xff08;黑客帝国Demo&#xff09;中就运用到了SmartObject。 但SmartObject实践起来较为繁琐&#xff0c;主要依赖于AI及行为树…

UE 中的数学

坐标空间转换 使用引擎提供的函数 通过 Rotate Vector / Unrotate Vector 转换坐标空间&#xff0c;因为该方法内部是通过旋转矩阵对向量进行变换 旋转计算 角度计算

【leetcode热题】 二叉树的后序遍历

给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记05_共谋(中)

1. 默许共谋 1.1. 又称寡头价格协调&#xff08;Oligopolistic Price Coordination&#xff09;或有意识的平行行为&#xff08;Conscious Parallelism&#xff09; 1.1.1. 在条件允许的情况下&#xff0c;它会发生在市场集中度较高的行业当中 1.1.…

蓝桥杯递推与递归法|斐波那契数列|数字三角形|42点问题|数的计算|数的划分(C++)

递归是用来做dfs&#xff0c;是搜索算法的基础 递推是用来做dp部分&#xff0c;及部分其他算法&#xff0c;复杂度较低&#xff0c;不会出现爆栈问题递推法&#xff1a; 递推法是一种在数学和其他领域广泛应用的重要方法&#xff0c;它在计算机科学中被用作一种关键的数值求解…