pinctrl_dev
pinctrl_dev用于抽象一个pinctrl controller,其中包含pinctrl_desc用于描述具体的pinctrl controller。
pinctrl_desc
struct pinctrl_desc {
const char *name;
const struct pinctrl_pin_desc *pins;
unsigned int npins;
const struct pinctrl_ops *pctlops;
const struct pinmux_ops *pmxops;
const struct pinconf_ops *confops;
struct module *owner;
#ifdef CONFIG_GENERIC_PINCONF
unsigned int num_custom_params;
const struct pinconf_generic_params *custom_params;
const struct pin_config_item *custom_conf_items;
#endif
};
pinctrl_desc用于描述具体的pinctrl controller,包含四个重要结构体:pinctrl_pin_desc、pinctrl_ops、pinmux_ops、pinconf_ops。
pinctrl_pin_desc
描述系统中所有的pin,并建立索引。
pinctrl_ops
获取pin group的信息
pinconf_ops
提供操作集配置管脚属性。
pinmux_ops
提供复用操作
以上属于pinctrl control内容
dev_pin_info
设备节点一般会被转换为platform_device,或者其它结构体(比如i2c_client、spi_device),它们内部都会有一个struct device成员。
device结构体中包含dev_pin_info结构体,该结构体用于存储设备树中指定的pinctrl状态信息(default、sleep、init、idle),即设备树中的pinctrl-name。
struct pinctrl
struct pinctrl来描述一个client device的所有状态。其中又抽象了:
struct pinctrl_state描述client device的某一种状态;在设备节点中由pinctrl-names属性指定的列表中某一个元素;
struct pinctrl_setting描述client device处于某一种状态下其中一个"引脚配置";即pinctrl节点下子节点的配置信息
其中pinctrl_state中包含一个setting链表。
pinctrl_map
struct pinctrl_map它用于描述client device的映射配置,使用pin controller device的pinctrl_desc->ops->dt_node_to_map来处理设备树中的"引脚配置节点"。 pinctrl-0 = <&uart0_xfer &uart0_cts &uart0_rts>,uart0_xfer 、uart0_cts 、uart0_rts节点均会被dt_node_to_map函数解析为一系列的pinctrl_map