文件分类 | 文件名称 | 源文件 | 作用 | |
公有文件 | 私有文件 | |||
Boot ROM | - | - | - | 处理器制造时,烧写到内部的一段固定的代码,通过判断引导配置引脚,选择第一个外部引导代码。 |
XLDR | XLDRNAND.nb0 | platform.c startup.s jumpto.s | main.c | NANDFlash上的第一段代码,用于选择第二段外部引导代码。 |
XLDRSD.nb0 | sdmain.c | 位于SD卡,用于选择第二段外部引导代码。 | ||
MLO | MLO | - | 是XLDRSD.nb0的实际的文件名。 | |
EBOOT | EBOOTND.nb0 | main.c menu.c stub.c flashmenu.c mmu.c startup.s jumpto.s | flash.c cfg.c | 位于NANDFlash上的第二个分区,用于引导内核的启动。 |
EBOOTSD.nb0 | flash.c cfg.c | 位于SD卡,用于引导内核启动。 | ||
LOGO | Logo.nb0 | - | 开机LOGO | |
NK | NK.bin | - | 内核镜像 |
从NANDFlash启动的过程:
(1) 首先执行startup.s的代码,拷贝数据段和代码段到SRAM,最后跳转到main.c中的XLDRMain()函数运行。
(2) main.c中的XLDRMain()函数,首先将NANDFlash中的EBOOTND.nb0拷贝到内存中,最后调用jumpto.s中的jumpto函数跳转到EBOOTND.nb0的Starup.s处运行。
(3) 在startup.s中主要激活MMU然后跳转到EBOOT的main函数运行。
(4) Main函数中使能设备时钟,执行BootloaderMain()函数,BootloaderMain()函数位于platform\common\src\common\boot\blcommon\Blcommon.c中,主要是初始化平台,然后执行OEMPreDownload ()函数。最后调用函数OEMLaunch(),启动内核。
(5) OEMPreDownload ()函数位于main.c文件中,初始化键盘,显示开机LOGO,设置NANDFlash的引导保留块(0~13),读取引导配置(EBOOT区域的最后一个sector),读取按键值shift+NO(只在插入可启动的SD时有效)或shift+*,如果按下shift+*,显示菜单,进行菜单中的相关操作。然后调用函数OALKitlDeviceType(),判断是将从SD卡还是从NANDFlash下载内核到内存运行。
从SD卡启动的过程:
(1) 首先执行startup.s的代码,拷贝数据段和代码段到SRAM,最后跳转到sdmain.c中的XLDRMain()函数运行。
(2) sdmain.c中的XLDRMain()函数,首先将SD卡中的EBOOTSD.nb0拷贝到内存中,最后调用jumpto.s中的jumpto函数跳转到EBOOTSD.nb0的Starup.s处运行。
(3) 在startup.s中主要激活MMU然后跳转到EBOOT的main函数运行。
(4) Main函数中使能设备时钟,执行BootloaderMain()函数,BootloaderMain()函数位于platform\common\src\common\boot\blcommon\Blcommon.c中,主要是初始化平台,然后执行OEMPreDownload ()函数。最后调用函数OEMLaunch(),启动内核。
OEMPreDownload ()函数位于main.c文件中,初始化键盘,显示开机LOGO,设置NANDFlash的引导保留块(0~13),读取引导配置(EBOOT区域的最后一个sector),读取按键值shift+NO(只在插入可启动的SD时有效)或shift+*,如果按下shift+*,显示菜单,进行菜单中的相关操作。如果按下shift+NO,依次烧写xldrnand.nb0,ebootnd.nb0,nk.bin, logo.nb0到Flash的对应分区,然后调用函数OALKitlDeviceType(),判断是将从SD卡还是从NANDFlash下载内核到内存运行。