在中断处理函数中,调用gpio_get_value/gpio_set_value()函数来获取/设置gpio端口的值,在这里简单分析一下内核的实现流程。
tmp = gpio_get_value(S5PV210_GPH2(0)); #define gpio_get_value __gpio_get_value int __gpio_get_value(unsigned gpio) { struct gpio_chip *chip; int value; chip = gpio_to_chip(gpio); ## { .base = (S5P_VA_GPIO + 0xC40), .config = &gpio_cfg_noint, .irq_base = IRQ_EINT(16), .chip = { .base = S5PV210_GPH2(0), .ngpio = S5PV210_GPIO_H2_NR, .label = "GPH2", .to_irq = samsung_gpiolib_to_irq, }, ## value = chip->get ? chip->get(chip, gpio - chip->base) : 0; //offset = gpio - chip->base trace_gpio_value(gpio, 1, value); return value; ## /**************************************************** chip->get()函数的内核实现 ****************************************************/ //drivers/gpio/gpio-plat-samsung.c void __init samsung_gpiolib_add_4bit_chips (structs 3c_gpio_chip *chip,int nr_chips) { for (; nr_chips > 0; nr_chips--, chip++) { samsung_gpiolib_add_4bit(chip); s3c_gpiolib_add(chip); } } void __init samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip) { chip->chip.direction_input = samsung_gpiolib_4bit_input; chip->chip.direction_output =