⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartsrv.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 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 + -