/* * SCI送信割込みサービスルーチン * */ void sh2scif_isr2_out (void) { if (siopcb_table[1].openflag) { sh2scif_isr_siop_out (get_siopcb (2)); } }
/* * シリアルI/Oポートのオープン */ SIOPCB * upd72001_opn_por(ID siopid, VP_INT exinf) { SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; upd72001_write_reg(siopinib->ctrl, CR_RESET); if (!upd72001_openflag()) { upd72001_write_ctrl((VP) TADR_UPD72001_CTRLA, UPD72001_CR2, 0x18); upd72001_write_ctrl((VP) TADR_UPD72001_CTRLB, UPD72001_CR2, 0x00); } siopcb->cr1 = CR1_DOWN; upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR1, siopcb->cr1); upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR4, siopinib->cr4_def); upd72001_write_brg(siopinib->ctrl, UPD72001_CR12, 0x01, siopinib->brg2_def, siopinib->brg1_def); upd72001_write_brg(siopinib->ctrl, UPD72001_CR12, 0x02, siopinib->brg2_def, siopinib->brg1_def); upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR15, CR15_DEF); upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR14, CR14_DEF); upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR10, CR10_DEF); upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR3, siopinib->cr3_def); upd72001_write_ctrl(siopinib->ctrl, UPD72001_CR5, siopinib->cr5_def); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }
/* * シリアルI/Oポートのオープン */ SIOPCB * sio_opn_por(ID siopid, intptr_t exinf) { SIOPCB *p_siopcb = get_siopcb(siopid); bool_t opnflg; ER ercd; /* * オープンしたポートがあるかをopnflgに読んでおく. */ opnflg = p_siopcb->openflag; /* * デバイス依存のオープン処理. */ at91skyeye_uart_opn_por(p_siopcb, exinf); /* * シリアルI/O割込みのマスクを解除する. */ if (!opnflg) { ercd = ena_int(INTNO_SIO); assert(ercd == E_OK); } return(p_siopcb); }
/* * SIOの割込みサービスルーチン */ void sio_isr(intptr_t exinf) { SIOPCB *p_siopcb; p_siopcb = get_siopcb(exinf); /* * 割込みのクリア */ UARTIntClear(p_siopcb->p_siopinib->base, UARTIntStatus(p_siopcb->p_siopinib->base, true)); if (UARTCharsAvail(p_siopcb->p_siopinib->base)) { /* * 受信通知コールバックルーチンを呼び出す. */ sio_irdy_rcv(p_siopcb->exinf); } if (UARTSpaceAvail(p_siopcb->p_siopinib->base)) { /* * 送信可能コールバックルーチンを呼び出す. */ sio_irdy_snd(p_siopcb->exinf); } }
/* * SCI受信割込みサービスルーチン sh1と同じ * * SH1内蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、 * SCI0の受信割込み以外でこのルーチンが呼ばれることはない * */ void sh2scif_isr_in () { if (siopcb_table[0].openflag) { sh2scif_isr_siop_in (get_siopcb (1)); } }
/* * シリアルI/Oポートのオープン */ SIOPCB * uart_opn_por(ID siopid, VP_INT exinf) { SIOPCB *siopcb; siopcb = get_siopcb(siopid); /* FIFOを有効にし、受信送信FIFOをクリア、 * トリガレベル=1(受信送信共通) * 8データ、1ストップビット、no parity */ UART_FCR = (FCR_FIFO | FCR_RFRST | FCR_TFRST | FIFO_TRIG); UART_LCR = 0x03; /* ボーレートレジスタにアクセス */ UART_LCR |= LCR_DLAB; UART_DLL = UART_BAUD_RATE; UART_DLM = UART_BAUD_RATE >> 8; /* BAUD RATE設定終了 */ UART_LCR &= ~LCR_DLAB; /* エラーフラグをクリア */ UART_SCR = UART_LSR; UART_IER = IER_RIE; /* 受信割り込み許可 */ siopcb->exinf = exinf; siopcb->openflag = TRUE; siopcb->getready = siopcb->putready = FALSE; return(siopcb); }
/* * シリアルI/Oポートのオープン */ SIOPCB * sio_opn_por(ID siopid, intptr_t exinf) { SIOPCB *p_siopcb; const SIOPINIB *p_siopinib; bool_t opnflg; ER ercd; p_siopcb = get_siopcb(siopid); p_siopinib = p_siopcb->p_siopinib; /* * オープンしたポートがあるかをopnflgに読んでおく. */ opnflg = p_siopcb->opnflg; p_siopcb->exinf = exinf; /* * ハードウェアの初期化 */ UARTConfigSetExpClk(p_siopinib->base, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); /* * シリアルI/O割込みのマスクを解除する. */ if (!opnflg) { ercd = ena_int(p_siopinib->intno); assert(ercd == E_OK); } return(p_siopcb); }
SIOPCB * uart_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; #ifndef USE_JTAG_UART // sil_wrw_mem(UART_DIVISOR, UART_DIVISOR_VAL); sil_wrw_mem((VP)UART_STATUS, 0x00); /* * 受信割り込み許可 */ sil_wrw_mem((VP)UART_CONTROL, UART_STATUS_RRDY); #else sil_wrw_mem((VP)JTAG_UART_CONTROL,JTAG_UART_CONTROL_RIE); #endif /* USE_JTAG_UART */ siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }
/* * シリアルI/Oポートのオープン */ SIOPCB * upd72001_opn_por(ID siopid, intptr_t exinf) { SIOPCB *p_siopcb; const SIOPINIB *p_siopinib; p_siopcb = get_siopcb(siopid); p_siopinib = p_siopcb->p_siopinib; upd72001_write_reg(p_siopinib->ctrl, CR_RESET); if (!upd72001_openflag()) { upd72001_write_ctrl((void *) TADR_UPD72001_CTRLA, UPD72001_CR2, 0x18); upd72001_write_ctrl((void *) TADR_UPD72001_CTRLB, UPD72001_CR2, 0x00); } p_siopcb->cr1 = CR1_DOWN; upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR1, p_siopcb->cr1); upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR4, p_siopinib->cr4_def); upd72001_write_brg(p_siopinib->ctrl, UPD72001_CR12, 0x01U, p_siopinib->brg2_def, p_siopinib->brg1_def); upd72001_write_brg(p_siopinib->ctrl, UPD72001_CR12, 0x02U, p_siopinib->brg2_def, p_siopinib->brg1_def); upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR15, CR15_DEF); upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR14, CR14_DEF); upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR10, CR10_DEF); upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR3, p_siopinib->cr3_def); upd72001_write_ctrl(p_siopinib->ctrl, UPD72001_CR5, p_siopinib->cr5_def); p_siopcb->exinf = exinf; p_siopcb->getready = false; p_siopcb->putready = false; p_siopcb->openflag = true; return(p_siopcb); }
/* * SCI受信エラー割込みサービスルーチン */ void sh2scif_isr2_error (void) { if (siopcb_table[1].openflag) { sh2scif_isr_siop_err (get_siopcb (2)); } }
/* * シリアルI/Oポートのオープン */ SIOPCB * st16c2550_opn_por(ID siopid, VP_INT exinf) { SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* * 初期化 */ st16c2550_init_siopinib(siopcb->siopinib); /* 受信割込み許可 */ st16c_write(siopcb->siopinib->reg_base, ST16C_IER, IER_RX); /* 割込み線をイネーブル */ st16c_write(siopcb->siopinib->reg_base, ST16C_MCR, MCR_INT_ENABLE); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }
/* * オープンしているポートがあるか? */ BOOL sh1sci_openflag(ID siopid) { SIOPCB *siopcb; siopcb = get_siopcb(siopid); return (siopcb->openflag); }
/* * SIOの割込みサービスルーチン */ void scif_rx_isr(ID siopid) { SIOPCB *p_siopcb = get_siopcb(siopid); while (scif_getready(p_siopcb)) { scif_irdy_rcv(p_siopcb->exinf); } }
/* ブレーク検出 */ void sh2scif_isr_brk (void) { if (siopcb_table[0].openflag) { sh2scif_isr_siop_brk (get_siopcb (1)); } }
/* * シリアル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); }
/* * SIOの割込みサービスルーチン */ void scif_tx_isr(ID siopid) { SIOPCB *p_siopcb = get_siopcb(siopid); if (scif_putready(p_siopcb)) { scif_irdy_snd(p_siopcb->exinf); } }
void at91skyeye_init_uart(uint_t siopid) { SIOPCB *p_siopcb = get_siopcb(siopid); /* 受信データの格納先アドレスの設定 */ sil_wrw_mem((void *)(USART0_RPR), (uint32_t)(&(p_siopcb->usart_rev_buf))); sil_wrw_mem((void *)(USART0_RCR), 0x0001); }
void h8s_sci4_isr_out() { SIOPCB *siopcb = get_siopcb(5); /* 送信可能コールバックルーチンの呼び出し */ if( siopcb->openflag ) { h8s_sci_ierdy_snd( siopcb->exinf ); } }
/* * SIOの受信エラー割込みサービスルーチン (SCI4専用) * * エラー処理は、下記エラーフラグのクリアのみ。 * ・オーバーランエラー、フレーミングエラー、パリティエラー */ void h8s_sci4_isr_error(void) { SIOPCB *siopcb = get_siopcb(5); if( siopcb->openflag ) { /* エラーフラグクリア */ h8s_sci_and( siopcb->siopinib, (UW) SSR, ~( RDRF | ORER | FER | PER ) ); } }
/* * SIOの割込みサービスルーチン (SCI4専用) */ void h8s_sci4_isr_in() { SIOPCB *siopcb = get_siopcb(5); /* 受信通知コールバックルーチンの呼び出し */ if( siopcb->openflag ) { h8s_sci_ierdy_rcv( siopcb->exinf ); } }
/* * カーネル起動時のバーナ出力用の初期化 */ void scif_init(ID siopid) { SIOPCB *p_siopcb = get_siopcb(siopid); const SIOPINIB *p_siopinib = get_siopinib(siopid); /* この時点では、p_siopcb->p_siopinibは初期化されていない */ if (!(p_siopcb->is_initialized)) { scif_init_siopinib(p_siopinib); p_siopcb->is_initialized = true; } }
/* * シリアル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 sio_handler(void) { SIOPCB *p_siopcb = get_siopcb((x_prc_index() + 1)); if (uart_getready(p_siopcb)) { /* * 受信通知コールバックルーチンを呼び出す. */ sio_irdy_rcv(p_siopcb->exinf); } if (uart_putready(p_siopcb)) { /* * 送信可能コールバックルーチンを呼び出す. */ sio_irdy_snd(p_siopcb->exinf); } }
/* * シリアルI/Oポートのオープン */ SIOPCB * h8s_sci_opn_por(ID siopid, VP_INT exinf) { SIOPCB *siopcb = get_siopcb(siopid); const SIOPINIB *siopinib = siopcb->siopinib; /* SCIレジスタの初期化 */ h8s_sci_init_siopinib( siopinib ); /* 割込みレベル設定、割込み要求クリアは、sio_opn_por で行う。 */ siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }
/* * open sio port */ SIOPCB * sio_opn_por(ID siopid, intptr_t exinf) { SIOPCB *p_siopcb = get_siopcb(siopid); p_siopcb->exinf = exinf; /* * the device dependent open */ emstartkit_uart_init(p_siopcb->p_siopinib->regs, LCR_WORD_LEN8 | LCR_1_STOP_BIT | LCR_PARITY_NONE, 115200); p_siopcb->getready = p_siopcb->putready = false; p_siopcb->openflag = true; ena_int(p_siopcb->p_siopinib->intno); return p_siopcb; }
/* * シリアル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_addr+TADR_SFR_UC1_OFFSET), sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET))&~(TBIT_UiC1_TE | TBIT_UiC1_RE)); /* ポート設定(動作モード、通信速度) */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UMR_OFFSET), siopinib->mr_def); sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC0_OFFSET), siopinib->c0_def); sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UBRG_OFFSET), siopinib->brg_def); /* * シリアル割込みの設定 */ sil_wrb_mem((VP)(siopinib->tic_addr), TB_LEVEL); sil_wrb_mem((VP)(siopinib->ric_addr), RB_LEVEL); /* オープン時はコールバック禁止 */ sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1); /* * ダミーデータ受信 */ sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_URB_OFFSET)); sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_URB_OFFSET)); for(i = 0 ; i < SFRUART_COUNT ; i++){ /* オープン時送信READYまで待ち */ if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI) break; } siopcb->exinf = exinf; return(siopcb); }
/* * シリアル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); }
SIOPCB * uart_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; /* * 送受信バッファクリア */ sil_wrw_mem((VP)UARTLITE_CTREG, UARTLITE_RST_RX_FIFO | UARTLITE_RST_TX_FIFO | UARTLITE_ENABLE_INTR); // sil_wrw_mem((VP)UARTLITE_CTREG, UARTLITE_RST_RX_FIFO // | UARTLITE_RST_TX_FIFO ); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb); }
/* * シリアルI/Oポートのオープン */ SIOPCB * sio_opn_por(ID siopid, intptr_t exinf) { SIOPCB *p_siopcb; const SIOPINIB *p_siopinib; int_t fd; struct termios term; p_siopcb = get_siopcb(siopid); p_siopinib = p_siopcb->p_siopinib; if (p_siopinib->path != NULL) { fd = open(p_siopinib->path, O_RDWR, 0777); assert(fd >= 0); p_siopcb->read_fd = p_siopcb->write_fd = fd; } else { fd = p_siopcb->read_fd = STDIN_FILENO; /* 標準入出力を使う */ p_siopcb->write_fd = STDOUT_FILENO; } fcntl(fd, F_SETOWN, getpid()); fcntl(fd, F_SETFL, (O_NONBLOCK | O_ASYNC)); tcgetattr(fd, &(p_siopcb->saved_term)); term = p_siopcb->saved_term; term.c_lflag &= ~(ECHO | ICANON); tcsetattr(fd, TCSAFLUSH, &term); p_siopcb->exinf = exinf; p_siopcb->rcv_flag = false; p_siopcb->rcv_rdy = false; p_siopcb->snd_flag = false; p_siopcb->snd_rdy = false; p_siopcb->openflag = true; return(p_siopcb); }
/* * シリアルI/Oポートのオープン */ SIOPCB * scif_opn_por(ID siopid, intptr_t exinf) { SIOPCB *p_siopcb; const SIOPINIB *p_siopinib; p_siopcb = get_siopcb(siopid); p_siopinib = p_siopcb->p_siopinib; /* * ハードウェアの初期化 * 既に初期化している場合は、二重に初期化しない。 */ if (!(p_siopcb->is_initialized)) { scif_init_siopinib(p_siopinib); p_siopcb->is_initialized = true; } p_siopcb->exinf = exinf; p_siopcb->getready = p_siopcb->putready = false; p_siopcb->openflag = true; return(p_siopcb); }