135 lines
3.2 KiB
C
135 lines
3.2 KiB
C
/****************************************************************************
|
|
*
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
*
|
|
* This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
* be copied by any method or incorporated into another program without
|
|
* the express written consent of Aerospace C.Power. This Information or any portion
|
|
* thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
* is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
* liability for its use in any way and conveys no license or title under
|
|
* any patent or copyright and makes no representation or warranty that this
|
|
* Information is free from patent or copyright infringement.
|
|
*
|
|
* ****************************************************************************/
|
|
|
|
#ifndef _S_UART_H_
|
|
#define _S_UART_H_
|
|
|
|
char sUartGetChar();
|
|
void sUartClearFifo(void);
|
|
/* For config */
|
|
#define UART0 0x44001000
|
|
|
|
#define UART_FULL_THRESH 120
|
|
|
|
#define UART_CLOCK DEFAULT_PLL_FRQ
|
|
#define UART_CLOCK_SYSTICK 1000000 /* 1M */
|
|
#define REG_UARTDR (0x00 + UART0)
|
|
#define REG_STATUS (0x24 + UART0)
|
|
#define REG_CLKDIV (0x1C + UART0)
|
|
#define REG_CONFIG0 (0x14 + UART0)
|
|
#define REG_INT_ENA (0x04 + UART0)
|
|
#define REG_INT_CLR (0x08 + UART0)
|
|
#define UART_TXFIFO_CNT ((REG32(REG_STATUS)>>16)&0xFF)
|
|
#define UART_RXFIFO_CNT (REG32(REG_STATUS)&0xFF)
|
|
|
|
#define uGET_CHAR() sUartGetChar()
|
|
#define uPUT_CHAR(c) (REG32(REG_UARTDR) = (0xFF)&((UINT32)(c)))
|
|
|
|
#define uRX_RAEDY() (UART_RXFIFO_CNT > 0 ? 1 : 0)
|
|
#define uTX_BUSY() (UART_TXFIFO_CNT > UART_FULL_THRESH ? 1 : 0)
|
|
|
|
#define CLEAR_FIFO() sUartClearFifo()
|
|
|
|
|
|
/* ----------------------- Uart ----------------------- */
|
|
|
|
#define ASC_CTRL_T 0x14
|
|
|
|
#define aDELAY(m) do{\
|
|
int T = m;\
|
|
while(T--) __asm volatile("nop\n");\
|
|
}while(0)
|
|
|
|
enum
|
|
{
|
|
xmSOH = 0x01,
|
|
xmSTX = 0x02,
|
|
xmEOT = 0x04,
|
|
xmACK = 0x06,
|
|
xmNAK = 0x15,
|
|
xmCAN = 0x18,
|
|
xmCRC = 0x43, /* ASCII of 'C' */
|
|
};
|
|
|
|
enum
|
|
{
|
|
xmRT_Finish = 0,
|
|
xmRT_Error = -1,
|
|
};
|
|
|
|
/* --------------------- XMODEM --------------------------- */
|
|
|
|
#define xmSTOP_NOW() uPUT_CHAR(xmCAN)
|
|
|
|
#define xmERROR_HANDER() do{xmSTOP_NOW(); return xmRT_Error;}while(0)
|
|
|
|
|
|
#define xm1ST_RETRY_TIME 200
|
|
|
|
#define xmFRMTYPE_128 128
|
|
#define xmFRMTYPE_1K 1024
|
|
|
|
#define xmRCV_BUF_SIZE xmFRMTYPE_1K
|
|
|
|
#define xmCHECK_CHKSUM 0x01
|
|
#define xmCHECK_CRC16 0x02
|
|
|
|
|
|
|
|
#define xmTRY_CHECKSUM_MODE(t, l, m, c) do\
|
|
{\
|
|
l = 0x400000;\
|
|
CLEAR_FIFO();\
|
|
uPUT_CHAR(m);\
|
|
while((--l)&&(!uRX_RAEDY()));\
|
|
if(l)\
|
|
{\
|
|
c = uGET_CHAR();\
|
|
if((c ==xmSOH) || (c ==xmSTX))\
|
|
{\
|
|
break;\
|
|
}\
|
|
}\
|
|
}while(--t)
|
|
|
|
#define xmTRY_CHECK_FRAME_START(t, l, m, c) do\
|
|
{\
|
|
l = 0x400000;\
|
|
while((--l)&&(!uRX_RAEDY()));\
|
|
if(l)\
|
|
{\
|
|
c = uGET_CHAR();\
|
|
if((c ==xmSOH) || (c ==xmSTX) || (c ==xmEOT))\
|
|
{\
|
|
break;\
|
|
}\
|
|
}\
|
|
}while(--t)
|
|
|
|
#define RECIVE_CHAR(b, l) do{\
|
|
l = 0x4000;\
|
|
while((--l)&&(!uRX_RAEDY())) __asm volatile("nop\n");\
|
|
if(l) (b) = uGET_CHAR();\
|
|
}while(0)
|
|
|
|
|
|
uint32_t sUartTxFifoCnt();
|
|
uint32_t sUartRxFifoCnt();
|
|
void sUartPortInit(int bRate, int UseRefTick);
|
|
void sUartPutString(char *pStr);
|
|
UINT32 xModemReciveframe(char *const pBuf, char frNO, int newFile);
|
|
|
|
#endif
|