05、Pinctrl 子函数操作集
- 一、pinctrl_ops
- 二、pinctrl_ops
- 三、pinconf_ops
在 pinctrl_desc 结构体中总共有三个函数操作集, 具体内容如下所示:
const struct pinctrl_ops *pctlops; // 引脚控制操作函数指针
const struct pinmux_ops *pmxops; // 引脚复用操作函数指针
const struct pinconf_ops *confops; // 引脚配置操作函数指针
2
3
一、pinctrl_ops
pinctrl_ops 结构体定义在内核源码的“include/linux/pinctrl/pinctrl.h” 文件中, 具体内容如下所示:
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);
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);
void (*dt_free_map) (struct pinctrl_dev *pctldev,
struct pinctrl_map *map, unsigned num_maps);
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PinControl操作函数集合(pinctrl_ops)包含一组用于管理引脚控制器的核心功能,具体功能如下:
- 获取组数量:统计可用的引脚组总共有多少个
- 获取组名称:查询指定序号对应的引脚组名称
- 获取引脚列表:列出某个引脚组包含的所有具体引脚
- 调试信息输出:在系统调试时显示引脚状态信息
- 设备树映射创建:根据硬件描述文件(设备树)中的节点信息,生成对应的引脚控制映射关系
- 释放映射资源:清理之前创建的设备树引脚映射数据
这些功能主要用来配置和管理硬件引脚,比如通过设备树配置引脚功能,查询引脚组信息,以及在调试时查看引脚状态等基础操作。
二、pinmux_ops
pinmux_ops
结构体定义在内核源码的“linux/pinctrl/pinmux.h” 文件中, 具体内容如下所示:
struct pinmux_ops {
int (*request) (struct pinctrl_dev *pctldev, unsigned offset);
int (*free) (struct pinctrl_dev *pctldev, unsigned offset);
int (*get_functions_count) (struct pinctrl_dev *pctldev);
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 *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);
void (*gpio_disable_free) (struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range,
unsigned offset);
int (*gpio_set_direction) (struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range,
unsigned offset,
bool input);
bool strict;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
pinmux_ops结构体是用于管理芯片引脚复用功能的一组工具函数。它包含以下核心功能:
引脚申请与释放
- request():检查某个引脚是否能被设置为复用模式
- free():释放之前申请的引脚资源
功能信息获取
- get_functions_count():获取该控制器支持的复用功能总数
- get_function_name():根据编号获取对应功能名称
- get_function_groups():列出某个功能涉及的所有引脚组名称
功能控制
- set_mux():启用选定的复用功能
- gpio_request_enable():在指定引脚上启用GPIO功能
- gpio_disable_free():禁用并释放GPIO功能
GPIO方向控制
- gpio_set_direction():设置GPIO引脚为输入或输出模式
冲突检测
- strict:开关选项,决定是否禁止同一引脚同时作为GPIO和其他功能使用(true=禁止,false=允许)
这些函数相当于给芯片的引脚控制器提供了一套标准操作接口。驱动开发者需要根据硬件特性实现这些功能,系统核心则通过调用这些函数来:
- 申请/释放引脚资源
- 设置引脚的复用功能
- 控制GPIO的工作模式
- 管理引脚功能间的冲突检测
这种设计让不同芯片的引脚控制器可以统一通过这套接口与系统交互,既保证了功能标准化,又允许硬件实现的灵活性。
三、pinconf_ops
pinconf_ops 结构体定义在内核源码的“linux/pinctrl/pinconf.h” 文件中, 具体内容如下所示:
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);
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);
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pinconf_ops结构体定义了控制硬件引脚配置所需的各种操作函数。以下是各成员的简单说明:
is_generic
:布尔值(true或false),表示是否使用通用引脚配置方式。当系统配置中启用了CONFIG_GENERIC_PINCONF时可用。pin_config_get
:获取指定引脚的当前配置参数。pin_config_set
:设置指定引脚的配置参数。pin_config_group_get
:获取一组引脚的配置参数。pin_config_group_set
:设置一组引脚的配置参数。
调试相关函数: 6. pin_config_dbg_parse_modify
:调试用函数,解析并修改引脚配置参数。 7. pin_config_dbg_show
:显示单个引脚的配置信息(调试用途)。 8. pin_config_group_dbg_show
:显示一组引脚的配置信息(调试用途)。 9. pin_config_config_dbg_show
:详细显示引脚配置的具体参数(调试用途)。
这些函数都是驱动程序需要实现的接口,用于实际操作硬件引脚的配置。比如设置引脚方向、电平、上拉电阻等参数,或者批量操作多个引脚的配置。调试函数则帮助开发人员查看和调整配置状态。
四、函数操作集的具体实现
首先找到内核源码目录下的 “ /drivers/pinctrl/pinctrl-rockchip.c ” 文 件 , 在rockchip_pinctrl_register 函数中对三个函数操作集进行了填充, 具体内容如下所示:
ctrldesc->pctlops = &rockchip_pctrl_ops;
ctrldesc->pmxops = &rockchip_pmx_ops;
ctrldesc->confops = &rockchip_pinconf_ops;
2
3
接下来对每一个函数操作集的具体实现进行讲解。
pinctrl-rockchip.c