本人与硬件合作完成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);
}