以前用的是Tiny210的开发板,在那个上面做过一个按键中断的驱动程序。现在在这个H3的开发板上照着以前的的驱动程序做一个按键的中断程序。
首先是硬件初始化,主要是配置相应的寄存器:
#define PL_CFG0_REG 0x01F02C00
#define PL_EINT_CFG0 0x01F02E00
#define PL_EINT_CTL 0x01F02E10
#define PL_EINT_STATUS 0x01F02E14
#define PL_EINT_DEB 0x01F02E18
//设置PL3为外部中断模式:
gpio_config = ioremap(PL_CFG0_REG,4);
data = readl(gpio_config);
data &= 0xffff0fff;
data |= 0x00006000;
writel(data,gpio_config);
//下降沿触发中断
gpio_config = ioremap(PL_EINT_CFG0,4);
data = readl(gpio_config);
data &= 0xffff0fff;
data |= 0x00001000;
writel(data,gpio_config);
//使能中断
gpio_config = ioremap(PL_EINT_CTL,4);
data = readl(gpio_config);
//data &= 0xFfffffff;
data |= 0x00000008;
writel(data,gpio_config);
然后是注册中断号:
//注册中断处理程序
/*IRQF_TRIGGER_FALLING:下降沿产生中断*/
/*IRQ_EINT16_31(中断号)查找文件路径: /arch/arm/mach-s5pv210/include/mach/irqs.h 中*/
//request_irq(gpio_to_irq(S5PV210_GPH2(0)),key_int,IRQF_TRIGGER_FALLING,"testkey",0);
//request_irq(gpio_to_irq(43),key_int,IRQF_TRIGGER_FALLING,"testkey",0);
//SUNXI_IRQ_EINTL IRQF_TRIGGER_LOW|IRQF_SHARED
val = request_irq(77,key_int,0,"testkey",NULL);
在这个注册中断号这里走了很多的弯路:
1、芯片引脚PL3的中断号不知道是多少,首先从芯片手册上查找,但是最后得出的结果是芯片PL这一组共用一个中断号,当时很不解,后来查找资料发现,PL这一组确实共用一个中断号,具体区分是哪个引脚的中断,有一个中断发生的寄存器,通过查看这个寄存器来判断是哪一个引脚发生的中断。从芯片手册上查到PL这一组的中断号是77,但是这个中断号和linux内核中的中断号是一样的吗?210开发板的时候,内核中的中断号的查找路径:
/*IRQ_EINT16_31(中断号)查找文件路径: /arch/arm/mach-s5pv210/include/mach/irqs.h 中*/
按照这个方式查找:
Z:\home\nanopi_h3\lichee\linux-3.4\arch\arm\mach-sunxi\include\mach\sun8i