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

📄 h8s_sci.c

📁 toppers操作系统源码
💻 C
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering *                   Tomakomai National College of Technology, JAPAN *  Copyright (C) 2001-2004 by Industrial Technology Institute, *                              Miyagi Prefectural Government, JAPAN *  *  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation  *  によって给山されている GNU General Public License の Version 2 に淡 *  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア *  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も *  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 *  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ *//* *  H8S柒垄SCI脱 词白SIOドライバ *  ˇ布淡は、2チャンネル脱に淡揭している。H8Sシリ〖ズの面には、3チャンネル *    笆惧サポ〖トしているチップもあるが、そのときの滦炳は推白である。 */#include <h8s_sci.h>/* SCIレジスタのアドレス *//* ベ〖スアドレス */#define SCI0_BASE_ADDR	0xff78	/* チャネル0 */#define SCI1_BASE_ADDR	0xff80	/* チャネル1 *//* レジスタオフセット */#define SMR		0	/* シリアルモ〖ドレジスタ */#define BRR		1	/* ビットレ〖トレジスタ */#define SCR		2	/* シリアルコントロ〖ルレジスタ */#define TDR		3	/* トランスミットデ〖タレジスタ */#define SSR		4	/* シリアルステ〖タスレジスタ */#define RDR		5	/* レシ〖ブデ〖タレジスタ */#define SCMR		6	/* スマ〖トカ〖ドモ〖ドレジスタ *//* 称レジスタのビットパタ〖ン *//* RSR, RDR, TSR, TDR *//* 年盗すべきものは、泼に痰い *//* SMR */#define CA	BIT7#define	CHR	BIT6	/* 8bit = 0 / 7bit = 1 */#define	PE	BIT5	/* Parity OFF = 0 / Parity ON = 1 */#define	OE	BIT4	/* EVEN Parity = 0 / ODD Parity = 1 */#define	STOP	BIT3	/* 1 STOP BIT = 0 / 2 STOP BIT = 1 */#define MP	BIT2#define	CSK1	BIT1#define	CSK0	BIT0/* * SMRの介袋猛 * * ビット7=0¨拇殊票袋及モ〖ド * ビット6=0¨キャラクタレングス=8ビット * ビット5=0¨パリティの烧裁、チェックを敦贿 * ビット4 ¨パリティモ〖ド∈踏蝗脱∷ * ビット3=0¨ストップビットレングス♂1ビット * ビット1,0¨ボ〖レ〖トジェネレ〖タへのクロックソ〖ス联买 *       ボ〖ド巴赂婶でSCRn_CKSとして年盗∈nはch戎规∷ */#define SMR_INIT	0/* SCR */#define TIE	BIT7#define	RIE	BIT6#define	TE	BIT5#define	RE	BIT4#define	MPIE	BIT3#define TEIE	BIT2#define	CKE1	BIT1#define	CKE0	BIT0/* SSR */#define TDRE	BIT7#define	RDRF	BIT6#define	ORER	BIT5#define	FER	BIT4#define	PER	BIT3#define TEND	BIT2#define	MPB	BIT1#define	MPBT	BIT0/* *  SCI脱システムインタフェ〖スレイヤ * *   base : ポ〖トのベ〖スアドレス *   offset : レジスタオフセット *   val : レジスタ猛  */#define h8s_sci_wrb( base, offset, val ) h8s_wrb_reg( (base) + (offset), (val) )#define h8s_sci_reb( base, offset )	h8s_reb_reg( (base) + (offset) )/*  * TNUM_PORT : シリアルドライバ∈serial.c∷、つまり GDICレベルでサポ〖トする *       シリアルポ〖トの眶  * TNUM_SIOP : PDICレベル∈プロセッサ柒垄SIO∷でサポ〖トするシリアルI/Oポ〖ト *       の眶∈附哼の悸刘では呵络2∷ *   * いずれもuser_config.hで年盗する。 *//* 笆布で、レジスタのアドレスを、UW 房へキャストをしている。これは、ベ〖ス   アドレスにオフセット猛を裁えて、呵姜弄なレジスタのアドレスを滇めている   ためである。艰评稿に、呵姜弄に VP 房にキャストされている。(h8s_sci.h) *//* *  シリアルI/Oポ〖ト介袋步ブロックの年盗 */typedef struct sio_port_initialization_block {	UW	reg_base;	/* レジスタのベ〖スアドレス */	UH	boud_rate;	/* ボ〖レ〖ト[bps] */	UB	boud_brr_def;	/* BRR 肋年猛∈ボ〖レ〖トの肋年猛∷ */	UB	smr_def;	/* SMR 肋年猛				   (流减慨ビット眶、ストップビット·パリティ) */} SIOPINIB;/* *  シリアルI/Oポ〖ト瓷妄ブロックの年盗 */struct sio_port_control_block {	const SIOPINIB	*siopinib;	/* シリアルI/Oポ〖ト介袋步ブロック */	VP_INT		exinf;		/* 橙磨攫鼠 */	BOOL		openflag;	/* オ〖プン貉みフラグ */	BOOL		getready;	/* 矢机を减慨した觉轮 */	BOOL		putready;	/* 矢机を流慨できる觉轮 */};/* *  シリアルI/Oポ〖ト介袋步ブロック */const SIOPINIB siopinib_table[TNUM_SIOP] = {	{ (UW)SCI0_BASE_ADDR,	  (UH)BAUD_RATE1,	  (UB)BRR0_RATE,			/* N 猛 */	  (UB)(SMR_INIT | (SCR0_CKS & (CKE1 | CKE0)))	},#if TNUM_SIOP >= 2	{ (UW)SCI1_BASE_ADDR,	  (UH)BAUD_RATE1,	  (UB)BRR1_RATE,		/* N 猛 */	  (UB)(SMR_INIT | (SCR1_CKS & (CKE1 | CKE0)))	}#endif /* TNUM_SIOP >= 2 */};/* *  シリアルI/Oポ〖ト介袋步ブロックの艰叫し */#define INDEX_SIOPINIB(siopid)	((UINT)((siopid) - 1))#define get_siopinib(siopid)	(&(siopinib_table[INDEX_SIOPINIB(siopid)]))/* *  シリアルI/Oポ〖ト瓷妄ブロックのエリア */SIOPCB	siopcb_table[TNUM_SIOP];/* *  シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid)	((UINT)((siopid) - 1))#define get_siopcb(siopid)	(&(siopcb_table[INDEX_SIOP(siopid)]))/* *  SCI脱レジスタ拎侯簇眶 */Inline voidh8s_sci_or( const SIOPINIB *siopinib, UW reg, UB val ){	h8s_sci_wrb( siopinib->reg_base, reg, h8s_sci_reb( siopinib->reg_base, reg ) | val );}Inline voidh8s_sci_and( const SIOPINIB *siopinib, UW reg, UB val ){	h8s_sci_wrb( siopinib->reg_base, reg, h8s_sci_reb( siopinib->reg_base, reg ) & val );}/* *  矢机を减慨できるか々 */Inline BOOLh8s_sci_getready(SIOPCB *siopcb){	siopcb->getready = FALSE;	if( h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & RDRF )		siopcb->getready = TRUE;	return( siopcb->getready );}/* *  矢机を流慨できるか々 */Inline BOOLh8s_sci_putready(SIOPCB *siopcb){	siopcb->putready = FALSE;	if( h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & TDRE ) {		siopcb->putready = TRUE;	}	return( siopcb->putready );}/* *  减慨した矢机の艰叫し */Inline charh8s_sci_getchar(SIOPCB *siopcb){	/* RDRFクリア */	h8s_sci_and( siopcb->siopinib, (UW) SSR, (UB) ~RDRF );	return( (char) h8s_sci_reb( siopcb->siopinib->reg_base, (UW) RDR ) );}/* *  流慨する矢机の今哈み */Inline voidh8s_sci_putchar(SIOPCB *siopcb, char c){	h8s_sci_wrb( siopcb->siopinib->reg_base, (UW) TDR, c );	/* TDREクリア */	h8s_sci_and( siopcb->siopinib, (UW) SSR, (UB) ~TDRE );}/* *  SIOドライバの介袋步ル〖チン */voidh8s_sci_initialize(void){	SIOPCB	*siopcb;	UINT	i;	/*	 *  シリアルI/Oポ〖ト瓷妄ブロックの介袋步	 */	for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {		siopcb->siopinib = &(siopinib_table[i]);		siopcb->openflag = FALSE;	}}/* *  SIOレジスタ介袋步ル〖チン */voidh8s_sci_init_siopinib( const SIOPINIB  *siopinib ){	/*	 * SCIレジスタの介袋步	 */	/* 流减慨匿贿 */	h8s_sci_and( siopinib, (UW) SCR, (UB) ~( TE | RE ) );	/* ビット墓など肋年 */	h8s_sci_wrb( siopinib->reg_base, (UW) SMR, siopinib->smr_def );	/* ボ〖レ〖ト肋年 */	h8s_sci_wrb( siopinib->reg_base, (UW) BRR, siopinib->boud_brr_def );	/*	 *  充哈み敦贿とクロックソ〖ス联买	 *  クロックソ〖スは柒婶クロックを联买	 */	h8s_sci_and( siopinib, (UW) SCR, (UB) ~( TIE | RIE | MPIE | TEIE | CKE1 | CKE0 ) );	/* ボ〖レ〖トの奥年步(1bit尸の略ち) */	sil_dly_nse_long( 1000000000ul / (siopinib->boud_rate) );	/* エラ〖フラグをクリア */	h8s_sci_and( siopinib, (UW) SSR, ~( ORER | FER | PER ) );	/* 流减慨钓材、减慨充哈み钓材 */	h8s_sci_or( siopinib, (UW) SCR, ( RIE | TE | RE ) );}/* *  カ〖ネル弹瓢箕のバ〖ナ〖叫蜗脱の介袋步 */voidh8s_sci_init(void){#ifndef OMIT_SCI0	h8s_sci_init_siopinib( get_siopinib(1) );#endif /* OMIT_SCI0 */#if TNUM_SIOP >= 2	h8s_sci_init_siopinib( get_siopinib(2) );#endif /* TNUM_SIOP >= 2 */}/* *  オ〖プンしているポ〖トがあるか々 */BOOLh8s_sci_openflag(void){	BOOL ret;#ifndef OMIT_SCI0	ret = siopcb_table[0].openflag;#else /* OMIT_SCI0 */	ret = FALSE;#endif /* OMIT_SCI0 */#if TNUM_SIOP >= 2	ret |= siopcb_table[1].openflag;#endif /* TNUM_SIOP < 2 */	return(ret);}/* *  シリアルI/Oポ〖トのオ〖プン */SIOPCB *h8s_sci_opn_por(ID siopid, VP_INT exinf){	SIOPCB 		*siopcb = get_siopcb(siopid);	const SIOPINIB  *siopinib = siopcb->siopinib;	/* SCIレジスタの介袋步 */	h8s_sci_init_siopinib( siopinib );	/* 充哈みレベル肋年、充哈み妥滇クリアは、sio_opn_por で乖う。 */	siopcb->exinf = exinf;	siopcb->getready = siopcb->putready = FALSE;	siopcb->openflag = TRUE;	return(siopcb);}/* *  シリアルI/Oポ〖トのクロ〖ズ */voidh8s_sci_cls_por(SIOPCB *siopcb){	/* TEND が 1 になるまで略つ */	while ( !(h8s_sci_reb( siopcb->siopinib->reg_base, (UW) SSR ) & TEND ) );	h8s_sci_and( siopcb->siopinib, (UW) SCR, ~( TE | RE ) );	siopcb->openflag = FALSE;}/* *  シリアルI/Oポ〖トへの矢机流慨 */BOOLh8s_sci_snd_chr(SIOPCB *siopcb, char c){	if( h8s_sci_putready(siopcb) ) {		h8s_sci_putchar(siopcb, c);		siopcb->putready = FALSE;		return(TRUE);	}	return(FALSE);}/* *  シリアルI/Oポ〖トからの矢机减慨 */INTh8s_sci_rcv_chr(SIOPCB *siopcb){	if( h8s_sci_getready(siopcb) ) {		siopcb->getready = FALSE;		return( (INT)(UB) h8s_sci_getchar(siopcb) );			/* UB のキャストは、射规橙磨を松贿するため */	}	return(-1);}/* *  シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidh8s_sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn){	switch (cbrtn) {	case SIO_ERDY_SND:		h8s_sci_or( siopcb->siopinib, (UW) SCR, TIE );		return;	case SIO_ERDY_RCV:		h8s_sci_or( siopcb->siopinib, (UW) SCR, RIE );		return;	}}/* *  シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidh8s_sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn){	switch( cbrtn ) {	case SIO_ERDY_SND:		h8s_sci_and( siopcb->siopinib, (UW) SCR, (UB) ~TIE );		return;	case SIO_ERDY_RCV:		h8s_sci_and( siopcb->siopinib, (UW) SCR, (UB) ~RIE );		return;	}}#ifndef OMIT_SCI0/* *  SIOの充哈みサ〖ビスル〖チン (SCI0漓脱) */voidh8s_sci0_isr_in(void){	SIOPCB *siopcb = get_siopcb(1);	/* 减慨奶梦コ〖ルバックル〖チンの钙び叫し */	if( siopcb->openflag ) {		h8s_sci_ierdy_rcv( siopcb->exinf );	}}voidh8s_sci0_isr_out(void){	SIOPCB *siopcb = get_siopcb(1);	/* 流慨材墙コ〖ルバックル〖チンの钙び叫し */	if( siopcb->openflag ) {		h8s_sci_ierdy_snd( siopcb->exinf );	}}/* *  SIOの减慨エラ〖充哈みサ〖ビスル〖チン (SCI0漓脱) * *  エラ〖借妄は、布淡エラ〖フラグのクリアのみ。 *  ˇオ〖バ〖ランエラ〖、フレ〖ミングエラ〖、パリティエラ〖 */voidh8s_sci0_isr_error(void){	SIOPCB *siopcb = get_siopcb(1);	if( siopcb->openflag ) {		/*  エラ〖フラグクリア  */		h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) );	}}#endif /*  OMIT_SCI0  */#if TNUM_SIOP >=2/* *  SIOの充哈みサ〖ビスル〖チン (SCI1漓脱) */voidh8s_sci1_isr_in(void){	SIOPCB *siopcb = get_siopcb(2);	/* 减慨奶梦コ〖ルバックル〖チンの钙び叫し */	if( siopcb->openflag ) {		h8s_sci_ierdy_rcv( siopcb->exinf );	}}voidh8s_sci1_isr_out(void){	SIOPCB *siopcb = get_siopcb(2);	/* 流慨材墙コ〖ルバックル〖チンの钙び叫し */	if( siopcb->openflag ) {		h8s_sci_ierdy_snd( siopcb->exinf );	}}/* *  SIOの减慨エラ〖充哈みサ〖ビスル〖チン (SCI1漓脱) * *  エラ〖借妄は、布淡エラ〖フラグのクリアのみ。 *  ˇオ〖バ〖ランエラ〖、フレ〖ミングエラ〖、パリティエラ〖 */voidh8s_sci1_isr_error(void){	SIOPCB *siopcb = get_siopcb(2);	if( siopcb->openflag ) {		/*  エラ〖フラグクリア  */		h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) );	}}#endif /* TNUM_SIOP >=2 */#if defined(OMIT_SCI0) && (LOGTASK_PORTID == 1)#error h8s_sci_putchar_pol serial port ID error.#endif/* *  H8S 柒垄 SCI 脱ポ〖リング叫蜗 (LOGTASK_PORTID漓脱、sys_putcで网脱) */voidh8s_sci_putchar_pol( char c ){	const SIOPINIB  *siopinib = get_siopinib( LOGTASK_PORTID );	/* TDRE が 1 になるまで略つ */	while ( !(h8s_sci_reb( siopinib->reg_base, (UW) SSR ) & TDRE ) );	h8s_sci_wrb( siopinib->reg_base, (UW) TDR, (UB) c );	/* TDREクリア */	h8s_sci_and( siopinib, (UW) SSR, (UB) ~TDRE );	/* TEND が 1 になるまで略つ */	while ( !(h8s_sci_reb( siopinib->reg_base, (UW) SSR ) & TEND ) );}

⌨️ 快捷键说明

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