GPIO 子系统重要概念
要操作 GPIO
引脚,先把所用到的引脚配置为 GPIO 功能,通过Pinctrl 子系统来实现。然后根据设置引脚方向(输入还是输出)、读取值 —— 获得电平状态,写入值—— 输出高低电平。
以前我们通过寄存器来操作 GPIO 引脚,即使LED 驱动程序,对于不同的板子它的代码也完全不同。
当BSP 工程师实现了GPIO 子系统后,我们就可以
- 在设备树里面指定GPIO 引脚。
- 在驱动代码中:使用GPIO 子系统的标准函数获得 GPIO 、设置GPIO 方向、读取/设置GPIO 的值。
这样的驱动代码,将与单板无关。
设备树中指定引脚
几乎在所有的ARM 芯片中,GPIO 都分为几组,每组若干个引脚,所以在使用GPIO 子系统之前,我们就要确定它是哪组的,组里的哪一个的。
在设备树中, GPIO 组就是一个 GPIO Controller
,这通常都由芯片厂家设置好,我们要做的是找到它的名字,比如gpio1,然后指定要用它里面的那个引脚,比如 <&gpio1 0>。
下图是一些芯片的 GPIO 控制器节点,他们一般都是厂家定义好,在xxx.dtsi
文件中
我们暂时需要关心的属性有2个
gpio-controller;
#gpio-cells=<2>;
gpio-controller
表示这个节点是一个GPIO Controller
,它下面有很多引脚。#gpio-cells=<2>
表示这个控制器下每一个引脚要用2个32位的数字(cell)来描述。
为什么要用 2 个数?其实使用多个 cell 来描述一个引脚,这是 GPIO Controller 自己决定的。比如可以用其中一个 cell 来表示那是哪一个引脚,用另一个 cell 来表示它是