#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中引用了什么?
答案 0 :(得分:1)
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
,因此对该函数的任何调用都可能通过该函数指针。