基于cortex-A8的Bootloader设计
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启动 4.2 测试Nand Flash和网卡。 在等待命令状态下输入“nfs 20000000 192.168.1.123:
cortext-A8 Bootloader设计 s5pv210 相关文章:
- S5PV210(TQ210)学习笔记——内存配置(DDR2)(11-28)
- S5PV210(TQ210)学习笔记——LCD驱动编写(11-28)
- S5PV210(TQ210)学习笔记——8位HWECC与YAFFS2的OOB布局(11-28)
- S5PV210(TQ210)学习笔记——Nand配置(11-28)
- S5PV210(TQ210)学习笔记——触摸屏驱动编写(11-28)
- S5PV210(TQ210)学习笔记——内核移植与文件系统构建(11-28)