在fs2410开发板上矩阵键盘的硬件连接图如下:
连接矩阵键盘的8个IO口与核心板IO依次对应为:
行:EINT0 GPF0 EINT2 GPF2 EINT11 GPF3 EINT19 GPF11
列:KCAN0 GPE11 KCAN1 GPG6 KCAN2 GPE13 KCAN3 GPG2
分析驱动入口函数button_init();
/*
配置GPE,GPF,GPG的控制寄存器GPCON,和数据寄存器GPDAT,通过iremap()
得到相应的IO口的虚拟地址,查数据手册可得,0x04表示32为。
*/
gpecon = ioremap(0x56000040, 0x04);//得到相应IO口的虚拟地址,下同
gpedat = ioremap(0x56000044, 0x04);
gpfcon = ioremap(0x56000050, 0x04);
gpfdat = ioremap(0x56000054, 0x04);
gpgcon = ioremap(0x56000060, 0x04);
gpgdat = ioremap(0x56000064, 0x04);
/*初始化GPIO*/
static void init_gpio(void)
{
//将GPE13 11 设置低位
writel((readl(gpecon) |(~3<<(2*13)|(~3<<(2*11))) , gpecon); //GPE13,11 设置为输出
writel(readl(gpedat) & (~1<<13) |(~1<<11), gpedat); //GPE13,11 输出为0
//将GPG6, 2 设置低位
writel((readl(gpgcon) | (~(3<<(2*6)|(~3<<(2*2)))), gpgcon); //GPG6,2 设置为输出
writel(readl(gpgdat) & 0xffffffbb, gpgdat); //GPG6,2 输出为0
writel((readl(gpfcon) | 0x33) & 0xffffffee, gpfcon); //GPF2, 0 设置为中断
writel((readl(gpgcon) | (3 << 22) | (3 << 6)) & (~((1 << 22) | (1 << 6))), gpgcon); //GPG11,3 设置为中断
/*调用set_irq_type设置中断为下降沿中断*/
set_irq_type(IRQ_EINT0, IRQT_FALLING);
// printk("dddddddddddd=%x/n",EXTINT0);
EXTINT0 = (EXTINT0 & (~0x07)) + 0x02;
set_irq_type(IRQ_EINT2, IRQT_FALLING);
EXTINT0 = (EXTINT0 & (~(0x07 << 8))) + (0x02 << 8);
set_irq_type(IRQ_EINT11, IRQT_FALLING);
EXTINT1 = (EXTINT1 & (~(0x07 << 12))) + (0x02 << 12);
set_irq_type(IRQ_EINT19, IRQT_FALLING);
EXTINT2 = (EXTINT2 & (~(0x07 << 12))) + (0x02 << 12);
进入申请中断函数request_irq:
static int request_irqs()
{
int ret;
/*
IRQ_EINT0为中断号,button_irq为中断处理函数,SA_INTERUPT标志为快速中断方式,最后一个参数设为NULL.