一文搞懂 | Linux pinctrl/gpio子系统

💡 原文中文,约12600字,阅读约需30分钟。
📝

内容提要

本文介绍了pinctrl子系统和gpio子系统在内核中的应用,包括引脚控制器的抽象、pin groups的功能实现、pin configuration的配置、pin mux的操作、pinctrl driver的信息收集,以及gpio子系统的GPIO控制器和引脚表示、设备树中的配置、gpio ranges的转换和pinctrl core的接口申请。

🎯

关键要点

  • pinctrl子系统和gpio子系统在内核中的应用非常广泛。
  • pinctrl使用struct pinctrl_desc来抽象引脚控制器,包含引脚描述、操作函数等信息。
  • pin groups用于将多个引脚组合在一起以实现特定功能。
  • pinctrl core通过struct pinctrl_ops提供获取pin groups信息的回调函数。
  • pin configuration封装了引脚的配置功能,使用struct pinconf_ops定义相关操作。
  • pin mux允许引脚配置为不同功能,使用struct pinmux_ops来抽象相关操作。
  • pinctrl driver通过pin map收集pin state信息,并在设备树中维护状态和映射表。
  • pinctrl controller驱动初始化时注册三类操作函数:pctlops、pmxops和confops。
  • GPIO子系统通过gpio_device和gpio_chip结构体来表示和控制GPIO引脚。
  • 设备树中定义GPIO控制器和引脚的分组,使用属性引用特定引脚。
  • GPIO子系统提供基于描述符和老式接口的两套操作函数,建议使用devm版本以自动管理资源。
  • pinctrl subsystem管理所有管脚,GPIO是其用途之一,GPIO操作需向pinctrl subsystem申请管脚。
  • pinctrl subsystem维护gpio number到pin number的映射,支持gpio的请求和方向设置。
➡️

继续阅读