#define GPIO_CHIP(_bank) { \
.irq_base = IRQ_GPIO_BASE_ ## _bank, \
.gpio_chip = { \
.label = "Bank " # _bank, \
.owner = THIS_MODULE, \
.set = gpio_set_value, \
.get = gpio_get_value, \
.direction_output =gpio_direction_output, \
.direction_input = gpio_direction_input, \
.base = GPIO_BASE_ ## _bank, \
.ngpio =GPIO_NUM_ ## _bank, \
}, \
}
用 .label 和 .set 等定义的是什么?
static void gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
{
uint32_t __iomem *reg = CHIP_TO_REG(chip, REG_GPIO_DATA_SET);
reg += !value;
writel(BIT(gpio), reg);
}
这个带有 writel, __iomen, BIT() 的函数,它们在 Linux 中是从哪里引用的?
最佳答案
GPIO_CHIP
用于初始化一组 GPIO(通用 I/O)的结构。如果你有
struct s {
int a, b, c;
char * d;
}
然后你可以像这样初始化一个变量
struct s example = { .a = 1, .b = 2, .c = 3, .d = "Hello!" };
你也可以这样做
struct s example = { 1, 2, 3, "Hello!" };
但在那种情况下,您需要跟踪结构成员的顺序,一目了然地看不到 1
、2
等. 实际上被用于,它很容易失去同步。
如果你需要像这样初始化很多变量,你可以使用一个#define
,它只是一个初始化器,比如
#define S_INIT(num) { .a = num, .b = 2, .c = 3 }
struct s example = S_INIT(0);
struct s examples[] = { S_INIT(1), S_INIT(2), S_INIT(3) };
GPIO_CHIP
将结构中的函数指针 .gpio_chip.set
设置为指向 gpio_set_value
,因此对该函数的任何调用都可能通过那个函数指针。
关于linux - 这是什么linux结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613049/