我正在调动司机。并且有这些类型的陈述:
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
答案 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;
}
// 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