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

一、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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下Linux-4.9.88/drivers/pinctrl目录结构如下: - core.c:pinctrl核心代码,包括pinctrl设备的注册与注销、pin和pin group的获取、配置和释放等。 - pinctrl-utils.c:pinctrl工具函数,例如获取pin的名称、通过pin的名称获取pin等。 - pinmux.c:pinmux子系统代码,包括pinmux设备的注册与注销、pinmux的获取、配置和释放等。 - pinctrl-single.c:pinctrl单例驱动,用于不需要动态配置pin的平台。 - pinconf.c:pin配置子系统代码,包括pin配置设备的注册与注销、pin配置的获取、配置和释放等。 - pinconf-generic.c:pin配置的通用实现,处理通用的pin配置属性。 - pinconf-sunxi.c:Allwinner SoC的pin配置实现。 - pinconf-tegra.c:Nvidia Tegra SoC的pin配置实现。 - pinconf-intel.c:Intel SoC的pin配置实现。 - pinconf-mcp23s08.c:Microchip MCP23S08 GPIO扩展器的pin配置实现。 - pinconf-mcp23s17.c:Microchip MCP23S17 GPIO扩展器的pin配置实现。 - pinconf-mcp23s18.c:Microchip MCP23S18 GPIO扩展器的pin配置实现。 - pinconf-rza1.c:Renesas RZ/A1 SoC的pin配置实现。 - pinconf-rza2.c:Renesas RZ/A2 SoC的pin配置实现。 - pinconf-rza2-part1.c:Renesas RZ/A2M SoC的pin配置实现。 - pinconf-rza2-part2.c:Renesas RZ/A2H SoC的pin配置实现。 总体来说,pinctrl文件夹下的代码实现了pin、pinmux和pin配置子系统的功能,同时提供了一些通用和特定SoC的实现。这些代码是用于Linux内核中进行GPIO和pin控制的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值