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 pointer,struct封装的常用方案。
消费者可以使用 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
我正在调试驱动程序。还有这些类型的语句:
/* 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 astuct gpio_desc
what is then?
看来,您将结构对象与指向结构对象的指针混淆了。 gpiod
对象的类型是后者,struct gpio_desc *
.
API使用了opaque pointer,struct封装的常用方案。
消费者可以使用 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