/* * シリアルI/Oポートのオープン */ SIOPCB * sh1sci_opn_por(ID siopid, VP_INT exinf) { SIOPCB *siopcb = get_siopcb(siopid); VB scr, smr; VH pbcr1; #ifdef GDB_STUB if (siopid == PORT1) { siopcb->exinf = exinf; siopcb->openflag = TRUE; return(siopcb); } #endif /* GDB_STUB */ sh1_anb_reg(siopcb->inib->base + SCR, (VB)~(SCR_TE | SCR_RE)); /* 送受信停止 */ /* ピンアサイン * シリアルデバイス自体の事項ではないので * 本来はこのファイルに記述するのはふさわしくないが、 * hw_serial.cを用意するのも煩雑なので暫定的にここに入れている。 */ pbcr1 = sil_reh_mem((VP)PBCR1); if (siopid == PORT1) { /* PB08:RxD0 PB09:TxD0 */ pbcr1 = (pbcr1 & PBCR1_TD0_RD0_MASK) | PBCR1_TD0 | PBCR1_RD0; } else { /* PB10:RxD1 PB11:TxD1 */ pbcr1 = (pbcr1 & PBCR1_TD1_RD1_MASK) | PBCR1_TD1 | PBCR1_RD1; } sil_wrh_mem((VP)PBCR1, pbcr1); /* 送受信フォーマット */ smr = siopcb->inib->smr_init; sil_wrb_mem(siopcb->inib->base + SMR, smr); sil_wrb_mem(siopcb->inib->base + BRR, (UB)siopcb->inib->baudrate); /* ボーレート設定 */ /* 割込み禁止とクロックソースの選択 */ scr = (VB)(~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE | SCR_MPIE | SCR_TEIE | SCR_CKE_MASK) | SCR_CKE); sil_wrb_mem(siopcb->inib->base + SCR, scr); /* * ボーレートの設定後、1カウント分待たなければならない。 */ sil_dly_nse(siopcb->inib->delay); /* エラーフラグをクリア */ sh1_anb_reg(siopcb->inib->base + SSR, (VB)~(SSR_ORER | SSR_FER | SSR_PER)); /* 受信割り込み許可 */ /* 送受信許可 */ sh1_orb_reg(siopcb->inib->base + SCR, (SCR_RIE | SCR_TE | SCR_RE)); /* 送信割込みの許可は送信制御関数で行う */ siopcb->exinf = exinf; siopcb->openflag = TRUE; return(siopcb); }
void sys_initialize(void) { VB * p; /* コントロール#2レジスタの初期化 */ p = (VB*)TADR_SFR_UART0_BASE; sil_wrb_mem((VP)(p+TADR_SFR_UC2_OFFSET), 0x00); /* UAERT1の設定 */ p = (VB*)TADR_SFR_UART1_BASE; /* 送受信モードレジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UMR_OFFSET), 0x05); /* 送受信モ−ドレジスタ 内部クロック,*/ /* 非同期、8ビット、パリティなし、 */ /* スリープなし */ /* 送信制御レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UC0_OFFSET), 0x10); /* 送受信制御レジスタ0 クロックf1選択 */ /* 転送速度レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UBRG_OFFSET), 64); /* 転送速度レジスタ(19200bps) */ /* 送受信制御レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UC1_OFFSET), (TBIT_UiC1_TE | TBIT_UiC1_RE)); /* 送受信制御レジスタ1 送受信許可 */ /* ポート7の初期化 */ sil_wrb_mem((VP)TADR_SFR_P7, 0xff); /* ポート7データ初期化 */ sil_wrb_mem((VP)TADR_SFR_PD7, 0xff); /* ポート7出力設定 */ /* ポート8の初期化 */ sil_wrb_mem((VP)TADR_SFR_PD8, 0x00); /* ポート8入力設定 */ sil_wrb_mem((VP)TADR_SFR_PUR2, 0x01); /* P80からP83プルアップ */ }
/* * シリアルI/Oポートに対する受信エラー割込み処理 */ Inline void sh2scif_isr_siop_err (SIOPCB * siopcb) { /* エラーフラグをクリア */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR), sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR)) & ~SC1SSR_ER); /* FIFOの初期化 */ sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR), (VB) SCFCR_RFRST); sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR), 0x30); }
/* * シリアルI/Oポートからのコールバックの禁止 */ void sh2scif_dis_cbr (SIOPCB * siopcb, UINT cbrtn) { switch (cbrtn) { case SIO_ERDY_SND: /* 送信割り込み要求を禁止 */ sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR), sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR)) & ~SCSCR_TIE); break; case SIO_ERDY_RCV: /* 受信割り込み要求を禁止 */ sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR), sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR)) & ~SCSCR_RIE); break; } }
/* * シリアルI/Oポートへのポーリングでの出力 */ void scif_pol_putc(char c, ID siopid) { const SIOPINIB *p_siopinib; uint16_t fsrval; SIL_PRE_LOC; p_siopinib = get_siopinib(siopid); while(1) { /* * リエントラントにするため、全割込みロック状態にする。 */ SIL_LOC_INT(); fsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR)); if (fsrval & SCFSR_TDFE) { sil_wrb_mem((uint8_t *)p_siopinib->port + REG_SCFTDR, c); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), ~(SCFSR_TEND | SCFSR_TDFE)); /* * リターンする前に全割込みロックフラグを元の状態に戻す。 */ SIL_UNL_INT(); return; } else { /* * ここで全割込みロックを解除して、割込みを受け付ける。 */ SIL_UNL_INT(); } } }
/* * ハードウェアの初期化処理 */ static int scif_init_siopinib(const SIOPINIB *p_siopinib) { uint16_t fsrval; uint8_t brrval; fsrval = UART_CLK / (32 * p_siopinib->bps_setting) - 1; if (fsrval > 255) return 1; brrval = (uint8_t)fsrval; sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSCR), 0); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFCR), SCFCR_TFRST | SCFCR_RFRST); (void)sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR)); (void)sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCLSR)); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), 0); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCLSR), 0); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSCR), SCSCR_INTCLK); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSMR), SCSMR_CKS1); /* 8N1, P1clock/1 */ sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCEMR), 0); sil_wrb_mem((uint8_t *)p_siopinib->port + REG_SCBRR, brrval); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFCR), SCFCR_RSTRG_15 | SCFCR_RTRG_1 | SCFCR_TTRG_8); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSCR), SCSCR_TE | SCSCR_RE | SCSCR_INTCLK); while (sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR)) & SCFSR_RDF) { (void)sil_reb_mem((uint8_t *)p_siopinib->port + REG_SCFRDR); sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), ~SCFSR_RDF); } sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), 0); return 0; }
/* * シリアルI/Oポートからのコールバックの禁止 */ void sfruart_dis_cbr(SIOPCB *siopcb, UINT cbrtn) { switch (cbrtn) { case SIO_ERDY_SND: siopcb->uc1 &= ~TBIT_UiC1_TE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); break; case SIO_ERDY_RCV: siopcb->uc1 &= ~TBIT_UiC1_RE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); break; default: break; } }
void sys_initialize(void) { VB * p; /* コントロール#2レジスタの初期化 */ p = (VB*)TADR_SFR_UART0_BASE; sil_wrb_mem((VP)(p+TADR_SFR_UC2_OFFSET), 0x00); /* UAERT1の設定 */ p = (VB*)TADR_SFR_UART1_BASE; /* 送受信モードレジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UMR_OFFSET), 0x05); /* 送受信モ−ドレジスタ 内部クロック,*/ /* 非同期、8ビット、パリティなし、 */ /* スリープなし */ /* 送信制御レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UC0_OFFSET), 0x10); /* 送受信制御レジスタ0 クロックf1選択 */ /* 転送速度レジスタの初期化 (38400bpsは25) */ sil_wrb_mem((VP)(p+TADR_SFR_UBRG_OFFSET), 51); /* 転送速度レジスタ(19200bps) */ /* 送受信制御レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UC1_OFFSET), (TBIT_UiC1_TE | TBIT_UiC1_RE)); /* 送受信制御レジスタ1 送受信許可 */ /* ポート0の初期化 */ sil_wrb_mem((VP)TADR_SFR_P0, 0xff); /* ポート0データ初期化 */ sil_wrb_mem((VP)TADR_SFR_PD0, 0xff); /* ポート0出力設定 */ }
/* * シリアルI/Oポートへの文字送信 */ BOOL sfruart_snd_chr(SIOPCB *siopcb, char c) { if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI){ sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UTB_OFFSET), c); return(TRUE); } return(FALSE); }
/* * シリアルI/Oポートのクローズ */ void sfruart_cls_por(SIOPCB *siopcb) { const SIOPINIB *siopinib; siopinib = siopcb->siopinib; /* 割り込み禁止 */ sil_wrb_mem((VP)(siopinib->tic_addr), DISABLE_LEVEL); sil_wrb_mem((VP)(siopinib->ric_addr), DISABLE_LEVEL); /* 送受信禁止 */ siopcb->uc1 = C1_DEF; sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); /* シリアルモジュールを無効にする */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UMR_OFFSET), MR_DISABLE_DEF); }
/** * \ingroup SIOSUPPORT * \brief シリアルポート・ペリフェラル書き込み関数 * \param addr UARTペリフェラルのベースアドレス。通常はTHRのアドレスである。 * \param offset ベースアドレスに対する、オフセット値。単位はバイト。 * \param val レジスタに書き込む値。 * \details * ベースアドレスとオフセットを整数で受け取り、ペリフェラルレジスタに * アクセスする。 */ Inline void uart_write(uint32_t addr, uint32_t offset, uint8_t val) { #ifdef TOPPERS_CHIP_LPC17XX sil_wrb_mem((void *)(addr + offset),val); #else #error "You must define access method for your architecture" #endif }
/* * ターゲットシステム依存の初期化 */ void sys_initialize() { volatile int i; /* LED ポート設定 */ sil_wrb_mem((VP)PMCCT, sil_reb_mem((VP)PMCCT) & (UB)~LED_BIT); sil_wrb_mem((VP)PMCT, sil_reb_mem((VP)PMCT) & (UB)~LED_BIT); sil_wrb_mem((VP)PCT, sil_reb_mem((VP)PCT) | (UB)LED_BIT); /* LED off */ #if 0 /* USBでシリアル通信をするときに、 */ /* TOPPERSロゴを表示するためにwaitを入れる */ for(i=0; i<0x1000000; i++) ; led(1); #endif }
/* * シリアルI/Oポートのクローズ */ void sh2scif_cls_por (SIOPCB * siopcb) { /* 送受信停止、割込み禁止 */ sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR), (VB) ~ (SCSCR_TIE | SCSCR_RIE | SCSCR_TE | SCSCR_RE)); siopcb->openflag = FALSE; }
/* * 送信する文字の書込み */ Inline void sh2scif_putchar (SIOPCB * siopcb, char c) { /* トランスミットFIFOデータレジスタエンプティ・フラグのクリア */ sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFTDR), c); sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR), sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR)) & ~SC1SSR_TDFE); }
Inline void uart_write(UW addr, UW offset, UB val) { #ifdef UART_IOP_ACCESS sil_wrb_iop((VP)(addr + offset),val); #else sil_wrb_mem((VP)(addr + offset),val); #endif }
/* * SIO受信エラー割込みサービスルーチン * * SH1内蔵のSCIでは割込み番号がチャネル別に分かれているので、 * SCI0の受信エラー割込み以外でこのルーチンが呼ばれることはない * * エラー処理自体はエラーフラグのクリアのみにとどめている。 * ・オーバーランエラー * ・フレーミングエラー * ・パリティエラー */ void sh1sci2_isr_error(void) { VB ssr1; if (siopcb_table[1].openflag) { ssr1 = sil_reb_mem(SCI_SSR1); /* 1度読み出して */ ssr1 &= ~(SSR_RDRF | SSR_ORER | SSR_FER | SSR_PER); sil_wrb_mem(SCI_SSR1, ssr1); /* エラーフラグクリア */ } }
/* * SIO受信エラー割込みサービスルーチン * * SH1内蔵のSCIでは割込み番号がチャネル別に分かれているので、 * SCI0の受信エラー割込み以外でこのルーチンが呼ばれることはない * * エラー処理自体はエラーフラグのクリアのみにとどめている。 * ・オーバーランエラー * ・フレーミングエラー * ・パリティエラー */ void sh1sci_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); /* エラーフラグクリア */ } }
/* * シリアルI/Oポートのクローズ */ void sio_cls_por(SIOPCB *siopcb) { switch(SIO_TYP(siopcb->flags)) { case SIO_TYP_M32RUART: /* 送受信動作を禁止する */ sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0); break; } }
void sys_initialize(void) { VB * p; volatile char ps0, pd6; /* * ポートの設定 */ /* ポートP63を TxD0, ポートP62を RxD0 に */ ps0 = sil_reb_mem((VP)TADR_SFR_PS0); ps0 |= 0x08; ps0 &= ~0x04; sil_wrb_mem((VP)TADR_SFR_PS0, ps0); pd6 = sil_reb_mem((VP)TADR_SFR_PD6); pd6 &= ~0x04; pd6 |= 0x08; sil_wrb_mem((VP)TADR_SFR_PD6, pd6); p = (VB*)TADR_SFR_UART0_BASE; /* * UART関連レジスタの設定 */ /* 送受信禁止 */ sil_wrb_mem((VP)(p+TADR_SFR_UC1_OFFSET), 0x00); /* 送受信モードレジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UMR_OFFSET), 0x05); /* 送受信モ−ドレジスタ 内部クロック,*/ /* 非同期、8ビット、パリティなし、*/ /* スリープなし */ /* 送信制御レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UC0_OFFSET), 0x10); /* 送受信制御レジスタ0 クロックf8選択 */ /* 転送速度レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UBRG_OFFSET), 48); /* 転送速度レジスタ(38400bps) */ /* 送受信制御レジスタの初期化 */ sil_wrb_mem((VP)(p+TADR_SFR_UC1_OFFSET), (TBIT_UiC1_TE | TBIT_UiC1_RE)); /* 送受信制御レジスタ1 送受信許可 */ /* * LED の初期化 */ sil_wrb_mem((VP)TADR_SFR_P0, 0xff); /* ポート0データ初期化 */ sil_wrb_mem((VP)TADR_SFR_PD0, 0xff); /* ポート0出力設定 */ }
/* * シリアルI/Oポートのクローズ */ void sfruart_cls_por(SIOPCB *siopcb) { const SIOPINIB *siopinib; siopinib = siopcb->siopinib; siopcb->tic = 0; set_ic_ilvl((VP)(siopinib->hint+TADR_SFR_S0TIC_OFFSET), siopcb->tic); set_ic_ilvl((VP)(siopinib->hint+TADR_SFR_S0RIC_OFFSET), 0); siopcb->cr1 = C1_DEF; sil_wrb_mem((VP)(siopinib->cntrl+TADR_SFR_UC1_OFFSET), siopcb->cr1); }
/* * シリアルI/Oポートのオープン */ SIOPCB * sh2scif_opn_por (ID siopid, VP_INT exinf) { SIOPCB *siopcb; siopcb = get_siopcb (siopid); /* 送受信停止 */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCSCR), sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCSCR)) & ~(SCSCR_TE | SCSCR_RE)); /* SCIFデータ入出力ポートの設定 */ /* ピンアサイン */ /* sys_initializeで設定 */ /* FIFOの初期化 */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCFCR), (VH) (SCFCR_TFRST | SCFCR_RFRST)); /* 送受信フォーマット */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCSMR), 0x0000); /* 調歩同期式 */ /* 8ビット、パリティなし */ /* ストップビットレングス:1 */ /* クロックセレクト */ sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCBRR), (VB) siopcb->siopinib->brr); /* ボーレート設定 */ /* * ボーレートの設定後、1カウント分待たなければならない。 */ sil_dly_nse (sh2scif_DELAY); /* FIFOの設定 */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCFCR), 0x0030); /* エラーフラグをクリア */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCFSR), sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCFSR)) & ~SCFSR_ER); /* 送受信開始 */ sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SCSCR), (VH) (SCSCR_TE | SCSCR_RE)); siopcb->exinf = exinf; siopcb->openflag = TRUE; return (siopcb); }
/* * SIOドライバの初期化ルーチン */ void sfruart_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->uc1 = C1_DEF; /* * 明示的にポートを不活性化しておく */ /* 割り込み禁止 */ sil_wrb_mem((VP)(siopcb->siopinib->tic_addr), DISABLE_LEVEL); sil_wrb_mem((VP)(siopcb->siopinib->ric_addr), DISABLE_LEVEL); /* 送受信禁止 */ sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); } }
/* * タイマの停止処理 */ void target_hrt_terminate(intptr_t exinf) { /* * OSタイマを停止する. */ sil_wrb_mem(OSTM_TT(OSTM0_BASE), OSTM_TT_STOP); /* * タイマ割込み要求をクリアする. */ clear_int(INTNO_OSTM0); }
/* * タイムウィンドウタイマの/オーバランタイマ初期化処理 */ void target_totimer_initialize(intptr_t exinf) { /* * OSタイマをインターバルタイマモードに設定する. */ sil_wrb_mem(OSTM_CTL(OSTM1_BASE), OSTM_CTL_INTERVAL); /* * タイムウィンドウタイマ割込み要求をクリアする. */ clear_int(INTNO_OSTM1); }
/* * タイマの起動処理 */ void target_hrt_initialize(intptr_t exinf) { /* * OSタイマをフリーランニングコンペアモードに設定する. */ sil_wrb_mem(OSTM_CTL(OSTM0_BASE), OSTM_CTL_FRCMP); /* * OSタイマの設定値を最大値にしておく. */ sil_wrw_mem(OSTM_CMP(OSTM0_BASE), 0xffffffff); /* * OSタイマを動作開始する. */ sil_wrb_mem(OSTM_TS(OSTM0_BASE), OSTM_TS_START); /* * タイマ割込み要求をクリアする. */ clear_int(INTNO_OSTM0); }
/* * 送信する文字の書込み */ Inline void sh1sci_putchar(SIOPCB *siopcb, char c) { if (siopcb->inib->rs485if) { if (!(sil_reh_mem(PB_DR) & PB_TXE1)) { sh1_orh_reg(PB_DR, PB_TXE1); /* TXENA ON */ sil_dly_nse(5000); /* 5us 保護時間 */ } sil_wrb_mem(siopcb->inib->base + TDR ,c); /* トランスミットデータレジスタエンプティ・フラグのクリア*/ sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_TDRE); /* TXENA OFF制御のため、のコールバックの許可 */ sh1sci_ena_cbr(siopcb, SIO_ERDY_SND); } else { #ifdef GDB_STUB gdb_stub_putc( c ); #else sil_wrb_mem(siopcb->inib->base + TDR ,c); /* トランスミットデータレジスタエンプティ・フラグのクリア*/ sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_TDRE); #endif } }
/* * シリアルI/Oポートのオープン */ SIOPCB * sfruart_opn_por(ID siopid, VP_INT exinf) { SIOPCB *siopcb; const SIOPINIB *siopinib; int i; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; sil_wrb_mem((VP)(siopinib->cntrl+TADR_SFR_UMR_OFFSET), siopinib->mr_def); sil_wrb_mem((VP)(siopinib->cntrl+TADR_SFR_UC0_OFFSET), siopinib->c0_def); sil_wrb_mem((VP)(siopinib->cntrl+TADR_SFR_UBRG_OFFSET), siopinib->brg_def); /* * シリアル割込みの設定 */ set_ic_ilvl((VP)(siopinib->hint+TADR_SFR_S0TIC_OFFSET), siopcb->tic); set_ic_ilvl((VP)(siopinib->hint+TADR_SFR_S0RIC_OFFSET), RB_LEVEL); siopcb->cr1 = TBIT_UiC1_TE; sil_wrb_mem((VP)(siopinib->cntrl+TADR_SFR_UC1_OFFSET), siopcb->cr1); /* * ダミーデータ受信 */ sil_reb_mem((VP)(siopinib->cntrl+TADR_SFR_URB_OFFSET)); sil_reb_mem((VP)(siopinib->cntrl+TADR_SFR_URB_OFFSET)); for(i = 0 ; i < SFRUART_COUNT ; i++){ /* オープン時送信READYまで待ち */ if(sil_reb_mem((VP)(siopcb->siopinib->cntrl+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI) break; } siopcb->exinf = exinf; return(siopcb); }
void sio_handler_out(void) { int port; for(port = 0; port < TNUM_PORT; ++ port) { if((siopcb_table[port].flags & SIO_STS_SENDING) != 0) { /* 送信ステータス初期化 */ sil_wrb_mem((void *)(SIOCR(port)+2), 0x1); siopcb_table[port].flags &= ~SIO_STS_SENDING; sio_ierdy_snd(GET_SIOPCB(ID_PORT(port))->exinf); } } }
/* * シリアルI/Oポートからのコールバックの禁止 */ void sfruart_dis_cbr(SIOPCB *siopcb, UINT cbrtn) { switch (cbrtn) { case SIO_ERDY_SND: siopcb->tic = 0; set_ic_ilvl((VP)(siopcb->siopinib->hint+TADR_SFR_S0TIC_OFFSET), siopcb->tic); break; case SIO_ERDY_RCV: siopcb->cr1 &= ~TBIT_UiC1_RE; sil_wrb_mem((VP)(siopcb->siopinib->cntrl+TADR_SFR_UC1_OFFSET), siopcb->cr1); break; deafult: break; } }
/* * シリアルI/Oポートのオープン */ SIOPCB * sio_opn_por(ID siopid, VP_INT exinf) { SIOPCB * siopcb = GET_SIOPCB(siopid); siopcb->exinf = exinf; switch(SIO_TYP(siopcb->flags)) { case SIO_TYP_M32RUART: /* UART初期化 */ sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0); /* ポートを開く(UART0) */ sil_wrb_mem((void *)PDATA(5), 0); sil_wrb_mem((void *)PDIR(5), 0x80); /* UART, Non-parity, 1 stop-bit */ sil_wrb_mem((void *)(SIOMOD0(siopcb->port)+3), 0); /* 8bit, internal clock */ sil_wrh_mem((void *)(SIOMOD1(siopcb->port)+2), 0x0800); /* M32R(32102) - f(BLK)=16MHzで115200bps */ sil_wrh_mem((void *)(SIOBAUR(siopcb->port)+2), SERIAL_CLKDIV); sil_wrb_mem((void *)(SIORBAUR(siopcb->port)+3), SERIAL_CLKCMP); /* 送受信割込み発生許可 */ sil_wrh_mem((void *)(SIOTRCR(siopcb->port)+2), 0x0006); /* ステータスクリア, 送受信動作開始 */ sil_wrb_mem((void *)(SIOCR(siopcb->port)+2), 0x3); sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0x3); /* 受信割込み受付許可 */ sil_wrh_mem((void *)(ICUCR(SIO,siopcb->port)+2), 0x1000); sil_wrh_mem((void *)(ICUCR(SIO,siopcb->port)+6), 0x1000); /* TxD,RxDピン有効(UART0) */ sil_wrh_mem((void *)PMOD(5), 0x5500); break; } return siopcb; }