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

📄 sh1sci.c

📁 toppers操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  シリアルI/Oポ〖ト瓷妄ブロックのエリア *    ID = 1 をSCI0に滦炳させているˉ */static SIOPCB	siopcb_table[TNUM_SIOP];/* *  シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */				/*  ポ〖トIDからデバイス戎规を滇めるマクロ  */#define INDEX_SIOP(siopid)	((UINT)((siopid) - 1))#define get_siopcb(siopid)	(&(siopcb_table[INDEX_SIOP(siopid)]))/* *  矢机を减慨できるか々 */Inline BOOLsh1sci_getready(SIOPCB *siopcb){	VB ssr0 = sil_reb_mem(SCI_SSR0);	return(ssr0 & SSR_RDRF);}/* *  矢机を流慨できるか々 */Inline BOOLsh1sci_putready(SIOPCB *siopcb){	VB ssr0 = sil_reb_mem(SCI_SSR0);	return(ssr0 & SSR_TDRE);}/* *  减慨した矢机の艰叫し */Inline charsh1sci_getchar(SIOPCB *siopcb){	char data;	data = sil_reb_mem(SCI_RDR0);		/*  レシ〖ブデ〖タレジスタフルˇフラグのクリア  */	sh1_anb_reg(SCI_SSR0, (VB)~SSR_RDRF);	return data;}/* *  流慨する矢机の今哈み */Inline voidsh1sci_putchar(SIOPCB *siopcb, char c){#ifdef GDB_STUB	gdb_stub_putc( c );#else	sil_wrb_mem(SCI_TDR0 ,c);		/*  トランスミットデ〖タレジスタエンプティˇフラグのクリア*/	sh1_anb_reg(SCI_SSR0, (VB)~SSR_TDRE);#endif}/* *  SIOドライバの介袋步ル〖チン */voidsh1sci_initialize(void){	SIOPCB	*siopcb;	UINT	i;	/*	 *  シリアルI/Oポ〖ト瓷妄ブロックの介袋步	 */	for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {		siopcb->openflag = FALSE;	}}/* *  オ〖プンしているポ〖トがあるか々 */BOOLsh1sci_openflag(void){#if TNUM_SIOP < 2	return(siopcb_table[0].openflag);#else /* TNUM_SIOP < 2 */	return(siopcb_table[0].openflag || siopcb_table[1].openflag);#endif /* TNUM_SIOP < 2 */}/* *  シリアルI/Oポ〖トのオ〖プン */SIOPCB *sh1sci_opn_por(ID siopid, VP_INT exinf){	SIOPCB *siopcb = get_siopcb(siopid);#ifndef GDB_STUB	VB scr0, smr0;	VH pbcr1;	sh1_anb_reg(SCI_SCR0, (VB)~(SCR_TE | SCR_RE));	/*  流减慨匿贿  */	/*  ピンアサイン	 *     シリアルデバイス极挛の祸灌ではないので	 *     塑丸はこのファイルに淡揭するのはふさわしくないが、	 *     hw_serial.cを脱罢するのも妊花なので幻年弄にここに掐れている。	 */	pbcr1 = sil_reh_mem((VP)PBCR1);						/* PB8:RxD0 PB9:TxD0  */	pbcr1 = (pbcr1 & PBCR1_TD0_RD0_MASK) |			PBCR1_TD0 | PBCR1_RD0;	sil_wrh_mem((VP)PBCR1, pbcr1);						/*  流减慨フォ〖マット  */	smr0 = 	SMR_CA_ASYNC |	/*  拇殊票袋及  		*/		SMR_CHR8 |	/*  キャラクタレングス¨8ビット */		SMR_PE_NON |	/*  パリティなし  		*/		SMR_STOP1 |	/*  ストップビットレングス¨1 	*/		SMR_CKS;	/*  クロックセレクト∈尸件孺∷  */	sil_wrb_mem(SCI_SMR0, smr0);		sil_wrb_mem(SCI_BRR0, SCI_BRR);	/*  ボ〖レ〖ト肋年  	*/					/*  充哈み敦贿とクロックソ〖スの联买 */	scr0 = (VB)(~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE |			  SCR_MPIE | SCR_TEIE | SCR_CKE_MASK) | SCR_CKE);	sil_wrb_mem(SCI_SCR0, scr0);		/*	 * ボ〖レ〖トの肋年稿、1カウント尸略たなければならない。	 */	sil_dly_nse(SH1SCI_DELAY);					/* エラ〖フラグをクリア	*/	sh1_anb_reg(SCI_SSR0, (VB)~(SSR_ORER | SSR_FER | SSR_PER));					/* 减慨充り哈み钓材   	*/					/* 流减慨钓材  		*/	sh1_orb_reg(SCI_SCR0, (SCR_RIE | SCR_TE | SCR_RE));			/*  流慨充哈みの钓材は流慨扩告簇眶で乖う  */#endif	/*  GDB_STUB  */	siopcb->exinf = exinf;	siopcb->openflag = TRUE;	return(siopcb);}/* *  シリアルI/Oポ〖トのクロ〖ズ */voidsh1sci_cls_por(SIOPCB *siopcb){				/*  流减慨匿贿、充哈み敦贿 	*/	sh1_anb_reg(SCI_SCR0, (VB)~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE));	siopcb->openflag = FALSE;}/* *  シリアルI/Oポ〖トへの矢机流慨 */BOOLsh1sci_snd_chr(SIOPCB *siopcb, char c){	if (sh1sci_putready(siopcb)) {		sh1sci_putchar(siopcb, c);		return(TRUE);	}	return(FALSE);}/* *  シリアルI/Oポ〖トからの矢机减慨 */INTsh1sci_rcv_chr(SIOPCB *siopcb){	if (sh1sci_getready(siopcb)) {		return((INT)(UB)sh1sci_getchar(siopcb));		/*  (UB)でキャストするのはゼロ橙磨にするため  */	}	return(-1);}/* *  シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidsh1sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn){	switch (cbrtn) {	case SIO_ERDY_SND:	/* 流慨充り哈み妥滇を钓材 */		sh1_orb_reg(SCI_SCR0, SCR_TIE);		break;	case SIO_ERDY_RCV:	/* 减慨充り哈み妥滇を钓材 */		sh1_orb_reg(SCI_SCR0, SCR_RIE);		break;	}}/* *  シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidsh1sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn){	switch (cbrtn) {	case SIO_ERDY_SND:	/* 流慨充り哈み妥滇を敦贿 */		sh1_anb_reg(SCI_SCR0, (VB)~SCR_TIE);		break;	case SIO_ERDY_RCV:	/* 减慨充り哈み妥滇を敦贿 */		sh1_anb_reg(SCI_SCR0, (VB)~SCR_RIE);		break;	}}/* *  シリアルI/Oポ〖トに滦する流慨充哈み借妄 */Inline voidsh1sci_isr_siop_out(SIOPCB *siopcb){	VB scr0 = sil_reb_mem(SCI_SCR0);		if ((scr0 & SCR_TIE) != 0 && sh1sci_putready(siopcb)) {		/*		 *  流慨奶梦コ〖ルバックル〖チンを钙び叫すˉ		 */		sh1sci_ierdy_snd(siopcb->exinf);	}}/* *  シリアルI/Oポ〖トに滦する减慨充哈み借妄 */Inline voidsh1sci_isr_siop_in(SIOPCB *siopcb){	VB scr0 = sil_reb_mem(SCI_SCR0);	if ((scr0 & SCR_RIE) != 0 && sh1sci_getready(siopcb)) {		/*		 *  减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ		 */		sh1sci_ierdy_rcv(siopcb->exinf);	}}/* *  SIO流慨充哈みサ〖ビスル〖チン *   *   SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 *   SCI0の流慨充哈み笆嘲でこのル〖チンが钙ばれることはない *   */voidsh1sci_isr_out(void){	if (siopcb_table[0].openflag) {		sh1sci_isr_siop_out(get_siopcb(1));	}}/* *  SIO减慨充哈みサ〖ビスル〖チン *   *   SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 *   SCI0の减慨充哈み笆嘲でこのル〖チンが钙ばれることはない *   */voidsh1sci_isr_in(void){	if (siopcb_table[0].openflag) {		sh1sci_isr_siop_in(get_siopcb(1));	}}/* *  SIO减慨エラ〖充哈みサ〖ビスル〖チン *   *   SH1柒垄のSCIでは充哈み戎规がチャネル侍に尸かれているので、 *   SCI0の减慨エラ〖充哈み笆嘲でこのル〖チンが钙ばれることはない *    *   エラ〖借妄极挛はエラ〖フラグのクリアのみにとどめている。 *     ˇオ〖バ〖ランエラ〖 *     ˇフレ〖ミングエラ〖 *     ˇパリティエラ〖 */voidsh1sci_isr_error(void){	VB ssr0;		if (siopcb_table[0].openflag) {		ssr0 = sil_reb_mem(SCI_SSR0);	/*  1刨粕み叫して  */		ssr0 &= ~(SSR_RDRF | SSR_ORER | SSR_FER | SSR_PER);		sil_wrb_mem(SCI_SSR0, ssr0);	/*  エラ〖フラグクリア  */	}}/* * ポ〖リングによる矢机の流慨 */voidsh1sci_putc_pol(char c){	while(!sh1sci_putready(&siopcb_table[0]));	sh1sci_putchar(&siopcb_table[0], c);}

⌨️ 快捷键说明

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