?? uart.c
字號:
}
if (uiParaData[Parity] > 4) {
uiParaData[Parity] = 0;
}
if (uiParaData[RtsControl] != 0) {
uiParaData[RtsControl] = 0;
}
if (OPERATE_FAIL == (__uartBandRate(PUartInfo,uiParaData[BaudRate]))) {
#if defined(UART_SEMCONTROL)
OSSemPost(PUartInfo->pUartSem);
#else
OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
return UART_NOK;
}
if(OPERATE_FAIL == (__uartMode(PUartInfo,uiParaData))) {
#if defined(UART_SEMCONTROL)
OSSemPost(PUartInfo->pUartSem);
#else
OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
return UART_NOK;
}
puiAddrBase[__B_UART_FCR << uiOffBase] = ((__GuiUartFifoTab[uiId] << 6) | 0x07);
/* 初始化FIFO為N個字節觸發,WO
發送和接收的FIFO都使能 */
puiAddrBase[__B_UART_IER << uiOffBase] = 0x05; /* 使能接收中斷,不使能發送中斷 */
PUartInfo->uiUartFlag |= 0x10; /* 4位置位表示發送隊列使能 */
#if defined(UART_SEMCONTROL)
OSSemPost(PUartInfo->pUartSem);
} // end of if ( PUartInfo->pUartSem!=0 )
#else
OS_EXIT_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartInit
** Descriptions: 串口初始化及中斷設置
** input parameters: uiId: 子設備號
** pcArg: 字符串指針
** pRsv: 保留參數
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失敗
** Example: char pUart[]="BaudRate=9600,DataBits=8,StopBits=1,Parity=NONE,RtsControl=NONE";
** uartInit(0,pUart,0);
*********************************************************************************************************/
#define MAX_UART_STR_NUM 5 /* 字符串中包含5個參數 */
extern int32 uartInit (uint32 uiId,
char *pcArg,
void *pRsv)
{
uint32 uiParaData[MAX_UART_STR_NUM]={0}; /* 定義一個數組存放字符串的參數*/
char cCopyStr[80]; /* 用于備份字符串 */
if ((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {
strcpy(cCopyStr,pcArg); /* 復制字符串 */
__GpuiUartInfoTab[uiId]->puiAddrBase = (uint32 *)__GuiUartBaseAddrTab[uiId];
/* 定基址 */
__GpuiUartInfoTab[uiId]->uiOffBase = 0; /* 地址偏移量 */
__GpuiUartInfoTab[uiId]->uiUartFlag = 0; /* 清0標志 */
__GpuiUartInfoTab[uiId]->uiQueueReviceFifoLen = __GuiQueueReviceFifoTab[uiId];
/* 軟件FIFO接收長度 */
__GpuiUartInfoTab[uiId]->uiQueueSendFifoLen = __GuiQueueSendFifoTab[uiId];
/* 軟件FIFO發送長度 */
__GpuiUartInfoTab[uiId]->PdqReviceBuf = (DataQueue *)GpuiUartReviceTab[uiId];
/* 記錄接收緩存 */
__GpuiUartInfoTab[uiId]->PdqSendBuf = (DataQueue *)GpuiUartSendTab[uiId];
/* 記錄發送緩存 */
__GpuiUartInfoTab[uiId]->uiUartId = uiId; /* 記錄下自己的ID號 */
ImpCmd(Tab_UART,cCopyStr,uiParaData); /* 從字符串中提取參數 */
if (__uartInit(__GpuiUartInfoTab[uiId], uiParaData,
__GuiQueueReviceFifoTab[uiId], __GuiQueueSendFifoTab[uiId]) == OPERATE_FAIL) {
return(UART_NOK);
}
else {
return(UART_OK);
}
}
else {
return(UART_NOK);
}
}
/*********************************************************************************************************
** Function name: uartSetMode
** Descriptions: 設置串口的參數
** input parameters: uiId : 子設備號
** uiCmd :設置參數宏:CTMODE--串口模式;BAUDRATE--串口波特率
** pcArg :字符串指針
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失敗
** Example1: char pUartBps[] = "BaudRate=9600";
** WdtSetMode( 0, BAUDRATE, pUartBps);
** Example2: char pUart[]="DataBits=8 StopBits=1 Parity=NONE RtsControl=NONE";
** WdtSetMode( 0, CTMODE, pUart);
*********************************************************************************************************/
#define BAUDRATE 0
#define CTMODE 1
extern int32 uartSetMode (uint32 uiId,
uint32 uiCmd,
char *pcArg)
{
uint32 uiParaData[MAX_UART_STR_NUM]={0}; /* 定義一個數組存放字符串的參數*/
char cCopyStr[80]; /* 用于備份字符串 */
if ((uiId<__UART_MAX_NUM) && (strlen(pcArg)<80)) {
strcpy(cCopyStr,pcArg); /* 復制字符串 */
ImpCmd(Tab_UART,cCopyStr,uiParaData); /* 從字符串中提取參數 */
switch(uiCmd) {
case BAUDRATE:
return(__uartBandRate(__GpuiUartInfoTab[uiId],uiParaData[BaudRate]));
break;
case CTMODE:
return(__uartMode(__GpuiUartInfoTab[uiId],uiParaData));
break;
default:
break;
}
}
return UART_NOK;
}
/*********************************************************************************************************
** Function name: __uartGetState
** Descriptions: 從底層串口寄存器獲取當前串口的參數
** input parameters: uiId: 子設備號
** uiParaData: 字符串指針
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失敗
*********************************************************************************************************/
int32 __uartGetState (uint32 uiId, uint32 *uiParaData)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint32 uiBak = 0;
puiAddrBase = __GpuiUartInfoTab[uiId]->puiAddrBase;
uiOffBase = __GpuiUartInfoTab[uiId]->uiOffBase;
uiBak = puiAddrBase[__B_UART_LCR << uiOffBase];
puiAddrBase[__B_UART_LCR << uiOffBase] |= 0x80; /* 允許訪問分頻因子寄存器 */
uiParaData[BaudRate] = ((Fpclk /(puiAddrBase[__B_UART_DLL << uiOffBase]
| (puiAddrBase[__B_UART_DLM << uiOffBase] << 8)) / 16));
uiParaData[DataBits] = (uiBak & 0x03) + 5;
uiParaData[StopBits] = ((uiBak >> 2) & 0x01) + 1;
if (( (uiBak >> 3) & 0x01) == 0)
uiParaData[Parity] = 0;
else
{
uiParaData[Parity] = (((uiBak >> 4) & 0x03) + 1);
}
puiAddrBase[__B_UART_LCR << uiOffBase] &= 0x7F; /* 禁止訪問分頻因子寄存器 */
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartGetState
** Descriptions: 獲取當前串口的參數
** input parameters: uiId: 子設備號
** pcArg: 字符串指針
** Output parameters: pcArg: 輸出字符串參數
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失敗
*********************************************************************************************************/
extern int32 uartGetState (uint32 uiId, char * pcArg)
{
uint32 uiParaData[MAX_UART_STR_NUM]={0}; /* 定義一個數組存放字符串的參數 */
if (uiId < __UART_MAX_NUM) {
__uartGetState(uiId, uiParaData);
ExpCmd(Tab_UART, pcArg, uiParaData);
}
else
return UART_NOK;
return UART_OK;
}
/*********************************************************************************************************
** Function name: _uartQueueStatus
** Descriptions: 獲取Queue隊列的狀態
** input parameters: PUartInfo : 指向uart信息結構體的指針
** uiWhichFifo : 1-發送隊列;0-接收隊列
** Returned value: 發送隊列中可操作的空間大小,或接收隊列中可用數據個數
*********************************************************************************************************/
static int32 _uartQueueStatus (__PUART_INFO PUartInfo, uint32 uiWhichFifo)
{
#if defined(UART_SEMCONTROL)
INT8U UartErr;
#endif // end #if defined(UART_SEMCONTROL)
#if defined(QUEUE_NEW_OPRT)
uint16 uiCurNData = 0;
uint16 uiMaxData;
uint8 *pucIn, *pucOut;
#endif // end of #if defined(QUEUE_NEW_OPRT)
#if defined(QUEUE_NEW_OPRT)
#if defined(UART_SEMCONTROL)
OSSemPend(PUartInfo->pUartSem, 0, &UartErr);
#else
OS_ENTER_CRITICAL();
#endif // end #if defined(UART_SEMCONTROL)
if ((uiWhichFifo == TX_FIFO) && ((PUartInfo->uiUartFlag) < 0x80))
{
pucIn = PUartInfo->PdqSendBuf->In;
pucOut = PUartInfo->PdqSendBuf->Out;
uiMaxData = PUartInfo->PdqSendBuf->MaxData;
if ( pucIn > PUartInfo->PdqSendBuf->Out ) {
uiCurNData = uiMaxData - (pucIn - pucOut);
} else {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -