将5350 i2c clk设置为gpio 中断模式的方法
5350和我之前用的三星和全志的芯片在中斷這塊有點差別,三星和全志的都是有專門的外部中斷管腳,并且每個中斷管腳對應一個中斷號,對管腳寄存器的配置即irq_desc里chip變量,都是bsp里自帶的,我們只需要用request_irq來注冊irqaction就可以了。
而5350所有的gpio共用一個中斷號6,所以想用哪個管腳都得自己配。有可能能用request_irq,但是驅動里已經有
setup_irq(SURFBOARDINT_GPIO,&ralink_gpio_irqaction);
所以我覺的還是在他這個基礎上改比較好
?
1.??在5350 中斷初始化的時候會調用ralink_gpio_init_irq函數
ralink_gpio_init_irq定義在driver/char/ralink_gpio.c
void __init ralink_gpio_init_irq(void)
{
??? setup_irq(SURFBOARDINT_GPIO,&ralink_gpio_irqaction);
}
這里已經調用了setup_irq函數來給irq_desc設置了irqaction,那么我們就不用再自己來用request_irq函數來設置irqaction了。
因為5350里所有的gpio中斷都共享了6號中斷,那么我們如果想讓哪個gpio產生中斷的話,需要自己來對相關的gpio進行配置。
2.?現在我們想讓i2c clk管腳配置為中斷模式的話,需要以下幾個步驟
1)?查看datasheet 第1.3節? pin sharing scheme
確定I2C_SCLK 為2號GPIO
?
?
2)?查看datasheet第3.4節 system control
將GPIOMODE寄存器的第0位設置為1,即將I2C設置為gpio模式。
代碼如下:
gpiotmp = le32_to_cpu(*(volatile u32 *)(RALINK_REG_GPIOMODE));
gpiotmp |= 0x1;
*(volatile u32 *)(RALINK_REG_GPIOMODE) = cpu_to_le32(gpiotmp);
3)?查看datasheet 第3.6節? interrupt controller
將INTENA寄存器的第6位設置為1,即使能PIO中斷。
代碼如下:
gpiotmp = le32_to_cpu(*(volatile u32*)(RALINK_REG_INTENA));
gpiotmp |= (0x01 << 6);
*(volatile u32 *)(RALINK_REG_INTENA) =cpu_to_le32(gpiotmp);
4)?查看datasheet 第3.10節? programmable I/O
將GPIO21_00_RENA和GPIO21_00_FENA這兩個寄存器的第2位設置為1,即2號GPIO的上升沿和下降沿的中斷使能。
代碼如下:
gpiotmp = le32_to_cpu(*(volatile u32*)(RALINK_REG_PIORENA));
gpiotmp |= (0x01 << 2);
*(volatile u32 *)(RALINK_REG_PIORENA) =cpu_to_le32(gpiotmp);
???
gpiotmp = le32_to_cpu(*(volatile u32*)(RALINK_REG_PIOFENA));
gpiotmp |= (0x01 << 2);
*(volatile u32 *)(RALINK_REG_PIOFENA) =cpu_to_le32(gpiotmp);
?
將GPIO21_00_DIR寄存器的第2位設置為0,即為輸入模式。
代碼如下
gpiotmp = le32_to_cpu(*(volatile u32*)(RALINK_REG_PIODIR));
gpiotmp &= ~cpu_to_le32(0x01<< 2);
*(volatile u32 *)(RALINK_REG_PIODIR) =cpu_to_le32(gpiotmp);
?
以上代碼都是放置在ralink_gpio_init函數中
3. 通過上面的設置,ralink_gpio_irq_handler這個中斷處理函數就可以被調用了。
總結
以上是生活随笔為你收集整理的将5350 i2c clk设置为gpio 中断模式的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asterisk文件目录
- 下一篇: 治理通货膨胀的措施有哪些?调整需求和供给