/* * This is the next part if the initialization sequence: we are now * running from RAM and have a "normal" C environment, i. e. global * data can be written, BSS has been cleared, the stack size in not * that critical any more, etc. */ void board_init_r(gd_t *id, ulong dest_addr) { char *s; bd_t *bd; ulong malloc_start; extern void malloc_bin_reloc(void); gd = id; bd = gd->bd; gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ monitor_flash_len = &_end - &_start; debug("monitor flash len: %08lX\n", monitor_flash_len); board_init(); /* Setup chipselects */ #if defined(CONFIG_NEEDS_MANUAL_RELOC) /* * We have to relocate the command table manually */ fixup_cmdtable(&__u_boot_cmd_start, (ulong)(&__u_boot_cmd_end - &__u_boot_cmd_start)); #endif /* defined(CONFIG_NEEDS_MANUAL_RELOC) */ #ifdef CONFIG_SERIAL_MULTI serial_initialize(); #endif debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr); /* The Malloc area is immediately below the monitor copy in DRAM */ malloc_start = dest_addr - TOTAL_MALLOC_LEN; mem_malloc_init(malloc_start, TOTAL_MALLOC_LEN); malloc_bin_reloc(); #ifndef CONFIG_SYS_NO_FLASH /* configure available FLASH banks */ gd->bd->bi_flashstart = CONFIG_SYS_FLASH_BASE; gd->bd->bi_flashsize = flash_init(); gd->bd->bi_flashoffset = CONFIG_SYS_FLASH_BASE + gd->bd->bi_flashsize; if (gd->bd->bi_flashsize) display_flash_config(gd->bd->bi_flashsize); #endif /* CONFIG_SYS_NO_FLASH */ #if defined(CONFIG_CMD_NAND) puts("NAND: "); nand_init(); /* go init the NAND */ #endif #ifdef CONFIG_GENERIC_MMC puts("MMC: "); mmc_initialize(gd->bd); #endif /* initialize environment */ env_relocate(); #if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI) nds32_pci_init(); #endif /* IP Address */ gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); stdio_init(); /* get the devices list going. */ jumptable_init(); #if defined(CONFIG_API) /* Initialize API */ api_init(); #endif console_init_r(); /* fully init console as a device */ #if defined(CONFIG_ARCH_MISC_INIT) /* miscellaneous arch dependent initialisations */ arch_misc_init(); #endif #if defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r(); #endif #if defined(CONFIG_USE_IRQ) /* set up exceptions */ interrupt_init(); /* enable exceptions */ enable_interrupts(); #endif /* Initialize from environment */ load_addr = getenv_ulong("loadaddr", 16, load_addr); #if defined(CONFIG_CMD_NET) s = getenv("bootfile"); if (s != NULL) copy_filename(BootFile, s, sizeof(BootFile)); #endif #ifdef BOARD_LATE_INIT board_late_init(); #endif #if defined(CONFIG_CMD_NET) puts("Net: "); eth_initialize(gd->bd); #if defined(CONFIG_RESET_PHY_R) debug("Reset Ethernet PHY\n"); reset_phy(); #endif #endif /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) main_loop(); /* NOTREACHED - no way out of command loop except booting */ }
void attachInterrupt(uint8_t interruptNum, void (*userCallBackFunc)(void), int mode) { unsigned short crossbar_ioaddr; if(interruptNum >= EXTERNAL_NUM_INTERRUPTS) { printf("This interrupt%d has no one pin to use\n", interruptNum); return; } mc = PIN86[INTPINSMAP[interruptNum]].ENCMC; md = PIN86[INTPINSMAP[interruptNum]].ENCMD; if(PIN86[INTPINSMAP[interruptNum]].userfunc != NULL) return; if(interrupt_init() == false) return; mcmsif_init(); clear_INTSTATUS(); enable_MCINT(0xfc); // SIFB FAULT INT3/2/1 + STAT3/2/1 = 6 bits crossbar_ioaddr = sb_Read16(0x64)&0xfffe; mcsif_Disable(mc, md); io_DisableINT(); PIN86[INTPINSMAP[interruptNum]].userfunc = userCallBackFunc; io_RestoreINT(); switch (mode) { case LOW: sifSetPol[interruptNum%3](mc, md, MCPFAU_POL_INVERSE); sifSetMask[interruptNum%3](mc, md, MCPFAU_MASK_INACTIVE); sifSetRelease[interruptNum%3](mc, md, MCPFAU_FAURELS_FSTAT0); sifClearStat[interruptNum%3](mc, md); _usedMode[mc][interruptNum%3] = MCPFAU_CAP_LEVEL0; clear_INTSTATUS(); break; case HIGH: sifSetMask[interruptNum%3](mc, md, MCPFAU_MASK_INACTIVE); sifSetRelease[interruptNum%3](mc, md, MCPFAU_FAURELS_FSTAT0); sifClearStat[interruptNum%3](mc, md); _usedMode[mc][interruptNum%3] = MCPFAU_CAP_LEVEL1; clear_INTSTATUS(); break; case CHANGE: sifIntMode[interruptNum%3](mc, md, MCPFAU_CAP_BOTH); _usedMode[mc][interruptNum%3] = MCPFAU_CAP_BOTH; break; case FALLING: sifIntMode[interruptNum%3](mc, md, MCPFAU_CAP_1TO0); _usedMode[mc][interruptNum%3] = MCPFAU_CAP_1TO0; break; case RISING: sifIntMode[interruptNum%3](mc, md, MCPFAU_CAP_0TO1); _usedMode[mc][interruptNum%3] = MCPFAU_CAP_0TO1; break; default: printf("No support this mode\n"); return; } // switch crossbar to MCM_SIF_PIN io_outpb(crossbar_ioaddr + 0x90 + PIN86[INTPINSMAP[interruptNum]].gpN, 0x08);//RICH IO mcsif_Enable(mc, md); // If select level-trigger, switch the MASK to "NONE" after sif is enabled. switch (mode) { case LOW: case HIGH: sifSetMask[interruptNum%3](mc, md, MCPFAU_MASK_NONE); break; default: break; } }
void board_init_r(gd_t *id, ulong dest_addr) { char *s; //bd_t *bd; ulong malloc_start; #ifdef CONFIG_NONCACHE_MEMORY uint malloc_noncache_start; #endif #if !defined(CONFIG_SYS_NO_FLASH) ulong flash_size; #endif int workmode; int ret; gd = id; //bd = gd->bd; gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ monitor_flash_len = _end_ofs; malloc_start = dest_addr - TOTAL_MALLOC_LEN - sizeof(struct spare_boot_head_t); #ifdef CONFIG_NONCACHE_MEMORY_SIZE malloc_start &= (~(0x00100000 -1)); malloc_noncache_start = malloc_start - CONFIG_NONCACHE_MEMORY_SIZE; gd->malloc_noncache_start = malloc_noncache_start; #endif /* Enable caches */ enable_caches(); debug("monitor flash len: %08lX\n", monitor_flash_len); board_init(); /* Setup chipselects */ #ifdef CONFIG_SERIAL_MULTI serial_initialize(); #endif debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr); #ifdef CONFIG_LOGBUFFER logbuff_init_ptrs(); #endif #ifdef CONFIG_POST post_output_backlog(); #endif /* The Malloc area is immediately below the monitor copy in DRAM */ mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN); #ifdef CONFIG_NONCACHE_MEMORY mem_noncache_malloc_init(malloc_noncache_start, CONFIG_NONCACHE_MEMORY_SIZE); #endif workmode = uboot_spare_head.boot_data.work_mode; debug("work mode %d\n", workmode); axp_reinit(); //uboot_spare_head.boot_data.work_mode = WORK_MODE_CARD_PRODUCT; #ifdef CONFIG_ARCH_HOMELET gpio_control(); #endif #if 0 #if !defined(CONFIG_SYS_NO_FLASH) puts("Flash: "); flash_size = flash_init(); if (flash_size > 0) { # ifdef CONFIG_SYS_FLASH_CHECKSUM print_size(flash_size, ""); /* * Compute and print flash CRC if flashchecksum is set to 'y' * * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX */ s = getenv("flashchecksum"); if (s && (*s == 'y')) { printf(" CRC: %08X", crc32(0, (const unsigned char *) CONFIG_SYS_FLASH_BASE, flash_size)); } putc('\n'); # else /* !CONFIG_SYS_FLASH_CHECKSUM */ print_size(flash_size, "\n"); # endif /* CONFIG_SYS_FLASH_CHECKSUM */ } else { puts(failed); hang(); } #endif #endif /* set up exceptions */ interrupt_init(); /* enable exceptions */ enable_interrupts(); sunxi_dma_init(); #ifdef DEBUG puts("ready to config storage\n"); #endif if((workmode == WORK_MODE_BOOT) || (workmode == WORK_MODE_CARD_PRODUCT)) { #if (defined(CONFIG_SUNXI_DISPLAY) || defined(CONFIG_SUN7I_DISPLAY)) drv_disp_init(); #endif board_display_device_open(); board_display_layer_request(); } ret = sunxi_flash_handle_init(); if(!ret) { sunxi_partition_init(); } //#else //#if defined(CONFIG_CMD_NAND) // if(!storage_type){ // puts("NAND: "); // nand_init(); /* go init the NAND */ // } //#endif/*CONFIG_CMD_NAND*/ // //#if defined(CONFIG_GENERIC_MMC) // if(storage_type){ // puts("MMC: "); // mmc_initialize(bd); // } //#endif/*CONFIG_GENERIC_MMC*/ #ifdef CONFIG_HAS_DATAFLASH AT91F_DataflashInit(); dataflash_print_info(); #endif /* initialize environment */ env_relocate(); #if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI) arm_pci_init(); #endif /* IP Address */ gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); stdio_init(); /* get the devices list going. */ jumptable_init(); #if defined(CONFIG_API) /* Initialize API */ api_init(); #endif console_init_r(); /* fully init console as a device */ #if defined(CONFIG_ARCH_MISC_INIT) /* miscellaneous arch dependent initialisations */ arch_misc_init(); #endif #if defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r(); #endif /* Perform network card initialisation if necessary */ #if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96) /* XXX: this needs to be moved to board init */ if (getenv("ethaddr")) { uchar enetaddr[6]; eth_getenv_enetaddr("ethaddr", enetaddr); smc_set_mac_addr(enetaddr); } #endif /* CONFIG_DRIVER_SMC91111 || CONFIG_DRIVER_LAN91C96 */ /* Initialize from environment */ s = getenv("loadaddr"); if (s != NULL) load_addr = simple_strtoul(s, NULL, 16); #if defined(CONFIG_CMD_NET) s = getenv("bootfile"); if (s != NULL) copy_filename(BootFile, s, sizeof(BootFile)); #endif #ifdef BOARD_LATE_INIT board_late_init(); #endif #ifdef CONFIG_BITBANGMII bb_miiphy_init(); #endif #if defined(CONFIG_CMD_NET) #if defined(CONFIG_NET_MULTI) puts("Net: "); #endif eth_initialize(gd->bd); #if defined(CONFIG_RESET_PHY_R) debug("Reset Ethernet PHY\n"); reset_phy(); #endif #endif #ifdef CONFIG_POST post_run(NULL, POST_RAM | post_bootmode_get(0)); #endif #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER) /* * Export available size of memory for Linux, * taking into account the protected RAM at top of memory */ { ulong pram; uchar memsz[32]; #ifdef CONFIG_PRAM char *s; s = getenv("pram"); if (s != NULL) pram = simple_strtoul(s, NULL, 10); else pram = CONFIG_PRAM; #else pram = 0; #endif #ifdef CONFIG_LOGBUFFER #ifndef CONFIG_ALT_LB_ADDR /* Also take the logbuffer into account (pram is in kB) */ pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024; #endif #endif sprintf((char *)memsz, "%ldk", (gd->ram_size / 1024) - pram); setenv("mem", (char *)memsz); } #endif //sprite_cartoon_test(); if(workmode == WORK_MODE_BOOT) { #if defined(CONFIG_SUNXI_SCRIPT_REINIT) { FATFS script_mount; int ret; uint read_bytes = 0; FILE script_fs; uchar *buf = NULL; f_mount_ex(0, &script_mount, 0); ret = f_open (&script_fs, "0:script.bin", FA_OPEN_EXISTING | FA_READ | FA_WRITE ); if(ret) { printf("cant open script.bin, maybe it is not exist\n"); } else { buf = (uchar *)malloc(100 * 1024); memset(buf, 0, 100 * 1024); if(!f_read(&script_fs, buf, 100 * 1024, &read_bytes)) { printf("f_read read bytes = %d\n", read_bytes); } f_close(&script_fs); puts("try to unlink file "); printf("%d\n", f_unlink("0:script.bin")); } f_mount(0, NULL, NULL); if(read_bytes > 0) { char *tmp_target_buffer = (char *)(CONFIG_SYS_TEXT_BASE - 0x01000000); sunxi_flash_exit(1); memcpy(tmp_target_buffer + uboot_spare_head.boot_head.uboot_length, buf, read_bytes); sunxi_sprite_download_uboot(tmp_target_buffer, uboot_spare_head.boot_data.storage_type, 1); reset_cpu(0); } if(buf) { free(buf); } } #endif printf("WORK_MODE_BOOT\n"); #if (defined(CONFIG_SUNXI_DISPLAY) || defined(CONFIG_SUN7I_DISPLAY)) if(!ret) { #ifndef CONFIG_ARCH_HOMELET printf("board_status_probe\n"); board_status_probe(0); #endif if(!gd->chargemode) { printf("sunxi_bmp_logo_display\n"); sunxi_bmp_display("bootlogo.bmp"); } else { printf("sunxi_bmp_charger_display\n"); sunxi_bmp_display("bat\\battery_charge.bmp"); } } #endif } /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) { main_loop(); } hang(); /* NOTREACHED - no way out of command loop except booting */ }
/************************ Global *************************/ int main(int argc, char * argv[]) { char *platform_path = NULL; struct stat s; int err; // Install a signal handler // make ttyprintk at some point stdout = freopen("/tmp/log.txt", "w", stdout); if (stdout == NULL){ fprintf(stderr, "unable to remap stdout !\n"); exit(-1); } fflush(stdout); stderr = freopen("/tmp/log_er.txt", "w", stderr); if (stderr == NULL){ printf("Unable to remap stderr !\n"); exit(-1); } fflush(stderr); // Snapshot time counter if (timeInit() < 0) exit(-1); // debug for the user if (argc < 2){ fprintf(stderr, "./sketch tty0\n"); return -1; } printf("started with binary=%s Serial=%s\n", argv[0], argv[1]); fflush(stdout); // check if we're running on the correct platform // and refuse to run if no match platform_path = (char *)malloc(sizeof(PLATFORM_NAME_PATH) + sizeof(PLATFORM_NAME)); sprintf(platform_path,"%s%s", PLATFORM_NAME_PATH, PLATFORM_NAME); printf("checking platform_path [%s]\n", platform_path); fflush(stdout); err = stat(platform_path, &s); if(err != 0) { fprintf(stderr, "stat failed checking for %s with error code %d\n", PLATFORM_NAME, err); free(platform_path); return -1; } if(!S_ISDIR(s.st_mode)) { /* exists but is no dir */ fprintf(stderr, "Target board not a %s\n", PLATFORM_NAME); free(platform_path); return -1; } printf("Running on a %s platform (%s)\n", PLATFORM_NAME, platform_path); fflush(stdout); free(platform_path); // TODO: derive trace level and optional IP from command line trace_init(VARIANT_TRACE_LEVEL, 0); trace_target_enable(TRACE_TARGET_UART); // Call Arduino init init(argc, argv); // Init IRQ layer // Called after init() to ensure I/O permissions inherited by pthread interrupt_init(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); //if (serialEventRun) serialEventRun(); } return 0; }
void board_init_r(gd_t *id, ulong dest_addr) { ulong malloc_start; #if !defined(CONFIG_SYS_NO_FLASH) ulong flash_size; #endif gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r"); monitor_flash_len = _end_ofs; /* Enable caches */ enable_caches(); debug("monitor flash len: %08lX\n", monitor_flash_len); board_init(); /* Setup chipselects */ /* * TODO: printing of the clock inforamtion of the board is now * implemented as part of bdinfo command. Currently only support for * davinci SOC's is added. Remove this check once all the board * implement this. */ #ifdef CONFIG_CLOCKS set_cpu_clk_info(); /* Setup clock information */ #endif serial_initialize(); debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr); #ifdef CONFIG_LOGBUFFER logbuff_init_ptrs(); #endif #ifdef CONFIG_POST post_output_backlog(); #endif /* The Malloc area is immediately below the monitor copy in DRAM */ malloc_start = dest_addr - TOTAL_MALLOC_LEN; mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN); #ifdef CONFIG_ARCH_EARLY_INIT_R arch_early_init_r(); #endif power_init_board(); #if !defined(CONFIG_SYS_NO_FLASH) puts("Flash: "); flash_size = flash_init(); if (flash_size > 0) { # ifdef CONFIG_SYS_FLASH_CHECKSUM print_size(flash_size, ""); /* * Compute and print flash CRC if flashchecksum is set to 'y' * * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX */ if (getenv_yesno("flashchecksum") == 1) { printf(" CRC: %08X", crc32(0, (const unsigned char *) CONFIG_SYS_FLASH_BASE, flash_size)); } putc('\n'); # else /* !CONFIG_SYS_FLASH_CHECKSUM */ print_size(flash_size, "\n"); # endif /* CONFIG_SYS_FLASH_CHECKSUM */ } else { puts(failed); hang(); } #endif #if defined(CONFIG_CMD_NAND) puts("NAND: "); nand_init(); /* go init the NAND */ #endif #if defined(CONFIG_CMD_ONENAND) onenand_init(); #endif #ifdef CONFIG_GENERIC_MMC puts("MMC: "); mmc_initialize(gd->bd); #endif #ifdef CONFIG_HAS_DATAFLASH AT91F_DataflashInit(); dataflash_print_info(); #endif /* initialize environment */ if (should_load_env()) env_relocate(); else set_default_env(NULL); #if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI) arm_pci_init(); #endif stdio_init(); /* get the devices list going. */ jumptable_init(); #if defined(CONFIG_API) /* Initialize API */ api_init(); #endif console_init_r(); /* fully init console as a device */ #ifdef CONFIG_DISPLAY_BOARDINFO_LATE # ifdef CONFIG_OF_CONTROL /* Put this here so it appears on the LCD, now it is ready */ display_fdt_model(gd->fdt_blob); # else checkboard(); # endif #endif #if defined(CONFIG_ARCH_MISC_INIT) /* miscellaneous arch dependent initialisations */ arch_misc_init(); #endif #if defined(CONFIG_MISC_INIT_R) /* miscellaneous platform dependent initialisations */ misc_init_r(); #endif /* set up exceptions */ interrupt_init(); /* enable exceptions */ enable_interrupts(); /* Initialize from environment */ load_addr = getenv_ulong("loadaddr", 16, load_addr); #ifdef CONFIG_BOARD_LATE_INIT board_late_init(); #endif #ifdef CONFIG_BITBANGMII bb_miiphy_init(); #endif #if defined(CONFIG_CMD_NET) puts("Net: "); eth_initialize(gd->bd); #if defined(CONFIG_RESET_PHY_R) debug("Reset Ethernet PHY\n"); reset_phy(); #endif #endif #ifdef CONFIG_POST post_run(NULL, POST_RAM | post_bootmode_get(0)); #endif #if defined(CONFIG_K2HK_EVM) || defined(CONFIG_K2E_EVM) || \ defined(CONFIG_K2L_EVM) ks2_post(); #endif #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER) /* * Export available size of memory for Linux, * taking into account the protected RAM at top of memory */ { ulong pram = 0; uchar memsz[32]; #ifdef CONFIG_PRAM pram = getenv_ulong("pram", 10, CONFIG_PRAM); #endif #ifdef CONFIG_LOGBUFFER #ifndef CONFIG_ALT_LB_ADDR /* Also take the logbuffer into account (pram is in kB) */ pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024; #endif #endif sprintf((char *)memsz, "%ldk", (gd->ram_size / 1024) - pram); setenv("mem", (char *)memsz); } #endif /* main_loop() can return to retry autoboot, if so just run it again. */ for (;;) { main_loop(); } /* NOTREACHED - no way out of command loop except booting */ }