Uboot的VIVI与UBOOT
嵌入式整体框架——总结

嵌⼊式整体框架——总结嵌⼊式应该什么都要涉及的到,从最开始的51单⽚机,之后到⾼级⼀些的微控制器 ARM cortexM3 M4等,STM32最为典型,她的主要特点就是功耗低,性能还算好些,再信号处理领域⽐较强的就要选择TI的DSP了,这些都算是不能跑linux系统的,因为他们都不带MMU (内存管理单元),所以⼤部分都是裸机跑,或者任务多的时候,⽤⼀些实时操作系统,如UcosII uclinux MQX vxworks等等什么的,DSP 跑的是⾃⼰的操作系统内核,叫Bios,也是很强⼤的。
这些主频可以从⼏⼗Mhz到200M左右Mhz不等,如果再⾼点的话,那就要选择,ARM7 ARM9 ARM11 MIPS POWERPC等等的,但是ARM7现在已经很少使⽤了。
⼤部分都是ARM, POWERPC的性能是⽐较强悍的,可能说是最强悍的,开发板也好贵,好⼏K,仿真器那更是如此。
但是耗能,MIPS可以说是位于两者之间。
从开始到现在,我设计到了不少的芯⽚,但是玩转的确实没有⼏个,从STM32F103 STM32F205 等东芝的cortexM3的还有飞思卡尔半导体K40 k60 基于cortexM4内核的,再到DSPF2812 c2000 系列的,DSP28335 之后到ARM9 三星的2440 之后到POWERPC51单⽚机 keil51开发裸机程序stm32 IAR KEIL4 4.6版本带ucosii系统和裸机的 jlink ulink都可以dsp CCS5.5 ⾃带系统的Bios的仿真器⽤的是合众达的SEED XDS510 560等,前者⼀个1500左右或者5000多,伤不起ARM9 ADS开发裸机程序⽤的 jlinkSTM32这个因为ST公司芯⽚出来的时候有固话的bootloader ,还不能改,所有如果这个bootloader的所有启动过程,如果有你不满意的地⽅,你只能⾃⼰从新写⼀个新的⾃⼰的bootloader了⽤于IAP编程,可以有⽹管系统⼀键下载,不⽤到线程,⽽ISP 只能短距离的,只能去现场了我把STM32的0x08000000 到0x08005000 这段作为bootloader区,内部协议⽤Ik xmordem,其余的空间⽤作⽤户的应⽤程序,ARM9 的bootloader⼀般分为vivi uboot等,vivi是三星芯⽚专⽤的,所有如果你的设备选的是三星的ARM 那么⽤vivi很好很强⼤,移植改起来也⽅便uboot呢,⽐vivi复杂,但是功能强⼤,在移植在MIPS powerpc arm等,都能⽤开发linux嵌⼊式产品⽐单⽚机难写,我理解的是这么个过程1.先选择开发设备的所使⽤的硬件资源,芯⽚什么的都确定好,之后硬件⼯程师开始做板⼦2,软件⼯程师开始搭交叉编译环境,arm 或者powerpc的等,看你什么芯⽚了3,开始移植编译vivi或者uboot,简单,针对于不同芯⽚时钟,驱动都配置好,就可以了4,之后把vivi通过H jtag 或者klink (ARM)把vivi烧写进去,ARM启动的时候分为norflash启动和nandflash启动先选好,因为两者的内存映射是不⼀样的,⽤norflash启动的话,直接把norflash的地址和0x00000000映射在⼀起就ok了因为norflash也是总线型的,直接发地址就能得到数据,但是nandFlash接⼝,不⼀样,还需要⼀定的算法,必须先给命令,之后给地址才能出数据,因此,⼀般从nandflash启动的时候,要先把nandflash的前4k代码copy出来到bootram中去,之后把bootram的地址映射到0x00000000所以这个要记住了5.开始移植配置内核,6内核版本选好,之后根据硬件设计的资源开始配置编译内核,第⼀次编译,错误多多,慢慢来吧没办法7之后可以编译出来⼀个zimage内核镜像⽂件8之后通过vivi ⽤串⼝或者⽹⼝把内核镜像⽂件也烧写到flash中去9 之后是⽂件系统10之后就是应⽤程序驱动的话,差别还是蛮⼤的,单⽚机是直接和硬件打交道,要看懂芯⽚⼿册,⽽且好多东西是不可服⽤的,如果你要写can驱动,你的设备上有三个can⼝那你就可能要写三个can的驱动,虽说这三个驱动,除了中断好,地址,IO⼝等不⼀样,其于的配置都差不多,但是你也要写三个,linux的驱动就不会这样,他典型的架构,和设备驱动模型,给驱动的开发带来了很多的好处,并且只看法⼀个can驱动,其他的都能复⽤,对于linux驱动来说,⼤部分设备驱动在买芯⽚的时候,如果是常见的芯⽚,linux内核⾥⾯都有的或者与之类似芯⽚的驱动,只需要简单的改改,移植就可以了,如果说linux内核没有这个类似芯⽚的驱动,那么⼚家也会有相应做好的了驱动,我们只要会修改就好了。
u-boot应用分析

