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

📄 sio.c

📁 USBhost source
💻 C
字号:
/**
*	sio.c
*	俫俉俴俙俶儃乕僪			捠怣娭悢
*	Copyright (c)2002 Junichi Tomaru
*/
#include	"h8hst.h"
#include	<stdarg.h>

static	char	st;

/**
*	SIO 弶婜壔
*/
void	sioinit( char ch, char speed, char prm )
{
	switch( ch ){			/* TE,RE,RIE,TIE,TEIE,MPIE傪嬛巭偡傞 */
		 case 0:	SCI0_SCR = 0;
		_case 1:	SCI1_SCR = 0;
		_default:	break;
	}
	switch( ch ){			/* 僋儘僢僋僙儗僋僩(冇) */
		 case 0:	SCI0_SMR = 0;
		_case 1:	SCI1_SMR = 0;
		_default:	break;
	}
	switch( ch ){			/* 捠怣僷儔儊乕僞丄暘廃 */
		 case 0:	SCI0_SMR |= prm;
		_case 1:	SCI1_SMR |= prm;
		_default:	break;
	}
	switch( ch ){			/* 儃乕儗僀僩乮價僢僩儗乕僩乯 */
		 case 0:	SCI0_BRR = speed;
		_case 1:	SCI1_BRR = speed;
		_default:	break;
	}

	waitms( 1 );
	rx0hp = rx0tp = rx0ct = rx0err = 0; /* 僶僢僼傽億僀儞僞摍僋儕傾 */
	tx0hp = tx0tp = tx0ct = 0;
	rx1hp = rx1tp = rx1ct = rx1err = 0;
	tx1hp = tx1tp = tx1ct = 0;

	switch( ch ){			/* 憲怣I嬛巭,庴怣I嫋壜,憲怣嫋壜,庴怣嫋壜 */
		 case 0:	SCI0_SCR = 0x70;
		_case 1:	SCI1_SCR = 0x70;
		_default:	break;
	}
}


/**
*	俠俫侽庴怣僄儔乕妱傝崬傒
*/
#pragma	interrupt
void	scirx0err( void )
{
	st = SCI0_SSR;			/* 僗僥乕僞僗撉傓 */
	rx0err |= st;			/* 慜偺僄儔乕偼徚偝側偄 */
	st &= 0xc7;			/* 僄儔乕偺僋儕傾(OE,FE,PE) */
	SCI0_SSR = st;
}


/**
*	俠俫侽庴怣妱傝崬傒
*/
#pragma	interrupt
void scirx0( void )
{
	rx0buf[rx0tp] = SCI0_RDR;		/* 庴怣 */
	rx0tp++;
	rx0tp &= 0xff;
	rx0ct++;
	rx0ct &= 0xff;
	SCI0_SSR &= 0x87;			/* RDRF僋儕傾 */
}


/**
*	俠俫侽憲怣僨乕僞儗僕僗僞僄儞僾僥傿妱傝崬傒
*/
#pragma	interrupt
void	scitx0empty( void )
{
	if( tx0ct != 0 ){		/* 憲傞暥帤偑偁傞 */
		tx0ct--;
		SCI0_TDR = tx0buf[tx0hp];	/* 憲怣 */
		tx0hp++;
		tx0hp &= 0xff;
		SCI0_SSR &= 0x7f;		/* TDRE僋儕傾 */
	}
	else{
		SCI0_SCR &= 0x7f;		/* 憲怣I嬛巭 */
	}
}


/**
*	俠俫侾庴怣僄儔乕妱傝崬傒
*/
#pragma	interrupt
void	scirx1err( void )
{
	st = SCI1_SSR;			/* 僗僥乕僞僗撉傓 */
	rx1err |= st;			/* 慜偺僄儔乕偼徚偝側偄 */
	st &= 0xc7;			/* 僄儔乕偺僋儕傾(OE,FE,PE) */
	SCI1_SSR = st;
}


/**
*	俠俫侾庴怣妱傝崬傒
*/
#pragma	interrupt
void	scirx1( void )
{
	rx1buf[rx1tp] = SCI1_RDR;		/* 庴怣 */
	rx1tp++;
	rx1tp &= 0xff;
	rx1ct++;
	rx1ct &= 0xff;
	SCI1_SSR &= 0x87;			/* RDRF僋儕傾 */
}


/**
*	俠俫侾憲怣僨乕僞儗僕僗僞僄儞僾僥傿妱傝崬傒
*/
#pragma	interrupt
void	scitx1empty( void )
{
	if( tx1ct != 0 ){			/* 憲傞暥帤偑偁傞 */
		tx1ct--;
		SCI1_TDR = tx1buf[tx1hp];	/* 憲怣 */
		tx1hp++;
		tx1hp &= 0xff;
		SCI1_SSR &= 0x7f;		/* TDRE僋儕傾 */
	}
	else{
		SCI1_SCR &= 0x7f;		/* 憲怣I嬛巭 */
	}
}


