cortex-a8 uboot系列:第八章 uboot源码分析4-启动第二阶段
0赞一、 start_armboot 3解析
1. norflash初始化
没有定义CFG_NO_FLASH宏,所以这里程序是执行的。
虽然Nandflash和norflash都是flash,但是nandflash简称为nand,而不是flash,一般讲flash是指norflash。
所以这里的两行代码是与norflash是相关的。
flash_init是和norflash相关的初始化。board/samsung/x210/flash.c. 返回值是norflash的大小。
display_flash_config是打印norflash的信息。lib_arm/board.c
在uboot中的效果。
实际上x210中是没有norflash的,所以这里的代码是可以去掉的。但是不去掉也没有影响,只是会在uboot中会显示Flash:8MB。不能对这8MB的norflash进行使用。
和虚拟显示(也就是LCD)有关的,程序中没有定义这个CONFIG_VFD宏,所以这段代码没有执行。
这个是uboot中自带的LCD显示的软件架构,但是九鼎uboot没有使用这个软件架构,而是自己在后面添加了LCD显示的程序部分。
这部分和LCD有关系,不过九鼎uboot对于LCD的管理是在其他地方做处理,所以这里的代码没有被执行。
2. 堆初始化
mem_malloc_init函数用来初始化uboot的堆管理器,uboot中维护了一段堆内存,于是就有一套代码来管理这个对内存。有了这些东西,uboot中就可以使用malloc,free这套机制来申请内存的内存释放。
函数的输入参数是DDR中堆的起始地址。
3. MMC初始化
开发板独有初始化:mmc初始化。
开始:
结束:
中间的代码是开发板独有的初始化。意思是三星用一套uboot同时满足了好多个系列型号的开发板,然后在这里把不同开发板自己独有的一些初始化写到这里。用#if条件编译配合CONFIGG_XXX宏来选定特定的开发板。
对于九鼎开发板,该宏为CONFIG_X210,在include/configs/x210_sd.h中有定义。
判断宏CONFIG_GENERIC_MMC是否定义,对于九鼎开发板,有使用eMMC,在通道0,所以该宏有定义,执行以下的代码。
先使用mmc_initialize函数对mmc进行初始化。其实就是初始化soc内部的SD/MMC控制器。函数在drivers/mmc/mmc.c程序中。(uboot中对硬件的操作,如网卡,SD卡……都是借用的linux内核中的驱动实现,程序都是放在drivers文件夹下,里面存放的是从linux中移植过来的源文件)
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最多可以使用4个MMC。这里设置为0,表示对MMC0操作,也就是开发板上的eMMC。
board_mmc_init是另外一个函数__def_mmc_init的别名函数,函数直接返回-1。因为对于x210开发板,使用的是soc的内置SD/MMC控制器,所以不需要板级的SD/MMC控制器,因此这里代码不做任何事,直接返回。
对于使用weak说明函数时,表示这里函数的实现是一个弱实现,如果其他地方有事先这个函数,那函数就被外部实现的函数所覆盖,如果其他地方没有实现这个函数,那么这个函数实现就是这个弱函数实现。alias属性,给函数取一个别名。
满足if条件,执行cpu_mmc_init函数。这个函数才是真正的执行MMC初始化函数。这个函数在cpu/s5pc11x/cpu.c中。说明这个函数是和使用的soc有关系的。
setup_hsmmc_clock函数(cpu/s5pc11x/setup_hsmmc.c中)设置MMC控制器的时钟,
setup_hsmmc_cfg_gpio函数(cpu/s5pc11x/setup_hsmmc.c中)对MMC控制器的gpio进行设置。
smdk_s3c_hsmmc_init函数(drivers/mmc/s3c_hsmmc.c中)对SD/MMC进行初始化。这里的初始化是软件层面的初始化,而不是对SD/MMC控制器和外部的SD/MMC卡初始化。这里初始化是指对SD/MMC管理的相关的参数进行设置。
对于MMC卡,使用了一个结构体来进行管理,所以软件需要对这个结构体进行初始化。
根据设定的宏,对外部不同的通道的SD/MMC进行初始化。再调用s3c_hsmmc_initialize函数(drivers/mmc/s3c_hsmmc.c中)。该函数对MMC管理的一些变量进行赋值。
最后调用mmc_register函数(drivers/mmc/mmc.c中),还是对MMC管理的一些参数赋值。
以上只是对MMC管理的一些参数设置,还没有对外部MMC卡进行初始化
实际上是调用了mmc_init函数(drivers/mmc/mmc.c中)对mmc初始化。然后获取容量,并打印。
通过发送cmd命令,来对SD/MMC进行初始化的。
以上的过程,就对SD/MMC控制器和外部MMC卡进行初始化了。初始化完MMC卡后,就将MMC的容量打印出来,对于九鼎uboot,打印的是通道0的MMC卡。
以上两个宏都是没有定义的,所以程序不执行。
对于CONFIG_CMD_NAND宏,使用NAND启动的时候,是有定义这个宏的,但是x210使用的是eMMC启动,所以该宏没有定义,代码也不执行。
所以,对于这一段独有开发板代码,九鼎uboot只是初始化了MMC控制器,打印外接通道0的MMC的容量。