pinctrl_desc函数操作集
文章目录
- pinctrl_desc函数操作集
- 操作集原型
- struct pinctrl_ops
- struct pinctrl_ops
- struct pinconf_ops
操作集原型
pinctrl_desc结构体中包含下列函数操作集
/* 引脚控制操作的虚拟函数表,用于支持引脚分组等全局概念,这是可选的 */
const struct pinctrl_ops *pctlops;
/* 引脚复用操作的虚拟函数表,如果驱动程序支持引脚复用 */
const struct pinmux_ops *pmxops;
/* 引脚配置操作的虚拟函数表,如果驱动程序支持引脚配置 */
const struct pinconf_ops *confops;
初始化 imx_pinctrl_desc时得知函数操作集为imx_pctrl_ops,imx_pmx_ops,imx_pinconf_ops
// 初始化 imx_pinctrl_desc
imx_pinctrl_desc->name = dev_name(&pdev->dev);
imx_pinctrl_desc->pins = info->pins;
imx_pinctrl_desc->npins = info->npins;
imx_pinctrl_desc->pctlops = &imx_pctrl_ops;
imx_pinctrl_desc->pmxops = &imx_pmx_ops;
imx_pinctrl_desc->confops = &imx_pinconf_ops;
imx_pinctrl_desc->owner = THIS_MODULE;
struct pinctrl_ops
pinctrl_ops
struct pinctrl_ops {
/* 获取已注册的总组数 */
int (*get_groups_count) (struct pinctrl_dev *pctldev);
/* 获取给定选择器的组名 */
const char *(*get_group_name) (struct pinctrl_dev *pctldev,
unsigned selector);
/* 获取给定选择器的引脚数组和数组大小 */
int (*get_group_pins) (struct pinctrl_dev *pctldev,
unsigned selector,
const unsigned **pins,
unsigned *num_pins);
/* 在debugfs中显示特定引脚的设备信息的可选调试显示钩子 */
void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file *s,
unsigned offset);
/* 解析设备树的“引脚配置节点”,并创建映射表项 */
int (*dt_node_to_map) (struct pinctrl_dev *pctldev,
struct device_node *np_config,
struct pinctrl_map **map, unsigned *num_maps);
/* 释放通过dt_node_to_map创建的映射表项 */
void (*dt_free_map) (struct pinctrl_dev *pctldev,
struct pinctrl_map *map, unsigned num_maps);
};
这是一个名为pinctrl_ops的结构体,它包含了一组函数指针成员。这些函数指针定义了一组操作,用于对引脚控制器进行配置和管理。下面是该结构体的成员及其功能的概括总结:
get_groups_count: 获取已注册的总组数。
get_group_name: 获取给定选择器的组名。
get_group_pins: 获取给定选择器的引脚数组和数组大小。
pin_dbg_show: 在debugfs中显示特定引脚的设备信息的可选调试显示钩子。
dt_node_to_map: 解析设备树的“引脚配置节点”,并创建映射表项。
dt_free_map: 释放通过dt_node_to_map创建的映射表项。
这些函数指针定义了与引脚控制器相关的操作,并提供了对引脚配置、设备信息显示等功能的支持。通过使用这些函数指针,可以在结构体外部实现这些操作的具体逻辑,并将其与引脚控制器相关联。
struct pinctrl_ops
pinctrl_ops
struct pinmux_ops {
/* pinmux操作,由支持引脚复用的引脚控制器驱动程序实现 */
int (*request) (struct pinctrl_dev pctldev, unsigned offset); / 请求特定引脚是否可用于复用 */
int (*free) (struct pinctrl_dev pctldev, unsigned offset); / request()回调的相反函数,释放已请求的引脚 */
int (*get_functions_count) (struct pinctrl_dev pctldev); / 返回此pinmux驱动程序中可选择的命名函数数量 */
const char *(*get_function_name) (struct pinctrl_dev pctldev, unsigned selector); / 返回复用选择器的函数名称,用于将特定设备映射到复用设置 */
int (*get_function_groups) (struct pinctrl_dev *pctldev, unsigned selector, const char * const *groups, unsigned * const num_groups);
/ 返回与特定函数选择器连接的一组组名(依次引用引脚) */
int (*set_mux) (struct pinctrl_dev pctldev, unsigned func_selector, unsigned group_selector); / 使用特定引脚组启用特定的复用功能 */
int (*gpio_request_enable) (struct pinctrl_dev *pctldev, struct pinctrl_gpio_range range, unsigned offset); / 在特定引脚上请求并启用GPIO */
void (*gpio_disable_free) (struct pinctrl_dev *pctldev, struct pinctrl_gpio_range range, unsigned offset); / 释放特定引脚上的GPIO复用 */
int (*gpio_set_direction) (struct pinctrl_dev *pctldev, struct pinctrl_gpio_range range, unsigned offset, bool input); /
由于控制器可能需要根据GPIO配置为输入或输出来进行不同的配置,因此可以实现方向选择器函数作为需要引脚复用的GPIO控制器的支持 */ };
这是一个名为pinmux_ops的结构体,它包含了一组函数指针成员。这些函数指针定义了一组操作,用于对引脚进行复用和配置。下面是该结构体的成员及其功能的概括总结:
request: 请求特定引脚是否可用于复用。
free: request() 回调的相反函数,释放已请求的引脚。
get_functions_count: 返回此pinmux驱动程序中可选择的命名函数数量。
get_function_name: 返回复用选择器的函数名称,用于将特定设备映射到复用设置。
get_function_groups: 返回与特定函数选择器连接的一组组名(依次引用引脚)。
set_mux: 使用特定引脚组启用特定的复用功能。
gpio_request_enable: 在特定引脚上请求并启用GPIO。
gpio_disable_free: 释放特定引脚上的GPIO复用。
gpio_set_direction: 由于控制器可能需要根据GPIO配置为输入或输出来进行不同的配置,因此可以实现方向选择器函数作为需要引脚复用的GPIO控制器的支持。
这些函数指针定义了与引脚复用和配置相关的操作,并提供了对引脚复用功能、GPIO请求和配置等功能的支持。通过使用这些函数指针,可以在结构体外部实现这些操作的具体逻辑,并将其与引脚控制器相关联。
struct pinconf_ops
pinconf_ops
struct pinconf_ops {
#ifdef CONFIG_GENERIC_PINCONF
bool is_generic; // 是否为通用的引脚配置
#endif
int (*pin_config_get) (struct pinctrl_dev *pctldev, // 获取特定引脚的配置
unsigned pin, // 引脚编号
unsigned long *config); // 配置信息
int (*pin_config_set) (struct pinctrl_dev *pctldev, // 配置单个引脚
unsigned pin, // 引脚编号
unsigned long *configs, // 配置信息数组
unsigned num_configs); // 配置信息数量
int (*pin_config_group_get) (struct pinctrl_dev *pctldev, // 获取整个引脚组的配置
unsigned selector, // 选择器
unsigned long *config); // 配置信息
int (*pin_config_group_set) (struct pinctrl_dev *pctldev, // 配置整个引脚组
unsigned selector, // 选择器
unsigned long *configs, // 配置信息数组
unsigned num_configs); // 配置信息数量
int (*pin_config_dbg_parse_modify) (struct pinctrl_dev *pctldev, // 调试时修改引脚配置
const char *arg, // 参数
unsigned long *config); // 配置信息
void (*pin_config_dbg_show) (struct pinctrl_dev *pctldev, // 调试时显示引脚信息
struct seq_file *s, // 序列文件
unsigned offset); // 偏移量
void (*pin_config_group_dbg_show) (struct pinctrl_dev *pctldev, // 调试时显示引脚组信息
struct seq_file *s, // 序列文件
unsigned selector); // 选择器
void (*pin_config_config_dbg_show) (struct pinctrl_dev *pctldev, // 调试时显示驱动程序的引脚配置参数
struct seq_file *s, // 序列文件
unsigned long config); // 配置信息
};
这是一个名为pinconf_ops的结构体,它包含了一组函数指针成员。这些函数指针定义了一组操作,用于对引脚的配置进行获取、设置和调试显示。下面是该结构体的成员及其功能的概括总结:
is_generic: 是否为通用的引脚配置(可选)。
pin_config_get: 获取特定引脚的配置。
pin_config_set: 配置单个引脚。
pin_config_group_get: 获取整个引脚组的配置。
pin_config_group_set: 配置整个引脚组。
pin_config_dbg_parse_modify: 调试时修改引脚配置。
pin_config_dbg_show: 调试时显示引脚信息。
pin_config_group_dbg_show: 调试时显示引脚组信息。
pin_config_config_dbg_show: 调试时显示驱动程序的引脚配置参数。
这些函数指针定义了与引脚配置相关的操作,并提供了对引脚配置的获取、设置和调试显示功能的支持。通过使用这些函数指针,可以在结构体外部实现这些操作的具体逻辑,并将其与引脚控制器相关联