📄 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"
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函数
******************************************************************************/
//devid 设备号0~(DEVNUM-1)
short SysOpenUart(ID devid)
{
init_uart(devid);
conf_uart(devid, SYSCLK, BAUDRATE, DATABIT, TRIGERLEVEL);
return SYS_OK;
}
/******************************************************************************
参数说明:
入口参数:
ID devid 设备id
返回参数:
SYS_OK: 成功
SYS_PAR: 入口参数错误
SYS_ID: 任务不需要使用CLOSE函数
******************************************************************************/
short SysCloseUart(ID devid)
{
return SYS_OK;
}
int SysWriteUart(ID devid, char *usr_buf, int total_num, int timeout)
{
int flgptn;
int unwritenum = 0;
int i = 0;
uartdev[devid].pWriteTraBuf = uartdev[devid].TraBuf;
//// unmask_irq(uartdev[devid].usetbl.INT_UART);
if(BUF_SIZE > total_num)
{
strncpy( uartdev[devid].pWriteTraBuf, usr_buf, total_num);
uartdev[devid].pWriteTraBuf = uartdev[devid].pWriteTraBuf + total_num - 1;
EN_UART_TRA(uartdev[devid].usetbl.UART_BASE);
unmask_irq(uartdev[devid].usetbl.INT_UART); //enable receive interrupt;
uartdev[devid].irq_uart_flag = 0; //unmask uart_irq
}
else
{
unwritenum = total_num;
while(unwritenum >= BUF_SIZE)
{
unwritenum = unwritenum - BUF_SIZE;
uartdev[devid].pWriteTraBuf = uartdev[devid].TraBuf;
strncpy(uartdev[devid].pWriteTraBuf, usr_buf + i*BUF_SIZE, BUF_SIZE);
i++;
uartdev[devid].pWriteTraBuf += BUF_SIZE - 1;
EN_UART_TRA(uartdev[devid].usetbl.UART_BASE);
unmask_irq(uartdev[devid].usetbl.INT_UART); //enable receive interrupt;
uartdev[devid].irq_uart_flag = 0; //unmask uart_irq
twai_flg(&flgptn, uartdev[devid].usetbl.WBUF_EVENT, 0XFF, TWF_ORW, timeout);
if(flgptn != uartdev[devid].usetbl.UART_TRA)
{
DIS_UART_TRA(uartdev[devid].usetbl.UART_BASE);
return SYS_TMOUT;
}
}
if(unwritenum > BUF_SIZE)
{
DIS_UART_TRA(uartdev[devid].usetbl.UART_BASE);
return SYS_TMOUT;
}
if(unwritenum == 0)
return SYS_OK;
else
{
uartdev[devid].pWriteTraBuf = uartdev[devid].TraBuf;
strncpy(uartdev[devid].pWriteTraBuf, usr_buf + i * BUF_SIZE, unwritenum);
uartdev[devid].pWriteTraBuf += (unwritenum - 1);
EN_UART_TRA(uartdev[devid].usetbl.UART_BASE);
unmask_irq(uartdev[devid].usetbl.INT_UART); //enable receive interrupt;
uartdev[devid].irq_uart_flag = 0; //unmask uart_irq
}
}
return SYS_OK;
}
int SysReadUart(ID devid, char *usr_buf, int total_num, int timeout)
{
int i = 0;
int flgptn;
int unreadnum;
uartdev[devid].pReadRecBuf = uartdev[devid].RecBuf;
if(BUF_SIZE > total_num)
{
uartdev[devid].pReadRecBuf = uartdev[devid].pReadRecBuf + total_num - 1;
unmask_irq(uartdev[devid].usetbl.INT_UART);
EN_UART_REC(uartdev[devid].usetbl.UART_BASE); //enable receive interrupt;
twai_flg(&flgptn, uartdev[devid].usetbl.RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == uartdev[devid].usetbl.UART_REC)
{
uartdev[devid].pReadRecBuf = uartdev[devid].pReadRecBuf + 1 - total_num;
strncpy(usr_buf, uartdev[devid].pReadRecBuf, total_num);
return SYS_OK;
}
else
{
mask_irq(uartdev[devid].usetbl.INT_UART);
return SYS_TMOUT;
}
}
else //total_num >= BUF_SIZE
{
unreadnum = total_num;
uartdev[devid].pReadRecBuf = uartdev[devid].RecBuf;
while(unreadnum >= BUF_SIZE)
{
unreadnum = unreadnum - BUF_SIZE;
uartdev[devid].pReadRecBuf = uartdev[devid].pReadRecBuf + BUF_SIZE - 1;
EN_UART_REC(uartdev[devid].usetbl.UART_BASE); //enable receive interrupt;
unmask_irq(uartdev[devid].usetbl.INT_UART);
uartdev[devid].irq_uart_flag = 0;
twai_flg(&flgptn, uartdev[devid].usetbl.RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == uartdev[devid].usetbl.UART_REC)
{
uartdev[devid].pReadRecBuf = uartdev[devid].pReadRecBuf + 1 - BUF_SIZE;
strncpy(usr_buf + i*BUF_SIZE, uartdev[devid].pReadRecBuf, BUF_SIZE);
i++;
}
else
{
mask_irq(uartdev[devid].usetbl.INT_UART);
return SYS_TMOUT;
}
}
if(unreadnum >= BUF_SIZE)
{
mask_irq(uartdev[devid].usetbl.INT_UART);
return SYS_TMOUT;
}
if(unreadnum == 0) //read finish
return SYS_OK;
else //read residual data
{
uartdev[devid].pReadRecBuf = uartdev[devid].pReadRecBuf + unreadnum - 1;
EN_UART_REC(uartdev[devid].usetbl.UART_BASE);
unmask_irq(uartdev[devid].usetbl.INT_UART); //enable receive interrupt;
uartdev[devid].irq_uart_flag = 0; //unmask uart_irq
twai_flg(&flgptn, uartdev[devid].usetbl.RBUF_EVENT, 0XFF, TWF_ORW|TWF_CLR, timeout);
if(flgptn == uartdev[devid].usetbl.UART_REC)
{
uartdev[devid].pReadRecBuf = uartdev[devid].pReadRecBuf + 1 - unreadnum;
strncpy(usr_buf + i*BUF_SIZE, uartdev[devid].pReadRecBuf, unreadnum);
return SYS_OK;
}
else
{
mask_irq(uartdev[devid].usetbl.INT_UART);
return SYS_TMOUT;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -