GPIO 引脚号转换为中断号: irq_num = gpio_to_irq(gpio_pin);
设置中断出发方式为下降沿触发 irq_set_irq_type(irq_num, IRQF_TRIGGER_FALLING);
申请中断: request_irq(irq_num, irq_proc, IRQF_DISABLED, GPIO_DEVICE_NAME, NULL);
linux/arch/arm/mach-omap2/board-am335xevm.c 文件中有计算公式:
先获得GPIO的pin number:
/* Convert GPIO signal to GPIO pin number */
#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
然后获得irq中断号:
irq = OMAP_GPIO_IRQ(pin_num)
其中pin_num=GPIO_TO_PIN(bank,gpio),比如GPIO1_7,pin_num=32*1+7=39, irq=160+39=199
Am335x 的GPIO驱动在 drivers/misc目录下
配置内核,使内核变为抢占式,将开发板带的按键驱动从配置中去掉(新写的驱动,在request_irq()中失败,打开proc/interrupts 发现按键驱动已被注册)
#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
int pin_val=GPIO_TO_PIN(2, 0);
ret=gpio_request(pin_val, “gpio_key”);
ret = gpio_direction_input(pin_val);
irq = gpio_to_irq( pin_val);
request_irq(irq, gpio_interupt, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, “gpio_2_0”, 0);
tatic struct pinmux_config d_can0_pin_mux[] = {
{“uart0_rxd.d_can0_tx”, OMAP_MUX_MODE2 | AM33XX_PULL_ENBL},
{“uart0_txd.d_can0_rx”, OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP},
{NULL, 0},};
setup_pin_mux(d_can0_pin_mux);
用管脚配置工具得到如下配置:
0x90 ( PIN_INPUT | MUX_MODE7 ) /* (R7) gpmc_advn_ale.gpio2[2] */
0xa8 ( PIN_INPUT | MUX_MODE7 ) /* (R3) lcd_data2.gpio2[8] */
0xac ( PIN_INPUT | MUX_MODE7 ) /* (R4) lcd_data3.gpio2[9] */
0xe4 ( PIN_INPUT | MUX_MODE7 ) /* (R5) lcd_hsync.gpio2[23] */
0xec ( PIN_INPUT | MUX_MODE7 ) /* (R6) lcd_ac_bias_en.gpio2[25] */
在board-am335xevm.c 中,配置应该成
{“gpmc_advn_ale.gpio2_20”, OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{“lcd_data2.gpio2_8”,OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{“lcd_data3.gpio2_9”,OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{“lcd_hsync.gpio2_23”,OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{“lcd_ac_bias_en.gpio2_25”,OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},