pinctrl子系统的工作原理

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 就要看具体的硬件了。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值