/**
*	庴怣悢僠僃僢僋
*	return	庴怣偟偨暥帤悢
*/
byte	getrxcount( char ch )
{
	byte	ret;

	_di( );
	if( ch == 0 ){
		ret = rx0ct;
	}
	else{
		ret = rx1ct;
	}
	_ei( );

	return	ret;
}


/**
*	憲怣悢僠僃僢僋
*	return	憲怣僶僢僼傽撪偺暥帤悢
*/
byte	gettxcount( char ch )
{
	byte	ret;

	_di( );
	if( ch == 0 ){
		ret = tx0ct;
	}
	else{
		ret = tx1ct;
	}
	_ei( );

	return	ret;
}


/**
*	庴怣僄儔乕撉傒弌偟
*/
char	chkrxerr( char ch )
{
	char	ret;

	if( ch == 0 ){
		ret = rx0err;
	}
	else{
		ret = rx1err;
	}

	return	ret;
}


/**
*	堦暥帤庴怣乮僶僢僼傽偐傜撉傒弌偡乯
*/
char	getsio1( char ch )
{
	char	c;

	_di( );
	if( ch == 0 ){
		c = rx0buf[rx0hp];
		rx0hp++;
		rx0hp &= 0xff;
		rx0ct--;
	}
	else{
		c = rx1buf[rx1hp];
		rx1hp++;
		rx1hp &= 0xff;
		rx1ct--;
	}
	_ei( );

	return	c;
}


/**
*	堦暥帤憲怣乮憲怣僶僢僼傽偵僙僢僩偲妱傝崬傒嫋壜乯
*/
bool	setsio1( char ch, char dat )
{
	bool	ret;

	_di( );
	if( ch == 0 ){
		if( tx0ct < 255 ){			/* 憲怣偱偒傞 */
			tx0buf[tx0tp] = dat;
			tx0tp++;
			tx0tp &= 0xff;
			tx0ct++;
			tx0ct &= 0xff;
			SCI0_SCR |= 0x80;		/* 憲怣I嫋壜 */
			ret = TRUE;
		}
		else{
			ret = FALSE;
		}
	}
	else{
		if( tx1ct < 255 ){			/* 憲怣偱偒傞 */
			tx1buf[tx1tp] = dat;
			tx1tp++;
			tx1tp &= 0xff;
			tx1ct++;
			tx1ct &= 0xff;
			SCI1_SCR |= 0x80;			/* 憲怣I嫋壜 */
			ret = TRUE;
		}
		else{
			ret = FALSE;
		}
	}
	_ei( );
	return	ret;
}


/**
*	堦暥帤憲怣(懸偮)
*/
bool	setsio1w( char ch, char dat )
{
	bool	ret;

	if( ch == 0 ){
		while( tx0ct >= 254 ){
		}
	}
	else{
		while( tx1ct >= 254 ){
		}
	}
	return	setsio1( ch, dat );
}


/**
*	億乕僩僋儕傾
*/
void	sioclear( char ch )
{
	while( getrxcount( ch ) != 0 ){		/* 庴怣偁偭偨 */
		getsio1( ch );
	}
}


/**
*	暥帤楍弌椡
*/
void	setsiostr( char ch, char *str )
{
	byte	i;

	for( i = 0; *( str + i ) != '\0'; i++ ){
		setsio1w( ch, *( str + i ));
	}
}


/**
*	暥帤楍弌椡(僼僅乕儅僢僩偮偒)
*/
void	setsiostrf( char ch, char *fmt, ... )
{
	va_list	argptr;
	byte	i;
	char	buf[64];

	va_start( argptr, fmt );
	vsprintf( buf, fmt, argptr );
	for( i = 0; buf[i] != '\0'; i++ ){
		setsio1w( ch, buf[i] );
	}
}


/**
*	俽俬俷暥帤楍擖椡
*	buf:	僶僢僼傽
*	ct:	僶僢僼傽梕検
*	dl:	僨儕儈僞乮 嬫愗傝暥帤 乯
*/
char	getsiostr( char ch, char *buf, int ct, char dl )
{
	byte	i;
	char	ret;
	word	wt;
	byte	c;

	ct--;
	wt = getcount1ms( );
	for( i = 0; i < ct; ){
		if( getrxcount( ch ) != 0 ){		/* 庴怣偁偭偨 */
			c = getsio1( ch );
			*( buf + i ) = (char)c;
			i++;
			if( c == dl ){			/* 僨儕儈僞 */
				*( buf + i ) = '\0';
				if( chkrxerr( ch ) ){	/* 捠怣僄儔乕偁偭偨 */
					ret = 0;
				}
				else{			/* 僨乕僞桳岟 */
					ret = 1;
				}
				break;
			}
		}
		else if( getcount1ms( ) - wt > 3000U ){
			ret = 0;
			break;
		}
		else{
		}
	}
	return	ret;
}

/* end of sio.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -