这里使用的uboot并非uboot官方发布的uboot代码,而是为三星定制的一个uboot版本s3c-u-boot-1.1.6,其代码作者就包括了三星的程序员与denx的员工。这个版本支持SD启动,不过默认是nand启动,使它支持uboot需要做以下事情:
1、 虽然支持uboot启动,但是uboot代码里不叫SD启动方式,而是叫movinand启动方式,在incluede/configs/smdk6410.h中就有这个选项,所以在这个文件里关闭nand启动,打开movinand启动就可以了:
//#define CONFIG_BOOT_NOR
//#define CONFIG_BOOT_NAND 注释nand启动
#define CONFIG_BOOT_MOVINAND 打开movinand启动
//#define CONFIG_BOOT_ONENAND
//#define CONFIG_BOOT_ONENAND_IROM
#define CONFIG_NAND
//#define CONFIG_ONENAND
#define CONFIG_MOVINAND 打开movinand选项,使uboot支持movinand的操作
2、如果单纯是做上面的改动,还是不够的,在运行的时候会发现到了一定的时候uboot就死掉了,其实这是因为uboot中假设SMDK6410在使用
SD方式的时候是从CH0启动的,但是手上的这个板子是通过CH1启动,那么在运行被复制到SRAM中的8K代码时候没办法在CH0检测到SD,更没办法
将SD 里的代码复制到SDRAM中。修改办法是在incluede/
movi.h中HSMMC_CHANNEL修改为1。
3、然后如果将上述修改后编译出来的u-boot.bin通过IROM_Fusing_tools直接烧写到SD中也是没办法启动的,需要运行以下的命令进行处理:
cat u-boot.bin >> temp
cat u-boot.bin >> temp
split -b 256k temp
mv xaa u-boot_256k.bin
split -b 8k u-boot.bin
mv xaa u-boot_8k.bin
cat u-boot_256k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin
经过这些处理,实际上是将u-boot.bin内容重复一次后(为了保证达到256K,如果这个bin更小,那么可能需要重复3次、4次,直到超过
256K 为止),将前256K制成u-boot_256k.bin,再将前8K制成u-boot_8k.bin,最后将u-boot_256k.bin
+u-boot_8k.bin合并成一个256K+8K大小的文件u-boot_mmc.bin,这个文件前256K就是u-boot_256k.bin
而后8K就是u-boot_8k.bin。把这个u-boot_mmc.bin通过IROM_Fusing_tools烧写到SD卡就可以成功启动系统
了。
为什么要做这样的处理这个bin文件呢?下面通过分析IROM_Fusing_tools、uboot的源码来揭示其中的由来。
从网上可以下载到IROM_Fusing_tools的源码,在按下这个软件的start控件后,先是读取这个SD卡的第一个扇区,也就是这个磁盘的
MBR
扇区,判断是不是FAT32格式的磁盘(这也是为什么用来做启动的SD必须格式化为FAT32格式),接着获取总的扇区数目TOTAl_SECOTR,并
将所要烧写的bin文件烧写到磁盘的这个扇区:TOTAL_SECTOR – 2 -
SIZE_OF_IMAGE/512。其中TOTAl_SECTOR是这个磁盘总的扇区数目;SIZE_OF_IMAGE/512是这个bin文件将要占
据的扇区数(这里是以512为扇区大小的,因此对于扇区更大的SD卡也就没办法使用了,而现在的大容量SD都可能使用了2K甚至4K的扇区,除非修改这个
程序,并同步地在uboot中修改程序);至于2则是保留的2个扇区,至于为什么要保留这2个扇区,需要分析uboot的源码情况,下面将做进一步的阐
述。
在SD启动方式下,S3C6410内部的IROM程序BL0首先运行,并将SD中的最后18个扇区开始的16个扇区内容复制到片内
的8K
SRAM,也就是SteppingStone,接着跳转到这块SRAM的开始地址开始运行,这8K的代码实际上就是上面u-boot_mmc.bin这个
文件的最后8K,也是u-boot.bin的最开始8K代码,这段代码也叫BL1。从BL0跳转到BL1的时候uboot也就接管了CPU。
Uboot的入口在start.S这个文件,cpu/s3c64x0/start.S中有这样一段代码:
#ifdef CONFIG_BOOT_MOVINAND
ldr sp, _TEXT_PHY_BASE
bl movi_bl2_copy
b after_copy
#endif
这段代码是实现SD启动的关键。到了这里后就执行movi_bl2_copy,这个函数负责将SD内的uboot完整地复制到SDRAM,这时候完整的uboot也叫BL2,而这个函数实际上是调用了以下函数:
CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);
HSMMC_CHANNEL这是SD/MMC通道号,手上板子使用的是CH1,而默认是CH0,所以需要对这个进行修改。
MOVI_BL2_POS
是需要拷贝的数据位于SD的起始扇区,其计算办法是这样的,先得到这个SD的总扇区数TOTAL,再减去256K的BL2和8K的BL1所占的扇区数,最
后减去0.5K
的eFuse和0.5K的保留区所占的扇区数,而这里还定义SD的扇区为512B。从这里可以看到和IROM_Fusing_tools对SD卡的处理是
完全对应的。这里还有一个问题,总扇区数TOTAL是如何得到的?从程序来看是从(TCM_BASE -
0x4)这个地址读取到的,至于TOTAL是如何被放到这里的就只能从BL0的代码找答案了。
MOVI_BL2_BLKCNT是需要复制的扇区数目,这里就是定义为256K,这也是为什么必须把u-boot.bin转换成256K的文件。
BL2_BASE是目的地址,也就是SDRAM中的地址。这里定义为0x57E00000,就是128M 的SDRAM的最后2M,因为到这里为止MMU尚未打开,因此这里使用的是物理地址。
MOVI_INIT_REQUIRED这个参数的意义是什么暂时没有任何资料说明。
而CopyMovitoMem这个函数的定义是这样的:
#define CopyMovitoMem(a,b,c,d,e) (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(TCM_BASE + 0x8))))(a,b,c,d,e))
这个定义实际上是调用了位于TCM_BASE + 0x8这个地址的函数指针,其中TCM_BASE的值为0x0C004000,至于这个地址放的是什么,也没资料说明。
当复制完BL2后便会跳转到BL2的start_armboot这个C语言函数中运行了,此后的运行过程就不需要再分析了。
分享到:
相关推荐
### 使U-Boot支持S3C6410的SD启动详解 #### 一、背景介绍 S3C6410是一款由三星推出的高性能嵌入式处理器,广泛应用于移动设备、工业控制等领域。而U-Boot作为一款开放源码的启动加载器,能够支持多种处理器架构和...
《S3C6410 SD卡启动裸机代码详解》 S3C6410是一款基于ARM11架构的高性能微处理器,常用于嵌入式系统开发。本篇文章将详细探讨S3C6410如何通过SD卡启动,并实现从串口下载程序的功能。这种启动方式在无UBOOT支持的...
本文旨在详细解析如何使 U-Boot 支持 Samsung 的 S3C6410 平台通过 SD 卡启动。这里的 U-Boot 版本并不是官方发布的通用版本,而是专为三星定制的 s3c-u-boot-1.1.6,该版本由三星和 Denx 共同开发。默认情况下,该...
6410 SD uboot 烧录工具是一款专门针对Samsung S3C6410处理器的嵌入式系统开发工具,主要用于在SD卡上烧录uboot引导加载程序。uboot是开源的微控制器固件,它在系统启动时执行初步的硬件初始化和加载操作系统映像到...
针对s3c2416开发板,从SD卡启动uboot,不需要修改,直接编译bin文件用IROM_Fusing_Tool工具烧录到SD卡中,然后跳线从SD卡即可启动UBOOT
6410 UBOOT 是一款针对特定硬件平台(可能是基于Samsung S3C6410处理器的嵌入式设备)的引导装载程序,其主要功能是初始化系统硬件,加载操作系统内核并将其传递到内存中执行。这个描述提及了6410 UBOOT 对SD/SDHC卡...
《ARM11 S3C6410 UBOOT与Linux内核详解》 在嵌入式系统领域,ARM11架构的处理器以其高效能、低功耗的特点被广泛应用。S3C6410作为三星公司推出的一款基于ARM11内核的处理器,集成了丰富的外围设备接口,广泛应用于...
1. **NAND Flash 支持**:S3C2440 芯片内置了 NAND Flash 存储器,uboot-s3c2440 版本包含了对 NAND Flash 的驱动和相关命令,如读写、擦除操作,这对于在 NAND Flash 上存储和管理操作系统映像是至关重要的。...
《S3C6410 UBoot 1.1.6移植指南——立宇泰解析》 S3C6410是一款由三星公司推出的高性能、低...通过立宇泰的移植指南,开发者可以更好地应对这一挑战,充分利用UBoot的功能,为S3C6410平台构建可靠且高效的启动环境。
【tiny6410 uboot】是一个专门为基于Samsung S3C6410处理器的开发板设计和优化的U-Boot启动加载器。U-Boot是嵌入式系统中广泛使用的开源固件,它提供了系统启动时的基本功能,如硬件初始化、文件系统管理、网络通信...
S3C6410提供了丰富的外设接口,开发过程中往往需要编写相应的驱动程序来使这些硬件设备正常工作。例如,针对GPIO(General Purpose Input/Output)接口,需要编写驱动来读写GPIO引脚状态;对于LCD显示屏,需要实现帧...
**S3C2440-Uboot移植** 在嵌入式系统开发中,U-Boot是一个重要的引导加载程序,用于初始化硬件,加载操作系统内核,并提供了一种与系统交互的命令行界面。本文将深入探讨如何将U-Boot移植到基于三星S3C2440处理器的...
uboot s3c2440补丁集合是一个专门针对S3C2440微处理器的U-Boot启动加载器的更新和改进集合。U-Boot是一款广泛使用的开源固件,用于多种嵌入式设备的引导过程,而S3C2440是三星公司生产的一款基于ARM920T内核的微...
2. **系统烧写**:通过SD卡将Linux系统烧写到开发板的Nandflash中,这涉及到制作SD卡、拷贝必要的镜像文件(如uboot、zImage和rootfs),并进行启动模式切换。 3. **硬件接口探索**:在熟悉了S3C6410的基本架构后,...
对于S3C6410来说,U-Boot的移植不仅能够实现基本的启动功能,还能进一步扩展其功能,例如网络启动、SD/MMC卡启动等。 #### 二、准备工作 1. **开发环境**:本例使用的是U-Boot 2012.04版本,在x86架构下的Red Hat ...
1. **理解SD启动模式**:在S3C-U-Boot-1.1.6中,虽然支持SD卡启动,但默认配置为NAND闪存启动。需要通过修改配置文件启用SD卡启动功能。 2. **配置文件修改**:主要涉及`include/configs/smdk6410.h`文件中的启动...
在开发或调试过程中,理解6410 SD BOOT 256K SDMA的工作原理和功能,以及如何正确配置和使用uboot1.1.6_256M,对于成功启动和运行基于S3C6410处理器的系统至关重要。这涉及深入理解嵌入式系统架构、存储器管理、设备...
本教程将详细介绍如何针对 S3C6410 处理器进行 U-Boot 的移植工作,采用的是 U-Boot 2011.06 版本,因为该版本对 S3C6410 提供了良好的支持。 移植环境主要包括一台装有 VMWare-ubuntu 的主机和一个 ok6410 开发板...
板级解析涉及到配置 Uboot 以匹配 mini6410 开发板的硬件特性,如处理器型号(S3C6410)、内存大小、I/O 接口等。这通常通过修改或生成配置文件如 `config.mk` 和 `config.h` 来实现。 4. **Uboot 文件库编译**: ...
2440UBoot是针对Samsung S3C2440微处理器的引导加载程序,它在嵌入式系统开发中扮演着至关重要的角色。UBoot全称为Universal Boot Loader,是一款开放源代码的、功能强大的嵌入式设备引导软件,它负责初始化硬件,...