Linux---Pinctrl子系统与GPIO子系统

本文详细解读了Linux内核中的Pinctrl子系统,包括其功能如pin信息获取、复用和电气特性设置,以及GPIO子系统的工作原理、关键API和OF函数的使用。同时介绍了sysfs中的操作方法。核心内容涉及设备树驱动和GPIO控制的底层实现。

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

一、Pinctrl子系统

pinctrl子系统主要完成工作:
1、获取设备树中 pin 信息
2、根据获取到的 pin 信息来设置 pin 的复用功能
3、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等
pinctrl子系统源码目录:drivers/pinctrl,主要涉及 2 个对象: pin controller、 client device。
前者提供服务:可以用它来复用引脚、配置引脚。
后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们
PinCtrl

driver_probe_device()
	really_probe()
		pinctrl_bind_pins()
			devm_pinctrl_get(dev);
			pinctrl_lookup_state(dev->pins->p,	PINCTRL_STATE_DEFAULT);
			pinctrl_lookup_state(dev->pins->p,	PINCTRL_STATE_INIT);
			pinctrl_select_state(dev->pins->p, dev->pins->default_state);
			pinctrl_select_state(dev->pins->p, dev->pins->init_state);
/*面朝大海0902*/

/面朝大海0902/

二、GPIO子系统

1、GPIO子系统主要工作及常见API

GPIO子系统主要是使用 GPIO 子系统的标准函数获得 GPIO、设置 GPIO 方向、读取/设置 GPIO 值。
源码目录:drivers/gpio,如下常涉及文件:
GPIO
GPIO常用API函数:
gpio api函数

2、GPIO 一般使用步骤:

1、 gpio_request 函数 //申请GPIO
int gpio_request(unsigned gpio, const char *label)
gpio:要申请的 gpio 标号,使用 of_get_named_gpio 函数从设备树获取指定 GPIO 属性信息,此函数会返回这个 GPIO 的标号。
label:给 gpio 设置个名字。
返回值: 0,申请成功;其他值,申请失败。

2、gpio_direction_input 函数/gpio_direction_output 函数 //设置GPIO方向
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)

3、gpio_get_value 函数/gpio_set_value 函数 //get或set gpio值
#define gpio_get_value __gpio_get_value
int __gpio_get_value(unsigned gpio)

#define gpio_set_value __gpio_set_value
void __gpio_set_value(unsigned gpio, int value)

4、gpio_free 函数 //释放GPIO
void gpio_free(unsigned gpio)
/面朝大海0902/

3、与 gpio 相关的 OF 函数

1、int of_gpio_named_count(struct device_node *np, const char *propname)
np:设备节点。
propname:要统计的 GPIO 属性。
返回值: 正值,统计到的 GPIO 数量;负值,失败。

2、int of_gpio_count(struct device_node *np)
此函数统计的是“gpios”这个属性的 GPIO 数量
np:设备节点。
返回值: 正值,统计到的 GPIO 数量;负值,失败

3、int of_get_named_gpio(struct device_node *np,const char *propname,int index)
此函数获取 GPIO 编号
np:设备节点。
propname:包含要获取 GPIO 信息的属性名。
index: GPIO 索引,因为一个属性里面可能包含多个 GPIO,此参数指定要获取哪个 GPIO的编号,如果只有一个 GPIO 信息的话此参数为 0。
返回值: 正值,获取到的 GPIO 编号;负值,失败。
/面朝大海0902/

4、sysfs 中的访问方法

节点目录:/sys/class/gpio
对于输出引脚,假设引脚号为 N,可以用下面的方法设置它的值为 1

echo N > /sys/class/gpio/export
echo out > /sys/class/gpio/gpioN/direction
echo 1 > /sys/class/gpio/gpioN/value
echo N > /sys/class/gpio/unexport
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值