?? uart.c
字號:
else
break;
}
OS_EXIT_CRITICAL();
}
return uiReviceNum;
}
/*********************************************************************************************************
** Function name: __uartWrite
** Descriptions: 發送多個字節數據
** input parameters: PUartInfo: 指向uart信息結構體的指針
** puiData: 要發送的數據的首地址
** uiNumByte: 發送數據的個數
** Output parameters: NONE
** Returned value: 成功發送數據的個數
*********************************************************************************************************/
static uint16 __uartWrite (__PUART_INFO PUartInfo, uint8 *puiData, uint32 uiNumByte)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint32 uiSendNumbyte;
uint8 uiTemp;
uiSendNumbyte = uiNumByte;
PUartInfo->uiUartFlag &= (~0x80); /* 使用隊列做為緩沖 */
if((PUartInfo->uiUartFlag) < 0x80) {
OS_ENTER_CRITICAL();
while (uiSendNumbyte > 0) {
if (QueueWrite((void *)PUartInfo->PdqSendBuf, *puiData++) == QUEUE_FULL) {
break;
}
uiSendNumbyte--;
}
PUartInfo->uiUartFlag |= 0x10; /* 使能發送隊列 */
if (PUartInfo->uiUartFlag > 0x0f) {
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
if ((puiAddrBase[__B_UART_IER << uiOffBase] & 0x02) == 0) {
if (QUEUE_OK == QueueRead(&uiTemp, PUartInfo->PdqSendBuf)) {
puiAddrBase[__B_UART_IER << uiOffBase] |= 0x02; /* 開發送中斷 */
puiAddrBase[__B_UART_THR << uiOffBase] = uiTemp;
}
}
}
OS_EXIT_CRITICAL();
}
return (uiNumByte - uiSendNumbyte);
}
/*********************************************************************************************************
** Function name: uartWrite
** Descriptions: 向串口設備寫數據
** input parameters: uiId: 子設備號
** puiBuf: 輸出數據的字符串指針地址
** uiNum: 一次寫入的數據個數
** pRsv: 保留參數
** Output parameters: NONE
** Returned value: 實際發送的數據個數
*********************************************************************************************************/
extern int32 uartWrite (uint32 uiId,
uint8 *puiBuf,
uint32 uiNum,
void *pRsv)
{
if (uiId < __UART_MAX_NUM){
return (__uartWrite(__GpuiUartInfoTab[uiId], puiBuf, uiNum));
}
else
return 0;
}
/*********************************************************************************************************
** Function name: __uartDirectWrite
** Descriptions: 直接發送一個字節數據
** input parameters: PUartInfo : 指向uart信息結構體的指針
** uiData : 要發送的數據
** Output parameters: NONE
** Returned value: OPERATE_SUCCESS: 操作成功
** OPERATE_FAIL: 操作失敗
*********************************************************************************************************/
static uint8 __uartDirectWrite (__PUART_INFO PUartInfo, uint8 uiData)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
OS_ENTER_CRITICAL();
puiAddrBase[__B_UART_LCR << uiOffBase] &= (~0x80); /* DLAB = 0 */
puiAddrBase[__B_UART_THR << uiOffBase] = uiData;
while ((puiAddrBase[__B_UART_LSR << uiOffBase] & 0x20) == 0); /* 等待發送完 */
OS_EXIT_CRITICAL();
return UART_OK;
}
/*********************************************************************************************************
** Function name: uartDirectWrite
** Descriptions: 向串口設備直接發送數據
** input parameters: uiId : 子設備號
** uiData : 輸出的數據
** Output parameters: NONE
** Returned value: 實際發送的數據個數(1或0);
*********************************************************************************************************/
extern int32 uartDirectWrite (uint32 uiId, uint8 uiData)
{
if (uiId < __UART_MAX_NUM) {
return (__uartDirectWrite(__GpuiUartInfoTab[uiId], uiData));
}
else
return 0;
}
/*********************************************************************************************************
** Function name: __uartIsr
** Descriptions: UART中斷服務程序
** input parameters: PUartInfo: 指向uart信息結構體的指針
** Output parameters: NONE
** Returned value: 無
*********************************************************************************************************/
static void __uartNone (__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
{
PUartInfo = PUartInfo;
puiAddrBase = puiAddrBase;
uiOffBase = uiOffBase;
}
static void __uartThre (__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
/* 發送中斷 */
{
uint16 uiNum;
DataQueue *dqSend;
uint8 *pucOut, *pucEnd;
PUartInfo-> uiUartState = 1; /* 發狀態 */
if (PUartInfo->uiUartFlag < 0x10) {
puiAddrBase[__B_UART_IER << uiOffBase] &= ~0x02;
return;
}
dqSend = PUartInfo->PdqSendBuf;
uiNum = PUartInfo->uiQueueSendFifoLen;
if ( uiNum > dqSend->NData) {
uiNum = dqSend->NData;
}
if (uiNum == 0) {
puiAddrBase[__B_UART_IER << uiOffBase] &= ~0x02;
return;
}
dqSend->NData -= uiNum;
pucOut = dqSend->Out;
pucEnd = dqSend->End;
do {
puiAddrBase[__B_UART_THR << uiOffBase] = *pucOut++;
while((puiAddrBase[__B_UART_LSR << uiOffBase]&0x40)==0); /* 數據是否發出去 */
if (pucOut >= pucEnd) {
pucOut = dqSend->Buf;
}
} while (--uiNum != 0);
dqSend->Out = pucOut;
}
static void __uartRevice(__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
/* 接收中斷 */
{
uint8 ucData;
DataQueue *pdqRevice;
uint16 uiNum, uiMaxData;
uint8 *pucIn, *pucEnd;
PUartInfo-> uiUartState = 0; /* 收狀態 */
pdqRevice = PUartInfo->PdqReviceBuf;
pucIn = pdqRevice->In;
pucEnd = pdqRevice->End;
uiNum = pdqRevice->NData;
uiMaxData = pdqRevice->MaxData;
do
{
ucData = puiAddrBase[__B_UART_RBR << uiOffBase];
if (uiNum < uiMaxData) {
*pucIn++ = ucData;
if (pucIn >= pucEnd) {
pucIn = pdqRevice->Buf;
}
uiNum++;
}
} while ((puiAddrBase[__B_UART_LSR << uiOffBase] & 0x00000001) != 0);
pdqRevice->In = pucIn;
pdqRevice->NData = uiNum;
}
static void __uartLine(__PUART_INFO PUartInfo, volatile uint32 *puiAddrBase, uint32 uiOffBase)
/* 接收線狀態 */
{
uint8 uiState;
uiState = puiAddrBase[__B_UART_LSR << uiOffBase];
}
static void (* const __uartFucTiom[16])(__PUART_INFO PUartInfo,
volatile uint32 *puiAddrBase,
uint32 uiOffBase) =
{__uartNone, __uartNone, __uartThre, __uartNone,
__uartRevice, __uartNone, __uartLine, __uartNone,
__uartNone, __uartNone, __uartNone, __uartNone,
__uartRevice, __uartNone, __uartNone, __uartNone};
void __uartIsr (__PUART_INFO PUartInfo)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
uint8 uiState;
puiAddrBase = PUartInfo->puiAddrBase;
uiOffBase = PUartInfo->uiOffBase;
uiState = puiAddrBase[__B_UART_IIR << uiOffBase] & 0x0f;
__uartFucTiom[uiState](PUartInfo, puiAddrBase, uiOffBase);
}
/*********************************************************************************************************
** Function name: uartIsr
** Descriptions: UART中斷服務程序
** input parameters: uiId : 子設備號
** Output parameters: NONE
** Returned value: 無
*********************************************************************************************************/
extern void uartIsr (uint32 uiId)
{
if (uiId < __UART_MAX_NUM) {
__uartIsr(__GpuiUartInfoTab[uiId]);
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -