Linux内核之pinctrl子系统

众所周知,ARM SoC提供了十分丰富的硬件接口,而接口物理上的表现就是一个个的pin(或者叫做pad, finger等)。为了实现丰富的硬件功能,SoC的pin需要实现复用功能,即单独的pin需要提供不同功能,例如,pin0既可以作为GPIO,可以也用于i2c的SCL,通过pin相关的复用寄存器来切换不同的功能。除此之外,软件还可以通过寄存器配置pin相关的电气特性,例如,上拉/下拉、驱动能力、开漏等。

Linux kernel 3.0之前的内核,对于pin的功能配置都是通过目标板的配置文件(arch/arm/mach-*)来初始化的,这种配置方式比较繁琐,十分容易出现问题(例如,pin的功能配置冲突)。所以,Linux kernel 3.0之后,实现了DT的板级配置信息管理机制,大大改善了对于pin的配置方式,随之一起实现的就是pinctrl子系统。

pinctrl子系统主要负责以下功能:

  1. 枚举、命名通过板级DTS配置的所有pin;
  2. 对于pin实现复用功能;
  3. 配置pin的电器特性,例如,上拉/下拉、驱动能力、开漏等。;

可见,pinctrl子系统地位相当于kernel全局的pin管理中心,kernel中所有需要pin资源的驱动、子系统都需要通过pinctrl子系统来申请、配置、释放。可将对于pin的操作来说,pinctrl子系统十分重要的。

软件框架

对于不同的SoC,其对于pin管理方式可能不同,所以软件上对于pin的配置方式可能存在较大的差异。对此,pinctrl子系统"求同存异",将pin的管理方式进行了抽象,形成pinctrl-core抽象层,将具体SoC的pin controler隔离出去,形成pinctrl-driver抽象层,pinctrl-core和pinctrl-driver通过抽象接口进行通信。对于pinctrl-core的back-end,即各个需要用到pin的驱动,pinctrl子系统将其抽象为pinctrl-client。

通过上面的软件抽象,pinctrl子系统可以很好的应对不同的SoC pin controler的管理需求,同样可以很好的为不同需要的驱动程序提供pin操作服务。下图简单示意一下pinctrl子系统的软件架构。

通过观察pinctrl子系统的软件框架图,可以发现一个问题,那就是GPIO子系统与pinctrl子系统的关系。理论上,GPIO子系统作为pinctrl子系统的使用者,其地位应该和普通的设备驱动没有差别,但是由于以下原因导致GPIO子系统与pinctrl子系统的功能出现了耦合:

早在kernel 3.0之前,GPIO子系统就已经出现了,其功能也比较明确,就是管理pin的GPIO功能;
pinctrl子系统以及DT机制出现之后,由于GPIO管理的特殊性,并没有将GPIO子系统合并到pinctrl子系统中,而是在pinctrl子系统为GPIO子系统保留了特殊的访问通道,已达到GPIO子系统访问pin的需求。

pinctrl-core

pinctrl-core抽象层主要的功能就是提供三种服务:

  1. 为SoC pin controler drvier提供底层通信接口的能力;
  2. 为Driver提供访问pin的能力,即driver配置pin复用能、配置引脚的电气特性;
  3. 为GPIO子系统提供GPIO访问的能力;

对于第一种服务来说,其实&#x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值