首先看一下pinctrl driver的描述符struct pinctrl_desc结构体的定义:
struct pinctrl_desc {
const char *name;---本控制器名称
struct pinctrl_pin_desc const *pins;---本控制器所控制的所有pins的数组
unsigned int npins;---pins数组中元素的个数
const struct pinctrl_ops *pctlops;---pin control全局函数表
const struct pinmux_ops *pmxops;---pinmux操作函数表
const struct pinconf_ops *confops;---pin config操作函数表
struct module *owner;
};
创建一个pinctrl驱动就需要创建一个pinctrl_desc对象。一个pinctrl driver需要管理一堆pins,这些pins就是pinctrl_desc结构体中的pins数组,pins中每一个pin的元素类型为struct pinctrl_pin_desc,定义如下:
struct pinctrl_pin_desc {
unsigned number;
const char *name;
void *drv_data;
};
number用于描述该引脚的编号,name描述引脚名称,drv_data是pinctrl驱动自定义的数据,pinctrl sub system不会理会这个数据。
struct pinctrl_ops中各个callback函数的具体的解释如下:
1、get_groups_count:该pin controller支持多少个pin group。pin group的定义可以参考本文关于pin controller的功能规格中的描述。注意不要把pin group和IO port的硬件分组搞混了。例如:S3C2416有138个I/O 端口,分成11组,分别是gpa~gpl,这个组并不叫pin group,而是叫做pin bank。pin group是和特定功能(例如SPI、I2C)相关的一组pin。
2、get_group_name:给定一个selector(index),获取指定pin group的name
3、get_group_pins:给定一个selector(index),获取该pin group中pin的信息(该pin group包括多少个pin,每个pin的ID是什么)
4、pin_dbg_show debug:fs的callback接口
5、dt_node_to_map:分析一个pin configuration node并把分析的结果保存成mapping table entry,每一个entry表示一个setting(一个功能复用设定,或者电气特性设定)
6、dt_free_map:dt_node_to_map函数的逆函数
复用引脚相关的操作函数的具体解释如下:
1、request:pin control core进行具体的复用设定之前需要调用该函数,主要是用来请底层的driver判断某个引脚的复用设定是否是可行的。
2、free:是request的逆函数。调用request函数请求占用了某些pin的资源,调用free可以释放这些资源。
3、get_functions_count:获取pin controller支持的function的数目
4、get_function_name:给定一个selector(index),获取指定function的name
5、get_function_groups:给定一个selector(index),获取指定function的pin groups信息
6、set_mux:使能一个特定的mux function,使用一个给定的group selector
7、gpio_request_enable:申请并使能一个pin的GPIO功能
8、gpio_disable_free:释放pin并关闭pin的GPIO功能
9、gpio_set_direction:设置GPIO的方向
配置引脚的特性的struct pinconf_ops数据结构的各个成员定义如下:
1、pin_config_get:给定一个pin ID以及config type ID,获取该引脚上指定type的配置。
2、pin_config_set:设定一个指定pin的配置
3、pin_config_group_get:以pin group为单位,获取pin上的配置信息
4、pin_config_group_set:以pin group为单位,设定pin group的特性配置
一个pinctrl driver需要实现上面pinctrl_ops、pinmux_ops、pinconf_ops 接口函数。