嵌入式系统工程师u-boot应用分析大纲常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析u-boot应用分析常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析vivi简介:vivi是由韩国MIZI公司开发的专门用于ARM产品线的一种Bootloader,主要参考Linux2.4内核开发特点:主要支持Samsung系列芯片,命令简单方便,其配置原理与编译过程与Linux非常相似,通过对其源码的分析可以加深对Linux配置过程的理解功能:初始版本只支持串口下载,速度较慢,在网上出现了各种改进版本,主要支持:常见的串口协议、网络协议、USB下载、YAFFS镜像烧写等HBOOT简介:HTC智能手机中常用的Bootloader,也可能是前几种Bootloader的一种或者几种的融合体,被HTC定制,是典型的两阶段启动,分别是:IPL和SPL。
IPL:即Initial Program Loader,是硬件上电后启动第一段程序,负责最初硬件(Nand Flash,CPU,SDRAM)初始化,然后再把SPL程序装到RAM指定位置。
SPL:完成更多更复杂的硬件初始化,且往往支持很多复杂命令,比如网络、USB下载(fastboot线刷)、SD升级(卡刷)等,最终将操作系统装入到RAM中运行。
特点:主要支持HTC系列手机PPCBoot简介:是德国DENX小组开发的用于多种嵌入式CPU的Bootloader引导程序,主要由德国工程师Wolfgang Denk和Internet上的一群自由开发人员对其进行维护和开发特点:支持PowerPC、ARM、MIPS、M68K等多种处理器平台,易于裁剪和调试ARMBoot简介:armboot主要是针对ARM或者StrongARM CPU等相关嵌入式系统所设计的特点:它支持多种类型的Flash,网络下载协议支持bootp和tftpu-boot简介:u-boot最初是由PPCBoot发展而来的,可以引导多种操作系统、支持多种架构的CPU,它对PowerPC系列处理器的支持最为完善,而操作系统则对Linux系统的支持最好目前已成为Armboot和PPCboot的替代品特点:主要支持操作系统:Linux、NetBSD、 VxWorks、QNX、RTEMS、ARTOS、LynxOS等主要支持处理器架构:PowerPC、MIPS、x86、ARM、NIOS、XScale等u-boot目前最新版本是:http://ftp.denx.de/pub/u-boot/u-boot应用分析常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析源码目录目录结构介绍:board:开发板相关,根据厂商进行分类,如当前平台board\samsung\unsp210,包含第一阶段要用到的一些初始化程序:lowlevel_init.Scpu:体系结构相关,按架构进行分类,如当前架构cpu\s5pc11x,第一阶段启动代码start.S就在这里common:各种命令的实现,通常一个命令就是一个C文件include:各种头文件和开发板配置文件,如include\configs\unsp210.h目录结构介绍:api/api_examples:用于演示测试用的代码,通常不参与工程编译disk:硬盘接口程序,disk驱动分区处理代码,嵌入式不常用doc:开发使用文档,主要介绍不同平台的配置编译方法drivers:设备驱动,如:网卡、SD卡、USB等examples:一些独立运行的实例,通常不参与工程编译fs:所能支持的文件系统,如fat、ubifs等,用于访问带文件系统的存储设备目录结构介绍:lib_arm:用于存放平台依赖文件,如第二阶段代码入口(start_armboot())、中断处理、启动相关等,其它以“lib_”开头的也是类似lib_generic:存放通用且不依赖于平台的库,如一些C库,终端操作接口等nand_spl:一些配置参考文件net:独立于网卡驱动的网络协议,如用于下载传输的TFTP协议,网络文件系统中的NFS协议等onenand_bl1:onenand启动的第一阶段代码onenand_ipl:onenand启动时,IPL和SPL过程中的第一个过程,即初始化阶段目录结构介绍:post:上电自检程序,与旧的PPC相关,当前平台下未编译到工程sd_fusing:一些操作SD卡的脚本,主要用于制作SD引导启动相关tools:工具软件,如mkimage用于制作内核镜像,scripts用于生成指定的config.mk配置文件,还有支持GDB的调试工具等u-boot的配置编译需要经过以下步骤:1、在u-boot的根目录下执行:#make unsp210_config //对应开发板配置Makefile 会构建编译结构,如:架构、cpu、开发板、厂商、芯片、目录等,为下一步真正编译链接做准备。
uboot 汇编指令

