博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Omap138开发板下以uboot2012.04.01为例分析uboot执行(八)
阅读量:3893 次
发布时间:2019-05-23

本文共 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” \

所以会继续往下执行

  • 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会作出响应的反应。

转载地址:http://jpohn.baihongyu.com/

你可能感兴趣的文章
50道!2020年!!MySQL高频数据库面试题解析,你都懂了吗?
查看>>
如何用Spring Boot加密配置文件中的特殊内容示例代码详解
查看>>
谈谈这些年面试官给大伙下的那些套,如何解?(面试技巧)
查看>>
5年开发经验的我被几条朋友圈打击到,点燃自己冲击阿里面经!
查看>>
5年工作经验的我放弃安逸,一份来自腾讯魔鬼面试的终极考验!
查看>>
学JAVA吗同学,这篇Sping boot 确定不了解下么?
查看>>
(3年+offer)华为技术岗面试初面+综合面试经验总结
查看>>
男默女泪,努力复习的我终于通过社招进入BAT工作了!(JAVA+JVM+框架+中间件+Spring干货分享)
查看>>
Python 导包
查看>>
dok_matrix
查看>>
theano 后端爆内存
查看>>
os.environ 和 keras.json
查看>>
后台面试经典问题-手写LRU算法
查看>>
Part-Guided Attention Learning for Vehicle Instance Retrieval
查看>>
Deep Residual Learning for Image Recognition
查看>>
Bag of Tricks and A Strong Baseline for Deep Person Re-identification
查看>>
vue+flask实现视频目标检测yolov5
查看>>
关于BigInteger
查看>>
UIScrollView不能响应UITouch事件
查看>>
iOS TextFiled 文本密码切换 光标偏移解决
查看>>