|
一、 硬件<br />PXA270公有3个串口,分别是FFUART,BTUART和SUART。FFUART可以控制Modem, BTUART可以进行蓝牙通讯,SUART就只能进行一般的RS232通讯。<br />二、 软件<br />1 Eboot下的Debug口的实现<br /> 在PLATFORM\Mtct_smt_2700g\Src\Common\Dbgserial\ Dbgserial.c中修改如下:<br /> VOID InitDebugSerial(UINT32 DbgSerPhysAddr) <br />{<br /> UINT32 logMask = 0;<br /> volatile BULVERDE_GPIO_REG *pGPIO_REGS = NULL;<br /> volatile BULVERDE_CLKMGR_REG *pCLKMGR_REGS = NULL;<br /> <br /> volatile i,j;<br /><br /> // At this moment we must suppress logging.<br /> //<br /> logMask = g_oalLogMask;<br /> g_oalLogMask = 0;<br /><br /> g_pDebugUARTPort = (volatile BULVERDE_UART_REG *) OALPAtoVA(DbgSerPhysAddr, FALSE);<br /> pGPIO_REGS = (volatile BULVERDE_GPIO_REG *) OALPAtoVA(BULVERDE_BASE_REG_PA_GPIO, FALSE);<br /> pCLKMGR_REGS = (volatile BULVERDE_CLKMGR_REG *) OALPAtoVA(BULVERDE_BASE_REG_PA_CLKMGR, FALSE);<br /><br /> // Ensure that UART interrupts are turned off.<br /> //<br /> g_pDebugUARTPort->lcr = 0x0; // Clear DLAB.<br /> g_pDebugUARTPort->ier_dlh = 0x0; // IER_DLH = 0x0.<br /><br /> // Set the Baud Rate (Divisor low = DEBUG_BAUD_38400).<br /> // The divisor latches are at offsets 0 and 1, which are <br /> // receive/transmit data and ier registers.<br /> //<br /> g_pDebugUARTPort->lcr = 0x80; // Access Divisor.<br /> g_pDebugUARTPort->thr_rbr_dll = DEBUG_BAUD_115200; // Low byte divisor.<br /> g_pDebugUARTPort->ier_dlh = 0x00; // High byte divisor.<br /> g_pDebugUARTPort->lcr = 0x0; // Clear DLAB.<br /><br /> //Setting UART properties to 8N1 <br /> //<br /> g_pDebugUARTPort->lcr = 0x3; // 8 bits, 1 stop, no parity. Also LCR DLAB bit = 0.<br /><br /> g_pDebugUARTPort->iir_fcr = 0x01; // Enable the FIFO.<br /> g_pDebugUARTPort->iir_fcr = 0x07; // Clear Rx,Tx FIFOs.<br /><br /> // Don't enable UART interrupts - we'll poll for the data.<br /> //<br /> g_pDebugUARTPort->ier_dlh = 0x0; <br /><br /> // Ensure loop-back test mode is off even though MCR reset value is 0x0. <br /> //<br /> g_pDebugUARTPort->mcr = 0x0; // UART is in normal mode.<br /><br /> // Configure GPIO pins for FFUART<br /> //<br />// if (DbgSerPhysAddr == BULVERDE_BASE_REG_PA_FFUART)<br />// {<br />//#define SMT<br />// // Initialize GPIO pins.<br />//#ifdef SMT<br />// GPIO99 FFTXD OUT 3<br />// GPIO102 FFRXD IN 3<br />// GPIO82 FFDTR OUT 3<br />// GPIO44 BTCTS IN 1<br />// GPIO41 FFRTS OUT 2<br />// GPIO37 FFDSR IN 1<br />// GPIO10 FFDCD IN 1<br />// GPIO89 FFRI IN 3<br /><br /><br /><br /> // Write 0 on GPIO pins 41, 82 and 99 before configuring them as outputs.<br /> //<br /><br /> pGPIO_REGS->GPCR1 = 0x1u<<(41-32);<br /> pGPIO_REGS->GPCR2 = 0x1u<<(82-64);<br /> pGPIO_REGS->GPCR3 = 0x1u<<(99-96); <br /><br /> // Configure direction of GPIO pins 10, 37, 44, 89 and 102 as input <br /> // and GPIO pins 41, 82 and 99 as output<br /> //<br /><br /> pGPIO_REGS->GPDR0 &= ~(0x1u<<(10-0));<br /> pGPIO_REGS->GPDR1 &= ~(0x1u<<(37-32));<br /> pGPIO_REGS->GPDR1 &= ~(0x1u<<(44-32));<br /> pGPIO_REGS->GPDR2 &= ~(0x1u<<(89-64));<br /> pGPIO_REGS->GPDR3 &= ~(0x1u<<(102-96));<br /> <br /> <br /> pGPIO_REGS->GPDR1 |= (0x1u<<(41-32));<br /> pGPIO_REGS->GPDR2 |= (0x1u<<(82-64));<br /> pGPIO_REGS->GPDR3 |= (0x1u<<(99-96));<br /><br /> // Configure GPIO pins 10, 37 and 44 for Alt_fn1. <br /> // And pin 41 for Alt_fn2<br /> // And pins 82,89,99 and 102 for Alt_fn3.<br /> //<br /><br /> pGPIO_REGS->GAFR0_L &=~ (0x1u<<20);//(0x1u<<10)<<2;<br /> pGPIO_REGS->GAFR1_L &=~ (0x1u<<10);//(0x1u<<(37-32))<<2;<br /> pGPIO_REGS->GAFR1_L &=~ (0x1u<<24);//(0x1u<<(44-32))<<2;<br /> pGPIO_REGS->GAFR1_L &=~ (0x2u<<18);//(0x2u<<(41-32))<<2;<br /> pGPIO_REGS->GAFR2_U &=~ (0x3u<<4);//(0x3u<<(82-64-16))<<2;<br /> pGPIO_REGS->GAFR2_U &=~ (0x3u<<18);//(0x3u<<(89-64-16))<<2;<br /> pGPIO_REGS->GAFR3_L &=~ (0x3u<<6);//(0x3u<<(99-96))<<2;<br /> pGPIO_REGS->GAFR3_L &=~ (0x3u<<12);//(0x3u<<(102-96))<<2;<br /><br /> pGPIO_REGS->GAFR0_L |= (0x1u<<20);//(0x1u<<10)<<2;<br /> pGPIO_REGS->GAFR1_L |= (0x1u<<10);//(0x1u<<(37-32))<<2;<br /> pGPIO_REGS->GAFR1_L |= (0x1u<<24);//(0x1u<<(44-32))<<2;<br /> pGPIO_REGS->GAFR1_L |= (0x2u<<18);//(0x2u<<(41-32))<<2;<br /> pGPIO_REGS->GAFR2_U |= (0x3u<<4);//(0x3u<<(82-64-16))<<2;<br /> pGPIO_REGS->GAFR2_U |= (0x3u<<18);//(0x3u<<(89-64-16))<<2;<br /> pGPIO_REGS->GAFR3_L |= (0x3u<<6);//(0x3u<<(99-96))<<2;<br /> pGPIO_REGS->GAFR3_L |= (0x3u<<12);//(0x3u<<(102-96))<<2;<br /> <br /><br /> // Enable the FFUART clock.<br /> //<br /> pCLKMGR_REGS->cken |= XLLP_CLKEN_FFUART ;<br /><br /> // Enable the UART.<br /> //<br /> g_pDebugUARTPort->ier_dlh = 0x40;<br /><br /> // Restore the logging mask.<br /> //<br /> g_oalLogMask = logMask;<br />}<br />2 WinCE下调试口的实现<br /> 在PLATFORM\Mtct_smt_2700g\Src\Drivers\Serial\ms2_serial.cpp中修改<br /> class CBulPdd16550FUART : public CBulPdd16550 {<br />public:<br /> CBulPdd16550FUART (LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj) <br /> : CBulPdd16550 (lpActivePath,pMdd, pHwObj) { };<br /> virtual BOOL Init() {<br /> if (CBulPdd16550::Init() ) {<br /> ConfigurePinout();<br /> //Enable FFUART clock<br /> m_pDCCLKReg->cken |= XLLP_CLKEN_FFUART ;<br /> return TRUE;<br /> }<br /> else<br /> return FALSE;<br /> }<br /> virtual void SerialRegisterRestore() {<br /> ConfigurePinout();<br /> CBulPdd16550::SerialRegisterRestore();<br /> }<br />private:<br /> BOOL ConfigurePinout(){<br /> //Initialize GPIO pins <br />//2009-3-5 9:38<br />//modified by Bruce<br />// //Write 0 on GPIO pins 39, 40 and 41 before configuring them as outputs.<br />// m_pGPIOReg->GPCR1 = ( XLLP_GPIO_BIT_FFDTR | XLLP_GPIO_BIT_FFTXD | XLLP_GPIO_BIT_FFRTS );<br />// <br />// //Configure direction of GPIO pins 34, 35, 36, 37 and 38 as input <br />// //and GPIO pins 39, 40 and 41 as output<br />// m_pGPIOReg->GPDR1 &= ~( XLLP_GPIO_BIT_FFRXD | XLLP_GPIO_BIT_FFCTS | <br />// XLLP_GPIO_BIT_FFDCD | XLLP_GPIO_BIT_FFDSR | <br />// XLLP_GPIO_BIT_FFRI );<br />// m_pGPIOReg->GPDR1 |= ( XLLP_GPIO_BIT_FFTXD | XLLP_GPIO_BIT_FFDTR | XLLP_GPIO_BIT_FFRTS );<br />// <br />// //Configure GPIO pins 34, 35, 36, 37 and 38 for Alt_fn1. And pins 39, 40 and 41 for Alt_fn2.<br />// m_pGPIOReg->GAFR1_L |= (XLLP_GPIO_AF_BIT_FFRXD | XLLP_GPIO_AF_BIT_FFCTS | <br />// XLLP_GPIO_AF_BIT_FFDCD | XLLP_GPIO_AF_BIT_FFDSR | <br />// XLLP_GPIO_AF_BIT_FFRI | XLLP_GPIO_AF_BIT_FFTXD | <br />// XLLP_GPIO_AF_BIT_FFDTR | XLLP_GPIO_AF_BIT_FFRTS );<br /><br /> // Write 0 on GPIO pins 41, 82 and 99 before configuring them as outputs.<br /> //<br /><br /> m_pGPIOReg->GPCR1 = 0x1u<<(41-32);<br /> m_pGPIOReg->GPCR2 = 0x1u<<(82-64);<br /> m_pGPIOReg->GPCR3 = 0x1u<<(99-96); <br /><br /> // Configure direction of GPIO pins 10, 37, 44, 89 and 102 as input <br /> // and GPIO pins 41, 82 and 99 as output<br /> //<br /><br /> m_pGPIOReg->GPDR0 &= ~(0x1u<<(10-0));<br /> m_pGPIOReg->GPDR1 &= ~(0x1u<<(37-32));<br /> m_pGPIOReg->GPDR1 &= ~(0x1u<<(44-32));<br /> m_pGPIOReg->GPDR2 &= ~(0x1u<<(89-64));<br /> m_pGPIOReg->GPDR3 &= ~(0x1u<<(102-96));<br /> <br /> <br /> m_pGPIOReg->GPDR1 |= (0x1u<<(41-32));<br /> m_pGPIOReg->GPDR2 |= (0x1u<<(82-64));<br /> m_pGPIOReg->GPDR3 |= (0x1u<<(99-96));<br /><br /> // Configure GPIO pins 10, 37 and 44 for Alt_fn1. <br /> // And pin 41 for Alt_fn2<br /> // And pins 82,89,99 and 102 for Alt_fn3.<br /> //<br />// pGPIO_REGS->GAFR0_L =0;<br />// pGPIO_REGS->GAFR1_L =0;<br />// pGPIO_REGS->GAFR2_L =0;<br />// pGPIO_REGS->GAFR3_L =0;<br />// pGPIO_REGS->GAFR0_U =0;<br />// pGPIO_REGS->GAFR1_U =0;<br />// pGPIO_REGS->GAFR2_U =0;<br />// pGPIO_REGS->GAFR3_U =0;<br /><br /> m_pGPIOReg->GAFR0_L &=~ (0x1u<<20);//(0x1u<<10)<<2;<br /> m_pGPIOReg->GAFR1_L &=~ (0x1u<<10);//(0x1u<<(37-32))<<2;<br /> m_pGPIOReg->GAFR1_L &=~ (0x1u<<24);//(0x1u<<(44-32))<<2;<br /> m_pGPIOReg->GAFR1_L &=~ (0x2u<<18);//(0x2u<<(41-32))<<2;<br /> m_pGPIOReg->GAFR2_U &=~ (0x3u<<4);//(0x3u<<(82-64-16))<<2;<br /> m_pGPIOReg->GAFR2_U &=~ (0x3u<<18);//(0x3u<<(89-64-16))<<2;<br /> m_pGPIOReg->GAFR3_L &=~ (0x3u<<6);//(0x3u<<(99-96))<<2;<br /> m_pGPIOReg->GAFR3_L &=~ (0x3u<<12);//(0x3u<<(102-96))<<2;<br /><br /> m_pGPIOReg->GAFR0_L |= (0x1u<<20);//(0x1u<<10)<<2;<br /> m_pGPIOReg->GAFR1_L |= (0x1u<<10);//(0x1u<<(37-32))<<2;<br /> m_pGPIOReg->GAFR1_L |= (0x1u<<24);//(0x1u<<(44-32))<<2;<br /> m_pGPIOReg->GAFR1_L |= (0x2u<<18);//(0x2u<<(41-32))<<2;<br /> m_pGPIOReg->GAFR2_U |= (0x3u<<4);//(0x3u<<(82-64-16))<<2;<br /> m_pGPIOReg->GAFR2_U |= (0x3u<<18);//(0x3u<<(89-64-16))<<2;<br /> m_pGPIOReg->GAFR3_L |= (0x3u<<6);//(0x3u<<(99-96))<<2;<br /> m_pGPIOReg->GAFR3_L |= (0x3u<<12);//(0x3u<<(102-96))<<2;<br /><br /> return TRUE;<br /> }<br />}<br /><br />3 WinCE下调试口转为可以被应用程序使用的普通串口<br /> 在PLATFORM\Mtct_smt_2700g\Src\Kernel\Oal\init.c中修改如下:<br /> VOID OEMInitDebugSerial(void)<br />{<br />UINT32 *pDbgSerPhysAddr = (UINT32*) OALArgsQuery(BSP_ARGS_QUERY_DBGSERIAL);<br /> return;<br /> if (pDbgSerPhysAddr)<br /> {<br /> InitDebugSerial(*pDbgSerPhysAddr);<br /> }<br />}<br />在platform.reg中修改为:<br />; -----------------------------------------------------------------------------<br />; @CESYSGEN IF CE_MODULES_SERIAL<br />IF BSP_NOSERIAL !<br />[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialBT]<br /> "Irq"=dword:15 ; 21 IRQ_BTUART<br /> "SysIntr"=dword:1c ; 28 SYSINTR_BTUART<br /> "MemBase"=dword:40200000 ; BTUART Register <br /> "MemLen"=dword:40<br /> "DeviceArrayIndex"=dword:81 ; BTUART object<br /> "Prefix"="COM"<br /> "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"<br /> "Dll"="ms2_serial.dll"<br /> "Index"=dword:3 ;cqz<br /> "Order"=dword:0<br /><br />[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialBT\Unimodem]<br /> "Tsp"="Unimodem.dll"<br /> "DeviceType"=dword:0<br /> "FriendlyName"="COM3:";Serial Cable on COM1:<br /> "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<br /><br />[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialST]<br /> "Dll"="ms2_serial.dll"<br /> "Irq"=dword:15 ; 20 IRQ_STUART<br /> "SysIntr"=dword:1d ; 29 SYSINTR_SFUART<br /> "MemBase"=dword:40700000 ; STUART Register<br /> "MemLen"=dword:40<br /> "Prefix"="COM"<br /> "Index"=dword:2 ;cqz 4<br /> "Order"=dword:1<br /> "DeviceArrayIndex"=dword:82 ; STUART object<br /> "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"<br /> <br />[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial\Unimodem]<br /> "Tsp"="Unimodem.dll"<br /> "DeviceType"=dword:0<br /> "FriendlyName"="COM2:" ;Serial Cable on COM4:<br /> "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<br /><br />[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SerialFT]<br /> "Irq"=dword:15 ; 21 IRQ_FFUART<br /> "SysIntr"=dword:1b ; 29 SYSINTR_FFUART<br /> "MemBase"=dword:40100000 ; FFUART Register <br /> "MemLen"=dword:40<br /> "DeviceArrayIndex"=dword:80 ; FTUART object<br /> "Prefix"="COM"<br /> "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"<br /> "Dll"="ms2_serial.dll"<br /> "Index"=dword:5<br /> "Order"=dword:2<br /><br />ENDIF BSP_NOSERIAL !<br /> |
|