Example #1
0
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 */
}
Example #2
0
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 */
}
Example #3
0
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;
}
Example #4
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);
}
Example #5
0
/**
 * 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);
}
Example #6
0
/**
 * 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;

}