|
今天看了一下优龙的外部串口ST16C2550驱动,发现一些不解的现象
在注册表有
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\S16550_A]
"SysIntr"=dword:00000012——这是系统中断
"Dll"="com16550.dll"
"Prefix"="COM"
"DeviceArrayIndex"=dword:0
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"
"Index"=dword:6
"Order"=dword:2
"irq"=dword:24——(16进制)物理中断对应#define IRQ_EINT8 36
"RegStride"=dword:2
"IoLen"=dword:100
"IOBase"=dword:08000000
"InterfaceType"=dword:0
"BusNumber"=dword:0
按照以前,一般是通过获得注册表物理中断,然后再申请系统中断的,可是我看里面的代码是直接获得系统中断,就开始操作中断了,那这个物理中断是如何和系统中断结合起来的?纳闷,知道的帮忙解答一下,3Q。
BOOL CPdd16550::Init()
{
if ( CSerialPDD::Init() && IsKeyOpened() && m_XmitFlushDone!=NULL) {
// IST Setup .
DDKISRINFO ddi;
if (GetIsrInfo(&ddi)!=ERROR_SUCCESS) {
return FALSE;
}
m_dwSysIntr = ddi.dwSysintr;------直接获得系统中断,咋回事?
if (m_dwSysIntr != MAXDWORD && m_dwSysIntr!=0 )
m_hISTEvent= CreateEvent(0,FALSE,FALSE,NULL);
if (m_hISTEvent!=NULL) {
if (!InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0)) {
m_dwSysIntr = MAXDWORD ;
return FALSE;
}
}
else
return FALSE;
// Get Device Index.
if (!GetRegValue(PC_REG_DEVINDEX_VAL_NAME, (PBYTE)&m_dwDevIndex, PC_REG_DEVINDEX_VAL_LEN)) {
m_dwDevIndex = 0;
}
if (!GetRegValue(PC_REG_SERIALWATERMARK_VAL_NAME,(PBYTE)&m_dwWaterMark,sizeof(DWORD))) {
m_dwWaterMark = 8;
}
if (!MapHardware() || !CreateHardwareAccess()) {
return FALSE;
}
return TRUE;
}
return FALSE;
}
|
|