U-Boot(Universal Boot Loader)是一个开源的、通用的引导加载程序,支持多种处理器架构和嵌入式系统。
在U-Boot中,汇编指令的使用主要涉及对硬件的低级操作和优化。
以下是一些常见的U-Boot汇编指令及其作用:
1.ldr:这是一个加载指令,用于从内存中读取数据并将其加载到寄存器中。
例如,ldr r0,=0x12345678将把地址0x12345678处的值加载到寄存
器r0中。
2.str:这是一个存储指令,用于将数据从寄存器存储到内存中。
例如,str r0,[r1]将把寄存器r0中的值存储到r1指向的内存地址中。
3.mov:这是一个移动指令,用于将数据从一个位置移动到另一个位置,而不对数据进行任何操作。
例如,mov r0,r1将把寄存器r1的值复制到寄存
器r0中。
4.add和sub:这些是算术指令,用于对数据进行加法或减法操作。
例如,add r0,r1,r2将把寄存器r1和r2的值相加,结果存储在寄存器r0中。
5.cmp:这是一个比较指令,用于比较两个值的大小。
它不保存结果,但会设置条件标志,这可以用于控制程序流。
例如,cmp r0,r1将比较寄存器
r0和r1中的值。
6.and、orr、eor等:这些是逻辑指令,用于执行逻辑与、或、异或等操作。
这些只是U-Boot汇编语言中的一部分指令,还有许多其他指令和语法结构。
建议查阅U-Boot的官方文档或参考手册以获取更详细的信息和示例。
uboot 启动参数

uboot 启动参数UBOOT是一种常用的启动程序,它能够运行在各种不同的硬件平台上,并且可以通过修改启动参数来适配不同的硬件环境。
下面将分步骤介绍UBOOT启动参数的相关内容。
第一步:获取UBOOT源码首先,需要在官方网站上下载UBOOT源码。
下载完成后,需要解压缩源码包,并通过命令行进入到UBOOT文件夹中。
第二步:配置启动参数配置启动参数需要修改UBOOT的配置文件。
在UBOOT源码目录下,有一个名为“config”的文件夹,其中包含了多个不同的配置文件。
每个配置文件对应着一个不同的硬件平台,可以选择对应的配置文件来进行修改。
打开对应的配置文件,找到“CONFIG_BOOTARGS”这个选项。
这个选项控制了UBOOT的启动参数,包括了启动时使用的内核命令参数、系统启动模式、显示分辨率、硬件时钟等等内容。
根据硬件的不同,需要根据实际情况来进行修改。
如果是嵌入式系统,需要将内核命令参数设置为启动时需要加载的模块和驱动程序;如果是开发板,需要指定启动模式为SD卡或者串口下载模式。
第三步:保存配置文件完成启动参数的修改后,需要保存配置文件。
保存后,可以通过编译UBOOT并将其烧录到目标硬件中。
第四步:运行UBOOT运行UBOOT的方式与平台有关。
在某些开发板上,可以通过在串口终端中运行“boot”命令来启动系统。
在嵌入式系统中,可以通过修改启动顺序来选择从NOR Flash或者SD卡中加载UBOOT。
总结通过上述步骤,可以修改UBOOT的启动参数,并实现对不同硬件平台的适配。
通过正确配置启动参数,可以使系统运行更加稳定,并且更加符合实际需求。
因此,UBOOT启动参数的修改是嵌入式开发中不可忽视的一部分。
Linux系统移植之—uboot移植,你们要的uboot终于来了,堪称精品

