主题 : tiny4412 注册按键中单失败,返回值-22 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 104655
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2014-05-31
最后登录: 2016-10-24
楼主  发表于: 2016-09-29 11:05

 tiny4412 注册按键中单失败,返回值-22


    //设置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);