weiqi7777

cortex-a8 uboot系列:第八章 uboot源码分析4-启动第二阶段

0
阅读(1855)

一、            start_armboot 3解析

1. norflash初始化

没有定义CFG_NO_FLASH宏,所以这里程序是执行的。

clip_image002

虽然Nandflashnorflash都是flash,但是nandflash简称为nand,而不是flash,一般讲flash是指norflash

所以这里的两行代码是与norflash是相关的。

flash_init是和norflash相关的初始化。board/samsung/x210/flash.c. 返回值是norflash的大小。

clip_image004

display_flash_config是打印norflash的信息。lib_arm/board.c

clip_image006

uboot中的效果。

clip_image007

 

实际上x210中是没有norflash的,所以这里的代码是可以去掉的。但是不去掉也没有影响,只是会在uboot中会显示Flash8MB。不能对这8MBnorflash进行使用。

 

clip_image009

和虚拟显示(也就是LCD)有关的,程序中没有定义这个CONFIG_VFD宏,所以这段代码没有执行。

这个是uboot中自带的LCD显示的软件架构,但是九鼎uboot没有使用这个软件架构,而是自己在后面添加了LCD显示的程序部分。

 

clip_image011

这部分和LCD有关系,不过九鼎uboot对于LCD的管理是在其他地方做处理,所以这里的代码没有被执行。

2. 堆初始化

mem_malloc_init函数用来初始化uboot的堆管理器,uboot中维护了一段堆内存,于是就有一套代码来管理这个对内存。有了这些东西,uboot中就可以使用mallocfree这套机制来申请内存的内存释放。

函数的输入参数是DDR中堆的起始地址。

clip_image013

clip_image015

3. MMC初始化

开发板独有初始化:mmc初始化。

开始:

clip_image016

结束:

clip_image018

中间的代码是开发板独有的初始化。意思是三星用一套uboot同时满足了好多个系列型号的开发板,然后在这里把不同开发板自己独有的一些初始化写到这里。用#if条件编译配合CONFIGG_XXX宏来选定特定的开发板。

对于九鼎开发板,该宏为CONFIG_X210,在include/configs/x210_sd.h中有定义。

clip_image019

clip_image021

判断宏CONFIG_GENERIC_MMC是否定义,对于九鼎开发板,有使用eMMC,在通道0,所以该宏有定义,执行以下的代码。

先使用mmc_initialize函数对mmc进行初始化。其实就是初始化soc内部的SD/MMC控制器。函数在drivers/mmc/mmc.c程序中。(uboot中对硬件的操作,如网卡,SD卡……都是借用的linux内核中的驱动实现,程序都是放在drivers文件夹下,里面存放的是从linux中移植过来的源文件)

clip_image023

mmc_initialize是具体硬件架构无关的一个MMC初始化函数,所有的使用了这套结构的代码都调用了这个函数来完成MMC的初始化,mmc_initialize调用board_mmc_init函数或者cpu_mmc_init函数来对MMC进行初始化。如果开发板使用外扩的SD/MMC控制器,那么MMC初始化就要在board_mmc_init中,如果开发板的soc自带SD/MMC控制器,那么就需要在cpu_mmc_init来对MMC进行初始化。对于x210来说,soc内部自带有SD/MMC控制器,因此调用cpu_mmc_init来对MMC初始化。

 

使用双向链表来对MMC设备进行维护。所以首先对MMC设备链表初始化。

cur_dev_num:设备编号,uboot最多可以使用4MMC。这里设置为0,表示对MMC0操作,也就是开发板上的eMMC

board_mmc_init是另外一个函数__def_mmc_init的别名函数,函数直接返回-1。因为对于x210开发板,使用的是soc的内置SD/MMC控制器,所以不需要板级的SD/MMC控制器,因此这里代码不做任何事,直接返回。

clip_image025

         对于使用weak说明函数时,表示这里函数的实现是一个弱实现,如果其他地方有事先这个函数,那函数就被外部实现的函数所覆盖,如果其他地方没有实现这个函数,那么这个函数实现就是这个弱函数实现。alias属性,给函数取一个别名。

满足if条件,执行cpu_mmc_init函数。这个函数才是真正的执行MMC初始化函数。这个函数在cpu/s5pc11x/cpu.c中。说明这个函数是和使用的soc有关系的。

clip_image027

setup_hsmmc_clock函数(cpu/s5pc11x/setup_hsmmc.c中)设置MMC控制器的时钟,

 

clip_image029

 

setup_hsmmc_cfg_gpio函数(cpu/s5pc11x/setup_hsmmc.c中)对MMC控制器的gpio进行设置。

clip_image031

 

smdk_s3c_hsmmc_init函数(drivers/mmc/s3c_hsmmc.c中)对SD/MMC进行初始化。这里的初始化是软件层面的初始化,而不是对SD/MMC控制器和外部的SD/MMC卡初始化。这里初始化是指对SD/MMC管理的相关的参数进行设置。

clip_image033

对于MMC卡,使用了一个结构体来进行管理,所以软件需要对这个结构体进行初始化。

 

clip_image035

根据设定的宏,对外部不同的通道的SD/MMC进行初始化。再调用s3c_hsmmc_initialize函数(drivers/mmc/s3c_hsmmc.c中)。该函数对MMC管理的一些变量进行赋值。

clip_image037

clip_image038

最后调用mmc_register函数(drivers/mmc/mmc.c中),还是对MMC管理的一些参数赋值。

clip_image040

 

以上只是对MMC管理的一些参数设置,还没有对外部MMC卡进行初始化

clip_image042

实际上是调用了mmc_init函数(drivers/mmc/mmc.c中)对mmc初始化。然后获取容量,并打印。

clip_image044

通过发送cmd命令,来对SD/MMC进行初始化的。

 

以上的过程,就对SD/MMC控制器和外部MMC卡进行初始化了。初始化完MMC卡后,就将MMC的容量打印出来,对于九鼎uboot,打印的是通道0MMC卡。

clip_image045

 

clip_image047

         以上两个宏都是没有定义的,所以程序不执行。

 

clip_image049

对于CONFIG_CMD_NAND宏,使用NAND启动的时候,是有定义这个宏的,但是x210使用的是eMMC启动,所以该宏没有定义,代码也不执行。

 

所以,对于这一段独有开发板代码,九鼎uboot只是初始化了MMC控制器,打印外接通道0MMC的容量。