重要结构步骤:
在设备树中添加信息
在驱动中调用系统提供的相关的函数
可参考官方文档
注意:pinctrl子系统不仅仅只是包括gpio,引入pinctrl最大的好处是标准化pin初始化。
1 pinctrl子系统提供给驱动的API接口
参考文档:doc "Documentation/driver-api/pinctl.rst"
2 使用pinctrl完成初始化的步骤
A:pinctrl设备树文件中,添加描述
B:设备树中添加引用
C:驱动中使用:
三步:获取一个pinctrl句柄,获取其中一个状态,选取其中一个状态设置
3 设备树中添加引用代码
&leds_test_node {
status = "okay";
pinctrl-names = "itop-leds1-on","itop-leds1-off";
pinctrl-0 = <&leds_gpios1_on>;
pinctrl-1 = <&leds_gpios1_off>;
};
4 驱动代码分析和测试
#include <linux/pinctrl/consumer.h>
xxx_probe(struct platform_device *pdev){
...
struct pinctrl *leds_pin_ctrl;
struct pinctrl_state *leds_state;
leds_pin_ctrl = devm_pinctrl_get(&pdev->dev); ---返回句柄
leds_state = pinctrl_lookup_state(leds_pin_ctrl,"itop-leds1-on"); ---获取状态
pinctrl_select_state(leds_pin_ctrl, leds_state); ---设置状态
devm_pinctrl_put(leds_pin_ctrl); ---释放句柄
}
GPIO子系统和设备树pinctrl子系统:GPIO在设备树中的写法、驱动中GPIO的调用、管脚设备树配置等等
PS:设备树的引入是为了节省代码,平台文件中,对应pin的管理是很糟糕的,在设备树中添加了pinctrl子系统;pinctrl和原来的GPIO子系统同时存在,大家先有这个概念。
文档
linux的GPIO系统官方文档:
Documentation/devicetree/bindings/gpio/gpio.txt
三星的GPIO系统官方文档:
Documentation/devicetree/bindings/gpio/gpio-samsung.txt
1.2 pinctrl文档
linux的pinctrl系统官方文档:
Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
三星的pinctrl系统官方文档:
Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt
源码文件:
dt-bindings/pinctrl/samsung.h
arch/arm/boot/dts/exynos4412-pinctrl.dtsi