新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于cortex-A8的Bootloader设计

基于cortex-A8的Bootloader设计

作者: 时间:2016-09-12 来源:网络 收藏

该函数实现对Nand Flash发送命令或者地址。

③ int (*dev_ready)(struct mtd_info *mtd);

该函数实现检测Nand Flash设备状态。

最后将成员ecc.mode设置为NAND_ECC_SOFT,即ECC软件校验。

配置文件中相应的宏定义如下所示:

#define CONFIG_NAND_S5PV210 /* 告诉Makefile编译Nand模块 */

#define CONFIG_SYS_MAX_NAND_DEVICE 1 /* 指定设备数量 */

#define CONFIG_SYS_NAND_BASE 0xB0E00000 /* Nand Flash 控制器的基址 */

3.2 支持网卡

支持nfs或tftp网络下载会极大的方便我们从Linux服务器上下载文件或镜像到硬件平台上。所以使能网卡在U-Boot移植过程中也显得非常重要。以网卡dm9000为例,U-Boot已经抽象出一套完整的关于dm9000的驱动代码(其源码路径为driversnetdm9000x.c)。用户只需要根据具体的硬件电路配置相应的宏即可。U-Boot中 dm9000网卡初始化函数的调用关系为:

board_init_r()->eth_initialize()->board_eth_init()->dm9000_initialize()。

配置文件中相应的宏定义如下所示:

#define CONFIG_DRIVER_DM9000 /* DM9000网卡模块加入编译 */

#define CONFIG_DM9000_BASE (0x88001000) /* 基地址 */

#define DM9000_IO (CONFIG_DM9000_BASE) /* IO口地址 */

#define DM9000_DATA (CONFIG_DM9000_BASE + 0x300C) /* 数据口地址 */

3.3.支持环境变量的保存和修改

为了方便用户配置,U-Boot将一部分变量,如串口波特率、ip地址、内核参数、启动命令等存在Flash或SD卡上,这部分数据称为环境变量。每次上电启动时,U-Boot会检查Flash或SD卡上是否存放有环境变量。如果有则将其读取出来并使用,如果没有就使用默认的环境变量。默认的环境变量定义在 env_default.h中。用户也可以随时修改或保存环境变量到Flash或SD卡中。

对于环境变量的移植也非常简单。以Nand Flash为例,开发人员在smdkv210.h源文件中只需要添加如下的宏定义即可:

#define CONFIG_ENV_IS_IN_NAND /* 告诉Makefile环境变量保存在Nand Flash中 */

#define CONFIG_ENV_OFFSET 0x80000 /* 环境变量保存的Nand Flash中的偏移地址 */

#define CONFIG_ENV_SIZE 0x20000 /* 环境变量的大小 */

#define CONFIG_ENV_OVERWRITE /* 规定环境变量和覆盖 */

4. 测试结果

4.1. 测试U-Boot启动

测试平台的软硬件环境:

◆ 硬件平台为友善之臂的smart210开发板;

◆ Linux服务器版本为ubuntu9.0;

◆ U-Boot版本为2013-01;

◆ GCC交叉编译工具链版本为4.3.2。

首先将修改后的源码包放到装有交叉编译工具链的Linux服务器上,输入命令make即可以编译生成两个二进制文件。一个是smdkv210- spl.bin,即BL1代码,存放在spl目录下。另一个是u-boot.bin,即BL2代码,存放在顶层目录下。然后插入SD卡,执行 write2sd.sh脚本就可以把BL1和BL2分别烧写到SD卡的第1扇区和第49扇区。write2sd.sh脚本实现如下:

#!/bin/sh

sudo dd iflag=dsync oflag=dsync if=spl/smdkv210-spl.bin of=/dev/sdc seek=1

sudo dd iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdc seek=49

烧写完成之后将SD卡插入到smart210开发板的SD卡槽中,连接好串口和网线,上电启动。之后可以通过串口工具(本次测试使用的是SecureCRT)看到输出信息如图四所示,表示该U-Boot已经成功运行在开发板上。

图四  测试U-Boot启动

图四 测试U-Boot启动

4.2 测试Nand Flash和网卡。

在等待命令状态下输入“nfs 20000000 192.168.1.123:/work/nfs_root/uImage”,该命令表示从ip为192.168.1.123的Linux服务器上,通过 nfs下载该服务器上“/work/nfs_root”目录下的uImage,并存放在内存地址为0x20000000处。uImage为适配于 开发板的Linux内核镜像。等待一段时间后看到“Bytes transferred = 2127008 (2074a0 hex)”字样,表示下载成功。

下载成功之后输入命令“nand erase.part kernel”,该命令表示擦除Nand Flash上的kernel分区。接着输入命令“nand write 20000000 kernel”,该命令表示拷贝内存地址为0x20000000的内容,烧写到Nand Flash的kernel分区中。内存地址0x20000000存放的内容正是之前我们从Linux服务器上下载下来的uImage。kernel保存在环境变量mtdparts中,kernel规定了该分区的起始地址和大小。执行完这两条命令后看到“4194304 bytes written: OK”字样,表示系统内核已经成功烧写到Nand Flash中,证明了Nand Flash和网卡均可以正常使用。其实验结果如图五所示:

图五  测试Nand Flash和网卡

图五 测试Nand Flash和网卡

4.3 测试引导内核启动

烧写完内核之后执行boot命令就可以启动该内核。boot命令实际上是执行环境变量bootcmd中的一条语句,其内容为“nand read 20000000 kernel; bootm 20000000”,该语句表示从Nand Flash的kernel分区中读出内核并存放在内存地址为0x20000000处,然后跳转在该地址执行内核镜像。启动过程中可以看到串口打印出如图六所示的信息,证明了该U-Boot已经成功支持引导Linux操作系统。

图六   测试引导内核启动

图六 测试引导内核启动



评论


相关推荐

技术专区

关闭