Linux系统移植之—uboot移植,你们要的uboot终于来了,堪称精品作为一名过来人,uboot、kernel对每个学linux的来说都有很深的情谊,因为它们是一个系统跑起来的最基础,每个学linux的都会首先接触到。
而它们本身就是一个精美的小系统,里边代码所体现的逻辑、算法以及每个绝妙的C知识点都让你沉醉其中。
uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核。
具体内容如下:1 uboot 的介绍及系统结构1.1 uboot 介绍1.2 获取 uboot1.3 uboot 体系结构1.3.1 uboot 目录结构2 uboot 的启动过程及工作原理2.1 启动模式介绍2.2 阶段 1 介绍2.2.1 定义入口2.2.2 设置异常向量2.2.3 设置 CPU 的模式为 SVC 模式2.2.4 关闭看门狗2.2.5 禁掉所有中断2.2.6 设置以 CPU 的频率2.2.7 设置 CP152.2.8 配置内存区控制寄存器2.2.9 安装 UBOOT 使的栈空间2.2.10 BSS 段清 02.2.11 搬移 Nand Flash 代码2.2.12 进入 C 代码部分2.3 阶段 2 的 C 语言代码部分2.3.1 调用一系列的初始化函数2.3.2 初始化网络设备2.3.3 进入主 UBOOT 命令行2.4 代码搬运3 uboot 的移植过程3.1 环境3.2 步骤3.2.1 修改 Makefile3.2.2 在 board 子目录中建立 crane2410 3.2.3 在 include/configs/中建立配置头文件3.2.4 指定交叉编译工具的路径3.2.5 测试编译能否成功3.2.6 修改 lowlevel_init.S 文件2.9 UBOOT 的 Nand Flash 移植3.2.8 重新编译 uboot3.2.9 把 uboot 烧入 flash4.2 常用命令使用说明4.2.1 askenv(F)在标准输入(stdin)获得环境变量。
2440超详细U-BOOT(UBoot介绍+H-jtag使用+Uboot使用)

凌FL2440超详细U-BOOT作业(UBoot介绍+H-jtag使用+Uboot使用)Bootloader是高端嵌入式系统开发不可或缺的部分。
它是在操作系统内核启动之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
现在主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。
希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正。
首先说一下什么是Uboot:U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FAD SROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linu x系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
vivi与uboot的用法

vivi> helpUsage:cpu [{cmds}] -- Manage cpu clocksbon [{cmds}] -- Manage the bon file systemreset -- Reset the systemparam [set|show|save|reset] -- set/get parameterpart [add|del|show|reset] -- Manage MTD partitionsmem [{cmds}] -- Manage Memoryload {...} -- Load a file to RAM/Flashgo <addr> <a0> <a1> <a2> <a3> -- jump to <addr>dump <addr> <length> -- Display (hex dump) a range of memory.call <addr> <a0> <a1> <a2> <a3> -- jump_with_return to <addr>boot [{cmds}] -- Booting linux kernelbootucos [{cmds}] -- Booting ucos systemhelp [{cmds}] -- Help about help?tftp {...} -- Get a file From Tftp Server to RAM/Flash autoip {...} -- Grab an address via bootp. No args.setip {client|server} ip -- Set IP addresses for TFTP Get.●显示启动参数vivi> param showNumber of parameters: 9name : hex integer-------------------------------------------------------------mach_type : 000000c1 193media_type : 00000003 3boot_mem_base : 30000000 805306368baudrate : 0001c200 115200xmodem_one_nak :00000000 0xmodem_initial_timeout : 000493e0 300000xmodem_timeout : 000f4240 1000000ymodem_initial_timeout : 0016e360 1500000boot_delay : 00989680 10000000Linux command line: noinitrd root=/dev/bon/3 init=/linuxrc console=ttyS0●启动参数帮助vivi> param helpUsage:param help -- Help aout 'param' commandparam reset -- Reset parameter table to default tableparam save -- Save parameter table to flash memeoryparam set <name> <value> -- Reset value of parameterparam set linux_cmd_line "..." -- set boot parameterparam showvivi> param set boot_delay 10000000Change 'boot_delay' value. 0x00989680(10000000) to 0x00989680(10000000) vivi> param saveFound block size = 0x0000c000Erasing... ... doneWriting... ... doneWritten 49152 bytesSaved vivi private data●显示分区帮助vivi> part helpUsage:part helppart add <name> <offset> <size> <flag> -- Add a mtd partition entrypart del <name> -- Delete a mtd partition entry part reset -- Reset mtd parition tablepart save -- Save mtd partition table part show -- Display mtd partition table ●显示分区vivi> part showmtdpart info. (6 partitions)name offset size flag------------------------------------------------vivi : 0x00000000 0x00020000 0 128kparam : 0x00020000 0x00010000 0 64kkernel : 0x00030000 0x00100000 0 1Mroot : 0x00130000 0x00300000 4 3Myaffs : 0x00430000 0x03b00000 8 59Mucos : 0x03f30000 0x000cc000 0 816k注意:以上信息全部存储在64M的flash之中。
实验12 Bootloader分析

