pinctrl 子系统对应的硬件是芯片的 pinmux 设备,用来配置 pin 脚的复用功能和电气特性。
在 kernel 中将 pinmux 设备抽象成了 pinctrl 子系统,而这一系列的配置抽象成了设置 (pinctrl_setting)。
这个抽象不是面向 pin 脚的,而是面向一个状态(pinctrl_state)。
在一个状态下(default or sleep),对应了一个功能(function_desc),这个功能使用了一个或几个 pin 脚(pin_desc)或 group(group_desc),所以是下面一种关系:
而驱动开发者就是要根据这三个 desc 信息,来设置自己的 pinmux 设备。
大概的流程如下:
- 按照 pinctrl 给出的规则将 node 转换为 pinctrl_map
- pinctrl 将 pinctrl_map 转换为 pinctrl_setting
- 调用 pin_config_group_set 和 set_mux 设置 pinmux
- 在上面两个接口中,可以解析到三个 desc 信息,利用这些信息设置 pinmux
pinctrl_setting 组织成了下图的方式:
配置一个或一组的 pin 脚的所有信息都可以通过 group,func,group_or_pin(同 group),configs,num_configs 获取。这是如何实现的?
在实现我们自己的 pinctrl 子系统时, 要实现这样一种关系:通过 group 可以得到 group_desc,通过 func 可以得到 function_desc。就可以设置 pin 的 mux。
这就要求 group_desc 要组织成一种映射关系,什么方式都可以,pinctrl 提供的是 tree 的形式,我们也可使用数组的形式:即 group_desc 与 group 要一一对应。同样的, function_desc 和 pin_desc 也是同样的组织方式。function_desc 与 func 一一对应。pin_desc 与 group_or_pin 一一对应。
具体怎么解析和使用这些 desc 信息和 configs 就要看具体的硬件了。