1 上周搞定在6410上的wince6.0的16550驱动。在注册表中增加串口信息,以下就是一个串口的注册表信息
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial4]
"DeviceArrayIndex"=dword:4
"Irq"=dword:40 ;
"MemBase"=dword:7F005C00
"MemLen"=dword:40
"ISTTimeouts"=dword:200 ; every 512 ticks checking Modem status.
"Prefix"="COM"
"Index"=dword:5
"Dll"="mycom16550.Dll"
"Order"=dword:30
"Port"="COM5:"
"DeviceType"=dword:0
"FriendlyName"="serial5"
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;--------------------------------------------------------------------------
红色部分是根据自己平台需要修改的
2 由于并不需要动态加载驱动,可以把下面红色部分注销掉
CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
{
#if 0
CSerialPDD * pSerialPDD = NULL;
if (DeviceArrayIndex == 0 ) {
pSerialPDD = new CPdd16550Isr(lpActivePath,pMdd, pHwObj);
if (pSerialPDD && !pSerialPDD->Init()) {
delete pSerialPDD;
pSerialPDD = NULL;
}
}
#endif
if (pSerialPDD == NULL) {
pSerialPDD= new CPdd16550(lpActivePath,pMdd, pHwObj);
if (pSerialPDD && !pSerialPDD->Init()) {
delete pSerialPDD;
pSerialPDD = NULL;
}
}
return pSerialPDD;
}
3 需要增加串口芯片对应的gpio口中断,在中断处理线程DWORD CPdd16550::ThreadRun()中记得重新使能中断,在中断触发上如果采用单边沿触发模式可能会漏中断,漏中断是致命的bug,一旦漏了就没有清除16550的中断寄存器将不再产生接收中断。
4 根据不同的晶振修改波特率表,reg = 晶振频率/16/波特率。