首页 U-BOOT移植指南

U-BOOT移植指南

举报
开通vip

U-BOOT移植指南 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 目录 目...

U-BOOT移植指南
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
本文档为【U-BOOT移植指南】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_671498
暂无简介~
格式:pdf
大小:322KB
软件:PDF阅读器
页数:26
分类:互联网
上传时间:2010-08-08
浏览量:37