devres 函数返回的类型是什么?

What is the returned type by devres functions?

我正在调试驱动程序。还有这些类型的语句:

/* Get the interrupt GPIO pin number */
gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_INT_NAME, GPIOD_IN);

我读过 devres 但我仍然不明白 returns 到底是什么?

我知道 gpiod_direction_output returns 一个 struct gpio_desc。但是 devm_gpiod_get_optional 似乎不是这种情况,因为我尝试在每个示例中打印 gpiod->label,但出现 dereferencing pointer to incomplete type 'struct gpio_desc' 错误。

所以如果 gpiod 不是 stuct gpio_desc 那是什么?

这些包括:

#include <linux/kernel.h>
#include <linux/dmi.h>
#include <linux/firmware.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/input/mt.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/acpi.h>
#include <linux/of.h>
#include <asm/unaligned.h>

So if gpiod isn't a stuct gpio_desc what is then?

看来,您将结构对象与指向结构对象的指针混淆了。 gpiod对象的类型是后者,struct gpio_desc *.

API使用了opaque pointerstruct封装的常用方案

消费者可以使用 public 函数访问或修改结构,这些函数通过指针间接操作对象。禁止直接访问,因为它需要将结构的 定义 放置在消费者翻译单元中。

典型的代码布局可能如下所示(代码仅供说明):

头文件:

struct gpio_desc;

struct gpio_desc *create(void);
void modify(struct gpio_desc *);

源文件:

// include header file

struct gpio_desc
{
    int secret_field_1;
    int secret_field_2;
};

struct gpio_desc *create(void)
{
    return malloc(sizeof(struct gpio_desc));   // definition required here
}

void modify(struct gpio_desc *p)
{
    p->secret_field_1 = 100;                   // definition required here too
    p->secret_field_2 = 200;
}

API 消费者:

// include header file

struct gpio_desc *gpiod = create();
modify(gpiod);

想法是消费者不需要 or/and 它不应该知道结构的内部结构。通过调用 public API 函数涵盖所有操作。

gpiod 也是指向 stuct gpio_desc 的指针。

您可以从您的驱动程序源代码中验证相同的内容。所有内核驱动程序都已开始使用 gpiod_* API。如果您正在编写新驱动程序,则需要从 Kconfig 启用 GPIOLIB。

您可以使用 struct gpio_device *gdev 结构访问 GPIO 编号,该结构是 struct gpio_desc[=29= 的成员].

struct gpio_desc {
  struct gpio_device *gdev;
};

您需要通过ACPI、设备树或平台数据传递GPIO编号。 GPIO 映射在消费者设备的节点中定义,在 属性 命名的 -gpios,驱动程序将请求的功能在哪里 通过 gpiod_get()

irq-gpios = <&gpio 1 GPIO_ACTIVE_LOW>; //

请阅读 kerel 的文档部分以获得更多理解:

Documentation/gpio/consumer.txt
Documentation/gpio/board.txt