📄 cdr18uat.c
字号:
/* == IDENTIFICATION ================================================== * * Copyright (C) 2005, Philips Semiconductors Nuernberg * * System : Vega Family * Component : any * Module : Driver * Unit : UART * File : cdr18uat.c * * @(#) %filespec: cdr18uat.c-9 % * *//* == HISTORY ========================================================= * * Name Date Ver Action * -------------------------------------------------------------------- * tcmc_ore 2-Nov-2005 9 Make compile without RX_BUFFER set * tcmc_ore 27-Oct-2005 8 Add RX Buffer for Automated Test Tool * tcmc_hyu 30-Sep-2005 7 make UART work on VEGA_DEMOBLUE_PP board * tcmc_hyu 04-Mar-2005 6 PR 497: set SYS2_UART_IER_MODEM in sys2_UART.ier register only when RTS/CTS * tcmc_hyu 04-Mar-2005 5 merged D76.1 with D54.3 * tcmc_hyu 20-Mar-2005 D76.1 updated for double slot demo. purpose * tcmc_afn 27-Jan-2005 D75.3 change TWO_LINE_BOARD to (NR_IOM_LINES>0) * tcmc_afn 27-Jan-2005 D75.2 Update and bug fix * tcmc_asa 13-Oct-2004 D75.1 update for TWO_LINE_BOARD * tcmc_asa 07-Nov-2001 re-rework after crosscheck * tcmc_asa 25-Oct-2001 rework after crosscheck * tcmc_asa 29-Jun-2001 part of HLP rework * tcmc_asa 04-Dec-2000 created, copied from D42 dr_uart.c * *//*MPM:::DRIVER::UART:========================================== * * ABSTRACT: * * The functions in this module comprise the UART driver. * Some functions have got second names given by macro definitions * to replace functions of tclib.lib. * * Global functions to be called by other layers: * ---------------------------------------------- * - p_dr18_UARTTx transmit a buffer of bytes (2nd name: putbuf) * - p_dr18_UARTRcv receive one byte (2nd name: _getkey) * - p_dr18_UARTTxWait wait for completion of transmission * - p_dr18_UARTTx * - p_dr18_UARTRcv * - p_dr18_UARTTxWait * - p_dr18_UARTInterrupt the UART interrupt service routine * - p_dr18_IOMInit * - p_arm_customer_fsi_io * * Layer local functions to be called from inside this layer: * ---------------------------------------------------------- * - p_dr18_UARTInit initialize and activate the driver * - p_dr18_UARTHookOff * - p_dr18_UARTHookOn * * Module local functions to be called from inside this module: * ------------------------------------------------------------ * - p_dr18_UARTDefineCommand * - p_dr18_UARTDial * - p_dr18_UARTSearchCommand * - p_dr18_UARTRingOFF * - p_dr18_UARTRingON */#define cdr18_c/* == GLOBAL DECLARATIONS ======================================= */#include "tclib.h"#define DECLARE_GLOBALS#ifndef PT_MODULE#include "bsd09cnf.h" /* component-globalal, system configuration */#include "bsd09ddl.h" /* messages and processes */#include "bdr02aud.h"#include "bmi01dat.h"#include "cap03def.h" /* xx_const.h */#endif#include "csys5os.h"#include "cos00int.h"#include "cdr08uat.h"#include "csys2vpb.h"#include "cds00adr.h"#define Delay(a) __asm { nop;nop;nop;nop;nop;nop;nop;nop; } #define HKOF 1#define HKON 2#define RGOF 4#define RGON 5#define DIAL 6#define DR18_NB_DATA_SEND 5#define DR18_NB_DATA_SEND_DIAL 21#define DR18_NB_DATA_BUFFER 50/* == DECLARATION OF LOCAL DATA =========================================== */#ifndef DR18_RX_BUFFER_SIZE#ifdef AUTOMATED_TEST_TOOL#define DR18_RX_BUFFER_SIZE 100#endif#endif#ifdef DR18_RX_BUFFER_SIZEu8 u8_dr18_RxBuffer[DR18_RX_BUFFER_SIZE];u16 u16_dr18_RxBufferWriteIndex;u16 u16_dr18_RxBufferReadIndex;#define DR18_RX_BUFFER_EMPTY (u16_dr18_RxBufferWriteIndex == \ u16_dr18_RxBufferReadIndex)#define DR18_RX_BUFFER_FULL (((u16_dr18_RxBufferWriteIndex + 1) % DR18_RX_BUFFER_SIZE) ==\ u16_dr18_RxBufferReadIndex)#endif /* DR18_RX_BUFFER_SIZE */#define u8_dr18_UARTRcvByte u8_LastRxTerm /* single byte receive buffer */u8 * pu8_dr18_UARTTxJob; /* a single transmission job queue */u8 u8_dr18_UARTTxLen; /* number of bytes remaining in the queue */#if (NR_IOM_LINES>0)u8 tab_HKOF[DR18_NB_DATA_BUFFER];u8 tab_HKON[DR18_NB_DATA_BUFFER];u8 tab_RGOF[DR18_NB_DATA_BUFFER];u8 tab_RGON[DR18_NB_DATA_BUFFER];u8 tab_DIAL[DR18_NB_DATA_BUFFER];u8 RX_Buffer[DR18_NB_DATA_BUFFER];u8 u8_dr18_NbDataSend = 0;u8 u8_dr18_NbDataRX = 0;u8 u8_dr18_CmdSend = 0;u8 u8_dr18_CmdRcvd = 0;#endif/* == DECLARATION OF FUNCTION PROTOTYPES =================================== */void p_dr18_UARTDefineCommand(void);void p_dr18_UARTRingON(void);void p_dr18_UARTRingOFF(void);/* == Code section for double slot demo. purpose only.===================== */#ifdef DATA_APP_DEMOextern void p_hm17_RxDemoDataFromUART(u8 u8_Byte);#endif /* end of DATA_APP_DEMO */#if (NR_IOM_LINES>0) || (defined UART)/* FUNCTIONAL DESCRIPTION * * This function initializes the UART driver * * INTERFACE DECLARATION */int p_dr18_UARTInit(u32 u32_Baudrate, int RtsCts){ const u8 u8_WLen = 8; const u8 u8_Parity = 0; const u8 u8_Stop = 1; /* Local variables, data, etc. **********************************************/ u8 u8_Status=0; u16 u8_Divider=0;#if (NR_IOM_LINES>0) p_dr18_UARTDefineCommand();#endif if (u32_Baudrate>0) { u8_Divider = 460800 / u32_Baudrate; } u8_Status |= ((u8_Divider==0) << 4); u8_Status |= (( (u8_WLen<5) | (u8_WLen>8)) << 3); u8_Status |= ((u8_Stop>1) << 1); if (!u8_Status) { *(volatile u8 *)&sys0_SCU.pb_pcon_on |= SYS0_SCU_UART_POWER_MASK; *(volatile u16 *)&sys2_GPIO.mux1 |= SYS2_GPIO1_UART_SEL; *(volatile u8 *)&sys2_UART.global = SYS2_BLRES_UART | 1; Delay(13); /* duration of reset (worst case) */ *(volatile u8 *)&sys2_UART.global = 1; /* set reserved bit 0 to enable UART */ if (RtsCts) { Delay(4); *(volatile u16 *)&sys2_GPIO.mux1 |= SYS2_GPIO1_BIFRTS_SEL_RTS; Delay(4); *(volatile u16 *)&sys2_GPIO.mux1 &= ~SYS2_GPIO1_BIFRTS_SEL_BIF; Delay(4); *(volatile u16 *)&sys2_GPIO.mux1 |= SYS2_GPIO1_CTS_SEL; *(volatile u8 *)&sys2_UART.mcr = SYS2_UART_MCR_AUTO | SYS2_UART_MCR_RTS; //RTS is low-active (as CTS) */ } else { *(volatile u8 *)&sys2_UART.mcr &= ~SYS2_UART_MCR_AUTO; }#if defined(Pin80onDemoBlue) *(volatile u16 *)&sys2_GPIO.mux1 |= SYS2_GPIO1_CTS_SEL; *(volatile u16 *)&sys2_GPIO.mux3 |= SYS2_GPIO3_UART_SWAP;#endif *(volatile u8 *)&sys2_UART.fcr = SYS2_UART_FCR_TXRST | SYS2_UART_FCR_RXRST; *(volatile u8 *)&sys2_UART.ier = SYS2_UART_IER_RX_INT //enable RX interrupt of the Uart | SYS2_UART_IER_TX_INT //enable TX interrupt of the Uart | SYS2_UART_IER_RXLINE; if (RtsCts) { /* PR 497: Problem occurs on the VegaLiteFlash FT software when this bit is set. */ *(volatile u8 *)&sys2_UART.ier |= SYS2_UART_IER_MODEM; } *(volatile u32 *)&sys0_ICU.irq_enbs = SYS0_ICU_INT_UART_IRQ; //enable Uart interrupt Delay(4); *(volatile u8 *)&sys2_UART.lcr = SYS2_UART_LCR_DIVENB; // sys2_UART.dlh = (u8_Divider/256); *(volatile u8 *)&sys2_UART.ier = (u8)(u8_Divider >> 8); // sys2_UART.dll = (u8_Divider%256); *(volatile u8 *)&sys2_UART.thr = (u8)(u8_Divider & 0x00ff); Delay(4); //4 cycles between 2 write accesses to the same register *(volatile u8 *)&sys2_UART.lcr = 0; //select thr (DIVENB=0) Delay(4); *(volatile u8 *)&sys2_UART.lcr= ((u8_Parity!=0)*(u8_Parity-1)*SYS2_UART_LCR_PARITY_EVEN) | ((u8_Parity!=0)*SYS2_UART_LCR_PARITYEN) | ((u8_Stop-1)*SYS2_UART_LCR_STOP) | ((u8_WLen-5) & 0x03); } return u8_Status;} /* p_dr18_UARTInit */#endif /* (NR_IOM_LINES>0) || (defined UART) */#if (NR_IOM_LINES>0)/* FUNCTIONAL DESCRIPTION * * This function initialze the command * * INTERFACE DECLARATION */void p_dr18_UARTDefineCommand(void){ // u8 u8_NbLoop = 0; /*Define tab command "HKOF" *//* for(u8_NbLoop = 0 ; u8_NbLoop < DR18_NB_DATA_BUFFER ;u8_NbLoop++) tab_HKOF[u8_NbLoop]= 0; */ memset(tab_HKOF, 0, DR18_NB_DATA_BUFFER); strcpy((char *)tab_HKOF,"HKOF"); /*Define tab command "HKON" *//* for(u8_NbLoop = 0 ; u8_NbLoop < DR18_NB_DATA_BUFFER ;u8_NbLoop++) tab_HKON[u8_NbLoop]= 0; */ memset(tab_HKON, 0, DR18_NB_DATA_BUFFER); strcpy((char *)tab_HKON,"HKON"); /*Define tab command "DIAL192.168.050.001." *//* for(u8_NbLoop = 0 ; u8_NbLoop < DR18_NB_DATA_BUFFER ;u8_NbLoop++) tab_DIAL[u8_NbLoop]= 0; */ memset(tab_DIAL, 0, DR18_NB_DATA_BUFFER); strcpy((char *)tab_DIAL,"DIAL192.168.050.001."); /*Define tab command "RGOF" *//* for(u8_NbLoop = 0 ; u8_NbLoop < DR18_NB_DATA_BUFFER ;u8_NbLoop++) tab_RGOF[u8_NbLoop]= 0; */ memset(tab_RGOF, 0, DR18_NB_DATA_BUFFER); strcpy((char *)tab_RGOF,"RGOF"); /*Define tab command "RGON" *//* for(u8_NbLoop = 0 ; u8_NbLoop < DR18_NB_DATA_BUFFER ;u8_NbLoop++) tab_RGON[u8_NbLoop]= 0; */ memset(tab_RGON, 0, DR18_NB_DATA_BUFFER); strcpy((char *)tab_RGON,"RGON"); /*initialize the rx buffer*//* for(u8_NbLoop=0 ; u8_NbLoop<DR18_NB_DATA_BUFFER ;u8_NbLoop++) RX_Buffer[u8_NbLoop]= 0; */ memset(RX_Buffer, 0, DR18_NB_DATA_BUFFER); u8_dr18_NbDataRX = 0; u8_dr18_CmdRcvd = RGOF; return;}/* p_dr18_UARTDefineCommand *//* FUNCTIONAL DESCRIPTION * * This function start the sending of the off HOOK * * INTERFACE DECLARATION */void p_dr18_UARTHookOff(void){ u8_dr18_CmdSend = HKOF; u8_dr18_NbDataSend = 0; VOLATILE(sys2_UART.thr,u8) = tab_HKOF[u8_dr18_NbDataSend]; }/* p_uart_HKOF *//* FUNCTIONAL DESCRIPTION * * This function start the sending of the on HOOK * * INTERFACE DECLARATION */void p_dr18_UARTHookOn(void){ u8_dr18_CmdSend = HKON; u8_dr18_NbDataSend = 0; VOLATILE(sys2_UART.thr,u8) = tab_HKON[u8_dr18_NbDataSend]; }/* p_uart_HKON *//* FUNCTIONAL DESCRIPTION * * This function start the sending of the Dial IP * * INTERFACE DECLARATION */ void p_dr18_UARTDial(void){ u8_dr18_CmdSend = DIAL; u8_dr18_NbDataSend = 0; VOLATILE(sys2_UART.thr,u8) = tab_DIAL[u8_dr18_NbDataSend]; }/* p_dr18_UARTDial *//* FUNCTIONAL DESCRIPTION * * This function check the uart command, receive * * INTERFACE DECLARATION */void p_dr18_UARTSearchCommand(void){ // u8 u8_NbLoop=0; if(u8_dr18_NbDataRX >= 5) { if(strcmp((char *)RX_Buffer,"RGON") == 0 ) { u8_dr18_CmdRcvd = RGON; /*initialize the rx buffer*/ /* for(u8_NbLoop=0 ; u8_NbLoop<DR18_NB_DATA_BUFFER ;u8_NbLoop++) RX_Buffer[u8_NbLoop]= 0; */ memset(RX_Buffer, 0, DR18_NB_DATA_BUFFER); p_dr18_UARTRingON(); } if(strcmp((char *)RX_Buffer,"RGOF") == 0) { u8_dr18_CmdRcvd = RGOF; /*initialize the rx buffer*/ /* for(u8_NbLoop=0 ; u8_NbLoop<DR18_NB_DATA_BUFFER ;u8_NbLoop++) RX_Buffer[u8_NbLoop]= 0; */ memset(RX_Buffer, 0, DR18_NB_DATA_BUFFER); p_dr18_UARTRingOFF(); } u8_dr18_NbDataRX = 0; } //if u8_dr18_NbDataRX >= 5 else if (u8_dr18_NbDataRX == 1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -