1. 程式人生 > >Am335x GPio、按鍵函式\管腳配置

Am335x GPio、按鍵函式\管腳配置

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},