1. 程式人生 > >Omap138開發板下以uboot2012.04.01為例分析uboot執行(八)

Omap138開發板下以uboot2012.04.01為例分析uboot執行(八)

(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” \

所以會繼續往下執行

  • resetvect++ = 0x1E000; / DSP Idle */

->

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會作出響應的反應。