目录
一、概述
暂时未实际应用过pinctrl,暂时是以理论基础来撰写改文档,如有错误后续会持续补充。
pinctrl主要是为了简化以及统一gpio的配置而产生。
pinctrl子系统的功能:
(1)管理系统中所有的可以控制的pin,在系统初始化的时候,枚举所有可以控制的pin,并标识这些pin。
(2)管理这些pin的复用(Multiplexing)。对于SOC而言,其引脚除了配置成普通的GPIO之外,若干个引脚还可以组成一个pin group,行程特定的功能。pin control subsystem要管理所有的pin group。
(3)配置这些pin的特性。例如使能或关闭引脚上的pull-up、pull-down电阻,配置引脚的driver strength。
对于pinctrl的背景可以参考文档linux内核中的GPIO系统之(1):软件框架,讲的比较清楚。
二、pinctrl的使用方法
pinctrl的使用主要包括两部分内容,一是dts配置,二是设备驱动中的使用。
dts配置:
pinctrl的背景可以参考文档linux内核中的GPIO系统之(1):软件框架,讲的比较清楚。
1. pinctrl-names/pinctrl-0/pinctrl-1 这些属性名字不能变,如果还有其他的配置则pinctrl-2 pinctrl-3以此类推
2. 一个pinctrl中可以有多个配置,用空格隔开;
3. 配置中,mux配置gpio的功能,有些gpio是可以复用成不同的功能; config用来配置gpio的一些配置如驱动能力,上拉下拉等;
驱动中的API:
devm_pinctrl_get() // 获取dev下得pinctrl配置
pinctrl_lookup_state() // 根据名字查找指定的pinctrl配置
pinctrl_select_state() //使能指定的配置
devm_pinctrl_put() //释放资源
同时需要注意:(以下的分析是基于高通SDM845代码,其他平台可以参考really_probe() → pinctrl_bind_pins() )
1. 如果在dts里面同时配置了default 状态的配置,在device probe之前内核就会默认配置一遍
2. 如果在dts里面同时配置了default 和init状态的配置,那么会配置init的配置,而不是default
三、 pinctrl原理以及驱动流程分析
与GPIO子系统的关系:
pinctrl也遵循linux的驱动模型,有设备节点以及设备驱动。
SDM845平台有两个pinctrl controller,参考sdm845-pinctrl.dtsi
一个是tlmm,另一个是pm8998_gpios(存在pmic上)
pm8998_gpios参考:pm8998.dtsi
如上图所知,每个pinctrl controller的dts设备节点都有一个对应的驱动。
tlmm的驱动 -》pinctrl-sdm845.c
pm8998_gpios的驱动 -》pinctrl-spmi-gpio.c
驱动中过程不详细的分析,主要有3个步骤:
1、 构造pinctrl以及gpiochip结构;struct pinctrl_desc / struct gpio_chip
2、 注册gpio子系统: gpiochip_add_data() / gpiochip_add_pin_range() / gpiochip_irqchip_add() 等
3、 注册pinctrl子系统: devm_pinctrl_register()
四、参考文档
文档 | 链接 |
Pinctrl子系统之一了解基础概念 | |
linux内核中的GPIO系统之(1):软件框架 | |
Pinctrl基础简介_简一商业-优快云博客_pinctrl
Pinctrl子系统之一了解基础概念_u012830148的博客-优快云博客_pinctrl
高通GPIO驱动(DTS方式)
高通GPIO驱动(DTS方式)https://www.bbsmax.com/A/E35p4W0y5v/