实验十二 Bootloader分析本次实验将介绍两种bootloader:u-boot和vivi的移植方法,并教大家如何编译vivi。
1. U-BOOT简介U-BOOT是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。
目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是/projects/U-BOOT。
1.1 U-BOOT源代码目录结构◆ board:和一些已有开发板有关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的C文件。
◆ cpu:CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。
其中cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S 是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆ disk:disk驱动的分区处理代码。
◆:文档。
doc◆:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
drivers◆ fs:支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支 include持的文件。
◆:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
U32 delayCount;
U32 fileSize, i;
char c;
char *pCmdLine;
char *pMem;
init(); //初始化FLASH控制器和CPU时钟
EUARTinit(); //串口初始化
EUARTputString("\n\nDBMX1 Linux Bootloader ver 0.2.0\n");
可以直接使用sdram控制器的接口,切记:在flash中运行的代码是不能初始化连接flash的sdram控制器的,不然绝对死掉了。所以,当程序在flash中运行的时候,去初始化sdram,而现在在sdram中运行,可放心大胆地初始化flash了,主要是设定字宽,行列延时,因为缺省都是最大的。
另外,如果列位看官的cpu有足够的片内ram,完全可以先把bootloader放在片内ram,干完一切后再跳到LINUX,小弟着也是不得已而为之啊。
uboot+linux启动过程
首先,porting linux的时候要规划内存影像,如小弟的系统有64m SDRAM,
地址从0x 0800 0000 -0x0bff ffff,32m flash,地址从0x0c00 0000-0x0dff ffff.
规划如下:bootloader, linux kernel, rootdisk放在flash里。
_start:
ldr r1,=StackInit
ldr sp,[r1]
b main
//此处我们跳到了C代码的main函数,当C代码执行完后,还要调用
//下面的JumpToKernel0x跳到LINXU kernel运行
.equ StackInitvalue, __end_data+0x1000 // 4K __end_data在连结脚本中指定
如果直接输入回车,进入kernel拷贝工作:
EUARTputString("Copying kernel from Flash to RAM ...\n");
count = 0x200000; // 2 Mbytes
pSource = (U32 *)0x0C100000;
pDestin = (U32 *)0x08008000;
由于arm-GCC的c参数调用的顺序是从左到右R0开始,所以R0是KERNKEL的地址,
r1是参数字符串的地址:
到此为止,为linux引导做的准备工作就结束了,下一回我们就正式进入linux的代码。
好,从本节开始,我们走过了bootloader的漫长征途,开始进入linux的内核:
说实话,linux宝典的确高深莫测,洋人花了十几年修炼,各种内功心法层处不穷。有些地方反复推敲也领悟不了其中奥妙,炼不到第九重啊。。
下载的方法是用usb连接,10m的rootdisk也就刷的一下。关于usb下载的讨论请参看先前的贴子“为arm开发平台增加usb下载接口“。
如果不选,直接回车,就开始把整个linux的内核拷贝到SDRAM中运行。
列位看官,可能有人要问,在flashloader中不是已经初始化过sdram控制器了吗?怎么init();中还要初始化呢,各位有所不知,小弟用的是syncflash,
STR r3, [r1]
// Issue Mode Register Command
LDR r3, =0x08111800 //; Mode Register value
Normal Mode
LDR r3, =0x82124200
STR r3, [r1]
//;***************************************
mov r3, r4
mov pc, r8
.section ".data.boot"
.section ".bss.boot"
下面让我们看看bootloader的c代码干了些什么。main函数比较长,让我们分段慢慢看。
int main()
{
U32 *pSource, *pDestin, count;
U8 countDown, bootOption;
do
{
*(pDestin++) = *(pSource++);
count -= 4;
} while (count > 0);
}
EUARTputString("Booting kernel ...\n\n");
这一段没有什么可说的,运行完后kernel就在0x08008000了,至于为什么要
空出0x8000的一段,主要是放kelnel的一些全局数据结构,如内核页表,arm的页目录要有16k大。
EUARTputString("Copyright (C) 2002 Motorola Ltd.\n\n");
EUARTputString((U8 *)cmdLine);
EUARTputString("\n\n");
EUARTputString("Press any key for alternate boot-up options ... ");
LDR r3, =0x8000000
LDR r2, [r3]
LDR r2, [r3]
LDR r2, [r3]
LDR r2, [r3]
LDR r2, [r3]
LDR r2, [r3]
LDR r2, [r3]
LDR r2, [r3]
// Set Mode Register
LDR r3, =0xB2120200
小弟的bootloader主要干这么几件事:init();初始化硬件,打印一些信息和提供一些操作选项:
0. Program bootloader image
1. Program kernel image
2. Program root-disk image
3. Download kernel and boot from RAM
所以bootloader前面有一小段程序把bootloader拷贝到SDRAM中的0x0AFE0100,
再从0x 0800 0000运行bootloader,我们叫这段小程序为flashloader,
flashloader必须要首先初始化SDRAM,不然往那放那些东东:
.equ SOURCE, 0x0C000100 bootloader的存放地址
.equ TARGET, 0x0AFE0100目标地址
.equ SDCTL0, 0x221000 SDRAM控制器寄存器
// size is stored in location 0x0C0000FC
.global _start
_start: //入口点
//;***************************************
我们知道,linux内核启动的时候可以传入参数,如在PC上,如果使用LILO,
当出现LILO:,我们可以输入root=/dev/hda1.或mem=128M等指定文件系统的设备或内存大小,在嵌入式系统上,参数的传入是要靠bootloader完成的,
pMem = (char *)0x083FF000; //参数字符串的目标存放地址
上回书说到flashloader把bootloader load到0x0AFE0100,然回跳了过去,
其实0x0AFE0100就是烧在flash 0x0C000100中的真正的bootloader:
bootloader有几个文件组成,先是START.s,也是唯一的一个汇编程序,其余的都是C写成的,START.s主要初始化堆栈:
//;* End of SDRAM and SyncFlash Init *
//;***************************************
// copy code from FLASH to SRAM
_CopyCodes:
ldr r0,=SOURCE
ldr r1,=TARGET
//ldr r3,=0x92120251
STR r3, [r1]
// Issue Precharge All Commad
LDR r3, =0x8200000
LDR r2, [r3]
// Set AutoRefresh Command
LDR r3, =0xA2120200
STR r3, [r1]
// Issue AutoRefresh Command
4. Download kernel and boot with ver 0.1.x bootloader format
5. Boot a ver0.1.x kernel
6. Boot with a different command line
也就是说,可以在bootloader里选择重新下载kernel,rootdisk并写入flash,
具体从0x0c00 0000开始的第一个1M放bootloader,
0x0c10 0000开始的2m放linux kernel,从0x0c30 0000开始都给rootdisk。
启动:
首先,启动后arm920T将地址0x0c00 0000映射到0(可通过跳线设置),
实际上从0x0c00 0000启动,进入我们的bootloader,但由于flash速度慢,
那来的MACH_TYPE_MX1?其实,在head-armv.S