void setup_tags(void *mem){ setup_core_tag(mem, 4096); /* standard core tag 4k pagesize */ setup_mem_tag(0xa0000000, 0x04000000); /* 64Mb at 0xa0000000 */ setup_mem_tag(0xc0000000, 0x04000000); /* 64Mb at 0xc0000000 */ //setup_cmdline_tag("root=31:0 rootfstype=jffs2 rootdelay=3 rw init=/sbin/init"); //root on flash setup_cmdline_tag("root=179:2 rootdelay=3 rw init=/sbin/init"); //root on mmc/sd card setup_end_tag(); /* end of tags */ }
static void setup_tags(uint32_t *parameters) { setup_core_tag(parameters, 4096); /* standard core tag 4k pagesize */ setup_mem_tag(DRAM_BASE, 0x1FFFFFFF); /* 512MB at 0x20000000, only DMC0 is connected in Tiny210 board */ setup_ramdisk_tag(8192); /* create 8Mb ramdisk */ setup_initrd2_tag(INITRD_LOAD_ADDRESS, 0x100000); /* 1Mb of compressed data placed 8Mb into memory */ setup_cmdline_tag("root=/dev/ram0"); /* commandline setting root device */ setup_end_tag(); /* end of tags */ }
static int bt_atag_cmdline(BT_HANDLE hShell, int argc, char **argv) { BT_HANDLE hStdout = BT_ShellGetStdout(hShell); if(argc != 2) { bt_fprintf(hStdout, "Usage: %s \"[kernel command line]\"\n", argv[0]); return -1; } setup_cmdline_tag(argv[1]); return 0; }
void boot_linux() { //1. 获取Linux启动地址 theKernel = (void (*)(int , int , unsigned int ))SDRAM_KERNEL_START; //2. 设置启动参数 //2.1 设置核心启动参数 setup_core_tag(); //2.2 设置内存参数 setup_mem_tag(); //2.3 设置命令行参数 setup_cmdline_tag(); //2.4 设置参数结束标志 setup_end_tag(); //3. 启动Linux系统 theKernel(0,168,SDRAM_TAGS_START); }
/** * Set up tags for arm kernel in booting dual Linux kernels. */ void setup_arm_tags(void *jump_addr, const char *cmdline, u32 mem_base, u32 mem_size, u32 initrd2_start, u32 initrd2_size, int verbose) { u32 atag_data_size = 4096; #if defined(AMBARELLA_LINUX_LAYOUT) u32 kernelp, kernels; u32 bsbp, bsbs; u32 dspp, dsps; #endif if (((u32)jump_addr) > (DRAM_START_ADDR + 0x00200000)) { /* Special handling for OS allocated in higer memory region */ mem_base = ((u32)jump_addr) & 0xfff00000; mem_size -= (mem_base - DRAM_START_ADDR); atag_data = (void *)mem_base; } else { atag_data = (void *)(DRAM_START_ADDR + 0x000c0000); } memzero(atag_data, atag_data_size); setup_core_tag(atag_data, atag_data_size); if (verbose) { putstr("atag_data: 0x"); puthex((u32)atag_data); putstr("\r\n"); } #if defined(AMBARELLA_LINUX_LAYOUT) ambarella_linux_arm_mem_layout(&kernelp, &kernels, &bsbp, &bsbs, &dspp, &dsps); if (verbose) { putstr("kernelp: 0x"); puthex(kernelp); putstr(" kernels: 0x"); puthex(kernels); putstr("\r\n"); putstr("bsbp: 0x"); puthex(bsbp); putstr(" bsbs: 0x"); puthex(bsbs); putstr("\r\n"); putstr("dspp: 0x"); puthex(dspp); putstr(" dsps: 0x"); puthex(dsps); putstr("\r\n"); } setup_mem_tag(ATAG_MEM, kernelp, kernels); setup_mem_tag(ATAG_AMBARELLA_BSB, bsbp, bsbs); setup_mem_tag(ATAG_AMBARELLA_DSP, dspp, dsps); setup_tag_revision(AMBOOT_BOARD_ID); if (verbose) { putstr("AMBOOT_BOARD_ID: 0x"); puthex(AMBOOT_BOARD_ID); putstr("\r\n"); } #else setup_mem_tag(ATAG_MEM, mem_base, mem_size); #endif if (initrd2_start != 0x0 && initrd2_size != 0x0) { setup_initrd_tag(initrd2_start, initrd2_size); if (verbose) { putstr("initrd: 0x"); puthex(initrd2_start); putstr(" size: 0x"); puthex(initrd2_size); putstr("\r\n"); } } if (ambarella_bapi_arm_atag_entry) ambarella_bapi_arm_atag_entry(verbose); if (cmdline != NULL&& cmdline[0] != '\0') { setup_cmdline_tag(cmdline); if (verbose) { putstr(cmdline); putstr("\r\n"); } } setup_end_tag(); clean_d_cache(atag_data, atag_data_size); }
/** * Set up tags for booting Linux kernel. */ void setup_tags(void *jump_addr, const char *cmdline, u32 mem_base, u32 mem_size, u32 initrd2_start, u32 initrd2_size, int verbose) { u32 atag_data_size = 4096; #if defined(AMBARELLA_LINUX_LAYOUT) int block_size; flpart_table_t ptb; u32 low, high; u32 kernelp, kernels; u32 bsbp, bsbs; u32 dspp, dsps; #endif if (((u32)jump_addr) > (DRAM_START_ADDR + 0x00200000)) { /* Special handling for OS allocated in higer memory region */ mem_base = ((u32)jump_addr) & 0xfff00000; mem_size -= (mem_base - DRAM_START_ADDR); atag_data = (void *)mem_base; } else { atag_data = (void *)(DRAM_START_ADDR + 0x000c0000); } memzero(atag_data, atag_data_size); setup_core_tag(atag_data, atag_data_size); if (verbose) { putstr("atag_data: 0x"); puthex((u32)atag_data); putstr("\r\n"); } #if defined(AMBARELLA_LINUX_LAYOUT) ambarella_linux_mem_layout(&kernelp, &kernels, &bsbp, &bsbs, &dspp, &dsps); bsbp = ARM11_TO_CORTEX(bsbp); dspp = ARM11_TO_CORTEX(dspp); kernelp = ARM11_TO_CORTEX(kernelp); if (verbose) { putstr("kernelp: 0x"); puthex(kernelp); putstr(" kernels: 0x"); puthex(kernels); putstr("\r\n"); putstr("bsbp: 0x"); puthex(bsbp); putstr(" bsbs: 0x"); puthex(bsbs); putstr("\r\n"); putstr("dspp: 0x"); puthex(dspp); putstr(" dsps: 0x"); puthex(dsps); putstr("\r\n"); } setup_mem_tag(ATAG_MEM, kernelp, kernels); setup_mem_tag(ATAG_AMBARELLA_BSB, bsbp, bsbs); setup_mem_tag(ATAG_AMBARELLA_DSP, dspp, dsps); setup_tag_revision(AMBOOT_BOARD_ID); if (verbose) { putstr("AMBOOT_BOARD_ID: 0x"); puthex(AMBOOT_BOARD_ID); putstr("\r\n"); } if (flprog_get_part_table(&ptb) >= 0) { high = ptb.dev.eth[0].mac[5]; high <<= 8; high |= ptb.dev.eth[0].mac[4]; low = ptb.dev.eth[0].mac[3]; low <<= 8; low |= ptb.dev.eth[0].mac[2]; low <<= 8; low |= ptb.dev.eth[0].mac[1]; low <<= 8; low |= ptb.dev.eth[0].mac[0]; setup_serialnr_tag(ATAG_AMBARELLA_ETH0, low, high); if (verbose) { putstr("ATAG_AMBARELLA_ETH0: 0x"); puthex(high); putstr(" 0x"); puthex(low); putstr("\r\n"); } high = ptb.dev.eth[1].mac[5]; high <<= 8; high |= ptb.dev.eth[1].mac[4]; low = ptb.dev.eth[1].mac[3]; low <<= 8; low |= ptb.dev.eth[1].mac[2]; low <<= 8; low |= ptb.dev.eth[1].mac[1]; low <<= 8; low |= ptb.dev.eth[1].mac[0]; setup_serialnr_tag(ATAG_AMBARELLA_ETH1, low, high); if (verbose) { putstr("ATAG_AMBARELLA_ETH1: 0x"); puthex(high); putstr(" 0x"); puthex(low); putstr("\r\n"); } high = ptb.dev.wifi[0].mac[5]; high <<= 8; high |= ptb.dev.wifi[0].mac[4]; low = ptb.dev.wifi[0].mac[3]; low <<= 8; low |= ptb.dev.wifi[0].mac[2]; low <<= 8; low |= ptb.dev.wifi[0].mac[1]; low <<= 8; low |= ptb.dev.wifi[0].mac[0]; setup_serialnr_tag(ATAG_AMBARELLA_WIFI0, low, high); if (verbose) { putstr("ATAG_AMBARELLA_WIFI0: 0x"); puthex(high); putstr(" 0x"); puthex(low); putstr("\r\n"); } /*Updating with the fldev_t struct*/ high = ptb.dev.wifi[1].mac[5]; high <<= 8; high |= ptb.dev.wifi[1].mac[4]; low = ptb.dev.wifi[1].mac[3]; low <<= 8; low |= ptb.dev.wifi[1].mac[2]; low <<= 8; low |= ptb.dev.wifi[1].mac[1]; low <<= 8; low |= ptb.dev.wifi[1].mac[0]; setup_serialnr_tag(ATAG_AMBARELLA_WIFI1, low, high); if (verbose) { putstr("ATAG_AMBARELLA_WIFI1: 0x"); puthex(high); putstr(" 0x"); puthex(low); putstr("\r\n"); } high = ptb.dev.usb_eth[0].mac[5]; high <<= 8; high |= ptb.dev.usb_eth[0].mac[4]; low = ptb.dev.usb_eth[0].mac[3]; low <<= 8; low |= ptb.dev.usb_eth[0].mac[2]; low <<= 8; low |= ptb.dev.usb_eth[0].mac[1]; low <<= 8; low |= ptb.dev.usb_eth[0].mac[0]; setup_serialnr_tag(ATAG_AMBARELLA_USB_ETH0, low, high); if (verbose) { putstr("ATAG_AMBARELLA_USB_ETH0: 0x"); puthex(high); putstr(" 0x"); puthex(low); putstr("\r\n"); } high = ptb.dev.usb_eth[1].mac[5]; high <<= 8; high |= ptb.dev.usb_eth[1].mac[4]; low = ptb.dev.usb_eth[1].mac[3]; low <<= 8; low |= ptb.dev.usb_eth[1].mac[2]; low <<= 8; low |= ptb.dev.usb_eth[1].mac[1]; low <<= 8; low |= ptb.dev.usb_eth[1].mac[0]; setup_serialnr_tag(ATAG_AMBARELLA_USB_ETH1, low, high); if (verbose) { putstr("ATAG_AMBARELLA_USB_ETH1: 0x"); puthex(high); putstr(" 0x"); puthex(low); putstr("\r\n"); } /* updating with the fldev_t struct end*/ #if (USE_HAL == 1) setup_hal_tag(ARM11_TO_CORTEX(ptb.part[PART_HAL].mem_addr), ptb.part[PART_HAL].img_len, HAL_BASE_VIRT); if (verbose) { putstr("HAL: 0x"); puthex(HAL_BASE_VIRT); putstr(" [0x"); puthex(ARM11_TO_CORTEX(ptb.part[PART_HAL].mem_addr)); putstr("] size: 0x"); puthex(ptb.part[PART_HAL].img_len); putstr("\r\n"); } #endif } #if (defined(ENABLE_FLASH) && !defined(CONFIG_NAND_NONE)) block_size = flnand.main_size * flnand.pages_per_block; setup_serialnr_tag(ATAG_AMBARELLA_NAND_CS, flnand.control, block_size); setup_serialnr_tag(ATAG_AMBARELLA_NAND_T0, flnand.nandtiming0, flnand.nandtiming1); setup_serialnr_tag(ATAG_AMBARELLA_NAND_T1, flnand.nandtiming2, flnand.nandtiming3); setup_serialnr_tag(ATAG_AMBARELLA_NAND_T2, flnand.nandtiming4, flnand.nandtiming5); setup_serialnr_tag(ATAG_AMBARELLA_NAND_ECC, flnand.ecc_bits, 0); if (verbose) { putstr("NAND control: 0x"); puthex(flnand.control); putstr(" block_size: 0x"); puthex(block_size); putstr("\r\n"); putstr("timing0: 0x"); puthex(flnand.timing0); putstr(" timing1: 0x"); puthex(flnand.timing1); putstr("\r\n"); putstr("timing2: 0x"); puthex(flnand.timing2); putstr(" timing3: 0x"); puthex(flnand.timing3); putstr("\r\n"); putstr("timing4: 0x"); puthex(flnand.timing4); putstr(" timing5: 0x"); puthex(flnand.timing5); putstr(" ecc bit: 0x"); puthex(flnand.ecc_bits); putstr("\r\n"); } #endif #else setup_mem_tag(ATAG_MEM, mem_base, mem_size); #endif if (initrd2_start != 0x0 && initrd2_size != 0x0) { setup_initrd_tag(ARM11_TO_CORTEX(initrd2_start), initrd2_size); if (verbose) { putstr("initrd: 0x"); puthex(ARM11_TO_CORTEX(initrd2_start)); putstr(" size: 0x"); puthex(initrd2_size); putstr("\r\n"); } } if (ambarella_bapi_atag_entry) ambarella_bapi_atag_entry(verbose); if (ambarella_cortex_atag_entry) ambarella_cortex_atag_entry(verbose); if (cmdline != NULL&& cmdline[0] != '\0') { setup_cmdline_tag(cmdline); if (verbose) { putstr(cmdline); putstr("\r\n"); } } setup_end_tag(); clean_d_cache(atag_data, atag_data_size); }
int main(runMode_t mode) { void* kernelImage = L"/e/zImage"; char* cmdlnRM = "bootmode=2 loglevel=4"; char* cmdlnBG = "bootmode=10 loglevel=4"; char* cmdln = "loglevel=4"; unsigned char ATAG_buf[512]={0}; t_stat filestat; fun_t kernel; int fd; unsigned long kernelSize=0; //here we start the real deal :) int mmuctrl = MemMMUCacheEnable(gMMUL1PageTable, 1); disp_FOTA_Init(); disp_FOTA_Printf("*----------------------------*"); disp_FOTA_Printf("| Booting Android |"); disp_FOTA_Printf("*----------------------------*"); //there was a ascii art forgatted it on other pc disp_FOTA_Printf("| |"); disp_FOTA_Printf("*----------------------------*"); disp_FOTA_Printf(""); //.... Your code here... __PfsNandInit(); __PfsMassInit(); MemoryCardMount(); tfs4_stat(kernelImage, &filestat); kernelSize = filestat.st_size; if ((fd=tfs4_open(kernelImage, 4)) >= 0) { tfs4_read(fd, &KERNEL_BUF, kernelSize); tfs4_close(fd); } if (kernelSize <= 0) { disp_FOTA_Printf("Kernel Not Found"); } DisableMmuCache(mmuctrl); _CoDisableMmu(); setup_core_tag(ATAG_buf); setup_serial_tag(0x123, 0x456); setup_rev_tag('0'); if(mode == rm_BIGMEM) { setup_cmdline_tag(cmdlnBG); disp_FOTA_Printf("Bigmem mode"); DRV_Modem_BootingStart(); } if(mode == rm_FPFK) { disp_FOTA_Printf("Under Maintise :D"); } if(mode == rm_FOTA_RECOVERY) { setup_cmdline_tag(cmdlnRM); disp_FOTA_Printf("recovery mode Activated"); } else { setup_cmdline_tag(cmdln); DRV_Modem_BootingStart(); } setup_end_tag(); //copy kernel to the right position memcpy(&KERNEL_START, &KERNEL_BUF, kernelSize); //SYSCON operations *((unsigned int*)SYSCON_NORMAL_CFG) = 0xFFFFFFFF; _CoDisableDCache(); _System_DisableVIC(); _System_DisableIRQ(); _System_DisableFIQ(); kernel = (fun_t)&KERNEL_START; kernel(0, 8500, ATAG_buf); //loop forever while(1); return 0; }