【Linux驱动】pinctrl 和 gpio子系统(二)—— 通过 pinctrl 和 gpio 子系统驱动LED

本文详细介绍了Linux内核中的GPIO子系统及其相关API,如of_get_named_gpio获取GPIO编号,gpio_direction_output和gpio_set_value控制GPIO引脚状态,以及如何在字符设备驱动中使用这些API进行GPIO操作。

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属性中包含了多个引脚

2、gpio_direction_out

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值