将原理图中的一个引脚复用为gpio功能

将主板原理图中的一个引脚标号复用为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.dtsirk3568-pinctrl.dtsirk3568-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 脚 复用
  • 添加和修改一个节点知道怎么配置,如何修改,参数要搞明白。
  • 复用功能是最基本的需求起点,先搞清楚复用如何配置,其实就是准备环境先。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野火少年

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值