/* * ビジーループ関数 */ int busy_wait_inc(int e){ e++; sil_dly_nse(1000); return e; }
/* * SIOレジスタ初期化ルーチン */ void h8s_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( 1/BAUD_RATE ); /* エラーフラグをクリア */ h8s_sci_and( siopinib, (UW) SSR, ~( ORER | FER | PER ) ); /* 送受信許可、受信割込み許可 */ h8s_sci_or( siopinib, (UW) SCR, ( RIE | TE | RE ) ); }
/* * シリアル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); }
/* * デバイスレジスタへのアクセス関数 */ Inline UB upd72001_read_reg(VP addr) { UB val; val = (UB) upd72001_reb_reg(addr); sil_dly_nse(UPD72001_DELAY); return(val); }
/* * デバイスレジスタへのアクセス関数 */ Inline uint8_t upd72001_read_reg(void *addr) { uint8_t val; val = upd72001_reb_reg(addr); sil_dly_nse(UPD72001_DELAY); return(val); }
/* * シリアル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); }
static void test_dly_nse(ulong_t dlytim) { SYSTIM stime, etime, delay_time; volatile ulong_t i; get_tim(&stime); for (i = 0; i < NO_LOOP; i++) { sil_dly_nse(dlytim); } get_tim(&etime); delay_time = (etime - stime) - empty_time; syslog(LOG_NOTICE, "sil_dly_nse(%u): %u %s", (uint_t)(dlytim), (uint_t)(delay_time), delay_time > dlytim ? "OK" : "NG"); syslog_flush(); }
/* * シリアルI/Oポートのオープン */ SIOPCB * uart_opn_por(ID siopid, VP_INT exinf) { /* unsigned int baud = ((MCK * 10) / (BAUDRATE * 16));*/ SIOPCB *siopcb; const SIOPINIB *siopinib; #if DEF_BARDRATE != 115200 UW tmp; #endif siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* * Wait を入れる. */ sil_dly_nse(5000); sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_LCR), 0x00000083); /* 8 bits, no Parity, 1 Stop bit*/ #if DEF_BARDRATE == 115200 sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_DLL), DEFAULT_DLL); /* for 12MHz PCLK Clock */ sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_FDR), DEFAULT_FDR); /* Fractional Divider */ #else tmp = (DEFAULT_PCLK * 10) / 16 / DEF_BAUDRATE; tmp = (tmp + 5) / 10; sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_DLL), tmp & 0xff); /* set divisor */ sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_DLM), tmp >> 8); #endif sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_LCR), 0x00000003); /* DLAB = 0 */ /* Enable RDA and THRE interrupts */ sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_IER), US_ETXI|US_ERXI); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }
/* * 送信する文字の書込み */ 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 } }
/* * ターゲット依存部 初期化処理 */ void target_initialize(void) { /* * プロセッサ依存部の初期化 */ prc_initialize(); /* * ペリフェラルの設定 */ /* * ハードウェアWDT無効化 */ sil_wrw_mem((void *)WDG_LCK , WDG_UNLOCK_VAL); sil_wrw_mem((void *)WDG_LCK , ~WDG_UNLOCK_VAL); sil_wrw_mem((void *)WDG_CTL , (WDG_RESDIS | WDG_RESINTDIS)); /* * I/Oポートの初期化 */ #if (SIO_PORTID == 1) /* PFRの設定 */ /* MFS(RX,TX) CH0 */ sil_andw((void *)EPFR7 , ~(0x03 << 2)); /* SIN0_0 , SOT0_0を使用 */ sil_orw((void *)EPFR7 , (0x01 << 6)); /* SIN0_0 , SOT0_0を使用 */ /* P21(SIN),P22(SOT) */ sil_orw((void *)PFR2 , (1 << 1) | (1 << 2)); sil_andw((void *)ADE , ~(1 << 31)); #elif (SIO_PORTID == 2) #error SIO_PORtID == 2 is not support. /* USART2(RX,TX) CH2 */ sil_andw((void *)EPFR8 , ~(0x03 << 6)); /* SIN4_2を使用 */ sil_orw((void *)EPFR8 , (0x03 << 6)); /* SIN4_2 , SOT4_2を使用 */ /* PD2(SIN),PD3(SOT) */ sil_orw((void *)PFR0 , (1 << 5) | (1 << 6)); #elif (SIO_PORTID == 3) #error SIO_PORtID == 3 is not support. #elif (SIO_PORTID == 4) /* MFS(RX,TX) CH3 */ sil_orw((void *)EPFR7 , (0x03 << 22)); /* SIN3_2を使用 */ sil_orw((void *)EPFR7 , (0x03 << 24)); /* SOT3_2を使用 */ /* P48(SIN), P49(SOT) */ sil_orw((void *)PFR4 , (1 << 8) | (1 << 9)); #endif /* * バナー出力用のシリアル初期化 */ target_low_output_init(SIO_PORTID); sil_dly_nse(10 * 1000 * 1000); /* LEDポート */ sil_andw((void *)PFRF , ~BITMAP_3); sil_orw((void *)PDDRF , BITMAP_3); sil_andw((void *)PDORF , ~BITMAP_3); }
Inline void upd72001_write_reg(VP addr, UB val) { upd72001_wrb_reg(addr, (VB) val); sil_dly_nse(UPD72001_DELAY); }
static void mdelay(unsigned long msecs) { sil_dly_nse(msecs * 1000 * 1000); }
Inline void upd72001_write_reg(void *addr, uint8_t val) { upd72001_wrb_reg(addr, val); sil_dly_nse(UPD72001_DELAY); }
/* * シリアルI/Oポートのオープン */ SIOPCB * uart_opn_por(ID siopid, VP_INT exinf) { unsigned int baud = ((MCK * 10) / (BAUDRATE * 16)); SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* * Wait を入れる. */ sil_dly_nse(5000); if(siopinib->pmc_pcer) sil_wrw_mem((VP)siopinib->pmc_pcer, siopinib->irq_bit); /* Disable Interrupt */ sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_IDR), 0xFFFFFFFF); sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), (US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS)); sil_wrw_mem((VP)(siopinib->uart_base+TOFF_PDC_RCR), 0); sil_wrw_mem((VP)(siopinib->uart_base+TOFF_PDC_TCR), 0); sil_wrw_mem((VP)siopinib->linectrl_pdr, siopinib->pdr_bit); /* 8Data, 1Stop, No Parity */ sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_MR), (US_CLKS_MCK|US_CHRL_8|US_PAR_NO|US_NBSTOP_1|US_CHMODE_NORMAL)); /* 115200bps */ if((baud % 10) >= 5) sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_BRGR), (baud/10)+1); else sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_BRGR), (baud/10)); /* * 割込み関連の設定 */ if(siopinib->pmc_pcer){ sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_TTGR), 0); sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), US_TXEN|US_RXEN); sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_IER), 1<<0); } else{ /* クロックイネーブル */ sil_wrw_mem((VP)(TADR_PMC_BASE+TOFF_PMC_PCER), (1<<IRQ_TC2_PID)); /* タイマ停止 */ sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CCR), TC_CLKDIS); sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_IDR), 0xFFFFFFFF); /* カウント値をセット */ sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CMR), TC_CLKS_MCK8); /* 47,923,200Hz/8=5,990,400Hz */ sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CMR), sil_rew_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CMR)) | TC_WAVESEL10); sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_RC), 59900); /* 10ms */ /* 割込みのクリア */ sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_IER), TC_CPCS); /* カウントスタート */ sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CCR), (TC_CLKEN|TC_SWTRG)); sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), US_TXEN|US_RXEN); } sil_rew_mem((VP)(siopinib->uart_base+TOFF_US_RHR)); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }