也在看串口这块的东西,觉得16550其实跟6410/2440是一个道理,分MDD+PDD层,PDD层实现MDD要调用的接口函数.获取成功(其实就是HW_VTBL函数表)MDD就可以通过这个PDD接口访问PDD层的底层硬件了(也就是些SFR操作),对于6410/2440就是那些UART的SFR了,对于你说的16550估计在整个系统内存空间也占有(或者映射)了一片地址,16550内部的SFR也可以通过访问这片内存地址来访问,觉得道理是一样的.不过MDD跟PDD层的几个有继承关系的类应该好好把握,因为很多很多接口都是虚函数实现而虚函数带来了灵活但给我们的理解带来了困难.子类重载了父类的虚函数调用的时候具体应该调那一个.
觉得理顺层次关系很重要!!!
1>class CPdd6410Uart: public CSerialPDD, public CMiniThread
2>class CPdd16550 : public CSerialPDD, public CMiniThread
class CPdd6410Uart跟class CPdd16550 的角色跟地位是一个样!!!
下面的代码应该就是事件跟中断号的绑定代码!!!!
BOOL CPdd6410Uart::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)
{
InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0);
}
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,PC_REG_SERIALWATERMARKER_VAL_LEN))
{
m_dwWaterMark = 8;
}
if (!GetRegValue(PC_REG_6410UART_IST_TIMEOUTS_VAL_NAME,(PBYTE)&m_dwISTTimeout, PC_REG_6410UART_IST_TIMEOUTS_VAL_LEN))
{
m_dwISTTimeout = INFINITE;
}
if (!GetRegValue(PC_REG_6410UART_MEM_LENGTH_VAL_NAME, (PBYTE)&m_dwMemLen, PC_REG_6410UART_MEM_LENGTH_VAL_LEN))
{
m_dwMemLen = 0x40;
}
if (!MapHardware() || !CreateHardwareAccess())
{
return FALSE;
}
return TRUE;
}
return FALSE;
}
复制代码
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 != SYSINTR_UNDEFINED && m_dwSysIntr!=0 )
m_hISTEvent= CreateEvent(0,FALSE,FALSE,NULL);
if (m_hISTEvent!=NULL) {
if (!InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0)) {
m_dwSysIntr = SYSINTR_UNDEFINED ;
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;
}
复制代码