//设置Key配置寄存器地址
unsigned long *lpKeyConfigAddr = ioremap(0x11000000+ 0x0C60,sizeof(long));
//获取EXT_INT43CON寄存器地址
unsigned long *lpExtConfigAddr = ioremap(0x11000000+ 0x0E0C,sizeof(long));
//获取EXT_INT43MASK寄存器地址
unsigned long *lpExtMaskgAddr = ioremap(0x11000000+ 0x0F0C,sizeof(long));
//获取EXT_INT43PEDN寄存器地址
unsigned long *lpExtPendAddr = ioremap(0x11000000+ 0x0F4C,sizeof(long));
//获得当前key1配置寄存器的值
unsigned long configData = ioread32(lpKeyConfigAddr);
//获得当前EXT_INT43CON配置寄存器的值
unsigned long ExtconfigData = ioread32(lpExtConfigAddr);
//获得当前EXT_INT43MASK配置寄存器的值
unsigned long ExtMaskData = ioread32(lpExtMaskgAddr);
//获得当前EXT_INT43PEDN配置寄存器的值
unsigned long ExtPendData = ioread32(lpExtPendAddr);
//将读取前的值输出
printk("old configData = %lX\n",configData);
printk("old ExtconfigData = %lX\n",ExtconfigData);
printk("old ExtMaskData = %lX\n",ExtMaskData);
printk("old ExtPendData = %lX\n",ExtPendData);
//配置Key1为中断引脚
configData |= 0xF00;
iowrite32(configData,lpKeyConfigAddr);
//设置EXT_INT43CON成0x2下触发
ExtconfigData &= ~(0xF<<8);
ExtconfigData |= 0x2<<8;
iowrite32(ExtconfigData,lpExtConfigAddr);
//设置EXT_INT43MASK第3位为0,不屏蔽中断
ExtMaskData &= ~(1<<2);
iowrite32(ExtMaskData,lpExtMaskgAddr);
//设置EXT_INT43PEDN中断屏蔽中断为0,禁止屏蔽
ExtPendData |= (1<<2);
iowrite32(ExtMaskData,lpExtPendAddr);
//将修改后的值输出
printk("new configData = %lX\n",configData);
printk("new ExtconfigData = %lX\n",ExtconfigData);
printk("new ExtMaskData = %lX\n",ExtMaskData);
printk("new ExtPendData = %lX\n",ExtPendData);
//注册中断号
static int noused = 1;
//这里一直注册中断失败返回 -22;
nRet = request_irq(64,irq_KeyDownHandler,IRQF_SHARED,"leddev",&noused);
if (nRet == 0)
{
printk("request 64 irq success\n");
free_irq(43,NULL);
}
else if (nRet == -EBUSY)
{
printk("request 64 irq Occupy \n");
}
else
{
printk("request 64 irq error nRet = %d \n",nRet);
}
iounmap(lpExtPendAddr);
iounmap(lpExtMaskgAddr);
iounmap(lpKeyConfigAddr);
iounmap(lpExtConfigAddr);