/* * タイマの起動処理 */ void target_timer_initialize(intptr_t exinf) { CLOCK cyc; uint32_t tmp; #ifdef SYSTIC_USE_CALIBRATION /* CALIBRATIONレジスタの値を使用 */ cyc = (sil_rew_mem((void *)SYSTIC_CALIBRATION) & SYSTIC_TENMS) / 10; #else cyc = TO_CLOCK(TIC_NUME, TIC_DENO) - 1; #endif /* SYSTIC_USE_CALIBRATION */ /* 停止 */ tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS); tmp &= ~SYSTIC_ENABLE; sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp); sil_wrw_mem((void *)SYSTIC_RELOAD_VALUE, cyc); sil_wrw_mem((void *)SYSTIC_CURRENT_VALUE, cyc); tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS); #ifdef SYSTIC_USE_STCLK /* 外部クロックの使用 */ tmp |= SYSTIC_ENABLE; #else /* プロセッサクロックの使用 */ tmp |= SYSTIC_ENABLE|SYSTIC_CLKSOURCE; #endif /* SYSTIC_USE_STCLK */ sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp); }
void Buzzer(uint8_t buzzer) { if (buzzer == BUZZER_ON){ sil_wrw_mem((void *)FIO2SET0,sil_rew_mem((void *)FIO2SET0) | (0x1<<1) ); /*p2.0 high*/ }else { sil_wrw_mem((void *)FIO2CLR0,sil_rew_mem((void *)FIO2CLR0) | (0x1<<1) ); /*p2.0 low*/ } }
/* * 受信した文字の取り出し */ Inline UB uart_getchar(SIOPCB *siopcb) { #ifndef USE_JTAG_UART return((UB)(sil_rew_mem((VP)UART_RXDATA))); #else return((UB)(sil_rew_mem((VP)JTAG_UART_DATA))); #endif /* USE_JTAG_UART */ }
void Buzzer_Init(void) { sil_wrw_mem((void *)SCS,sil_rew_mem((void *)SCS)|0x00000001); /*set GPIOx to use Fast I/O */ sil_wrw_mem((void *)PINSEL10,0); /*ETM interface is disabled. must set this*/ sil_wrw_mem((void *)PINSEL4,sil_rew_mem((void *)PINSEL4) & (~(0x3<<2)) ); /*set GPIOx to use Fast I/O */ sil_wrw_mem((void *)PINMODE4,sil_rew_mem((void *)PINMODE4) & (~(0x3<<2)) ); /*p2.0 pull up*/ sil_wrw_mem((void *)FIO2DIR0,sil_rew_mem((void *)FIO2DIR0) | (0x1<<1) ); /*p2.0 output*/ }
void pl310_init(uint32_t aux_val, uint32_t aux_mask) { uint32_t tmp; uint32_t aux; uint32_t cache_id; uint32_t prefetch; uint32_t prefetch_val = 0; uint32_t power; int ways; /* L2キャッシュがすでにオンになっているか確認する */ tmp = sil_rew_mem((void*)(RMA1_L2CACHE_BASE + PL310_CTRL)); /* L2キャッシュが無効の場合のみ初期化を実施する */ if ( !(tmp & 1) ) { cache_id = sil_rew_mem((void*)(RMA1_L2CACHE_BASE + PL310_CACHE_ID)); aux = sil_rew_mem((void*)(RMA1_L2CACHE_BASE + PL310_AUX_CTRL)); prefetch = sil_rew_mem((void*)(RMA1_L2CACHE_BASE + PL310_PREFETCH_CTRL)); power = sil_rew_mem((void*)(RMA1_L2CACHE_BASE + PL310_POWER_CTRL)); if (aux & (1 << 16)) { ways = 16; } else { ways = 8; } aux_val |= 1 << 22; aux_val |= 1 << 29; prefetch_val |= 1 << 29; aux_val |= 1 << 28; prefetch_val |= 1 << 28; if ((cache_id & 0x3f) > 0x6) { prefetch_val |= 1 << 30; } pl310_way_mask = (1 << ways) - 1; aux &= aux_mask; aux |= aux_val; prefetch |= prefetch_val; sil_wrw_mem((void*)(RMA1_L2CACHE_BASE + PL310_AUX_CTRL), aux); sil_wrw_mem((void*)(RMA1_L2CACHE_BASE + PL310_PREFETCH_CTRL), prefetch); sil_wrw_mem((void*)(RMA1_L2CACHE_BASE + PL310_POWER_CTRL), power); pl310_inv_all(); sil_wrw_mem((void*)(RMA1_L2CACHE_BASE + PL310_CTRL), 1); } }
/* * 文字を送信できるか? */ Inline BOOL uart_putready(SIOPCB *siopcb) { #ifndef USE_JTAG_UART return((sil_rew_mem((VP)UART_STATUS) & UART_STATUS_TRDY) != 0); #else return((sil_rew_mem( (VP)JTAG_UART_CONTROL) & JTAG_UART_CONTROL_WSAPCE) > 0); #endif /* USE_JTAG_UART */ }
/* * 受信割込み禁止 */ Inline void uart_disable_rcv(SIOPCB *siopcb) { #ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_CONTROL, sil_rew_mem((VP)UART_CONTROL)&~UART_STATUS_RRDY); #else sil_wrw_mem((VP)JTAG_UART_CONTROL, sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_RIE); #endif /* USE_JTAG_UART */ }
/* * 送信割込み禁止 */ Inline void uart_disable_send(SIOPCB *siopcb) { #ifndef USE_JTAG_UART sil_wrw_mem((VP)UART_CONTROL, sil_rew_mem((VP)UART_CONTROL)&~UART_CONTROL_ITRD); #else sil_wrw_mem((VP)JTAG_UART_CONTROL, sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_WIE); #endif /* USE_JTAG_UART */ }
void UART_PrintChar (uint8_t ch) { #if UART_PORT == 1 while (!(sil_rew_mem((void *)U1LSR) & 0x20)); /* wait until U1THR is empty.*/ sil_wrw_mem((void *)U1THR, ch); #elif UART_PORT == 0 while (!(sil_rew_mem((void *)U0LSR) & 0x20)); /* wait until U1THR is empty.*/ sil_wrw_mem((void *)U0THR, ch); #endif }
/* * 文字を受信したか? */ Inline BOOL uart_getready(SIOPCB *siopcb) { #ifndef USE_JTAG_UART return((sil_rew_mem((VP)UART_STATUS) & UART_STATUS_RRDY) != 0); #else UW tmp = sil_rew_mem((VP)JTAG_UART_DATA); jtag_uart_buf = (UB)tmp; return ((tmp & JTAG_UART_DATA_RVALID) != 0); #endif /* USE_JTAG_UART */ }
void timer2_capinit(void) { sil_wrw_mem(PCONP,sil_rew_mem(PCONP)|(1<<22));/*power on timer2*/ sil_wrw_mem(PCLKSEL1,(PCLKSEL1&(~(0x3<<12)))|(0x1<<12));/*pclk of timer is cclk*/ sil_wrw_mem(PINSEL0,sil_rew_mem(PINSEL0)|(0x3<<8)); /*p0.4 as cap2*/ sil_wrw_mem(T2PR,0); /*prescale counter is 0*/ sil_wrw_mem(T2IR,0xff); /*reset the interrupts*/ sil_wrw_mem(T2TCR,0x02); /*disable and reset counter*/ sil_wrw_mem(T2CTCR,0x00); /*timer mode,capture on rising edge CAP2.0 for TIMER2*/ sil_wrw_mem(T2MCR,0x00); /*disable match control*/ sil_wrw_mem(T2CCR,0x05); /*capture rising and falling edge cr0 load TC and generate interrupt*/ sil_wrw_mem(T2TCR,0x01); /*start counter*/ }
void LED_Init(void) { sil_wrw_mem((void *)SCS,sil_rew_mem((void *)SCS)|0x00000001); /*set GPIOx to use Fast I/O */ /* P3[20] - p3[27] =>LEDS as GPIOs*/ sil_wrw_mem((void *)PINSEL7,sil_rew_mem((void *)PINSEL7)&0xff0000ff); /*select P320 - P327 pull_up*/ sil_wrw_mem((void *)PINMODE7,sil_rew_mem((void *)PINSEL7)&0xff0000ff); /* P320-P327 as output */ sil_wrw_mem((void *)FIO3DIR2,sil_rew_mem((void *)FIO3DIR2)|0x000000f0); sil_wrw_mem((void *)FIO3DIR3,sil_rew_mem((void *)FIO3DIR3)|0x0000000f); }
/* * 受信割込み禁止 */ Inline void uart_disable_rcv(SIOPCB *siopcb) { unsigned long tmp = sil_rew_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_IER)); tmp &= ~US_ERXI; sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_IER), tmp); }
/* * 文字を受信したか? */ Inline BOOL uart_getready(SIOPCB *siopcb) { return((sil_rew_mem((VP)UARTLITE_SRREG) & UARTLITE_RX_FIFO_VALID_DATA) != 0); }
/* * ターゲット依存の初期化 */ void target_initialize(void) { uint32_t reg; /* * チップ依存の初期化 */ chip_initialize(); /* * Emulation Baseboardの割込みモードの設定 */ sil_wrw_mem(EB_SYS_LOCK, EB_SYS_LOCK_UNLOCK); /* ロック解除 */ reg = sil_rew_mem(EB_SYS_PLD_CTRL1); reg &= ~EB_SYS_PLD_CTRL1_INTMODE_MASK; reg |= EB_SYS_PLD_CTRL1_INTMODE_NEW_NODCC; sil_wrw_mem(EB_SYS_PLD_CTRL1, reg); sil_wrw_mem(EB_SYS_LOCK, EB_SYS_LOCK_LOCK); /* ロック */ /* * UARTを初期化 */ #ifndef TOPPERS_OMIT_TECS tPutLogCT11MPCore_initialize(); #endif /* TOPPERS_OMIT_TECS */ }
/* * CPUインタフェースの初期化 */ void gicc_initialize(void) { /* * CPUインタフェースをディスエーブル */ sil_wrw_mem(GICC_CTLR, GICC_CTLR_DISABLE); /* * 割込み優先度マスクを最低優先度に設定 */ gicc_set_priority((GIC_PRI_LEVEL - 1) << GIC_PRI_SHIFT); /* * 割込み優先度の全ビット有効に */ sil_wrw_mem(GICC_BPR, 0U); /* * アクティブな割込みがあれば,EOIによりクリアする */ sil_wrw_mem(GICC_EOIR, sil_rew_mem(GICC_IAR)); /* * CPUインタフェースをイネーブル */ #ifdef TOPPERS_SAFEG_SECURE sil_wrw_mem(GICC_CTLR, (GICC_CTLR_FIQEN|GICC_CTLR_ENABLEGRP1 |GICC_CTLR_ENABLEGRP0)); #else /* TOPPERS_SAFEG_SECURE */ sil_wrw_mem(GICC_CTLR, GICC_CTLR_ENABLE); #endif /* TOPPERS_SAFEG_SECURE */ }
/* * 送信割込み許可 */ Inline void uart_enable_send(SIOPCB *siopcb) { unsigned long tmp = sil_rew_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_IER)); tmp |= US_ETXI; sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_UART_IER), tmp); }
ERCD RTC_Stop(void) { /*disable rtc clock*/ sil_wrw_mem((void *)RTC_CCR,sil_rew_mem((void *)PCONP)&(~(1<<0))); return ERCD_OK; }
ERCD RTC_SetTime(RTCTime Time) { /*ctc reset*/ sil_wrw_mem((void *)RTC_CCR,sil_rew_mem((void *)RTC_CCR)|(1<<1)); /*RTC current time set*/ sil_wrw_mem((void *)RTC_SEC, Time.RTC_Sec); sil_wrw_mem((void *)RTC_MIN, Time.RTC_Min); sil_wrw_mem((void *)RTC_HOUR, Time.RTC_Hour); sil_wrw_mem((void *)RTC_DOM, Time.RTC_Mday); sil_wrw_mem((void *)RTC_DOW, Time.RTC_Wday); sil_wrw_mem((void *)RTC_DOY, Time.RTC_Yday); sil_wrw_mem((void *)RTC_MONTH, Time.RTC_Mon); sil_wrw_mem((void *)RTC_YEAR, Time.RTC_Year); /*ctc start*/ sil_wrw_mem((void *)RTC_CCR,sil_rew_mem((void *)RTC_CCR)&(~(1<<1))); return ERCD_OK; }
/* * ターゲットシステム依存の初期化 */ void sys_initialize() { /* * プロセッサ識別のための変数の初期化 */ board_id = ((UINT)(sil_rew_mem((VP) TADR_BOARD_REG0)) & 0x1f); board_addr = (VP)(board_id << 24); /* * 割込み関連の初期化 * * すべての割込みをマスク・クリアし,割込みベクトルを設定する. */ dga_write((VP) TADR_DGA_CSR21, 0); dga_write((VP) TADR_DGA_CSR23, ~0); dga_write((VP) TADR_DGA_CSR19, (TVEC_G0I << 24) | (TVEC_G1I << 16) | (TVEC_SWI << 8) | TVEC_SPRI); /* * アボート割込みの設定(NMI) * * アボート割込みの割込みレベルを設定し,要求をクリアした後, * マスクを解除する. */ dga_set_ilv((VP) TADR_DGA_CSR24, TBIT_ABTIL, TIRQ_NMI); dga_write((VP) TADR_DGA_CSR23, TBIT_ABT); dga_bit_or((VP) TADR_DGA_CSR21, TBIT_ABT); /* * メモリ領域の設定 * * ローカルメモリのVMEバス上での先頭アドレスとサイズ(16MB) * し,アクセスを受け付けるように設定する.また,VMEバスから * 拡張アドレスアクセスを受け付けるようにに設定する. */ dga_write((VP) TADR_DGA_CSR4, (UW) board_addr | 0x00ff); dga_write((VP) TADR_DGA_CSR5, 0x0000012fu); /* * インタフェースレジスタ(IFR)の設定 * * インタフェースレジスタのベースアドレスを設定する.また,イ * ンタフェースレジスタ0のサービスリクエストフラグをクリア. * インタフェースレジスタ3にボードのID番号を設定. */ dga_write((VP) TADR_DGA_CSR3, (board_id << 4) | 0x3); dga_write((VP) TADR_DGA_IFR0, 0x80000000u); dga_write((VP) TADR_DGA_IFR3, board_id); /* * ラウンドロビンモードに設定(マルチプロセッサ対応) */ dga_write((VP) TADR_DGA_CSR1, (dga_read((VP) TADR_DGA_CSR1) & 0xffeffcff) | (1u << 20) | ((board_id % 4) << 8)); }
/* * タイマ割込みハンドラ */ void target_timer_handler(void) { /* probe_int のため,COUNTFLAGをクリア */ (void)sil_rew_mem((void *)SYSTIC_CONTROL_STATUS); i_begin_int(INTNO_TIMER); signal_time(); /* タイムティックの供給 */ i_end_int(INTNO_TIMER); }
/* 割込みベクタの退避 */ void load_vector(TMP_VECTOR *p) { UW *redboot_trap_vector = (UW *)VECTOR_TABLE_ADDR + TRAP8; UW *pirq5 = (UW *)VECTOR_TABLE_ADDR + IRQ_EXT5; /* ベクタテーブルの内、trapa命令分を退避 */ memcpy(&(p->trap_vector), redboot_trap_vector, TRAP_VECTOR_SIZE*4); /* IRQ5:Ethernet割込みの先頭アドレスを退避 */ p->irq5 = sil_rew_mem((VP)pirq5); }
/* * 文字を受信したか? */ Inline BOOL uart_getready(SIOPCB *siopcb) { VW dt; if(0 != siopcb->rxfdb) return TRUE; dt = sil_rew_mem((VP)siopcb->siopinib->pSraReg); return(dt &(SCSRA_RFS | SCSRA_RRDY)); }
ERCD RTC_Init(void) { /*power on the rtc*/ sil_wrw_mem((void *)PCONP,sil_rew_mem((void *)PCONP)|(1<<9)); /*don't compare seconds*/ sil_wrw_mem((void *)RTC_AMR, 0x01); sil_wrw_mem((void *)RTC_CIIR, 0x0); sil_wrw_mem((void *)RTC_CISS, 0x0); /*RTC clock source select as RTC*/ sil_wrw_mem((void *)RTC_CCR, 0x10); return ERCD_OK; }
/* * 受信した文字の取り出し */ Inline UB uart_getchar(SIOPCB *siopcb) { UW dt; if(0 == siopcb->rxfdb) { siopcb->rxfdb = (sil_rew_mem((VP)siopcb->siopinib->pSraReg) >> 20) & 0x03; if(0 == siopcb->rxfdb) siopcb->rxfdb = 4; siopcb->rxbuf = sil_rew_mem((VP)siopcb->siopinib->pFifoReg); }
/* * SIOの割込みサービスルーチン */ void int_timer2() { SIOPCB *siopcb = &(siopcb_table[0]); sil_rew_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_SR)); if (uart_getready(siopcb)) { /* * 受信通知コールバックルーチンを呼び出す. */ uart_ierdy_rcv(siopcb->exinf); } }
/* * 割込みコンフィギュレーション設定 */ void gicd_config(uint8_t id, bool_t is_edge, bool_t is_1_n) { uint16_t offset_addr; uint16_t offset_bit; uint32_t cfgr_reg_val; uint8_t config; if (is_edge) { config = GICD_ICFGRn_EDGE; } else { config = GICD_ICFGRn_LEVEL; } if (is_1_n) { config |= GICD_ICFGRn_1_N; } else { config |= GICD_ICFGRn_N_N; } offset_addr = (id / 16) * 4; offset_bit = (id % 16) * 2; cfgr_reg_val = sil_rew_mem((void *)(GICD_ICFGRn + offset_addr)); cfgr_reg_val &= ~(0x03U << offset_bit); cfgr_reg_val |= (0x03U & config) << offset_bit; sil_wrw_mem((void *)(GICD_ICFGRn + offset_addr), cfgr_reg_val); #ifdef GIC_USE_FIQ offset_addr = (id / 32) * 4; offset_bit = id % 32; sil_wrw_mem((void *)(GICD_IGROUPRn + offset_addr), sil_rew_mem((void *)(GICD_IGROUPRn+ offset_addr)) & ~(1 << offset_bit)); #endif /* GIC_USE_FIQ */ }
/* * DIC割込みターゲットの設定 * cpusはターゲットとするCPUのビットパターンで指定 * CPU0 : 0x01 * CPU1 : 0x02 * CPU2 : 0x04 * CPU3 : 0x08 */ void gicd_set_target(uint8_t id, uint8_t cpus) { uint32_t offset_addr; uint32_t offset_bit; uint32_t itr_reg_val; offset_addr = (id / 4) * 4; offset_bit = (id % 4) * 8; itr_reg_val = sil_rew_mem((void *)(GICD_ITARGETSRn + offset_addr)); itr_reg_val &= ~(0xf << offset_bit); itr_reg_val |= (cpus << offset_bit); sil_wrw_mem((void *)(GICD_ITARGETSRn + offset_addr), itr_reg_val); }
/* * 割込み優先度のセット * 内部表現で渡す. */ void gicd_set_priority(uint8_t id, int pri) { uint16_t offset_addr; uint16_t offset_bit; uint32_t pr_reg_val; offset_addr = (id / 4) * 4; offset_bit = ((id % 4) * 8) + GICC_PMR_OFFSET; pr_reg_val = sil_rew_mem((void *)(GICD_IPRIORITYRn + offset_addr)); pr_reg_val &= ~(GICC_PMR_MASK << offset_bit); pr_reg_val |= (GICC_PMR_MASK & pri) << (offset_bit); sil_wrw_mem((void *)(GICD_IPRIORITYRn + offset_addr), pr_reg_val); }
/* * シリアルI/Oポートからのコールバックの禁止 */ void eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn) { CELLCB *p_cellcb = GET_CELLCB(idx); uint32_t reg; reg = sil_rew_mem(UART_IMSC(ATTR_baseAddress)); switch (cbrtn) { case SIOSendReady: reg &= ~UART_IMSC_TXIM; break; case SIOReceiveReady: reg &= ~UART_IMSC_RXIM; break; } sil_wrw_mem(UART_IMSC(ATTR_baseAddress), reg); }