02-[Linux][GPIO] DTS配置和API接口解释说明

发布时间 2023-08-25 15:13:36作者: 596

1、DTS配置说明

在DTS文件中,定义GPIO引脚,要以“-gpio”或者“-gpios”结尾,使用格式如下:
foo-gpio = <&pio 79 GPIO_ACTIVE_HIGH>;

  • pio:表示GPIO的控制器,该节点定义在其它dts文件中。
  • 79: GPIO的ID,表示GPIO的编号
    对于GPIO_ACTIVE_HIGH的属性值,需要重点介绍如下:
    该位有两种属性取值:GPIO_ACTIVE_HIGH和GPIO_ACTIVE_LOW。
#include <dt-bindings/gpio/gpio.h>

#define GPIO_ACTIVE_HIGH  0
#define GPIO_ACTIVE_LOW   1

GPIO_ACTIVE_HIGH表示高有效,GPIO_ACTIVE_LOW表示低有效。

2、DTS中的GPIO配置和代码使用说明

  • 基于描述符操作,需要包含如下头文件:
#include <linux/gpio/consumer.h>
  • 解析DTS并使能GPIO,同时配置为输入或者输出(支持输出高或低配置)
// 只定义一个GPIO时
struct gpio_desc *devm_gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags);

// 定义多个GPIO时,按索引获取GPIO信息
struct gpio_desc *devm_gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx, enum gpiod_flags flags);

举例如下:

foo_device {
    compatible = "acme,foo";
    ...
    led-gpios = <&pio 15 GPIO_ACTIVE_HIGH>, /* red */
                <&pio 16 GPIO_ACTIVE_HIGH>, /* green */
                <&pio 17 GPIO_ACTIVE_HIGH>; /* blue */
    power-gpio = <&pio 1 GPIO_ACTIVE_LOW>;
};

获取方法:

struct gpio_desc *red, *green, *blue, *power;
red = devm_gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = devm_gpiod_get_index(dev, "led", 1, GPIO_OUT_HIGH);
blue = devm_gpiod_get_index(dev, "led", 2, GPIO_OUT_HIGH);

power = devm_gpiod_get(dev, "power", GPIOD_IN);
  • 配置为输入模式
// 配置为输入模式,如果使用前面解析函数已经通过flag配置为输入的,则无需再调用
int gpiod_direction_input(struct gpio_desc *desc);
  • 配置为输出模式和默认电平
// 如果DTS配置的是高有效,当value为1时输出高电平;当value为0时输出低电平
// 如果DTS配置的是低有效,当value为1时输出低电平;当value为0时输出高电平
int gpiod_direction_output(struct gpio_desc *desc, int value);

// 不管DTS配置的是高有效还是低有效,value为1时输出高电平;value为0时输出低电平
int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
  • 输入模式时,获取外部电平是高还是低
// 如果DTS配置的是高有效,则高电平返回1,低电平返回0
// 如果DTS配置的是低有效,则高电平返回0,低电平返回1
int gpiod_get_value(const struct gpio_desc *desc);

// 不管DTS配置的是高有效还是低有效,高电平返回1,低电平返回0
int gpiod_get_raw_value(const struct gpio_desc *desc);
  • 输出模式时,设置外部电平是高还是低
// 如果DTS配置的是高有效,当value为1时输出高电平,当value为0时输出低电平
// 如果DTS配置的是低有效,当value为1时输出低电平,当value为0时输出高电平
void gpiod_set_raw_value(struct gpio_desc *desc, int value);