06、设备树中 GPIO 相关属性(定义)
- 看原理图
- 改设备树
- 写设备树解析驱动
一、RK GPIO设备树节点
我们以设备树中的gpio使用为例:
rk3568.dtsi中:
tspi-rk3566-user-v10-linux.dts
二、gpio-controller(身份标识,BSP不需要定义)
GPIO控制器属性的作用是告诉系统:这个硬件模块负责管理一组GPIO引脚。
当设备节点添加了这个属性,就相当于告诉系统:
- 这个硬件模块能控制哪些具体的GPIO引脚
- 它可以开关这些引脚,或者设置它们的工作模式(比如输入/输出)
其他设备需要使用某个GPIO功能时,就会通过这个控制器来操作对应的物理引脚。在设备树文件里加上这个标记,能让操作系统快速找到正确的GPIO管理模块,从而准确控制所有相关引脚的开关和配置。
三、#gpio-cells(不需要更改)
#gpio-cells 属性的作用是说明描述一个GPIO引脚需要多少个数字参数。它的数值通常设置为2,表示需要两个数字来定义一个GPIO引脚的信息——比如第一个数字代表引脚编号,第二个数字代表引脚功能(如输入/输出设置)。
在第一小节的示例中有 1 个 gpio 引脚描述属性,由于#gpio-cells 属性被设置为了 2,所以每个引脚描述属性中会有两个整数,具体内容如下所示:
RK_PC5、GPIO_ACTIVE_HIGH都属于宏定义,会在下面的小节进行讲解。
通过使用#gpio-cells 属性,设备树可以指定 GPIO 引脚描述符的编码方式,使系统能够正确识别和解析 GPIO 引脚的配置和控制
四、gpio-ranges(不需要更改)
GPIO-ranges属性是设备树里用来简化GPIO引脚管理的一个工具。它的作用就像给GPIO控制器的引脚编号做翻译,让硬件和软件能用统一的方式来"认同一根引脚"。
想象一下:GPIO芯片内部有自己的引脚编号(比如从0开始),但实际电路板上的物理引脚可能标着不同的编号。这时候,gpio-ranges就派上用场了。它用三组数字告诉系统:
- 外部电路板的起始编号(比如0)
- 芯片内部的起始编号(比如0)
- 需要映射的引脚数量(比如32)
举个例子,属性值<&pinctrl 0 0 32>的含义是:
- 引脚控制器pinctrl的0号内部引脚
- 对应到外部电路板的0号物理引脚
- 这样连续对应32个引脚
这样设置后,程序员只需要用外部编号就能直接操作GPIO,不需要手动计算内部编号,就像给引脚贴上了所有人都能看懂的标签。
五、gpio 引脚描述属性
设备树中GPIO引脚的描述方式由两个关键点决定:
- 属性数量由 #gpio-cells 确定 gpio0节点设置的 #gpio-cells=2,说明每个GPIO引脚需要2个参数来描述。就像手机号码需要11位数字一样,这里的两个参数分别是引脚编号和控制选项。
- 引脚编号的转换 RK_PB6 是预定义的宏(在 rockchip.h 文件中),它把开发板上的物理引脚名称(如PB6)转换成系统能识别的GPIO编号,这样写设备树时可以直接用RK_PB6代替具体数字。
- 电平状态设置 GPIO_ACTIVE_LOW 和 GPIO_ACTIVE_HIGH 是两个控制选项(定义在 gpio.h 中):
- LOW 表示该GPIO默认用低电平有效
- HIGH 表示默认用高电平有效 这两个选项只是设备树的"描述性说明",实际电平设置需要驱动程序配合才能生效,就像菜单上的选项需要厨师来执行一样。
总结:每个GPIO描述由 "引脚编号 + 控制选项" 组成,编号通过宏转换,控制选项说明电平状态,具体实现由驱动完成。