将主板原理图中的一个引脚标号复用为gpio功能。
前言
需求很简单, 就是验证gpio函数功能,但是gpio功能必须有gpio口呀,那么这里就举例把某一个引脚复用为gpio,并设置自己的节点。 这里涉及到三个知识点:
- 会看基本的原理图:从地板原理图和核心板原理图中 来找自己相关的pin脚。
- 设备树配置:pin脚可能默认的其它功能,比如I2c 功能,知道如何屏蔽和如何配置设备树,让系统加载时候复用为gpio功能
- pinctrl 配置: 根据需要的功能,用pinctrl 来实现配置
涉及到修改文件
- 底板原理图:topeet_rk3568_main_v1_7.pdf
- 核心板原理图:topeet_rk3568_coreddr4x2_v1_1.pdf
- 设备树文件:kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
- pinctrl 设备树文件配置:kernel/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi
- 通用的设备树配置自己的节点:kernel/arch/arm64/boot/dts/rockchip/rk3568/rk3568-evb1-ddr4-v10.dtsi
底板原理图 与 核心板原理图,这里暂不描述,工作当中常用的check 文档。
rk3568.dtsi rk3568-pinctrl.dtsi rk3568-evb1-ddr4-v10.dtsi 文件的区别与联系
我们在修改、配置 设备树的时候,经常会和这几个文件打交道,先搞清楚这几个文件是做什么的,加深一下印象,理解背后的逻辑,这样才方便自己实际开发中 动手操作、定制。
文件的区别
| 特性 | rk3568.dtsi | rk3568-pinctrl.dtsi | rk3568-evb1-ddr4-v10.dtsi |
|---|---|---|---|
| 层级与角色 | SoC 级定义 | SoC 级定义 | 板级定义 |
| 核心内容 | 1、定义 CPU 簇(如 4核 A55) /2、定义系统内存区域 包含所有片上外设的总线定义和节点(如 uart0, i2c1, emmc, gmac0 等) 3、定义中断控制器 | 1、专门定义引脚复用和引脚配置 2、为 SoC 的每个引脚或引脚组定义多种功能状态(如 uart0 的 tx 和 rx 引脚,i2c 的 scl 和 sda 引脚) | 1、定义与特定开发板相关的硬件 2、选择使用哪种内存(DDR4)和时序配置 3、启用/禁用 SoC 上的特定外设 4、覆盖和引用 SoC 级定义,为其指定具体的引脚和物理设备 |
| 描述范围 | 描述 RK3568 芯片本身 的硬件资源,与具体使用它的电路板无关。 | 描述 RK3568 芯片本身 的引脚控制功能,与具体电路板无关。 | 描述 某一块具体电路板 上的硬件配置。 |
| 可复用性 | 高。任何使用 RK3568 芯片的设计都可以(也必须)包含它。 | 高。任何使用 RK3568 芯片的设计都可以包含它。 | 低。只适用于特定的 EVB1 DDR4 V10 开发板。如果换一块底板,就需要一个新的 .dts 或 .dtsi 文件。 |
| 设计目标 | 提供芯片的完整功能清单。 | 提供芯片的引脚功能配置库。 | 描述如何将这些功能在特定板上实现和连接。 |
备注: 可以这么理解吧:
- 在 rk3568.dtsi 定义了功能配置 ; rk3568-pinctrl.dtsi 如其名,配置pin脚定义 ; rk3568-evb1-ddr4-v10.dtsi| 如果是自己需要定义、扩展节点,可以考虑在这里处理,新增。
文件的联系与协同工作方式
最顶层:板级设备树文件
签名在文件区别中,板级文件 rk3568-evb1-ddr4-v10.dtsi 就是最top级别的文件,它是编译的入口。
看一下她的导入和基本结构
引入的导入文件


包含关系链
rk3568-evb1-ddr4-v10.dtsi 包含 rk3568.dtsi。
rk3568.dtsi 内部会包含 rk3568-pinctrl.dtsi,因为 SoC 的外设定义需要依赖引脚控制定义。
一、需求
将底板上面 ,将 一个引脚 VCC3.3 I2C3_SDA_MO(3.3) 复用到gpio ,肯定不是所有的引脚都是 gpio,所以一定要会复用更改,J39 就是一个引脚座子

