多串口芯片16550驱动移植到s3c6410上

时间:2022-06-02 00:23:14

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/波特率。