我的开发环境是s3c2450+wince5,需要用到EINT20做键盘中断,但是因为wince5
默认只支持64个物理中断,而且BSP用到的IRQ_LAST是EINT16。因为EINT4到EINT16
都有用处,想通过将EINT20移到64
以内并添加静态映射的方法就行不通了,只能用动态分配的方法,为此需要对BSP及WINCE
做一些调整。具体做法如下:
1、修改bsp中的s3c2450_intr.h:添加IRQ_EINT17到IRQ_EINT23的定义,将IRQ_LAST由
IRQ_EINT16改为IRQ_EINT23
2、动态分配中断的代码在platform/common/src/common/intr/base/map.c中
关于OAL_INTR_IRQ_MAXIMUM的定义是在platform/common/src/inc中,将它由64修改为72
,否则无法动态分配系统中断给超过64的物理中断。
关于此宏定义在bsp的inc目录中的oal_intr.h
也有定义,但是并没有使用。开始的时候我改的是BSP
下的不起作用,要注意不要改错地方。
3、将EINT20对应的GPG12设置为外部中断。
修改bsp的kernel/oal目录中的intr.c:在BSPIntrInit中添加将GPG12(EINT20)
设置为外部中断并使能中断的代码
注意在设置好GPGCON、GPGDAT、GPGUP后要调用OALIntrEnableIrqs。刚开始我是把GPG
引脚的设置放到设备驱动初始化中,也可以运行。不过放到BSPIntrint感觉更放心。
4、在设备驱动中按动态分配的方法分配IRQ_EINT20、关联事件、创建IST。
经过此改动,能够实现大于64
的物理中断动态分配,键盘程序运行正常。不过没有做其它测试了。