二、 实战 - 一个引脚 VCC3.3 I2C3_SDA_MO(3.3) 复用到gpio
底板原理图查看相关默认配置信息
在底板原理图:topeet_rk3568_main_v1_7.pdf 中 搜索 I2C3_SDA_MO 搜索到了3处,很明显 没有被系统其它地方使用,如果有使用地方,在设备树中是需要先去掉的。



继续在核心板原理图上面找:I2C3_SDA_MO 引脚

可以看到这个引脚可以用作: I2C 、 UART 、 CAN 、 AUDIOPWM 、ACODEC_ADC_DATA 、GPIO ,我们需求就是要把这个引脚复用为GPIO 功能,默认是I2C 功能,排在第一位,我们需要复用为 gpio功能
分析:找底板原理图目的:
- 这个引脚是不是被其他功能用到了,如果用到了就在设备树中去掉
- 需要查看我们复用为gpio功能,那么这个gpio的引脚标号多少。比如 GPIO1_A0
去掉 设备树相关的I2C3_SDA_MO复用的i2c 配置
去设备树文件:rk3568.dtsi,源码路径:kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
在这个文件里面,检索i2c3 ,为什么要检索 i2c3 , 那是因为底板原理图上面已经说明了,默认的 这个pin脚 复用的是i2c 功能。 我们看看实际系统里面的配置:

可以看到了 也引入了 pinctrl 子系统:pinctrl-0 = <&i2c3m0_xfer>; 也就是说将 0 服用到i2c3 的功能。
那么就继续检索 i2c3m0_xfer 这个值,发现在rk3568.dtsi文件中并没有找到,那么就在 kernel/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi

现在我们想把引脚不挂到i2c3 下,想挂载到gpio 下,那么我们就需要屏蔽i2c3 下面配置关联的引脚配置,如下:
i2c3: i2c@fe5c0000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xfe5c0000 0x0 0x1000>;
clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>;
clock-names = "i2c", "pclk";
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
// pinctrl-names = "default";
// pinctrl-0 = <&i2c3m0_xfer>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
就是拼比掉 pin-ctrl 配置就可以了。 这样的话在系统启动的时候,不会把这个 RK_PA1 引脚配置成 i2c3 的功能。
配置自己的节点 - 复用pin脚位gpio 功能
在哪里写呢? 看一下:rk3568-evb1-ddr4-v10.dtsi 路径: kernel/arch/arm64/boot/dts/rockchip/rk3568
直接在根节点下添加自己的节点:
my_gpio:gpio1_a0{
compatible="mygpio"
my-gpios= <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
pinctrl-0 = <&my_gpio_ctrl>;
};

在 &pinctrl 设置pinctrl
还是在rk3568-evb1-ddr4-v10.dtsi 中直接配置,当然也可以参考其它在rk3568-pinctrl.dtsi 中配置也是可以的呀
mygpio{
my_gpio_ctrl:my_gpio_ctrl {
rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};

编译固件验证节点
我们在设备树配置节点的名字是什么 呢,是 gpio1_a0 。 编译烧录固件后,
执行命令查看节点信息:cat /proc/device-tree/gpio 按TAB 按键。

说明我们节点创建成功了,gpio 节点。
三、知识点
在哪里配置自己节点
上面已经分析了 rk3568.dtsi rk3568-pinctrl.dtsi rk3568-evb1-ddr4-v10.dtsi 文件的区别与联系 其实在哪里配置都是一样的,就是引用关系。 根据自己的习惯和系统本身的架构体系配置,合适配置即可。 所以,我们在顶层设备树文件中rk3568-evb1-ddr4-v10.dtsi 的根节点下配置自己的节点,也在这个节点中的 &pinctrl 节点中配置自己的pin-ctrl 相关pin脚的复用
节点名称配置详解
经常会回到配置不知道啥意思 或者 新手 以前配置过 过了一段时间又是一脸懵逼,这里详解一下自己配置节点的含义:
my_gpio:gpio1_a0{
compatible = "mygpio";
my-gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&my_gpio_ctrl>;
};
节点标签和名称
my_gpio:gpio1_a0{
my_gpio: - 节点标签,在其他地方可以用&my_gpio引用这个节点gpio1_a0- 节点名称,在设备树中唯一标识这个节点
兼容性属性
compatible = "mygpio";
作用:告诉内核这个设备与哪个驱动程序匹配
mygpio- 驱动程序在of_match_table中声明的兼容字符串- 内核会搜索所有注册的驱动,找到
compatible字段包含mygpio的驱动
GPIO资源定义
my-gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
先搞清楚,如上需求图片和底板原理图 pin脚如下,也就是需要复用到的引脚:GPIO1_A0_u,那么配置就是一一对应罢了。
详细解析:
1)&gpio1 - 引用GPIO控制器节点
-
指向标签为gpio1的GPIO控制器节点
-
对应RK3568的GPIO1组
2)RK_PA0 - 引脚编号宏
-
通常是 0 (GPIO1_A0 = 1 * 32 + 0 * 8 + 0 = 32)
-
表示GPIO1组的A0引脚
3) GPIO_ACTIVE_HIGH - 极性定义
-
值为 0 - 高电平有效
-
如果是GPIO_ACTIVE_LOW则值为1,表示低电平有效
引脚控制配置
pinctrl-names = "default";
pinctrl-0 = <&my_gpio_ctrl>;
工作机制:
-
pinctrl-names 定义状态名称,这里只有默认状态"default"
-
pinctrl-0 引用在pinctrl节点中定义的引脚配置 &my_gpio_ctrl
备注
这里有两点知识点,可能会遗漏:
my-gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;中 ,可以找一下 gpio1 到底引用到的是哪里,有没有配置。如下:

