Linux pinctrl子系统

Linux内核的pinctrl子系统用于统一管理SoC的pin控制器,实现引脚的功能配置和特性设置。它枚举并管理所有可控制的pin,处理引脚复用,以及配置引脚特性。pinctrl与DTS紧密关联,通过dts_to_map函数解析配置,并在设备驱动中使用devm_pinctrl_get等API进行操作。pinctrl与gpio子系统共同管理GPIO,确保pin的正确使用。在主控驱动中,需通过pinctrl_desc注册pinctrl子系统,并提供回调函数进行硬件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、pinctrl子系统介绍

在许多soc内部都包含有pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。在软件方面,为了统一各soc厂商的pin脚管理,Linux内核提供了pinctrl子系统。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。
 

二、函数介绍

主要API:devm_pinctrl_get、devm_pinctrl_lookup_state、pinctrl_select_state

/*
 struct devm_pinctrl_get() - Resource managed pinctrl_get()
 @dev:the device to obtain the handle for
 If there is a need to explicitly destroy the returned struct pinctrl, the returned struct pinctrl.
 devm_pinctrl_put() should be used, rather than plain pinctrl_put().
 */
struct pinctrl devm_pinctrl_get(struct device dev);//1.根据设备获取pin操作句柄

/*
 pinctrl_lookup_state() - retrieves a state handle from a pinctrl handle
 @p: the pinctrl handle to retrive the state from
 @name: the state to retrive
 */
struct pinctrl_state pinctrl_lookup_state(struct pinctrl p, const char name);//2.获取这个pin对应的pin_state

/*
 pinctrl_select_state() - select/activate/program a pinctrl state to HW
 @p: the pinctrl handle for the device that requests configuration
 @state: the state handle to select/activate/program
 */
int pinctrl_select_state(struct pinctrl p, struct pinctrl_state *state);//3.设置引脚为state

三、pinctrl子系统与DTS的关系

3.1.pinctrl的dts文件分析

device-node-name {

引用\[1\]: pinctrl子系统Linux内核中的一个框架,用于统一管理不同系统芯片的引脚控制和配置。在pinctrl子系统中,有一个主要的结构体struct pinctrl_dev,用于表示一个引脚控制器设备。一般系统只会有一个struct pinctrl_dev实例。通过调用pinctrl_register_pins函数,可以为每个引脚分配一个独立的struct pin_desc结构体,并进行相应的赋值。struct pin_desc是pinctrl子系统用来管理每个引脚的最小单元。 引用\[2\]: 在pinctrl子系统中,引脚控制器并不只有一个,而是可以有多个。在设备树中,含有pinctrl-names和pinctrl-0属性的节点会拥有一个struct pinctrl结构体。pinctrl-names和pinctrl-0属性中的内容指定了要控制的引脚。有时候会遇到多个pinctrl-names和pinctrl-0属性,可以通过这种方式来配置不同的引脚控制。 引用\[3\]: pinctrl子系统的目的是为了统一各种不同的系统芯片中的引脚管理。在ARM的各种SOC芯片中,一个引脚可以被复用为不同功能的引脚,例如GPIO、SPI、I2C、UART等。pinctrl子系统的引入正是为了解决这种复用问题,使得不同SOC厂商的引脚管理能够在Linux内核中得到统一。 #### 引用[.reference_title] - *1* *3* [Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)](https://blog.youkuaiyun.com/ZHONGkunjia/article/details/89873417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于LinuxPinctrl子系统框架源码分析](https://blog.youkuaiyun.com/qq_42017846/article/details/127795402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值