2014-10-28 131 views
1
#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和其他定义什么?这是什么linux结构

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?

回答

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,所以任何可能通过该函数指针调用该函数。

详情请咨询kernel documentation for the GPIO driver interface