【发布时间】:2020-08-23 14:34:41
【问题描述】:
您好,我正在按照 Linux 设备驱动程序开发一书在 Linux 中编写驱动程序。示例代码如下:
struct my_gpios {
int reset_gpio;
int led_gpio;
};
static struct my_gpiosneeded_gpios = {
.reset_gpio = 47;
.led_gpio = 41;
};
static struct resource needed_resources[] = {
[0] = { /* The first memory region */
.start = JZ4740_UDC_BASE_ADDR,
.end = JZ4740_UDC_BASE_ADDR + 0x10000 - 1,
.flags = IORESOURCE_MEM,
.name = "mem1",
},
[1] = {
.start = JZ4740_UDC_BASE_ADDR2,Platform Device Drivers
[ 126 ]
.end = JZ4740_UDC_BASE_ADDR2 + 0x10000 -1,
.flags = IORESOURCE_MEM,
.name = "mem2",
},
};
static struct platform_devicemy_device = {
.name = "my-platform-device",
.id = 0,
.dev = {
.platform_data = &needed_gpios,
},
.resource = needed_resources,
.num_resources = ARRY_SIZE(needed_resources),
};
platform_device_register(&my_device);
我不明白static struct_gpiosneeded_gpios = {} 的语法含义以及为什么.reset_gpio 中有一个点。语法static struct [] = {[0]={}, [1]={}} 的含义是什么?
能否给我一个关于static struct {.a = VALUE, .b = VALUE,}; 的参考链接或关键字或示例?
【问题讨论】:
-
它只是为那些命名字段指定初始化值。
-
如果你还没有 C 的经验,你真的不应该编写设备驱动程序。为了你自己的利益,在开始内核编程之前,先做一些 C 用户空间开发的练习。
-
谢谢你的解释链接,当我阅读linux的驱动代码时,我看到许多奇怪的语法是“u32”,“__raw”,......我不明白他们为什么命名类型是“u32”或“__raw”的目的是什么。是否有任何标准或规则来命名内核中的变量、宏、类型……?在 linux 驱动程序中编写代码时我必须遵守什么 C 标准?
-
第 5 行有错字吗?我认为您缺少一个空格,它应该是
static struct my_gpios needed_gpios = {。然后它将定义一个名为needed_gpios、类型为struct my_gpios、存储持续时间为static的对象,并对其进行初始化,这一切都有意义。正如所写,这是一个语法错误。static struct platform_devicemy_device也是如此。
标签: c linux struct syntax linux-kernel