Example #1
0
/*
 *  SCI送信割込みサービスルーチン
 *  
 */
void
sh2scif_isr2_out (void)
{
	if (siopcb_table[1].openflag) {
		sh2scif_isr_siop_out (get_siopcb (2));
	}
}
Example #2
0
/*
 *  シリアル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);
}
Example #4
0
/*
 *  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);
	}
}
Example #5
0
/*
 *  SCI受信割込みサービスルーチン sh1と同じ
 *  
 *   SH1内蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
 *   SCI0の受信割込み以外でこのルーチンが呼ばれることはない
 *  
 */
void
sh2scif_isr_in ()
{
	if (siopcb_table[0].openflag) {
		sh2scif_isr_siop_in (get_siopcb (1));
	}
}
Example #6
0
/*
 *  シリアル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);
}
Example #7
0
/*
 *  シリアル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);
}
Example #8
0
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);
}
Example #9
0
/*
 *  シリアル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);
}
Example #10
0
/*
 *  SCI受信エラー割込みサービスルーチン
 */
void
sh2scif_isr2_error (void)
{
	if (siopcb_table[1].openflag) {
		sh2scif_isr_siop_err (get_siopcb (2));
	}
}
Example #11
0
/*
 * シリアル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);
}
Example #12
0
/*
 *  オープンしているポートがあるか?
 */
BOOL
sh1sci_openflag(ID siopid)
{
	SIOPCB *siopcb;

	siopcb = get_siopcb(siopid);
	return (siopcb->openflag);
}
Example #13
0
/*
 *  SIOの割込みサービスルーチン
 */
void
scif_rx_isr(ID siopid)
{
	SIOPCB *p_siopcb = get_siopcb(siopid);
	while (scif_getready(p_siopcb)) {
		scif_irdy_rcv(p_siopcb->exinf);
	}
}
Example #14
0
/* ブレーク検出 */
void
sh2scif_isr_brk (void)
{

	if (siopcb_table[0].openflag) {
		sh2scif_isr_siop_brk (get_siopcb (1));
	}
}
Example #15
0
/*
 *  シリアル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);
}
Example #16
0
/*
 *  SIOの割込みサービスルーチン
 */
void
scif_tx_isr(ID siopid)
{
	SIOPCB *p_siopcb = get_siopcb(siopid);

	if (scif_putready(p_siopcb)) {
		scif_irdy_snd(p_siopcb->exinf);
	}
}
Example #17
0
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);
}
Example #18
0
void
h8s_sci4_isr_out()
{
	SIOPCB *siopcb = get_siopcb(5);

	/* 送信可能コールバックルーチンの呼び出し */
	if( siopcb->openflag ) {
		h8s_sci_ierdy_snd( siopcb->exinf );
	}
}
Example #19
0
/*
 *  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 ) );
	}
}
Example #20
0
/*
 *  SIOの割込みサービスルーチン (SCI4専用)
 */
void
h8s_sci4_isr_in()
{
	SIOPCB *siopcb = get_siopcb(5);

	/* 受信通知コールバックルーチンの呼び出し */
	if( siopcb->openflag ) {
		h8s_sci_ierdy_rcv( siopcb->exinf );
	}
}
Example #21
0
/*
 * カーネル起動時のバーナ出力用の初期化
 */
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;
	}
}
Example #22
0
/*
 *  シリアル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);
}
Example #23
0
/*
 *  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);
	}
}
Example #24
0
/*
 *  シリアル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;
}
Example #26
0
/*
 *  シリアル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);
}
Example #27
0
/*
 * シリアル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);
}
Example #28
0
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);
}
Example #29
0
/*
 *  シリアル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);
}
Example #30
0
/*
 *  シリアル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);
}