一, 作用
1,引脚的枚举与命名
2,引脚复用
3,引脚的配置
二,使用示例
2.1,pincontroller设备树信息
pinctrl: pinctrl {
compatible = "rockchip,rk3399-pinctrl";
rockchip,grf = <&grf>;
rockchip,pmu = <&pmugrf>;
#address-cells = <0x2>;
#size-cells = <0x2>;
ranges;
......
i2c1 {
i2c1_xfer: i2c1-xfer {
rockchip,pins =
<4 2 RK_FUNC_1 &pcfg_pull_none>,
<4 1 RK_FUNC_1 &pcfg_pull_none>;
};
};
}
2.2 ,使用pincontroller设备树信息:在i2c节点里定义"pinctrl-names"、“pinctrl-0”
i2c1: i2c@ff110000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xff110000 0x0 0x1000>;
clocks = <&cru SCLK_I2C1>, <&cru PCLK_I2C1>;
clock-names = "i2c", "pclk";
interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH 0>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_xfer>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
三,重要的数据结构
3.1,pin controller 数据结构
在pincontroller 这边,一个pincontroller 用 pinctrl_dev 表示
pinctrl_desc 示例如下:
使用结构体pinctrl_pin_desc来描述一个引脚,一个pin controller有多个引脚:
使用pinctrl_ops来操作引脚,主要功能有二:
- 来取出某组的引脚:get_groups_count、get_group_pins
- 处理设备树中pin controller中的某个节点:dt_node_to_map,把device_node转换为一系列的pinctrl_map
引脚复用:
引脚的配置:
3.2,client 端数据结构
在设备树种,设备节点要么被转换为platform_device,或者其他结构体(比如i2c_client),但是里面都会有一个device结构体,比如:
每个device中,都有一个 dev_pin_info结构体,用来保存pinctrl 信息。当device引用pincontrl 中的某个节点时,这个节点会转化成一系列的pinctrl_map 和 pinctrl_setting
四,调试
在 /sys/kernel/debug/pinctrl/pinctrl 目录下,有以下信息:
cat pingroups : 获取引脚组的信息
cat pinmux-pins :引脚的复用信息
cat pinmux-functions : 支持该function的group
cat pins: 枚举引脚
cat pinconf-pins :引脚的配置