2014-10-28 141 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