dram.init讲解

int dram_init(void)//是关于ddr的初始化,在会汇编阶段已经初始化过ddr,否则也无法relocate到第二阶段
//这里再次初始化是因为这里是在给gd->bd里面关于ddr配置部分的全局变量赋值,让gd->bd数据记录下来
//当前的开发板的ddr的配置信息,以便在uboot中使用内存
//(3):从代码上看。其实就是初始化gd->bd->bi_dram这个结构体数组,
{
    DECLARE_GLOBAL_DATA_PTR;

    gd->bd->bi_dram[0].start = PHYS_SDRAM_1;   //第一片内存的起始地址//没有宏定义判断,因为至少也要有一篇ddr内存存在
    gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;   //第一片内存的大小

#if defined(PHYS_SDRAM_2)
    gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
    gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
#endif

#if defined(PHYS_SDRAM_3)
    gd->bd->bi_dram[2].start = PHYS_SDRAM_3;
    gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
#endif

    return 0;
}

static int display_dram_config (void)//打印显示dram的配置信息,
//启动信息中的(dram: 512MB)就是在这里打印的,其中在运行中要得知配置信息:使用bdinfo
//这个命令可以打印出gd->bd中记录的所有硬件相关的全局变量的值,
可得知ddr的配置信息:
dram bank  = 0x00000000
->start  = 0x30000000
->size  = 0x10000000
dram bank  = 0x00000001
->start  = 0x40000000
->size  = 0x10000000
//
{
    int i;

#ifdef DEBUG
    puts ("RAM Configuration:\n");

    for(i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
        printf ("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
        print_size (gd->bd->bi_dram[i].size, "\n");
    }
#else
    ulong size = 0;

    for (i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
        size += gd->bd->bi_dram[i].size;
    }

    puts("DRAM:    ");
    print_size(size, "\n");
#endif

    return (0);
}

//init_sequence 总结:
board_init 初始化:都是板级硬件的初始化以及gd->bd,gd中的数据结构的初始化,譬如:
网卡初始化,机器码(gd->bd->bi_arch_number),内核传参ddr地址(gd->bd->bi_boot_params),
interupt_init 是对定时器4初始化为10ms一次
波特率初始化
serial_init:串口初始化
console_ini_f:第一阶段初始化(gd->have_console设置为1)
打印uboot的启动信息:plar_banner函数(这个函数里面有打开lcd背光的函数)
打印cpu相关设置信息,检查并打印当前开发板名字,ddr配置信息的初始化(dram_init)
ddr总容量打印

hang()挂起函数

int console_init_r (void)  //纯软件架构方面的初始化(说白了就是给console相关的数据结构中填充相应的值)
{//这个东西在uboot中是没多大作用的,因为是调用串口函数实现的。但在linux内核中就有缓冲作用
    device_t *inputdev = NULL, *outputdev = NULL;
    int i, items = ListNumItems (devlist);

#ifdef CONFIG_SPLASH_SCREEN
    /* suppress all output if splash screen is enabled and we have
       a bmp to display                                            */
    if (getenv("splashimage") != NULL)
        gd->flags |= GD_FLG_SILENT;
#endif

    /* Scan devices looking for input and output devices */
    for (i = 1;
         (i <= items) && ((inputdev == NULL) || (outputdev == NULL));
         i++
        ) {
        device_t *dev = ListGetPtrToItem (devlist, i);

        if ((dev->flags & DEV_FLAGS_INPUT) && (inputdev == NULL)) {
            inputdev = dev;
        }
        if ((dev->flags & DEV_FLAGS_OUTPUT) && (outputdev == NULL)) {
            outputdev = dev;
        }
    }

    /* Initializes output console first */
    if (outputdev != NULL) {
        console_setfile (stdout, outputdev);
        console_setfile (stderr, outputdev);
    }

    /* Initializes input console */
    if (inputdev != NULL) {
        console_setfile (stdin, inputdev);
    }

    gd->flags |= GD_FLG_DEVINIT;    /* device initialization completed */

#ifndef CFG_CONSOLE_INFO_QUIET
    /* Print information */
    puts ("In:      ");
    if (stdio_devices[stdin] == NULL) {
        puts ("No input devices available!\n");
    } else {
        printf ("%s\n", stdio_devices[stdin]->name);
    }

    puts ("Out:     ");
    if (stdio_devices[stdout] == NULL) {
        puts ("No output devices available!\n");
    } else {
        printf ("%s\n", stdio_devices[stdout]->name);
    }

    puts ("Err:     ");
    if (stdio_devices[stderr] == NULL) {
        puts ("No error devices available!\n");
    } else {
        printf ("%s\n", stdio_devices[stderr]->name);
    }
#endif /* CFG_CONSOLE_INFO_QUIET */

#ifndef    CONFIG_X210
    /* Setting environment variables */
    for (i = 0; i < 3; i++) {
        setenv (stdio_names[i], stdio_devices[i]->name);
    }
#endif

#if 0
    /* If nothing usable installed, use only the initial console */
    if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL))
        return (0);
#endif

    return (0);
}

#endif /* CFG_CONSOLE_IS_IN_ENV */

//uboot总结:

第二阶段:主要是对开发板级别的硬件,软件的初始化
:init_sequence:
        cpu_init.空的
        board_init :网卡,机器码,内存传参地址
           :dm9000_pre_init:网卡初始化
            gd->bd->bi_arch_number:机器码
            gd->bd->bi_boot_params:内存传参地址
        interupt_init:定时器
        env_init:
        init_baudrate:gd数据结构中波特率的初始化
        serial_init:串口初始化
        console_ini_f:空的
        display_banner:打印启动信息
        display_cpuinfo:打印cpu的时钟设置信息
        checkboard:检验开发板名称
        dram_init:gd数据中的ddr信息
        display_dram_config:打印ddr配置信息表
    mem_malloc_init:初始化uboot自个维护的堆内存
    mmc_initiallier:inand/sd卡的soc的控制器和卡的初始化
    env_relocate:环境变量重定位
    gd->bd->bi_ip_addr
    gd->bd->bi_enetaddr:gd数据结构赋值
    devices_init:空的
    jumptable_init:跳转表,不用关注
    console_init_r:控制台的真正初始化
    loadaddr,bootfile::环境变量读出,初始化环境变量
    board_late_init:空的
    eth_initialize:空的
    x210_preboot_init:LCD初始化和显示logo
    check_menu_update_from_sd:检查更新实现量产功能
    main_loop:主循环

启动过程总结:(第一阶段的不需要我们调试,由开发板产商搞)
1:第一阶段是汇编代码。第二阶段是C语言
2:第一阶段在sram中。第二阶段在ddr(dram)中
3:第一阶段注重soc内部,第二阶段注重soc外部,board内部

移植时注意点:
1:x210_sd.h头文件中的宏定义
2:特定硬件的初始化函数位置(如:网卡)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值