am335x-uboot-2014.10移植

来源:互联网 发布:淘宝店设计装修多少钱 编辑:程序博客网 时间:2024/05/29 14:17

移植基于am335x evm 板子的
参考文章:
am335x学习笔记-uboot-2014.10
注意几个文件
board/ti/am335x/u-boot.lds
arch/arm/cpu/armv7/am33xx/u-boot-spl.lds
include/configs/ti_am335x_common.h
include/configs/ti_armv7_common.h
include/configs/am335x_evm.h
arch/arm/include/asm/arch/omap.h

SPL目录下u-boot-spl.map u-boot-spl
arm-linux-objdump -d u-boot-spl > SPL //重定向到文件中,反汇编文件,根据反汇编文件和map文件界定函数的位置

//arch/arm/cpu/armv7/start.S#ifndef CONFIG_SKIP_LOWLEVEL_INIT    bl  cpu_init_cp15    bl  cpu_init_crit#endif    bl  _main
//include/configs/ti_am335x_common.h#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_NOR_BOOT)#define CONFIG_SKIP_LOWLEVEL_INIT#endif

SPL 阶段 CONFIG_SKIP_LOWLEVEL_INIT 没有定义
cpu_init_cp15: 协处理器的有关配置,这里不讨论。
cpu_init_crit: bl lowlevel_init

//arch/arm/cpu/armv7/lowlevel_init.SENTRY(lowlevel_init)    ldr sp, =CONFIG_SYS_INIT_SP_ADDR    bic sp, sp, #7 /* 8-byte alignment for ABIcompliance */#ifdef CONFIG_SPL_BUILD    ldr r9, =gdata#else    sub sp, sp, #GD_SIZE    bic sp, sp, #7    mov r9, sp#endif    push    {ip, lr}    bl  s_init    pop {ip, pc}ENDPROC(lowlevel_init)
//include/configs/ti_armv7_common.h#define CONFIG_SYS_INIT_SP_ADDR         (NON_SECURE_SRAM_END - \                        GENERATED_GBL_DATA_SIZE)//arch/arm/include/asm/arch/omap.h#ifdef CONFIG_AM33XX#define NON_SECURE_SRAM_START   0x402F0400#define NON_SECURE_SRAM_END 0x40310000#define SRAM_SCRATCH_SPACE_ADDR 0x4030B800#endif//include/generated/generic-asm-offsets.h#define GENERATED_GBL_DATA_SIZE 192  #define GD_SIZE 184
//arch/arm/cpu/armv7/am33xx/board.cvoid s_init(void){#ifdef CONFIG_NOR_BOOT //undefine    enable_norboot_pin_mux();#endif#ifdef CONFIG_SPL_BUILD    save_omap_boot_params();#endif    watchdog_disable();//cpudir/am33xx/board.c    timer_init();    //enable uart0 pin mux    set_uart_mux_conf();//cpudir/arch_timer.c    setup_clocks_for_console();//cpudir/am33xx/clock_am33xx.c    uart_soft_reset();#if defined(CONFIG_NOR_BOOT) || defined(CONFIG_QSPI_BOOT)    gd->baudrate = CONFIG_BAUDRATE;    serial_init();    gd->have_console = 1;#elif defined(CONFIG_SPL_BUILD)    gd = &gdata;    //uart init    preloader_console_init();//common/spl/spl.c#endif#if defined(CONFIG_SPL_AM33XX_ENABLE_RTC32K_OSC)    /* Enable RTC32K clock */    rtc32k_enable();//cpudir/am33xx/board.c#endif#ifdef CONFIG_SPL_BUILD    board_early_init_f();//cpudir/am33xx/board.c    sdram_init();//board/ti/am335x/board.c#endif}

关于时钟管理部分: 寄存器 CM_WKUP.CM_WKUP_CLKSTCTRL,个人理解类似总开关,CM_WKUP_CLKSTCTRL[CLKTRCTRL],管理其他位的开关,而其他位是只读的,在寄存器CM_WKUP.CM_WKUP_UART0_CLKCTRL[MODULEMODE]对应模块的激活

//cpudir/am33xx/clock_am33xx.cvoid setup_clocks_for_console(void){   clrsetbits_le32(&cmwkup->wkclkstctrl, CD_CLKCTRL_CLKTRCTRL_MASK,            CD_CLKCTRL_CLKTRCTRL_SW_WKUP <<            CD_CLKCTRL_CLKTRCTRL_SHIFT);    ..........    clrsetbits_le32(&cmwkup->wkup_uart0ctrl,            MODULE_CLKCTRL_MODULEMODE_MASK,            MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN <<            MODULE_CLKCTRL_MODULEMODE_SHIFT);    ..........}
//cpudir/am33xx/board.cint board_early_init_f(void){    prcm_init();//cpudir/am33xx/clock.c,基本时钟的初始化    set_mux_conf_regs();//board/ti/am335x/board.c,板级引脚配置    return 0;}

这里写图片描述
CLKOUT = 输入时钟 * m /(n+1) * (1 /M2);

//在sdram_init中调用config_ddr//cpudir/am33xx/emif4.cvoid config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,        const struct ddr_data *data, const struct cmd_control *ctrl,        const struct emif_regs *regs, int nr){    ddr_pll_config(pll);//空函数#ifndef CONFIG_TI816X//未定义    config_vtp(nr);#endif    config_cmd_ctrl(ctrl, nr);//cpudir/am33xx/ddr.c    config_ddr_data(data, nr);#ifdef CONFIG_AM33XX    config_io_ctrl(ioregs);    /* Set CKE to be controlled by EMIF/DDR PHY */    writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);#endif    /* Program EMIF instance */    config_ddr_phy(regs, nr);    set_sdram_timings(regs, nr);    if (get_emif_rev(EMIF1_BASE) == EMIF_4D5)        config_sdram_emif4d5(regs, nr);    else        config_sdram(regs, nr);}#endif

sdram_init执行完毕,bl _main //arch/arm/lib/crt0.S

ENTRY(_main)#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)    ldr sp, =(CONFIG_SPL_STACK)#else    ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)#endif    bic sp, sp, #7  /* 8-byte alignment for ABI compliance */    mov r2, sp    sub sp, sp, #GD_SIZE    /* allocate one GD above SP */    bic sp, sp, #7  /* 8-byte alignment for ABI compliance */    mov r9, sp      /* GD is above SP */    mov r1, sp    mov r0, #0clr_gd:    cmp r1, r2          /* while not at end of GD */    strlo   r0, [r1]        /* clear 32-bit GD word */    addlo   r1, r1, #4      /* move to next */    blo clr_gd#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SPL_BUILD)    sub sp, sp, #CONFIG_SYS_MALLOC_F_LEN    str sp, [r9, #GD_MALLOC_BASE]#endif    /* mov r0, #0 not needed due to above code */    bl  board_init_f //arch/arm/lib/spl.cENDPROC(_main)//arch/arm/lib/spl.cvoid __weak board_init_f(ulong dummy){    debug("arch/arm/lib/spl.c:board_init_f\n");    memset(__bss_start, 0, __bss_end - __bss_start);    gd = &gdata;    board_init_r(NULL, 0);//common/spl/spl.c}
//common/spl/spl.cvoid board_init_r(gd_t *dummy1, ulong dummy2){    .....#ifdef CONFIG_SPL_BOARD_INIT    spl_board_init();//cpudir/omap-common/boot-common.c#endif    boot_device = spl_boot_device();//cpudir/omap-common/boot-common.c    switch (boot_device) {//省略一些没有关系的语句#ifdef CONFIG_SPL_MMC_SUPPORT    case BOOT_DEVICE_MMC1:    case BOOT_DEVICE_MMC2:    case BOOT_DEVICE_MMC2_2:        spl_mmc_load_image();//common/spl/spl_mmc.c        break;#endif#ifdef CONFIG_SPL_NAND_SUPPORT    case BOOT_DEVICE_NAND:        spl_nand_load_image();        break;#endif    }   }
//cpudir/omap-common/boot-common.cvoid spl_board_init(void){#ifdef CONFIG_SPL_NAND_SUPPORT    gpmc_init();//cpudir/omap-common/mem-common.c#endif#if defined(CONFIG_AM33XX) && defined(CONFIG_SPL_MUSB_NEW_SUPPORT)    arch_misc_init();//cpudir/board.c#endif#if defined(CONFIG_HW_WATCHDOG)    hw_watchdog_init();//driver/watchdog/omap_wdt.c#endif#ifdef CONFIG_AM33XX    am33xx_spl_board_init();//board/ti/am335x/board.c#endif}

//cpudir/omap-common/mem-common.c
void gpmc_init(void)
{
writel(0x00000012, &gpmc_cfg->config);//改为
writel(0x2,&gpmc->config);写保护引脚底电平有效
}

0 0