pinctrl 子系统一般用于快速配置引脚的复用,而gpio子系统一般用于配置引脚的初始状态,只有将一个引脚复用为普通的 GPIO 功能,而并非作为 USART 的 TXD、SPI 的 CS 或者是 I2C 的SDA等其他功能时,才会需要用到 gpio 子系统。
一、相关API介绍
Linux内核提供了获取 gpio 子系统相关属性的API,这些 API 的声明在 linux/of_gpio.h 文件
1、of_get_named_gpio
该函数用于获取 gpio 编号,gpio 编号可以看做是标识gpio引脚的一种方式,大部分gpio相关的API都要通过gpio编号来操作对应的引脚。上一篇文章已经在设备树中创建了一个 gpio-led 的节点,of_get_named_gpio 获取到的便是 led-gpio 属性的内容,返回的是一个引脚编号,用来代表引脚 GPIO1_IO03。
gpio-led {
pinctrl-names = "default"; // pinctrl 子系统
pinctrl-0 = <&pinctrl_gpio_leds>;
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>; // gpio 子系统
status = "okay";
};
of_get_named_gpio函数的声明如下:
/*
* @description 获取gpio引脚编号
* @param np 设备树节点
* @param propname gpio属性名(gpio子系统的属性名是自己拟定的)
* @param index gpio属性包含的引脚可以不止一个,对此需要通过索引来获取到指定引脚
* @return 返回gpio引脚编号(成功返回值大于0,失败返回值小于0)
*/
static inline int of_get_named_gpio(struct device_node *np,
const char *propname,
int index);
示例:
// 获取设备树节点
struct device_node* gpioNode = of_find_node_by_path("/gpio-led");
// 获取gpio属性
int gpioNum = of_get_named_gpio(gpioNode, "led-gpio", 0);
if (gpioNum < 0)
{
printk("gpio property fetch failed!\n");
return -1;
}
注意: gpio属性包含的引脚可以不止一个,若gpio属性中包含了多个引脚


本文详细介绍了Linux内核中的GPIO子系统及其相关API,如of_get_named_gpio获取GPIO编号,gpio_direction_output和gpio_set_value控制GPIO引脚状态,以及如何在字符设备驱动中使用这些API进行GPIO操作。
最低0.47元/天 解锁文章
—— 通过 pinctrl 和 gpio 子系统驱动LED&spm=1001.2101.3001.5002&articleId=134020421&d=1&t=3&u=16e503a68fe54c01a4cef2734b089c8f)
3052

被折叠的 条评论
为什么被折叠?



