Beispiel #1
0
/*
 * ビジーループ関数
 */ 
int
busy_wait_inc(int e){
    e++;
    sil_dly_nse(1000);
  
    return e;
}
Beispiel #2
0
/*
 *  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 ) );
}
Beispiel #3
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);
}
Beispiel #4
0
/*
 *  デバイスレジスタへのアクセス関数
 */
Inline UB
upd72001_read_reg(VP addr)
{
	UB	val;

	val = (UB) upd72001_reb_reg(addr);
	sil_dly_nse(UPD72001_DELAY);
	return(val);
}
Beispiel #5
0
/*
 *  デバイスレジスタへのアクセス関数
 */
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);
}
Beispiel #7
0
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();
}
Beispiel #8
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);
}
Beispiel #9
0
/*
 *  送信する文字の書込み
 */
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
	}
}
Beispiel #10
0
/*
 * ターゲット依存部 初期化処理
 */
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);
	
}
Beispiel #11
0
Inline void
upd72001_write_reg(VP addr, UB val)
{
	upd72001_wrb_reg(addr, (VB) val);
	sil_dly_nse(UPD72001_DELAY);
}
Beispiel #12
0
static void mdelay(unsigned long msecs) {
	sil_dly_nse(msecs * 1000 * 1000);
}
Beispiel #13
0
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);
}