⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdr18uat.c

📁 UART驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/* == 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 + -