我的uboot之路(3)start

来源:互联网 发布:手机淘宝换手机登录 编辑:程序博客网 时间:2024/04/28 14:32

    关于start.s的解析,网上的资料太多了,我就不在意义介绍,这里介绍重要细节:

    (1)   

.global _end_vect_end_vect:.balignl 16,0xdeadbeef
     首先.balignl是伪指令,它的意思是:以当前地址为开始然后,找到第一地址为16的倍数的地址然后存放0xdeadbeef,16的倍数既是至少4字节倍数,这样偏移4个字节地址之后存放参数0xdeadbeef,而0xdeadbeef只是一个标志,我们看system.Map:

         cc800010 T _start         cc800030 t _undefined_instruction         cc800034 t _software_interrupt         cc800038 t _prefetch_abort         cc80003c t _data_abort         cc800040 t _not_used         cc800044 t _irq         cc800048 t _fiq         cc80004c t _pad         cc800050 T _end_vect
    很明白这是为了保证前面的异常向量表预留的,每个都是4字节;

    (2)

        /* Read booting information */        ldrr0, =PRO_ID_BASE //0xE0000000        ldrr1, [r0,#OMR_OFFSET] //0x04        bicr2, r1, #0xffffffc1        /* NAND BOOT */cmpr2, #0x0@ 512B 4-cyclemoveqr3, #BOOT_NANDcmpr2, #0x2@ 2KB 5-cyclemoveqr3, #BOOT_NANDcmpr2, #0x4@ 4KB 5-cycle8-bit ECCmoveqr3, #BOOT_NANDcmpr2, #0x6@ 4KB 5-cycle16-bit ECCmoveqr3, #BOOT_NANDcmpr2, #0x8@ OneNAND Muxmoveqr3, #BOOT_ONENAND
       这段代码就是通过读取OM脚的配置状态并判断是哪种方式启动,nand也按照页大小,校验位等区分;   
nand_boot:movr0, #0x1000blcopy_from_nandbafter_copy
      然后就在flash中去copy代码:
.globl copy_from_nandcopy_from_nand:push{lr}/* save return address */movr9, r0movr9, #0x100/* Compare about 8KB */blcopy_uboot_to_ramtst r0, #0x0bnecopy_failed

        cpu/s5pc11x/nand_cp.c:按照一页一页复制到0x20000000 + 0xc800000(200M BL2)这就是在实际内存DRAM 0中,这个板子用到是这颗flash:MT29F8G08ABABAWP 512MB大小,2048个block,每个block有128页,每页2k大小可以看出 start.s主要做的工作就是ARM初始化 lowlevel_init 下节分析。把nandflah中的代码读到DRAM,设置堆栈和初始化BSS段。通过ldr pc, _start_armboot 跳转到SDRAM中执行C代码 start_armboot;

(3)start_armboot

       这个函数在/lib_arm/board.c文件里:

      下买你是这个函数的精简版:     

void start_armboot (void){ulong gd_base;gd_base = CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE - sizeof(gd_t);gd = (gd_t*)gd_base;/* compiler optimization barrier needed for GCC >= 3.4 */__asm__ __volatile__("": : :"memory");memset ((void*)gd, 0, sizeof (gd_t));gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));memset (gd->bd, 0, sizeof (bd_t));monitor_flash_len = _bss_start - _armboot_start;for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {if ((*init_fnc_ptr)() != 0) {hang ();}}#ifndef CFG_NO_FLASH/* configure available FLASH banks */size = flash_init ();display_flash_config (size);#endif /* CFG_NO_FLASH */mem_malloc_init (CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE);#if defined(CONFIG_SMDKC110)#if defined(CONFIG_GENERIC_MMC)puts ("SD/MMC:  ");mmc_exist = mmc_initialize(gd->bd);if (mmc_exist != 0){puts ("0 MB\n");}#endif#if defined(CONFIG_CMD_NAND)puts("NAND:    ");nand_init();#endif#endif /* CONFIG_SMDKC110 */env_relocate ();/* initialize environment */gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");/* IP Address *//* MAC Address */{int i;ulong reg;char *s, *e;char tmp[64];i = getenv_r ("ethaddr", tmp, sizeof (tmp));s = (i > 0) ? tmp : NULL;for (reg = 0; reg < 6; ++reg) {gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;if (s)s = (*e) ? e + 1 : e;}}devices_init ();/* get the devices list going. */jumptable_init ();console_init_r ();/* fully init console as a device */enable_interrupts ();/* enable exceptions */if ((s = getenv ("loadaddr")) != NULL) {load_addr = simple_strtoul (s, NULL, 16);}#ifdef BOARD_LATE_INITboard_late_init ();#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 */}






0 0
原创粉丝点击