void main(void) { // configure PIC core_initialize(); // init all peripherals periph_initialize(); // start app logic app_initialize(); // main program loop while (1) app_tick(); }
/* * target dependent initialization */ void target_initialize(void) { /* in emstartkit, clock nand mem are already initialized when FPGA is configured */ /* * to use target_fput_log, initialize UART */ emstartkit_uart_init((DW_APB_UART_STRUCT_PTR)REGBASE_UART1, LCR_WORD_LEN8 | LCR_1_STOP_BIT | LCR_PARITY_NONE, 115200); /* * core dependent initialization */ core_initialize(); }
/* * ターゲット依存の初期化 */ void target_initialize(void) { int i; /* * ARM依存の初期化 */ core_initialize(); /* * 割込み入力時に割込み要因を判定するためSVRに割込み番号をセットする */ /* * 全割込み禁止 */ sil_wrw_mem((void*)(TADR_AIC_BASE+TOFF_AIC_ICCR), ~0U); /* * EOICRをセット */ sil_wrw_mem((void*)(TADR_AIC_BASE+TOFF_AIC_EOICR), 0U); for(i = 0; i < TNUM_INT; i++){ sil_wrw_mem((void*)(TADR_AIC_BASE+TOFF_AIC_SVR+(i*4)), (uint32_t)i); } /* * 各割込みの割込み要求禁止フラグ全禁止 */ idf = ~0U; /* * 割込み優先度マスクは0 */ ipm = 0U; /* * 全ての割込みをマスク */ at91sam7s_disable_int(~0U); /* * 割込み属性が設定されているかを判別するための変数を初期化する. */ bitpat_cfgint = 0U; #ifndef VECTOR_KERNEL /* * 例外ベクタテーブルへ割込みハンドラを登録 */ x_install_exc(EXCH_NO_IRQ, interrupt_handler); x_install_exc(EXCH_NO_UNDEF, undef_handler); x_install_exc(EXCH_NO_SWI, swi_handler); x_install_exc(EXCH_NO_PABORT, prefetch_handler); x_install_exc(EXCH_NO_DABORT, data_abort_handler); x_install_exc(EXCH_NO_FIQ, fiq_handler); #endif /* VECTOR_KERNEL */ /* * target_fput_log が可能になるようにUARTを初期化 */ at91sam7s_init_uart(); }
/* * チップ依存の初期化 */ void chip_initialize(void) { /* * ARM依存の初期化 */ core_initialize(); /* * ベクタテーブルをHigh exception vectors(0xFFFF0000)にコピー */ char *vt = (char*)0xFFFF0000; char *vts = (char*)vector_table; for(int i = 0; i < 512; ++i) vt[i] = vts[i]; /* * Select high exception vectors (0xFFFF0000) * by setting V bit in CP15 c1 (control register). */ asm("mrc p15, 0, r0, c1, c0, 0"); asm("orr r0, r0, #0x00002000"); asm("mcr p15, 0, r0, c1, c0, 0"); /* * AINTCの初期化 */ AINTC.GER = 0x1; AINTC.HIER = 0x2; AINTC.EISR = 21; AINTC.CR = 0x14; AINTC.VBR = (uint32_t)ISR_VECTORS; AINTC.VSR = 0; x_set_ipm(0); /* Set IPM to 0 */ /** * 低レベル出力シリアルI/Oの初期化 */ sio_initialize_low(); /* * キャッシュを無効に */ uint32_t bits = 0; CP15_CONTROL_READ(bits); bits &= ~(CP15_CONTROL_I_BIT | CP15_CONTROL_C_BIT); CP15_CONTROL_WRITE(bits); //cache_disable(); #if !defined(TOPPERS_SUPPORT_PROTECT) section_table_init(); #endif /** * MMUを有効に */ CP15_TTB0_WRITE((uintptr_t)section_table); #if defined(TOPPERS_SUPPORT_PROTECT) CP15_DOMAINS_WRITE(0x01U/*D0_CLIENT*/); #else CP15_DOMAINS_WRITE(0x03U/*D0_MANAGER*/); #endif //CP15_ASID_SET(1); CP15_CONTROL_READ(bits); bits |= CP15_CONTROL_M_BIT; CP15_CONTROL_WRITE(bits); //*(uint32_t*)0x1E2608C = 0x0; //mmu_init(); //MCR p15, 0, <Rd>, c2, c0, 0; write TTBR /* * キャッシュを有効に */ CP15_CONTROL_READ(bits); bits |= (CP15_CONTROL_I_BIT | CP15_CONTROL_C_BIT); CP15_CONTROL_WRITE(bits); }