- 引脚配置 pinctrl-0 = <&my_gpio_ctrl>
mygpio{
my_gpio_ctrl:my-gpio-ctrl {
rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
pin-ctrl节点名称配置详解
如上已经配置了 pin-ctrl 配置,这里重要的是rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; 到底什么意思。
这是核心配置行,它使用了 Rockchip 平台的特定属性 rockchip,pins。这个属性值由4个部分组成,我们用尖括号 < > 包起来: 这里我们要配置的不就是原理图中:GPIO1_A0_u
配置中 1 详解
- 含义:GPIO 组号 或 Bank Number。
- 解析:Rockchip SoC 的 GPIO 被分为多个组,例如 GPIO0, GPIO1, GPIO2, GPIO3, GPIO4。这里的 1 指的就是 GPIO1 这个组。
RK_PA0详解
- 含义:GPIO 引脚号 within the bank。
解析:这是一个宏,它定义了在 GPIO1 组中的具体哪个引脚。RK3568 的每个 GPIO 组通常有 32 个引脚(A0-A7, B0-B7, C0-C7, D0-D7)。
- RK_PA0 通常表示 GPIO1_A0,即 GPIO1 组的第 0 个引脚。
- 例如,RK_PB3 就表示 GPIO1_B3。
RK_FUNC_GPIO详解
RK_FUNC_GPIO
-
含义:引脚复用功能。
-
解析:这个参数设置引脚的复用模式。RK_FUNC_GPIO 是一个特定的值,它告诉 SoC 将这个引脚配置为普通的 GPIO 功能。
-
选择 RK_FUNC_GPIO 意味着这个引脚将由内核的 GPIO 子系统来控制,你可以通过标准 GPIO - 接口将其设置为输入或输出模式,并读取或写入电平。
&pcfg_pull_none 详解
-
含义:引脚的电气属性配置。
-
解析:这是一个 phandle(指向另一个节点的句柄),它引用了一个预定义的电气配置。
-
pcfg_pull_none:表示不启用内部的上拉或下拉电阻。
其他常见选项:
&pcfg_pull_up:启用内部上拉电阻。
&pcfg_pull_down:启用内部下拉电阻。
&pcfg_pull_bias_disable:另一种表示禁用上下拉的方式。
这些预定义配置通常在 include/dt-bindings/pinctrl/rockchip.h 或类似的平台头文件中定义。
总结
- 最基本的,学会看原理图,找到对应pin 脚 复用
- 添加和修改一个节点知道怎么配置,如何修改,参数要搞明白。
- 复用功能是最基本的需求起点,先搞清楚复用如何配置,其实就是准备环境先。
1587

被折叠的 条评论
为什么被折叠?



