微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于cortex-A8的Bootloader设计

基于cortex-A8的Bootloader设计

时间:09-12 来源:互联网 点击:

ddr_sp;

return (unsigned int)id;

}

(2)board_init_r()

board_init_r()负责对其他硬件资源进行初始化。如网卡、Flash、MMC、中断等。最后调用main_loop(),等待用户输入命令。

3 设计实现

3.1 支持Nand Flash读写

Nand Flash是嵌入式系统中重要的存储设备,其储存对象包括Bootloader本身,操作系统内核,环境变量,根文件系统等,所以使能Nand Flash读写是U-Boot移植过程中必须完成的一个步骤。U-Boot中Nand Flash初始化函数调用关系为:

board_init_r()->nand_init()->nand_init_chip()->board_nand_init()。

board_nand_init() 完成两件事:(1)对s5pv210关于Nand Flash控制器的相关寄存器进行设置。(2)对nand_chip结构体进行设置。我们需要设置的成员项有IO_ADDR_R,IO_ADDR_W,这两个成员都指向地址0xB0E00010,即 Nand Flash控制器的数据寄存器的地址。另外还需要实现以下三个成员函数:

① void (*select_chip)(struct mtd_info *mtd, int chip);

该函数实现Nand Flash设备选中或取消选中。

② void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl);

该函数实现对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的驱动代码(其源码路径为drivers\net\dm9000x.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:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top