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

时间:2017-01-30 15:59:35

标签: c linux-kernel linux-device-driver gpio

我正在调动司机。并且有这些类型的陈述:

foreach()

我已经阅读了devres,但我还是不明白究竟会有什么回报?

我知道/* Get the interrupt GPIO pin number */ gpiod = devm_gpiod_get_optional(dev, GOODIX_GPIO_INT_NAME, GPIOD_IN); 会返回gpiod_direction_output。但似乎struct gpio_desc的情况并非如此,因为我已经尝试按照每个示例打印devm_gpiod_get_optional,但我收到gpiod->label错误。

那么如果dereferencing pointer to incomplete type 'struct gpio_desc'不是gpiod那么呢?

这些包括:

stuct gpio_desc

2 个答案:

答案 0 :(得分:1)

  

那么如果gpiod不是stuct gpio_desc那么呢?

看起来,您正在将带有指针的struct对象混淆到struct对象。 gpiod对象的类型是后者,struct gpio_desc *

API使用opaque pointer struct encapsulation 的常用方案。

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

典型的代码布局可能如下所示(代码只是说明性的):

头文件:

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);

这个想法是消费者不需要或/并且它不应该知道结构的内部。调用公共API函数可以涵盖所有操作。

答案 1 :(得分:1)

gpiod 也是 stuct gpio_desc 的指针。

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

您可以使用 struct gpio_device * gdev 结构访问GPIO号码,该结构是 struct gpio_desc 的成员。

struct gpio_desc {
  struct gpio_device *gdev;
};

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

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

请通过kerel的文档部分了解更多信息:

文档/ GPIO / consumer.txt
文档/ GPIO / board.txt