ARM仿真器-foxICE 设为首页   |   加入收藏夹   |   网站地图         
  站内搜索:
 
http://www.foxice.net
最新下载_foxICE
ARM7TDMI R3内核
ARM7EJS内核
ARM946E-S内核
ARM966E-S内核
ARM9TDMI内核
ARM940T内核
ARM指令集速查卡
ARM925T内核(TI925T)

更多 >> 

 技术专栏RSS订阅

   首页>技术专栏>Nandflash专栏>从NAND闪存中启动U-BOOT的设计

从NAND闪存中启动U-BOOT的设计

来自:电子设计应用    作者:刘晔 汪灿华等 1  2    下载pdf版

首先在 /include/configs/wch2410.h 中加入 CONFIG_S3C2410_NAND_BOOT, 如下:
#define CONFIG_S3C2410_NAND_BOOT 1?? @ 支持从 NAND 闪存中启动
然后在 /cpu/arm920t/start.S 中添加
#ifdef CONFIG_S3C2410_NAND_BOOT
copy_myself:
mov r10, lr
ldr sp, DW_STACK_START @ 安装栈的起始地址
mov fp, #0 @ 初始化帧指针寄存器
bl nand_reset @ 跳到复位 C 函数去执行,执行 NAND 闪存复位
.......
/* 从 NAND 闪存中把 U-BOOT 拷贝到 RAM*/
ldr r0, =UBOOT_RAM_BASE @ 设置第 1 个参数 : UBOOT 在 RAM 中的起始地址
mov r1, #0x0 @ 设置第 2 个参数 :NAND 闪存的起始地址
mov r2, #0x20000 @ 设置第 3 个参数 : U-BOOT 的长度 (128KB)
bl nand_read_whole @ 调用 nand_read_whole(), 把 NAND 闪存中的数据读入到 RAM 中
tst r0, #0x0 @ 如果函数的返回值为 0, 表示执行成功
beq ok_nand_read @ 执行内存比较,把 RAM 中的前 4K 内容与 NAND 闪存中的前 4K 内容进行比较 , 如果完全相同 , 则表示搬移成功
其中, nand_reset () , nand_read_whole() 被加在 /board/wch2410/wch2410.c 中。

支持 U-BOOT 命令设计

在 U-BOOT 下对 nand 闪存的支持主要是在命令行下实现对 nand 闪存的操作。对 nand 闪存实现的命令为: nand info( 打印 nand Flash 信息 ) 、 nand device( 显示某个 nand 闪存设备 ) 、 nand read( 读取 nand 闪存 ) 、 nand write( 写 nand 闪存 ) 、 nand erease( 擦除 nand 闪存 ) 、 nand bad( 显示坏块 ) 等。

用到的主要数据结构有: struct nand_flash_dev 、 struct nand_chip 。前者包括主要的芯片型号、存储容量、设备 ID 、 I/O 总线宽度等信息;后者是具体对 NAND 闪存进行操作时用到的信息。

a. 设置配置选项

修改 /include/configs/wch2410.h, 主要是在 CONFIG_COMMANDS 中打开 CFG_CMD_NAND 选项。定义 NAND 闪存控制器在 SFR 区中的起始寄存器地址、页面大小,定义 NAND 闪存命令层的底层接口函数等。

b. 加入 NAND 闪存芯片型号

在 /include/linux/mtd/ nand_ids.h 中对如下结构体赋值进行修改 :
static struct nand_flash_dev nand_flash_ids[] = {
......
{"Samsung K9F1208U0A", NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},
.......
}
这样对于该款 NAND 闪存芯片的操作才能正确执行。
c. 编写 NAND 闪存初始化函数
在 /board/wch2410/wch2410.c 中加入 nand_init() 函数。
void nand_init(void)
{
/* 初始化 NAND 闪存控制器 , 以及 NAND 闪存芯片 */
nand_reset();
/* 调用 nand_probe() 来检测芯片类型 */
printf ("%4lu MB\n", nand_probe(CFG_NAND_BASE) >> 20);
}
该函数在启动时被 start_armboot() 调用。
最后重新编译 U-BOOT 并将生成的 u-boot.bin 烧入 NAND 闪存中,目标板上电后从串口输出如下信息:
U-Boot 1.1.3 (Nov 14 2006 - 11:29:50)
U-Boot code: 33F80000 -> 33F9C9E4 BSS: -> 33FA0B28
RAM Configuration:
Bank #0: 30000000 64 MB
## Unknown Flash on Bank 0: ID 0xffff, Size = 0x00000000 = 0 MB
Flash: 0 kB
NAND: 64 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
wch2410 #

结语

以往将 U-BOOT 移植到 ARM9 平台中的解决方案主要针对的是 ARM9 中的 NOR 闪存,因为 NOR 闪存的结构特点致使应用程序可以直接在其内部运行,不用把代码读到 RAM 中,移植过程相对简单。从 NAND 闪存中启动 U-BOOT 的设计难点在于 NAND 闪存需要把 U-BOOT 的代码搬移到 RAM 中,并要让 U-BOOT 支持 NAND 闪存的命令操作。本文介绍了实现这一设计的思路及具体程序。移植后, U-BOOT 在嵌入式系统中运行良好。

参考文献

1 杜春雷 . ARM 体系结构与编程 [M]. 北京 : 清华大学出版社, 2003
2 S3C2410 User's Mannual[Z].Samsung

1  2  

立即下载:
点击下载
相关文档
U-Boot在44B0X开发板上的移植以及代码分析
U-boot移植日记(s3c44b0)
S3C44B0\U-Boot的启动流程及移植
U-Boot在S3C2410上的移植
uboot在ARM s3c2410上移植过程
VxWorks 的bootrom 到u-boot 的移植心得
嵌入式系统中U-Boot基本特点及其移植方法
uboot移植到S3C44B0X开发板的经历
下载说明:
  1. 未经本站明确许可,任何网站不得非法盗链及抄袭本站资源!
 

首页 | 产品介绍 | 技术支持 | 下载中心 | 技术专栏 | 关于我们 | 联系我们
电话:86-755-82798083   82796301   传真:86-755-82799007    Email:sales@foxice.net   sales6@foxice.net
在线咨询:QQ:346466907   MSN:sales6@foxice.net   ini3000@msn.com

© 2006 Foxice.net 版权所有