📄 sh1sci.c
字号:
/* * シリアル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 + -