Super-ARM9 LUB-2410A-00
U-BOOT 移植指南
基于 Super-ARM9
部 目:Super-ARM9
部 门:技术部
作 者:潘炀均
编 号:LUB-2410A-00
关键字:U-BOOT;移植;2410;Super-ARM
摘 要:本文介绍了如何将 U-BOOT 移植到 Super-ARM9 硬件平台上。
Super-ARM9 LUB-2410A-00
I
Super-ARM9 LUB-2410A-00
目录
目录 .......................................................................................................................................................... I
介绍 ..........................................................................................................................................................1
U-BOOT...............................................................................................................................................1
获取U-BOOT.......................................................................................................................................1
U-BOOT体系结构...............................................................................................................................1
U-BOOT目录结构...............................................................................................................................2
开发环境 ..................................................................................................................................................3
目标板硬件环境 ..................................................................................................................................3
软件开发环境 ......................................................................................................................................3
存储器使用划分 ..................................................................................................................................4
启动过程及工作原理 ..............................................................................................................................5
启动模式介绍 ......................................................................................................................................5
启动流程..............................................................................................................................................5
移植步骤 ................................................................................................................................................ 11
设置编译工具 .................................................................................................................................... 11
修改MAKEFILE ................................................................................................................................... 11
在BOARD子目录建立WTK2410.......................................................................................................... 11
在INCLUDE/CONFIGS/建立配置头文件WTK2410.H............................................................................ 11
测试编译能否成功 ............................................................................................................................ 11
修改LOWLEVEL_INIT.S内存配置文件 ...............................................................................................12
移植NOR FLASH驱动 .........................................................................................................................14
增加NAND FLASH驱动.......................................................................................................................14
修改CPU\ARM920T\START.S 引导文件 ..............................................................................................15
修改WTK2410.H配置头文件 .............................................................................................................20
启动运行............................................................................................................................................21
I
Super-ARM9 LUB-2410A-00
II
Super-ARM9 LUB-2410A-00
介绍
U-BOOT
U-BOOT 是德国 DENX 小组的开发用于多种嵌入式 CPU 的 bootloader 程序 ,
U-BOOT 不仅仅支持嵌入式 Linux 系统的引导,当前,它还支持 NetBSD, VxWorks, QNX,
RTEMS, ARTOS, LynxOS 嵌入式操作系统。U-BOOT 除了支持 PowerPC 系列的处理器外,
还能支持 MIPS、x86、ARM、NIOS、XScale 等诸多常用系列的处理器。
简单地说,U-BOOT 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,
我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适
的状态,以便为最终调用操作系统内核准备好正确的环境。
获取 U-BOOT
从http://sourceforge.net/projects/U-BOOT 下载最近的稳定版本(U-BOOT-1.1.3.tar.bz2)
解压 U-BOOT:
#tar -xjvf U-BOOT-1.1.3.tar.bz2
U-BOOT体系结构
U-BOOT 是 sourceforge 网一个开放源代码的项目,对 Linux 操作系统的支持最好,大
多数 bootloader 都分为 stage1 和 stage2 两大部分,U-BOOT 也一样,依赖于 CPU 体系结构
的代码(如初始化代码)通常都放在 stage1,一般用汇编语言实现,而 stage2 则通常用 C 语言
来实现。这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
U-BOOT 的 stage1 通常包括以下步骤:
(1)硬件设备的初始化(如设置异常向量,设置 CPU 的速度、时钟频率及中断控制等。
(2)将 nand flash 中的程序拷贝到 RAM 中。
(3)初始化堆栈。
(4)跳转到 stage2 的 C 入口点,转到 RAM 中执行,指令 ldr pc start_armboot 可完成。
U-BOOT 的 stage2 包括以下步骤:
(1) 初始化本阶段用到的硬件设备(如初始化 flash、初始化 nand 设备、初始化相关网络设备,
填写 IP、MAC 等)。
(2) 检测系统内存映射。
(3) 将 kernel 映像和跟文件系统映像从 nand flash 上读到 RAM 中。
(4) 为内核设置启动参数。
(5) 调用内核心。
1/22
Super-ARM9 LUB-2410A-00
U-BOOT目录结构
|-- board
|-- common
|-- cpu
|-- disk
|-- doc
|-- drivers
|-- dtt
|-- examples
|-- fs
|-- include
|-- lib_arm
|-- lib_generic
|-- lib_i386
|-- lib_m68k
|-- lib_microblaze
|-- lib_mips
|-- lib_nios
|-- lib_nios2
|-- lib_ppc
|-- net
|-- post
|-- rtc
`-- tools
board:和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中,
比如说:SMDK2410,子目录中存放与开发板相关的配置文件.
common:实现 U-BOOT 命令行下支持的命令,每一条命令都对应一个文件。例如 bootm 命
令对应就是 cmd_bootm.c。
cpu:与特定 CPU 架构相关目录,每一款 U-BOOT 下支持的 CPU 在该目录下对应一个
子目录,比如有子目录 arm920t 等。
disk:对磁盘的支持。
doc:文档目录。U-BOOT 有非常完善的文档,推荐大家参考阅读。
drivers:U-BOOT 支持的设备驱动程序都放在该目录,比如各种网卡、支持 CFI 的 Flash、
串口和 USB 等。
fs: 支持的文件系统,U-BOOT 现在支持 cramfs、fat、fdos、jffs2 和 registerfs。
include:U-BOOT 使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件
和对文件系统支持的 文件。该目录下 configs 目录有与开发板相关的配置头文件,如
smdk2410.h。该目录下的 asm 目录有与 CPU 体
系结构相关的头文件,asm 对应的是 asm-arm.
lib_xxxx: 与体系结构相关的库文件。如与 ARM 相关的库放在 lib_arm 中。
net:与网络
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
栈相关的代码,BOOTP 协议、TFTP 协议、RARP 协议和 NFS 文件系统
的实现。
tools:生成 U-BOOT 的工具,如:mkimage, crc 等等。
2/22
Super-ARM9 LUB-2410A-00
开发环境
目标板硬件环境
深圳旋极 Supper ARM 实验箱
z CPU: S3C2410
z SDRAM: HY57V561620(64MB)
z Nor Flash: E28f320 (4MB)
z Nand flash: K9F1208U0B(64MB)
z 以太网芯片:CS8900A
软件开发环境
z Linux 操作系统
z GNU 交叉编译工具 2.95.3:
z tftp 服务器
z minicom
3/22
Super-ARM9 LUB-2410A-00
存储器使用划分
我们公司的 supper arm 2410 实验系统的 nand flash 存取分配如下:
0x0
Nboot 0x20000
Eboot
0xc0000
wince
内核
0x2000000
U-BOOT 0x2030000
Linux
内核
0x2200000
Linux
文件系统
0x4000000
最终修改完成后的 u-boot 是存放在 nand flash 的 0x2000000(32MB)处,前 32MB 是存放
winCE 操作系统,而后 32MB 是存放 Linux 操作系统,u-boot 启动是通过 nboot 把整过 u-boot
拷到 SDRAM 运行,请修改 u-boot,能够把 u-boot 存放在 0x0 地址引导操作系统。
4/22
Super-ARM9 LUB-2410A-00
启动过程及工作原理
启动模式介绍
Boot Loader 一般都是两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别
仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作
系统,而并不存在所谓的启动加 载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即 Boot
Loader 从目标机 上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并
没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时
侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连
接或网络连接等通信手 段从主机(Host)下载文件,比如:下载内核映像和根文件系统映
像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被
BootLoader 写到目标机上的 FLASH 类固态存储设备中。Boot Loader 的这种模式通常在第
一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这
种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的
命令 行接口。
U-BOOT 这样功能强大的 Boot Loader 同时支持这两种工作模式,而且允许用户在
这两种工作模式之间进行切换。
启动流程
大多数 bootloader 都分为阶段 1(stage1)和阶段 2(stage2)两大部分,U-BOOT 也不例
外。依赖于 CPU 体系结构 的代码(如 CPU 初始化代码等)通常都放在阶段 1 中且通常
用汇编语言实现,而阶段 2 则通常用 C 语言来实 现,这样可以实现复杂的功能,而且有
更好的可读性和移植性。
阶段 1 介绍
U-BOOT 的 stage1 代码通常放在 start.s 文件中,它用汇编语言写成,其主要代码部分如
下:
1> 定义入口
由于一个可执行的 Image 必须有一个入口点,并且只能有一个全局入口,通常这个入口放
在 ROM(Flash)的 0x0
地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
1. board/crane2410/U-BOOT.lds: ENTRY(_start) ==> cpu/arm920t/start.S: .globl _start
2. U-BOOT 代码区(TEXT_BASE = 0x33F80000)定义在 board/crane2410/config.mk
5/22
Super-ARM9 LUB-2410A-00
2> 设置异常向量
_start:
B reset @0x00000000
ldr pc, _undefined_instruction @ 0x00000004
ldr pc, _software_interrupt @ 0x00000008
ldr pc, _prefetch_abort @ 0x0000000c
ldr pc, _data_abort @ 0x00000010
ldr pc, _not_used @ 0x00000014
ldr pc, _irq @ 0x00000018
ldr pc, _fiq @ 0x0000001c
当发生异常时,执行 cpu/arm920t/interrupts.c 中定义的中断处理
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
。
3> 设置 CPU 的模式为 SVC 模式
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
4> 关闭看门狗
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON
mov r1, #0x0 @根据三星手册进行调置。
str r1, [r0]
5> 禁掉所有中断
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
6> 设置以 CPU 的频率
默认频率为 FCLK:HCLK:PCLK = 1:2:4,默认 FCLK 的值为 120 MHz,该值为 S3C2410
手册的推荐值。
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
6/22
Super-ARM9 LUB-2410A-00
7> 设置 CP15
设置 CP15, 失效指令(I)Cache 和数据(D)Cache 后, 禁止 MMU 与 Cache。
cpu_init_crit:
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /*失效 I/D cache,见S3C2410手册附录的 2-16*/
mcr p15, 0, r0, c8, c7, 0 /*失效 TLB,见 S3C2410 手册附录的 2-18 */
/*
* 禁止 MMU 和 caches, 详见 S3C2410 手册附录 2-11
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 /* 清除 bits 13, 9:8 (--V- --RS)
* Bit 8: Disable System Protection
* Bit 7: Disable ROM Protection
* Bit 13: 异常向量
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
基地址: 0x0000 0000
*/
bic r0, r0, #0x00000087 /* 清除 bits 7, 2:0 (B--- -CAM)
* Bit 0: MMU disabled
* Bit 1: Alignment Fault checking disabled
* Bit 2: Data cache disabled
* Bit 7: 0 = Little-endian operation
*/
orr r0, r0, #0x00000002 /*set bit 2 (A) Align, 1 = Fault checking enabled */
orr r0, r0, #0x00001000 /*set bit12 (I)I-Cache,1=Instruction cache
enabled*/
mcr p15, 0, r0, c1, c0, 0
8> 配置内存区控制寄存器
配置内存区控制寄存器,寄存器的具体值通常由开发板厂商或硬件工程师提供. 如果您对总
线周期及外围 芯片非常熟悉 , 也可以自己确定 , 在 U-BOOT 中的设置文件是
board/crane2410/lowlevel_init.S, 该文件包含 lowleve_init 程序段.
mov ip, lr
bl lowlevel_init
mov lr, ip
9> 安装 U-BOOT 使的栈空间
下面这段代码只对不是从 Nand Flash 启动的代码段有意义,对从 Nand Flash 启动的代
码,没有意义。因为从 Nand Flash 中把 U-BOOT 执行代码搬移到 RAM,由 2.1.9 中代码
完成.
#ifndef CONFIG_SKIP_RELOCATE_U-BOOT
...
#endif stack_setup:
ldr r0, _TEXT_BASE /* 代码段的起始地址 */
sub r0, r0, #CFG_MALLOC_LEN /* 分配的动态内存区 */
sub r0, r0, #CFG_GBL_DATA_SIZE /* U-BOOT 开发板全局数据存放 */
#ifdef CONFIG_USE_IRQ
/* 分配 IRQ 和 FIQ 栈空间 */
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* 留下 3 个字为 Abort */
7/22
Super-ARM9 LUB-2410A-00
10> BSS 段清 0
clear_bss:
ldr r0, _bss_start /* BSS 段的起始地址 */
ldr r1, _bss_end /* BSS 段的结束地址 */
mov r2, #0x00000000 /* BSS 段置 0 */
clbss_l:
str r2, [r0] /* 循环清除 BSS 段 */
add r0, r0, #4
cmp r0, r1
ble clbss_l
11> 搬移 Nand Flash 代码
从 Nand Flash 中, 把数据拷贝到 RAM, 是由 copy_myself 程序段完成,
#ifdef CONFIG_S3C2410_NAND_BOOT
Bl copy_myself
12> 进入 C 代码部分
ldr pc, _start_armboot
_start_armboot: .word start_armboot
阶段 2 的 C 语言代码部分
lib_arm/board.c 中的 start armboot 是 C 语言开始的函数,也是整个启动代码中 C 语言的
主函数,同时还是整个 U-BOOT(armboot)的主函数,该函数主要完成如下操作:
1>调用一系列的初始化函数
指定初始函数表:
init_fnc_t *init_sequence[] = {
cpu_init, /* cpu 的基本设置 */
board_init, /* 开发板的基本初始化 */
interrupt_init, /* 初始化中断 */
env_init, /* 初始化环境变量 */
init_baudrate, /* 初始化波特率 */
serial_init, /* 串口通讯初始化 */
console_init_f, /* 控制台初始化第一阶段 */
display_banner, /* 通知代码已经运行到该处 */
dram_init, /* 配制可用的内存区 */
display_dram_config,
#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)
Checkboard,
#endif
NULL
}
执行初始化函数的代码如下:
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0)
{
hang ();
}
}
8/22
Super-ARM9 LUB-2410A-00
2> 配置可用的 Flash 区
flash_init ()
3> 初始化内存分配函数
mem_malloc_init()
4> nand flash 初始化
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
puts ("NAND:");
nand_init(); /* 初始化 NAND */
5> 初始化环境变量
env_relocate ();
6> 外围设备初始化
devices_init()
初始化网络设备
初始化相关网络设备,填写 IP、MAC 地址等。
设置 IP 地址
/* IP Address */
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
/* MAC Address */
{
int i;
ulong reg;
char *s, *e;
uchar tmp[64];
i = getenv_r ("ethaddr", tmp, sizeof (tmp));
s = (i > 0) ? tmp : NULL;
for (reg = 0; reg < 6; ++reg) {
gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
}
进入主 U-BOOT 命令行
进入命令循环(即整个 boot 的工作循环),接受用户从串口输入的命令,然后进行相
应的工作。
for (;;) {
main_loop (); /* 在 common/main.c */
}
9/22
Super-ARM9 LUB-2410A-00
代码搬运
为了支持 NAND flas 起动,S3C2410 内建了内部的 4k 的 SRAM 缓存“Steppingstone”。
当起动时,NAND flash 最初的 4k 字节将被读入”Steppingstone”然后开始执行起动代码。
通常起动代码会把 NAND flash 中的内容 拷到 SDRAM 中以便执行主代码。
使用硬件的 ECC, NAND flash 中的数据的有效性将会得到检测。
功能
1> NAND flash 模式:支持读/删除/编程 NAND Flash
2>自动起动模式:在复位时起动代码将被读入”Steppingstone”中,然后开始执行起动代码。
3>硬件 ECC 检测模块(硬件检测,软件纠正)
4>“Steppingstone” 4-KB 内部 SRAM 在起动后可以另外使用。
10/22
Super-ARM9 LUB-2410A-00
移植步骤
设置编译工具
把 corss2.95.3.tar.bz2 解压到\usr\local\arm 目录下,这样就建立的交叉编译环境,然后增
加/usr/local/arm/2.95.3/bin 到路径环境变量 PATH=$PATH:/usr/local/arm/2.95.3/bin,可以用
echo $path 检查路径变量是否设置正确。或修改 U-BOOT 下的 makefile:把 CROSS-COMPILE
= arm-linux- 改为实际目录.
修改 Makefile
为 wtk2410 建立编译项
wtk2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t wtk2410 NULL s3c24x0
各项的意思如下:
arm: CPU 的架构(ARCH)
arm920t: CPU 的类型(CPU),其对应于 cpu/arm920t 子目录。
wtk2410: 开发板的型,对应于 board/wtk2410 目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
在 board子目录建立 wtk2410
在 board 建立 wtk2410 开发版目录,可以拷背原版 smdk2410
#cp -rf board/smdk2410 board/wtk2410
#mv board/wtk2410/smdk2410.c wtk2410.c
在 include/configs/建立配置头文件 wtk2410.h
拷背 smdk2410.h 即可
#cp include/configs/smdk2410.h include/configs/wtk2410.h
测试编译能否成功
在 U-BOOT 目录下运行以下编译命令,如果没有错误则通过
#make clobber
#make wtk2410_config
#make
11/22
Super-ARM9 LUB-2410A-00
修改 lowlevel_init.S内存配置文件
修改/board/wtk2410 的文件的宏定义参数如下
#define BWSCON 0x48000000
/* BWSCON */
#define DW8 (0x0)
#define DW16 (0x1)
#define DW32 (0x2)
#define WAIT (0x1<<2)
#define UBLB (0x1<<3)
#define B1_BWSCON (DW16)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
/* BANK0CON */
#define B0_Tacs 0x3 /* 4clk */
#define B0_Tcos 0x3 /* 4clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x3 /* 4clk */
#define B0_Tah 0x3 /* 0clk */
#define B0_Tacp 0x3
#define B0_PMC 0x0 /* normal */
/* BANK1CON */
#define B1_Tacs 0x3 /* 0clk */
#define B1_Tcos 0x3 /* 0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x3 /* 0clk */
#define B1_Tah 0x3 /* 0clk */
#define B1_Tacp 0x3
#define B1_PMC 0x0
#define B2_Tacs 0x0
#define B2_Tcos 0x0
#define B2_Tacc 0x7
#define B2_Tcoh 0x0
#define B2_Tah 0x0
#define B2_Tacp 0x0
#define B2_PMC 0x0
#define B3_Tacs 0x0 /* 0clk */
#define B3_Tcos 0x3 /* 4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x1 /* 1clk */
#define B3_Tah 0x0 /* 0clk */
#define B3_Tacp 0x3 /* 6clk */
#define B3_PMC 0x0 /* normal */
#define B4_Tacs 0x3 /* 0clk */
#define B4_Tcos 0x3 /* 0clk */
12/22
Super-ARM9 LUB-2410A-00
#define B4_Tacc 0x7 /* 14clk */
#define B4_Tcoh 0x3 /* 0clk */
#define B4_Tah 0x3 /* 0clk */
#define B4_Tacp 0x3
#define B4_PMC 0x0 /* normal */
#define B5_Tacs 0x0 /* 0clk */
#define B5_Tcos 0x0 /* 0clk */
#define B5_Tacc 0x7 /* 14clk */
#define B5_Tcoh 0x0 /* 0clk */
#define B5_Tah 0x0 /* 0clk */
#define B5_Tacp 0x0
#define B5_PMC 0x0 /* normal */
#define B6_MT 0x3 /* SDRAM */
#define B6_Trcd 0x2 /* 行地址产生后, 再产生列地址的延时时间 */
#define B6_SCAN 0x1 /* 9bit */
#define B7_MT 0x3 /* SDRAM */
#define B7_Trcd 0x2 /* 3clk */
#define B7_SCAN 0x1 /* 9bit */
/* REFRESH parameter */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trp 0x0 /* 2clk */
#define Trc 0x3 /* 7clk */
#define Tchr 0x2 /* 3clk */
#define REFCNT 1113 /* 刷新周期 period=15.6us, 总线时钟 HCLK=101.2Mhz,
(2048+1-15.6*60)=486, 刷新不占用总线,在取指令的第三个时钟周期执行刷新, 刷新快一点
也没关系 */
在
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
的后面加上一下代码:
mov r3, pc
ldr r4, =0xffff0000
and r3, r3, r4
add r0, r0, r3
add r2, r2, r3
13/22
Super-ARM9 LUB-2410A-00
移植 Nor Flash驱动
\board\wtk2410\flash.c 文件是 cup 的 norflash 驱动文件, 我们核心板上的 flash 是 intel 的
E28F320J3A,smdk2410 的 flash 驱动是针对 AMD 型号的,所以整个驱动都改写, 故我们可以
从/board 目录下找到 CMI 主板,它用的是 intel 的 flash,把 cmi 中的 flash.c 拷到 wtk2410 目
录下替换原来的 flash.c,并进行修改,因为我们的硬件的 Nor Flash 是 32 位,所以要把原来
支技 16 位的函数修改为 32 位。我们删除它的 write_short 和 write_buff 函数,把 ep7312 主
板目录中的 flash.c 文件中的 write_word 和 write_buff 函数复制过来就行,这样 U-BOOT 就
可以从 E28F320(Nor Flash)操作了,最终 flash.c 驱动文件就能移植成功。如果只把 U-BOOT
放在 nand flash 引导,这 norflash 驱动可以不做。
增加 Nand Flash驱动
由于本系统采用的是 U-BOOT 从 nand flash 中启动,而 U-BOOT 并不支持从 Nand Flash
启动,故按照 bootload 的启动方法对 U-BOOT 进行改造,添加支持从 Nand Flash 启动的配
置,实现将他自己从 Nand Flash 拷贝到 SDRAM,我们使用的 nand 设备型号是三星的
k9f1208,所以也需对 s3c2410 的有关 nand 控制的寄存器进行设置。
主要做修改的地方有:
>增加了/cpu/arm920t/s3c24x0/nand_read.c 文件及配置同目录的 Makefile
>修改了/board/wtk2410/wtk2410.c 文件
>修改了/cpu/arm920t/start.S 文件,具体请看 start.s 引导文件修改
>修改了/include/configs/wtk2410.h 文件,具体请看 wtk2410.h 配置文件修改
♦ 在/cpu/arm920t/s3c24x0 中添加 Nand Flash 的读函数 nand_read.c 文件,对 nand 进行操作
时必须调用到 nand 的读取函数。
其代码如下:
#include
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned short *)(x))
#define NF_BASE 0x4e000000
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
#define BUSY 1
inline void wait_idle(void) {
int i;
while(!(NFSTAT & BUSY))
for(i=0; i<10; i++);
}
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
/*low level nand read function */
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i,j;
/* chip Enable */
NFCONF &= ~0x800;
for(i=0; i<10; i++);
for(i=start_addr; i<(start_addr +size);) {
14/22
Super-ARM9 LUB-2410A-00
/* READ0 */
NFCMD = 0;
/* Write Address */
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >>17) & 0xff;
NFADDR = (i >>25) & 0xff;
wait_idle();
for(j=0; j
extern ulong nand_probe(ulong physadr);
extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
void nand_init(void)
{
int i;
S3C2410_NAND * nand = S3C2410_GetBase_NAND();
/*NF_Init();*/
nand->NFCONF = (1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(0<<8)|(3<<4|0<<0);
/*reset*/
nand->NFCONF = nand->NFCONF&~(1<<11);
nand->NFCMD = 0xff;
for(i = 0; i < 10; i++);
while(!(nand->NFSTAT&(1<<0)));
nand->NFCONF = nand->NFCONF|(1<<11);
printf("%4lu MB\n",nand_probe((ulong)nand)>>20);
}
#endif
这个函数相当关键,是监测 nand 设备的函数,不监测根本就不能操作 nand。
修改 cpu\arm920t\start.S 引导文件
♦ 在 start.S 中在需要设置的 nand 代码前面加入下面的宏定义:
#define NAND_CTL_BASE 0x4E000000
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define Onfaddr 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
15/22
Super-ARM9 LUB-2410A-00
♦ 增加 nand flash 启动执行代码
#ifndef CONFIG_SKIP_RELOCATE_U-BOOT
relocate: /* relocate U-BOOT to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or