📄 mpc860_smc.c
字号:
SIOPCB *smc_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; siopcb = get_siopcb(siopid); /* 流减慨匿贿 */ mpc860_andh_mem(SMCMR1, ~(SMCMR_TEN | SMCMR_REN)); /* * ピンˇアサイン * ポ〖トBの肋年 * BP25ピン¨SMTXD1 * BP24ピン¨SMRXD1 */ /* 漓脱ペリフェラル怠墙联买 */ mpc860_orw_mem(PBPAR, (PBPAR_DD24 | PBPAR_DD25)); /* ペリフェラル怠墙0联买 */ mpc860_andw_mem(PBDIR, ~(PBDIR_DR24 | PBDIR_DR25)); /* アクティブにドライブ */ mpc860_andw_mem(PBODR, ~(PBODR_OD24 | PBODR_OD25)); /* * VCOUTからBRGCLKへの尸件犯眶肋年 * SCCR.DFBRG=00¨尸件孺1 */ unlock_sccr(); /* SCCRアンロック */ mpc860_andw_mem(SCCR, ~SCCR_DFBRG); /* 尸件孺肋年 */ lock_sccr(); /* SCCRロック */ /* * ボ〖レ〖ト肋年∈BRG1∷ * EN=1¨BRGカウントイネ〖ブル * EXTC=00¨クロックソ〖スにBRGCLKを联买 * ATB=0¨オ〖トボ〖怠墙ディセ〖ブル * CD¨尸件孺 * DIV16¨16尸件するか容か */ mpc860_wrw_mem(BRGC1, BRGC1_EN | (BRGC1_CD_VAL<<1)); /* * BRG1とSMC1の儡鲁 * SMC1=0¨NMSIモ〖ド∈驴脚步しない∷ * SMC1CS=000¨クロックソ〖スBRG1 */ mpc860_andw_mem(SIMODE, ~(SIMODE_SMC1 | SIMODE_SMC1CS)); /* クロックが奥年するまで略つ */ sil_dly_nse(SMC_1BIT_TIME); /* * バッファˇディスクリプタBDの肋年 */ /* RxBDベ〖スアドレス */ mpc860_wrh_mem(RBASE1, RxBD_BASE_ADDRESS); /* TxBDベ〖スアドレス */ mpc860_wrh_mem(TBASE1, TxBD_BASE_ADDRESS); /* * 奶慨プロセッサCPにINIT RX AND TX PARAMETERSコマンドを券乖 */ mpc860_CP_command(CPCR_INIT_RX_TX_PARAMETERS, CPCR_CH_NUM_SMC1); /* SDMAのUバス拇匿庭黎刨を肋年 */ mpc860_wrw_mem(SDCR, SDCR_RAID_RB5); /* 庭黎刨5¨奶撅借妄 */ /* バッファˇディスクリプタBDのエンディアン肋年 */ mpc860_wrb_mem(RFCR1, RFCR_BO); /* 减慨 */ mpc860_wrb_mem(TFCR1, TFCR_BO); /* 流慨 */ /* 呵络减慨バッファ墓 */ mpc860_wrh_mem(MRBLR1, PIC_BUFFER_SIZE); /* アイドルキャラクタ眶浮叫怠墙ディセ〖ブル */ mpc860_wrh_mem(MAX_IDL1, 0); /* 减慨ブレ〖クに簇する肋年は涩妥ないのでクリア */ mpc860_wrh_mem(BRKLN1, 0); mpc860_wrh_mem(BRKEC1, 0); /* STOP TRANSMITコマンドで流慨されるブレ〖クキャラクタの眶を肋年 */ mpc860_wrh_mem(BRKCR1, 1); /* 减慨バッファˇディスクリプタRxBDの介袋步 */ mpc860_wrh_mem(RxBD_STATUS, RxBD_STATUS_E | RxBD_STATUS_W | RxBD_STATUS_I); /* Eフラグセット */ /* W=1¨テ〖ブル柒の呵姜BD */ /* I=1¨减慨充哈み券栏 */ mpc860_wrh_mem(RxBD_LENGTH, PIC_BUFFER_SIZE); /* デ〖タ墓 */ /* 减慨バッファポインタ */ mpc860_wrw_mem(RxBD_BUFFP, (VW)Rx_buffer); /* 流慨バッファˇディスクリプタTxBDの介袋步 */ mpc860_wrh_mem(TxBD_STATUS, TxBD_STATUS_R | TxBD_STATUS_W | TxBD_STATUS_I); /* Rフラグセット */ /* W=1¨テ〖ブル柒の呵姜BD */ /* I=1¨流慨充哈み券栏 */ mpc860_wrh_mem(TxBD_LENGTH, PIC_BUFFER_SIZE); /* デ〖タ墓 */ /* 流慨バッファポインタ */ mpc860_wrw_mem(TxBD_BUFFP, (VW)Tx_buffer); /* 笆涟のイベントをクリア */ mpc860_wrb_mem(SMCE1, SMCE_BRKE | SMCE_BRK | SMCE_BSY | SMCE_TX | SMCE_RX); /* すべてのUART充哈みを钓材 */ mpc860_wrb_mem(SMCM1, SMCM_BRKE | SMCM_BRK | SMCM_BSY | SMCM_TX | SMCM_RX); /* SMCモ〖ド肋年 */ mpc860_wrh_mem(SMCMR1, (VH)((0x9<<11) | SMCMR_SM_UART)); /* * CLEN=9¨キャラクタ墓 * SL=0¨1ストップビット * PEN=0¨パリティなし * SM=10¨SMCモ〖ド UART * DM=00¨壳们モ〖ド 奶撅瓢侯 * TEN=0¨SMC流慨ディセ〖ブル * REN=0¨SMC减慨ディセ〖ブル * この箕爬ではまだ、流慨も减慨もイネ〖ブルではない */ mpc860_orh_mem(SMCMR1, (SMCMR_TEN | SMCMR_REN)); /* * 惧淡に裁えて * TEN=1¨SMC流慨イネ〖ブル * REN=1¨SMC减慨イネ〖ブル */ siopcb->exinf = exinf; siopcb->openflag = TRUE; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voidsmc_cls_por(SIOPCB *siopcb){ /* 流减慨匿贿 */ mpc860_andh_mem(SMCMR1, ~(SMCMR_TEN | SMCMR_REN)); siopcb->openflag = FALSE;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLsmc_snd_chr(SIOPCB *siopcb, char c){ if (smc_putready(siopcb)) { smc_putchar(siopcb, c); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTsmc_rcv_chr(SIOPCB *siopcb){ if (smc_getready(siopcb)) { return((INT)(UB) smc_getchar(siopcb)); } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidsmc_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ SIL_PRE_LOC; switch (cbrtn) { case SIO_ERDY_SND: /* 流慨充り哈み妥滇を钓材 */ SIL_LOC_INT(); mpc860_orh_mem(SMCMR1, SMCMR_TEN); SIL_UNL_INT(); break; case SIO_ERDY_RCV: /* 减慨充り哈み妥滇を钓材 */ SIL_LOC_INT(); mpc860_orh_mem(SMCMR1, SMCMR_REN); SIL_UNL_INT(); break; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidsmc_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ SIL_PRE_LOC; switch (cbrtn) { case SIO_ERDY_SND: /* 流慨充り哈み妥滇を敦贿 */ SIL_LOC_INT(); mpc860_andh_mem(SMCMR1, ~SMCMR_TEN); SIL_UNL_INT(); break; case SIO_ERDY_RCV: /* 减慨充り哈み妥滇を敦贿 */ SIL_LOC_INT(); mpc860_andh_mem(SMCMR1, ~SMCMR_REN); SIL_UNL_INT(); break; }}/* * シリアルI/Oポ〖トに滦する流慨充哈み借妄 */Inline voidsmc_isr_siop_out(SIOPCB *siopcb){ /* SMCE1での充哈み妥傍のチェックは貉んでいる */ if (smc_putready(siopcb)) { /* * 流慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ smc_ierdy_snd(siopcb->exinf); }}/* * シリアルI/Oポ〖トに滦する减慨充哈み借妄 */Inline voidsmc_isr_siop_in(SIOPCB *siopcb){ /* SMCE1での充哈み妥傍のチェックは貉んでいる */ if (smc_getready(siopcb)) { /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ smc_ierdy_rcv(siopcb->exinf); }}/* * SILを蝗脱したときのログ怠墙 */#ifdef SIL_DEBUG#define ENTER_SMC_ISR \ if (sil_debug_on) { \ syslog(LOG_EMERG, "Enter selial interrupt."); \ }#else /* SIL_DEBUG */#define ENTER_SMC_ISR#endif /* SIL_DEBUG *//* * SIO流慨充哈みサ〖ビスル〖チン * * 流减慨鼎奶 * */voidsmc_isr(){ UB smce1, smcm1, event; SIL_PRE_LOC; ENTER_SMC_ISR if (!siopcb_table[0].openflag) goto exit_label; smce1 = mpc860_reb_mem(SMCE1); smcm1 = mpc860_reb_mem(SMCM1); event = smce1 & smcm1; if (event & (SMCE_BRKE | SMCE_BRK | SMCE_BSY)) { /* エラ〖借妄¨踏窗喇 */ goto exit_label; } if (event & SMCE_RX) { /* 减慨充哈み */ /* 1をセットすることにより、イベントをクリア */ mpc860_wrb_mem(SMCE1, SMCE_RX); smc_isr_siop_in(&siopcb_table[0]); } if (event & SMCE_TX) { /* 流慨充哈み */ /* 1をセットすることにより、イベントをクリア */ mpc860_wrb_mem(SMCE1, SMCE_TX); smc_isr_siop_out(&siopcb_table[0]); }exit_label: /* * 充哈み妥滇のクリア * 充哈みコントロ〖ラ巴赂 * ∈sys_config.hで年盗∷ */ SIL_LOC_INT(); CLEAR_IRQ_TO_ICU(SMC1); SIL_UNL_INT();}/* * ポ〖リングによる矢机の流慨 */voidsmc_putc_pol(char c){ BOOL is_ten_ok; VH smcmr; if (smc_openflag()) { /* 介袋步されているかチェック */ smcmr = mpc860_reh_mem(SMCMR1); is_ten_ok = smcmr & SMCMR_TEN; if (!is_ten_ok) { /* 流慨钓材 */ mpc860_orh_mem(SMCMR1, SMCMR_TEN); } /* バッファが鄂になるのを略つ */ while(!smc_putready(&siopcb_table[0])); smc_putchar(&siopcb_table[0], c); /* 1矢机流慨 */ if (!is_ten_ok) { /* バッファが鄂になるのを略つ */ while(!smc_putready(&siopcb_table[0])); /* 2キャラクタ尸略つ */ sil_dly_nse(SMC_1BIT_TIME*18*10); /* 流慨敦贿 */ mpc860_andh_mem(SMCMR1, ~SMCMR_TEN); } }}/* end of file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -