本文共 2966 字,大约阅读时间需要 9 分钟。
(12)
/* Setting environment variables */ for (i =0; i < 3; i++) { setenv(stdio_names[i],stdio_devices[i]->name); }->stdio_names[0]=”stdin”stdio_names[1]=”stdout”stdio_names[2]=”stderr”将这三个变量名存放在环境变量里。
(13)
misc_init_r()
1)
dspwake();
->
/* if the device is ARM
only, return */if
((readl(CHIP_REV_ID_REG) & 0x3f) == 0x10)return;
在这里CHIP_REV_ID_REG这个寄存器的位置是错的,在手册上找不到这个寄存器。
按照它的定义:
#define CHIP_REV_ID_REG (DAVINCI_BOOTCFG_BASE + 0x24)
#define DAVINCI_BOOTCFG_BASE 0x01c14000
这个寄存器的位置应该在0x01c14024,但是从手册来看,这个位置并没有定义寄存器。
if (hwconfig_subarg_cmp_f(“dsp”, “wake”,“no”, NULL))
return;
在da850sdi.h中可以找到定义:
“hwconfig=dsp:wake=yes\0” \
所以会继续往下执行
->
unsigned resetvect = (unsigned)DAVINCI_L3CBARAM_BASE;
#define DAVINCI_L3CBARAM_BASE 0x80000000
在手册上查到0x80000000到0x8001FFFF是Memory Attribute Register for RAM,但是没有找到具体的这个位置的寄存器。
/* setup the DSP resetvector */
writel(DAVINCI_L3CBARAM_BASE,HOST1CFG);
#define DAVINCI_L3CBARAM_BASE 0x80000000
#define HOST1CFG (DAVINCI_BOOTCFG_BASE + 0x44)=0x01c14044
则实际运行的函数为:writel(0x80000000, 0x01c14044)
->
#define writel(b,addr) ((*(volatile u32 *)(addr)) = (b))
也就是说,这里将DSP的启动引导地址设为了0x8000,0000
dsp_lpsc_on(1, DAVINCI_LPSC_GEM);#define DAVINCI_LPSC_GEM 15相当于dsp_lpsc_on(1, 15);对应void dsp_lpsc_on(unsigned domain, unsignedint id){ while(*ptstat & (0x1 << domain)); if((*mdstat & 0x1f) == 0x03) return; /* Already on and enabled */ *mdctl|= 0x03; *ptcmd= 0x1 << domain; while(*ptstat & (0x1 << domain)); while((*mdstat & 0x1f) != 0x03) ; /* Probably an overkill... */} *mdctl |= 0x03; *ptcmd = 0x1 << domain;
mdctl寄存器的值配置如下:
mdstat寄存器域配置如下:
2)/* Generating MAC addr for Device Identification Register value */
buff[0] = davinci_syscfg_regs->dieidr[0]>> 24; buff[1]= (davinci_syscfg_regs->dieidr[0] & 0xff0000) >> 16; buff[2]= (davinci_syscfg_regs->dieidr[0] & 0xff00) >> 8; buff[3]= davinci_syscfg_regs->dieidr[0] & 0xff; buff[4]= (davinci_syscfg_regs->dieidr[1] & 0xff00) >> 8; buff[5]= davinci_syscfg_regs->dieidr[1] & 0xff; /*make it local unicast */ buff[0]= (buff[0] | 0x02) & ~0x01; /* * MAC address not present in the environment * try and read the MAC address from Generating'DIEID' * and set it.
这几个寄存器没有找到具体的说明。
(14)
/* set up exceptions */
interrupt_init();->/* * setup up stacks if necessary */ IRQ_STACK_START_IN= gd->irq_sp + 8;
(15)
/* Initialize from environment */
load_addr= getenv_ulong("loadaddr", 16, load_addr);
使用默认的环境变量,环境变量存储的位置在load_addr里面。
ulong load_addr = CONFIG_SYS_LOAD_ADDR; /* Default Load Address */
#define CONFIG_SYS_LOAD_ADDR (PHYS_SDRAM_1 + 0x700000)
#define PHYS_SDRAM_1 DAVINCI_DDR_EMIF_DATA_BASE /* DDR Start */
#define DAVINCI_DDR_EMIF_DATA_BASE 0xc0000000
最后得出load_addr=0xc0700000
到此,uboot的初始化部分就结束了,接下进入主流程:
for(; ; ){
main_loop;
}
等待用户输入命令,即用户输入“ctrl+c”,”setenv”等命令之后,uboot会作出响应的反应。
转载地址:http://jpohn.baihongyu.com/