📄 uartsrv.c
字号:
/******************************************************************************
filename:
description:
createdata:
note:
author:
******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "uartdrv.h"
#include "uartsrv.h"
//#include "uartapp.h"
#include <kernel\ros33.h>
#include <sys\devmng.h>
#include <sys\syserr.h>
#include <sys\systsk.h>
#include <sys\sysusr.h>
#include <kernel\itron.h>
#include "internal.h"
#include "hardware.h"
char RecBuf0[BUF_SIZE];
char RecBuf1[BUF_SIZE];
char TraBuf0[BUF_SIZE];
char TraBuf1[BUF_SIZE];
char *pReadRecBuf0 = NULL;
char *pReadTraBuf0 = NULL;
char *pWriteRecBuf0 = NULL;
char *pWriteTraBuf0 = NULL;
char *pReadRecBuf1 = NULL;
char *pReadTraBuf1 = NULL;
char *pWriteRecBuf1 = NULL;
char *pWriteTraBuf1 = NULL;
int irq_uart0_flag = 0;
int irq_uart1_flag = 0;
DEVUSETBL gDevUseTbl[DEVNUM]={
/* name, ownerid, semid_own, semid_write, flgid_wbuf, semid_read, flgid_rbuf data_proc*/
{"UART0", 0, UART0_OWN_SEM, UART0_WRITE_SEM, UART0_WBUF_EVENT, UART0_READ_SEM, UART0_RBUF_EVENT, NULL},
{"UART1", 0, UART1_OWN_SEM, UART1_WRITE_SEM, UART1_WBUF_EVENT, UART1_READ_SEM, UART1_RBUF_EVENT, NULL}
};
void SysDevTableInit(void)
{
int i;
for(i = 0; i < DEVNUM; i++)
gDevUseTbl[i].ownerid = 0;
}
/******************************************************************************
参数说明:
入口参数:
ID devid 设备id
返回参数:
SYS_OK: 成功
SYS_PAR: 入口参数错误
SYS_ID: 任务不需要使用open函数
******************************************************************************/
short SysOpenUart(ID devid)
{
ID tskid;
DEVUSETBL *dev;
init_uart(devid);
conf_uart(devid, SYSCLK, BAUDRATE, DATABIT, TRIGERLEVEL);
if(devid >= DEVNUM || devid == -1) //uart0,uart1
return SYS_PAR;
get_tid(&tskid);
if(tskid < SHELL_ID)
return SYS_ID;
dev = &gDevUseTbl[devid];
if(dev->ownerid != 0) //device is in use
{
if(dev->ownerid == tskid)
return SYS_OK;
else
return SYS_PAR;
}
else
dev->ownerid = tskid;
return SYS_OK;
}
/******************************************************************************
参数说明:
入口参数:
ID devid 设备id
返回参数:
SYS_OK: 成功
SYS_PAR: 入口参数错误
SYS_ID: 任务不需要使用CLOSE函数
******************************************************************************/
short SysCloseUart(ID devid)
{
ID tskid;
DEVUSETBL *dev;
if(devid >= DEVNUM || devid == -1)
return SYS_PAR;
get_tid(&tskid);
if(tskid < SHELL_ID)
return SYS_ID;
dev = &gDevUseTbl[devid];
if(dev->ownerid != 0)
{
if(dev->ownerid == tskid)
return SYS_OK;
else
return SYS_PAR;
}
else
dev->ownerid = tskid;
return SYS_OK;
}
int SysWriteUart(ID devid, char *usr_buf, int total_num, int timeout)
{
int flgptn;
int unwritenum = 0;
int uart_base;
int i = 0;
if(devid == UART0_ID) //for uart0
{
uart_base = UART0_BASE;
pWriteTraBuf0 = TraBuf0;
unmask_irq(INT_UART0);
if(BUF_SIZE > total_num)
{
strncpy( pWriteTraBuf0, usr_buf, total_num);
pWriteTraBuf0 = pWriteTraBuf0 + total_num - 1;
EN_UART_TRA(uart_base);
unmask_irq(INT_UART0); //enable receive interrupt;
irq_uart0_flag = 0; //unmask uart0_irq
}
else
{
unwritenum = total_num;
while(unwritenum >= BUF_SIZE)
{
unwritenum = unwritenum - BUF_SIZE;
pWriteTraBuf0 = TraBuf0;
strncpy(pWriteTraBuf0, usr_buf + i*BUF_SIZE, BUF_SIZE);
i++;
pWriteTraBuf0 += BUF_SIZE - 1;
EN_UART_TRA(uart_base);
unmask_irq(INT_UART0); //enable receive interrupt;
irq_uart0_flag = 0; //unmask uart0_irq
twai_flg(&flgptn, UART0_WBUF_EVENT, 0XFF, TWF_ORW, timeout);
if(flgptn != UART0_TRA)
{
DIS_UART_TRA(uart_base);
return SYS_TMOUT;
}
}
if(unwritenum > BUF_SIZE)
{
DIS_UART_TRA(uart_base);
return SYS_TMOUT;
}
if(unwritenum == 0)
return SYS_OK;
else
{
pWriteTraBuf0 = TraBuf0;
strncpy(pWriteTraBuf0, usr_buf + i * BUF_SIZE, unwritenum);
pWriteTraBuf0 += (unwritenum - 1);
EN_UART_TRA(uart_base);
unmask_irq(INT_UART0); //enable receive interrupt;
irq_uart0_flag = 0; //unmask uart0_irq
}
}
}
else //for uart1
{
uart_base = UART1_BASE;
pWriteTraBuf1 = TraBuf1;
unmask_irq(INT_UART1);
if(BUF_SIZE > total_num)
{
strncpy( pWriteTraBuf1, usr_buf, total_num);
pWriteTraBuf1 = pWriteTraBuf1 + total_num - 1;
EN_UART_TRA(uart_base);
// unmask_irq(INT_UART1); //enable receive interrupt;
// irq_uart1_flag = 0; //unmask uart1_irq
}
else
{
unwritenum = total_num;
while(unwritenum >= BUF_SIZE)
{
unwritenum = unwritenum - BUF_SIZE;
pWriteTraBuf1 = TraBuf1;
strncpy(pWriteTraBuf1, usr_buf + i*BUF_SIZE, BUF_SIZE);
i++;
pWriteTraBuf1 += BUF_SIZE - 1;
EN_UART_TRA(uart_base);
unmask_irq(INT_UART1); //enable receive interrupt;
irq_uart1_flag = 0; //unmask uart1_irq
twai_flg(&flgptn, UART1_WBUF_EVENT, 0XFF, TWF_ORW, timeout);
if(flgptn != UART1_TRA)
{
DIS_UART_TRA(uart_base);
return SYS_TMOUT;
}
}
if(unwritenum > BUF_SIZE)
{
DIS_UART_TRA(uart_base);
return SYS_TMOUT;
}
if(unwritenum == 0)
return SYS_OK;
else
{
pWriteTraBuf1 = TraBuf1;
strncpy(pWriteTraBuf1, usr_buf + i * BUF_SIZE, unwritenum);
pWriteTraBuf1 += (unwritenum - 1);
EN_UART_TRA(uart_base);
unmask_irq(INT_UART1); //enable receive interrupt;
irq_uart1_flag = 0; //unmask uart1_irq
}
}
}
return SYS_OK;
}
int SysReadUart(ID devid, char *usr_buf, int total_num, int timeout)
{
int uart_base;
int i = 0;
int flgptn;
int unreadnum;
if(devid == UART0_ID) //for uart0
{
pReadRecBuf0 = RecBuf0;
uart_base = UART0_BASE;
if(BUF_SIZE > total_num)
{
pReadRecBuf0 = pReadRecBuf0 + total_num - 1;
unmask_irq(INT_UART0);
EN_UART_REC(uart_base); //enable receive interrupt;
twai_flg(&flgptn, UART0_RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == UART0_REC)
{
pReadRecBuf0 = pReadRecBuf0 + 1 - total_num;
strncpy(usr_buf, pReadRecBuf0, total_num);
return SYS_OK;
}
else
{
mask_irq(INT_UART0);
return SYS_TMOUT;
}
}
else //total_num >= BUF_SIZE
{
unreadnum = total_num;
pReadRecBuf0 = RecBuf0;
while(unreadnum >= BUF_SIZE)
{
unreadnum = unreadnum - BUF_SIZE;
pReadRecBuf0 = pReadRecBuf0 + BUF_SIZE - 1;
EN_UART_REC(uart_base); //enable receive interrupt;
unmask_irq(INT_UART0);
irq_uart0_flag = 0;
twai_flg(&flgptn, UART0_RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == UART0_REC)
{
pReadRecBuf0 = pReadRecBuf0 + 1 - BUF_SIZE;
strncpy(usr_buf + i*BUF_SIZE, pReadRecBuf0, BUF_SIZE);
i++;
}
else
{
mask_irq(INT_UART0);
return SYS_TMOUT;
}
}
if(unreadnum >= BUF_SIZE)
{
mask_irq(INT_UART0);
return SYS_TMOUT;
}
if(unreadnum == 0) //read finish
return SYS_OK;
else //read residual data
{
pReadRecBuf0 = pReadRecBuf0 + unreadnum - 1;
EN_UART_REC(uart_base);
unmask_irq(INT_UART0); //enable receive interrupt;
irq_uart0_flag = 0; //unmask uart0_irq
twai_flg(&flgptn, UART0_RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == UART0_REC)
{
pReadRecBuf0 = pReadRecBuf0 + 1 - unreadnum;
strncpy(usr_buf + i*BUF_SIZE, pReadRecBuf0, unreadnum);
return SYS_OK;
}
else
{
mask_irq(INT_UART0);
return SYS_TMOUT;
}
}
}
}
else //for uart1
{
pReadRecBuf1 = RecBuf1;
uart_base = UART1_BASE;
if(BUF_SIZE > total_num)
{
pReadRecBuf1 = pReadRecBuf1 + total_num - 1;
unmask_irq(INT_UART1);
EN_UART_REC(uart_base); //enable receive interrupt;
twai_flg(&flgptn, UART1_RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == UART1_REC)
{
pReadRecBuf1 = pReadRecBuf1 + 1 - total_num;
strncpy(usr_buf, pReadRecBuf1, total_num);
return SYS_OK;
}
else
{
mask_irq(INT_UART1);
return SYS_TMOUT;
}
}
else //total_num >= BUF_SIZE
{
unreadnum = total_num;
pReadRecBuf1 = RecBuf1;
while(unreadnum >= BUF_SIZE)
{
unreadnum = unreadnum - BUF_SIZE;
pReadRecBuf1 = pReadRecBuf1 + BUF_SIZE - 1;
EN_UART_REC(uart_base); //enable receive interrupt;
unmask_irq(INT_UART1);
irq_uart1_flag = 0;
twai_flg(&flgptn, UART1_RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == UART1_REC)
{
pReadRecBuf1 = pReadRecBuf1 + 1 - BUF_SIZE;
strncpy(usr_buf + i*BUF_SIZE, pReadRecBuf1, BUF_SIZE);
i++;
}
else
{
mask_irq(INT_UART1);
return SYS_TMOUT;
}
}
if(unreadnum >= BUF_SIZE)
{
mask_irq(INT_UART1);
return SYS_TMOUT;
}
if(unreadnum == 0) //read finish
return SYS_OK;
else //read residual data
{
pReadRecBuf1 = pReadRecBuf1 + unreadnum - 1;
EN_UART_REC(uart_base);
unmask_irq(INT_UART1); //enable receive interrupt;
irq_uart1_flag = 0; //unmask uart1_irq
twai_flg(&flgptn, UART1_RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == UART1_REC)
{
pReadRecBuf1 = pReadRecBuf1 + 1 - unreadnum;
strncpy(usr_buf + i*BUF_SIZE, pReadRecBuf1, unreadnum);
return SYS_OK;
}
else
{
mask_irq(INT_UART1);
return SYS_TMOUT;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -