本人與硬件合作完成ppc405ep 串口擴展,主要負責vxWorks串口驅動的工作。
工具 :tornado 2.2(vxWorks內核的編譯), UltraEdit(編寫代碼), BDI3000(bootrom的燒寫)
步驟 :
1, 建立開發環境,如下圖所示
2, 搞清vxWorks下串口驅動的架構,如下圖示
3, 對於串口的工作原理,已經很清楚這裏就不在詳細說明了。對vxWorks的驅動架構有了認識後,下來就開始進行驅動。vxWorks中對串口的初始化流程如下所示:
sysHwInit()函數會安裝一些外圍硬件的驅動。具體的串口中,就是調用sysSerialHwInit()函數來初始化具體串口,我們可將擴展串口的驅動加入此函數中
void ExtendUartHwInit
(
void
)
{
UINT clkDivisor;
/*
* Disable and clear serial interrupts in the UIC for both UARTs
*/
intDisable(INT_LVL_EXT_IRQ_0); //IRQ
/*
* intialize ST16C654 device A descriptors (S0)
*/
ST16C654ChanA.int_vec = dev54AParas.vector;
ST16C654ChanA.channelMode = 0;
ST16C654ChanA.lcr = UARTA_REG(UART_LCR);
ST16C654ChanA.data = UARTA_REG(UART_RDR);
ST16C654ChanA.brdl = UARTA_REG(UART_BRDL);
ST16C654ChanA.brdh = UARTA_REG(UART_BRDH);
ST16C654ChanA.ier = UARTA_REG(UART_IER);
ST16C654ChanA.iid = UARTA_REG(UART_IID);
ST16C654ChanA.mdc = UARTA_REG(UART_MDC);
ST16C654ChanA.lst = UARTA_REG(UART_LST);
ST16C654ChanA.msr = UARTA_REG(UART_MSR);
ST16C654ChanA.outByte = sysOutByte;
ST16C654ChanA.inByte = sysInByte;
clkDivisor = 12;
ST16C654ChanA.clkFreq = systemInfo.freqPLLOUTA / clkDivisor;
/*
* Reset both devices
*/
evbNs16550HrdInit(&ST16C654ChanA);
}