u-boot2011.09 启动流程记录

  • start

    arch/arm/cpu/armv7/start.S
     36 .globl _start
     37 _start: b   reset

    136 reset:
    137     bl  save_boot_params
    138     /*
    139      * set the cpu to SVC32 mode
    140      */
    141     mrs r0, cpsr
    142     bic r0, r0, #0x1f
    143     orr r0, r0, #0xd3
    144     msr cpsr,r0

    206 call_board_init_f:
    207     ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
    208     bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
    209     ldr r0,=0x00000000
    210     bl  board_init_f   //  ----> 前置初始化 SPL  

    321 #ifndef CONFIG_SYS_ICACHE_OFF
    322     mcr p15, 0, r0, c7, c5, 0   @ invalidate icache
    323     mcr     p15, 0, r0, c7, c10, 4  @ DSB
    324     mcr     p15, 0, r0, c7, c5, 4   @ ISB
    325 #endif
    326     ldr r0, _board_init_r_ofs
    327     adr r1, _start
    328     add lr, r0, r1
    329     add lr, lr, r9
    330     /* setup parameters for board_init_r */
    331     mov r0, r5      /* gd_t */
    332     mov r1, r6      /* dest_addr */
    333     /* jump to it ... */
    334     mov pc, lr
    335 
    336 _board_init_r_ofs:
    337     .word board_init_r - _start  // 后置初始化, u-boot.img
  • board_init_f

    264 void board_init_f(ulong bootflag)
    265 {
            // ... ...
    281     for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
    282         if ((*init_fnc_ptr)() != 0) {
    283             hang ();
    284         }
    285     }
            // ... ..

    235 init_fnc_t *init_sequence[] = {
    236 #if defined(CONFIG_ARCH_CPU_INIT)
    237     arch_cpu_init,      /* basic arch cpu dependent setup */
    238 #endif
    239 #if defined(CONFIG_BOARD_EARLY_INIT_F)
    240     board_early_init_f,
    241 #endif
    242     timer_init,     /* initialize timer */
    243 #ifdef CONFIG_FSL_ESDHC
    244     get_clocks,
    245 #endif
    246     env_init,       /* initialize environment */
    247     init_baudrate,      /* initialze baudrate settings */
    248     serial_init,        /* serial communications setup */
    249     console_init_f,     /* stage 1 init of console */
    250     display_banner,     /* say that we are here */
    251 #if defined(CONFIG_DISPLAY_CPUINFO)
    252     print_cpuinfo,      /* display cpu info (and speed) */
    253 #endif
    254 #if defined(CONFIG_DISPLAY_BOARDINFO)
    255     checkboard,     /* display board info */
    256 #endif
    257 #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
    258     init_func_i2c,
    259 #endif
    260     dram_init,      /* configure available RAM banks */
    261     NULL,
    262 };
    
    //  board/aplex/ecm_5410.c
     98 int dram_init(void)
     99 {
    100     gd->ram_size = PHYS_DRAM_1_SIZE;
    101 
    102     return 0;
    103 }
  • board_init_r

    // arch/arm/lib/board.c
    443 void board_init_r(gd_t *id, ulong dest_addr)
    444 {
        // ... ...
    464     board_init();   /* Setup chipselects */     // i2c, pinmux  gpmc init
    // ... ...
    523 #if defined(CONFIG_CMD_NAND)
    524     puts("NAND :  ");
    525     nand_init();        /* go init the NAND */
    526 #endif
    // ... ...  

    //  drivers/mtd/nand/ti81xx_nand.c
    864 int board_nand_init(struct nand_chip *nand)
    865 {
    867     cs = 0;
    876     while (cs < GPMC_MAX_CS) {
    877         /* Check if NAND type is set */
    878         if ((readl(&gpmc_cfg->cs[cs].config1) & 0xC00) == 0x800) {
    879             /* Found it!! */
    880 #ifdef NAND_DEBUG
    881             printf("Searching for NAND device @ GPMC CS:%1d
", cs);
    882 #endif  
    883             break;
    884         }
    885         cs++;
    886     }   
    887     if (cs >= GPMC_MAX_CS) {
    888         printf("NAND: Unable to find NAND settings in "
    889             "GPMC Configuration - quitting
");
    890         return -ENODEV;
    891     }
    892         
    893     nand->IO_ADDR_R = (void __iomem *)&gpmc_cfg->cs[cs].nand_dat;
    894     nand->IO_ADDR_W = (void __iomem *)&gpmc_cfg->cs[cs].nand_cmd;
    895     
    896     nand->cmd_ctrl = ti81xx_nand_hwcontrol;
    897     nand->options = NAND_NO_PADDING | NAND_CACHEPRG | NAND_NO_AUTOINCR;
    898     /* If we are 16 bit dev, our gpmc config tells us that */
    899     if ((readl(&gpmc_cfg->cs[cs].config1) & 0x3000) == 0x1000) {
    900         nand->options |= NAND_BUSWIDTH_16;
    901     }
    902     
    903     nand->chip_delay = 100;
    904 
    905     /* required in case of BCH */
    906     elm_init();
    907 
    908     /* BCH info that will be correct for SPL or overridden otherwise. */
    909     nand->priv = &bch_priv;
    910 
    911 #ifndef CONFIG_SPL_BUILD
    912     /* For undocumented reasons we need to currently keep our environment
    913      * in 1-bit ECC so we configure ourself thusly. */
    914     nand_curr_device = 0;
    915     ti81xx_nand_switch_ecc(NAND_ECC_HW, 0);
    916 #else
    917     /* The NAND chip present requires that we have written data in with
    918      * at least 4-bit ECC so we configure outself for that in SPL.
    919      */
    920     nand->ecc.mode = NAND_ECC_HW_SYNDROME;
    921     nand->ecc.layout = &hw_bch8_nand_oob;
    922     nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
    923     nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
    924     nand->ecc.steps = CONFIG_SYS_NAND_ECCSTEPS;
    925     nand->ecc.total = CONFIG_SYS_NAND_ECCTOTAL;
    926     nand->ecc.hwctl = ti81xx_enable_ecc_bch;
    927     nand->ecc.correct = ti81xx_correct_data_bch;
    928     nand->ecc.calculate = ti81xx_calculate_ecc_bch;
    929 
    930     if (nand->options & NAND_BUSWIDTH_16)
    931         nand->read_buf = nand_read_buf16;
    932     else
    933         nand->read_buf = nand_read_buf;
    934     nand->dev_ready = ti81xx_spl_dev_ready;
    935 
    936     ti81xx_hwecc_init_bch(nand, NAND_ECC_READ);
    937 #endif
    938 
    939     return 0;
    940 }
原文地址:https://www.cnblogs.com/chenfulin5/p/8065671.html