六、(正点原子)pinctrl子系统和gpio子系统

        前面我们使用设备树来驱动LED灯,其实就是将LED寄存器地址写入到设备树的属性reg中,通过OF函数 ,读取到LED灯的寄存器信息,从而操作寄存器来控制LED灯。在操作LED灯时候,我们使用到GPIO这个引脚,通过对这个GPIO的控制来实现LED灯的控制。

一、pinctrl子系统

        pinctrl子系统,用来设置pin(引脚)的复用功能和配置这个pin的电气属性。主要体现:

  • 获取设备树中pin信息。
  • 根据获取到的pin信息来设备pin的复用功能。
  • 根据获取到的pin信息来设备pin的电气属性,比如上/下拉、速度、驱动能力等。

        对于我们来说,只需要在设备树里面设置好某个pin的相关属性,其他的初始化工作pinctrl子系统来完成,pinctrl子系统源码目录为drivers/pinctrl

        pin配置信息详解

        要使用 pinctrl 子系统,我们需要在设备树里面设置 PIN 的配置信息,毕竟 pinctrl 子系统要
根据你提供的信息来配置 PIN 功能,一般会在设备树里面创建一个节点来描述 PIN 的配置信
息。在imx6ull.dtsi中有者三个节点表示imx6ullpin引脚

iomuxc: iomuxc@020e0000 {
	compatible = "fsl,imx6ul-iomuxc";
	reg = <0x020e0000 0x4000>;
};


gpr: iomuxc-gpr@020e4000 {
	compatible = "fsl,imx6ul-iomuxc-gpr",
	"fsl,imx6q-iomuxc-gpr", "syscon";
	reg = <0x020e4000 0x4000>;
};

iomuxc_snvs: iomuxc-snvs@02290000 {
	compatible = "fsl,imx6ull-iomuxc-snvs";
	reg = <0x02290000 0x10000>;
};

 imx6ull的参考手册

        在imx6ull-alientek-emmc.dts中,对pin进行追加信息比如:

 不同的外设使用的 PIN 不同、其配置也不同,因此一个萝卜一个坑,将某个外设所使用的所有 PIN 都组织在一个子节点里面。其中,在iomux节点下有个imx6ul-evk的子结点,这个节点就是用来描述evk这个开发板外设所使用到的pin。简单来说就是在这个节点来表示出来evk开发板的各个功能使用到哪些引脚和引脚是哪一个。比如:hoggrp-1这个evk节点下面的子结点,表示热插拔功能所需要的引脚。

        关于MX6UL_PAD_UART1_RTS_B__GPIO1_IO19       0x17059 含义:

这是一个宏定义,定义在文件arch/arm/boot/dts/imx6ul-pinfunc.h 中, imx6ull.dtsi 会引用 imx6ull-pinfunc.h 这个头文件,而imx6ull-pinfunc.h 又会引用 imx6ul-pinfunc.h 这个头文件,

        在imx6ull参考手册中我们可以看出来MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 这个宏就是表示UART1_RTS_B这个引脚复用为GPIO1_IO19功能 。

<mux_reg   conf_reg    input_reg      mux_mode    input_val>
 0x0090    0x031C      0x0000         0x5         0x0

         0x0090mux_reg寄存器偏移地址,复用功能寄存器地址。

        0x031C conf_reg 寄存器偏移地址,表示I

### 正点原子 IMX6ULL 触摸屏驱动配置教程 #### 1. 设备树配置 对于正点原子 IMX6ULL 平台,触摸屏的正常工作依赖于设备树中的正确配置。如果驱动编译通过但仍存在问题,则可能是设备树节点名称或兼容性字段有误[^4]。建议仔细检查设备树文件中与触摸屏相关的部分,确保其匹配实际硬件。 以下是典型的设备树片段示例: ```dts &i2c1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c1>; clock-frequency = <100000>; ft5x_ts: touchscreen@38 { compatible = "ft5x_ts"; /* 替换为具体芯片型号 */ reg = <0x38>; interrupt-parent = <&gpio1>; interrupts = <7 IRQ_TYPE_LEVEL_LOW>; /* 根据实际情况调整 */ reset-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; /* 复位引脚 */ status = "okay"; }; }; ``` #### 2. 内核配置 为了支持触摸屏功能,还需要确认 Linux 内核已启用必要的输入子系统模块。进入内核菜单配置界面,按以下路径找到并激活相关选项: - **Device Drivers → Input device support → Generic input layer (needed for keyboard, mouse, ...)** - **Keyboards → GPIO Buttons** 通常情况下,默认配置已经启用了这些选项,但如果未生效,需手动验证并重新编译内核[^1]。 #### 3. 屏幕刷新与事件处理 在某些图形库(如 LVGL)的应用场景下,屏幕刷新频率事件响应机制至关重要。可以参考类似的移植案例来优化性能。例如,在设置屏幕刷新时间心跳时间时,可将其统一设为较低延迟值(如 10ms),以便提升用户体验[^3]。 #### 4. 测试与调试 完成上述配置后,可通过简单的测试程序验证触摸屏的功能。下面是一个基础的 C 程序用于读取触摸坐标数据: ```c #include <stdio.h> #include <linux/input.h> #include <fcntl.h> #include <unistd.h> int main() { int fd; struct input_event ev; fd = open("/dev/input/event0", O_RDONLY); // 根据实际设备号修改 if (fd < 0) { perror("Failed to open event"); return -1; } while (read(fd, &ev, sizeof(struct input_event)) > 0) { if (ev.type == EV_ABS && ev.code == ABS_X) { printf("Touch X coordinate: %d\n", ev.value); } else if (ev.type == EV_ABS && ev.code == ABS_Y) { printf("Touch Y coordinate: %d\n", ev.value); } } close(fd); return 0; } ``` 此代码会持续监听 `/dev/input/event0` 文件中的事件流,并打印触控位置信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tofu_Cabbage

你的打赏是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值