|
请Paul_Chao 大侠帮忙看看!!急!还是关于2416的中断!!!!!
[复制链接]
1. 印象中, 中断与 DeviceArrayIndex 无关.
2. "COM4:", 则请 LZ 加入 Index=dword:4(not DeviceArrayIndex=dword:4),
不然它有可能会变成 "COM1:" or "COM2:"...
3. "SysIntr"=dword:XYZ-0x10, 须请 LZ 在 oal 中的 BSPIntrInit 加入
类似OALIntrStaticTranslate(SYSINTR_UART4, IRQ_EINT3);
的指令, 并在 bsp_cfg.h 中加入 #define SYSINTR_UART4 (SYSINTR_FIRMWARE+XYZ)
4. EINT3 的 GPIO 设定, 请自行设好.
To Paul_Chao:
您在我的上个帖子中回复如上,现在小弟还是有些疑问:
1、我的串口驱动芯片16550需要用到一个外部中断EINT3
我参照BSP中的PowerButton驱动(该驱动用到EINT0)来看BSP中驱动的用法
发现:在PowerButton的HW_Init中先初始化了一下中断用到的GPIO0
然后
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_PwrButtonIrq, sizeof(UINT32), &g_PwrButtonSysIntr, sizeof(UINT32), NULL))
得到了一个系统中断号(这个号是不是随机的?)g_PwrButtonSysIntr
并跟事件绑定InterruptInitialize(g_PwrButtonSysIntr, pPWR->ISTEvent, 0, 0)以后就是做了IST处理
而物理中断号g_PwrButtonIrq在PowerButton驱动中是直接赋值为IRQ_EINT0
IRQ_EINT0在s3c2450_intr.h中#define IRQ_EINT0 0
也就是说驱动程序通过KernelIoControl直接把物理中断号0传进去得到了一个(随机)系统中断号
并在SMDK2416\Src\Common\Intr\intr.c中的ISR程序中做了相应处理 if (irq <= IRQ_ADC))...
其中(IRQ_ADC == 31),在这个过程中并没有通过OALIntrStaticTranslate函数转换一个中断号
那么我按照powerbutton的做法做可以吗??
2、在com16550的驱动中,我在注册表中:"IRQ"=dword:3 ,通过
regError = RegQueryValueEx(hKey, PC_REG_IRQ_VAL_NAME, NULL, NULL,(LPBYTE)(&pHWHead->dwSysIntr),&dwDataSize);
读到一个IRQ的ID(3)并传给pHWHead->dwSysIntr
这个IRD = 3 对应的是s3c2450_intr.h中#define IRQ_EINT3 3
对IRQ程序的处理依然在SMDK2416\Src\Common\Intr\intr.c中的if (irq <= IRQ_ADC))...
但是我看com16550的驱动中用到许多kernelIoControl并没有把这个物理中断号转换成一个系统中断号
用法:
KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &pHWHead->dwSysIntr, sizeof(pHWHead->dwSysIntr), NULL, 0, NULL);
KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &pHWHead->dwSysIntr, sizeof(pHWHead->dwSysIntr), NULL, 0, NULL);
同时,在驱动的其他地方赋值如下
pHWHead->pIsrInfoVirt->SysIntr=pHWHead->dwSysIntr;
pHWHead->pHWObj->dwIntID = pHWHead->dwSysIntr;
请问,我这里传进来一个物理中断号是不是不对啊???
在这个传口驱动中我应该怎么操作这个外部中断???
|
|