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

📄 uartsrv.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 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 + -