UBoot实验2、uboot使用实验
- 格式:pdf
- 大小:382.33 KB
- 文档页数:8
实验二 bootloader,内核与文件系统烧写【实验目的】将开发板还原出厂设置【实验学时】2【实验内容】1、烧写bootloader应用程序:u-boot.bin2、烧写linux 操作系统内核:uImage3、烧写根文件系统:root.cramfs4、烧写应用程序【实验原理】【实验要求】【实验步骤】在 windows xp 下进行Linux 系统烧写时,需要烧写bootloader应用程序,linux 操作系统内核,根文件系统和应用程序,分别是如下四个uboot.bin, uImage, root.cramfs, run_exp.tar.bz2。
1、安装并口驱动(1) 将并口线一端连接到PC机上,另一端连接到开发板的14针并口上。
将串口线一端连接到PC机上,另一端连接到开发板的9针串口上。
(2) 把整个 GIVEIO 文件夹拷贝到 C:\WINDOWS 下,并把该目录下的giveio.sys 文件拷贝到 C:\WINDOWS\system32\drivers 下。
(3) 在控制面板里,选添加硬件如图 2-1。
图 2-1图 2-1中选下一步,如图 2-2:图 2-2图 2-1中选下一步,如图 2-3:图 2-3 图 2-3中选下一步如图 2-4:图 2-4 图 2-4中选下一步,如图 2-5:图 2-5图 2-5中选下一步,如图 2-6图 2-6注意,这里不一定会显示giveio。
选择从磁盘安装如图 2-7:图 2-7指定驱动为 C:\WINDOWS\GIVEIO\giveio.inf文件,点击确定。
继续点击下一步,完成安装。
图 2-72、烧写bootloader将目录bootloader放d盘根目录下。
(1) 点击“开始”中的“运行”输入 cmd,找到目录bootloader,运行该目录下的sjf2440-s.exe文件,输入:> sjf2440-s.exe /f:u-boot.bin进入烧写界面,如图 2-8,界面会显示 CPU的 ID:0x0032409d ,这时候我们对烧写进行地址位的选择,选择4。
实验3 利用u-boot下载VxWorks操作系统一实验原理实验2创建了一个基于目标板的Bootable工程,并最终生成了VxWorks映象文件的二进制代码。
该代码运行起来以后就是VxWorks操作系统,但是它不能在主机中运行,它必须通过一定的手段下载到相应的目标机中运行。
实验2编译时选择的BSP是jx2410_920t,它对应的目标机是CVT-2410的实验箱,因此,必须将该代码下载到CVT-2410实验箱中运行。
下载的地址是在代码中已经确定下来的,为0x30010000,此处为SDRAM,该地址在“C:\Tornado2.2\target\config\jx2410_920t\config.h”文件中进行了定义,如下所示的RAM_LOW_ADRS即为VxWorks映象的入口点地址。
#define RAM_LOW_ADRS 0x30010000 /* VxWorks image entry point */#define RAM_HIGH_ADRS 0x33800000 /* RAM address for ROM boot */可以修改该地址,但是注意下面几点:1. 该地址只能为0x30010000以后的地址,如0x30020000,不能使用0x30000000,因为从0x30000000开始的64KB需要作为系统保留的区域供操作系统使用;2. 修改该地址后,必须按照实验2的内容重新建立一个Bootable工程,否则修改无效;3. 该地址修改会牵涉到后续部分实验,此处不建议修改该地址。
必须将VxWorks代码下载到0x30010000地址处,否则将产生错误。
下载方式是通过将目标板与主机PC通过以太网连接,并使用tftp协议进行传输,主机PC作为tftp服务器端将VxWorks.bin所在目录作为tftp服务器的根目录。
Windows下使用tftpd32.exe程序作为tftp服务器。
而客户端上运行的u-boot使用tftp命令连接tftp服务器并获取vxworks.bin文件。
Uboot命令使⽤⼀、uboot启动log简析1、以后带有调试性质的开发,uboot都是烧写到SD卡中的,因为⽅便烧写。
⼆、uboot命令使⽤2.1、help命令查看某⼀个命令帮助信息,?命令名2.2、信息查询1、bdinfo2、printenv命令重要查看当前板⼦的环境变量。
2.3、setenv命令重点设置环境变量,也可以⾃定义环境变量,也可以删除环境变量2.4、saveenv命令重点保存环境变量。
2.5、新建环境变量2.6、删除环境变量2.7、内存操作命令1、md命令2、nm命令3、mm命令4、mw命令5、cp命令6、cmp命令2.8、⽹络操作命令⽹线插如到ENET2上,保证开发板和电脑处于同⼀个⽹段内。
1、ping命令重点2、dhcp命令3、nfs命令重点⽬的就是为了调试程序。
4、tftp命令重点2.9 EMMC/SD卡操作命令1、mmc命令2、mmc info命令3、mmc rescan命令4、mmc list命令5、mmc dev命令6、mmc part命令7、mmc read命令8、mmc write命令9、mmc erase命令最好不要使⽤!!2.10 FAT格式⽂件系统操作命令对于I.MX6U来说,SD/EMMC分为三个分区:第⼀个:存放uboot第⼆个:存放Linux zImage,.dtb。
FAT第三个:系统的根⽂件系统,EXT41、fatinfo命令2、fatls命令3、fstype命令4、fatload命令5、fatwrite命令2.11 EXT格式⽂件系统操作命令1、ext4ls命令2.12 NAND操作命令1、nand info命令2、nand write命令3、nand erase命令4、nand write命令5、nand read命令2.13 BOOT操作命令1、booz命令要启动Linux必须将zImage,dtb放到DRAM。
2、bootm命令3、boot命令2.14 其他命令1、reset命令2、go命令3、run命令4、mtest命令。
3 U-BOOT移植实验3.1 解压u-boot源码1.在虚拟机中,利用Samba共享一个文件夹给XP,例如共享“/home/uptech”文件夹2.将该文件夹的权限设为可读可写可执行“chmod 777 /home/uptech”3.在XP中,把“03/下午/src”文件夹拷贝到“//192.168.1.12”的共享文件夹uptech内,并把uptech中的“src”更名为“03 u-boot”4.在Linux虚拟机中进入该文件夹“cd /home/uptech/03 u-boot”输入“ls”命令,可见该文件夹内有3个文件:“u-boot-1.3.2.tar.bz2”(u-boot-1.3.2源码压缩包)“dm9000x.h”、“dm9000x.c”(dm9000网卡驱动程序)5.解压u-boot源码压缩包,即输入命令“tar jxvf u-boot-1.3.2.tar.bz2”3.2 建立UP2410的板级支持1.进入u-boot源码文件夹,输入命令“cd u-boot-1.3.2”2.建立UP2410板级支持包“cd board”“mkdir up2410”在board文件夹内创建“up2410”文件夹“cp smdk2410/* up2410/ -a”将smdk2410文件夹的内容拷贝到up2410文件夹内“cd ..”返回u-boot-1.3.2目录“cp include/config/smdk2410.h include/config/up2410.h”以smdk2410为模板创建up2410配置文件up2410.h 3.配置UP2410开发板,即修改“u-boot-1.3.2/Makefile”文件“vi Makefile”输入“/smdk2410”找到smdk2400_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0紧接这两行添加如下两行:up2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t up2410 NULL s3c24x0其中第二行开始部分的空白是按TAB键获得的!4.保存退出Makefile文件。
凌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项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
uboot命令使⽤教程(uboot参数设置)1. Printenv 打印环境变量。
uboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100Environment size: 80/8188 bytes2. Setenv 设置新的变量如:uboot> setenv myboard AT91RM9200DKuboot> saveenvuboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100myboard=AT91RM9200DKEnvironment size: 102/8188 bytes⼜如想重置启动参数bootargs:uboot> setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0'uboot> saveenv3. saveenv 保存变量命令将当前定义的所有的变量及其值存⼊ flash 中。
⽤来存储变量及其值的空间只有 8k 字节,应不要超过。
(如上例,每次与setenv配合使⽤)4. loadb 通过串⼝ Kermit 协议下载⼆进制数据。
5. tftp 通过⽹络下载程序,需要先设置好⽹络配置简单配置:uboot> setenv ethaddr 32:34:46:78:9A:DCuboot> setenv ipaddr 192.168.0.111uboot> setenv serverip 192.168.0.100//下载 bin ⽂件到地址 0x20000000 处。
U-Boot启动流程(Linux内核)的分析(二)这一篇主要就是U-Boot的config.mk进行了分析。
如果要使用开发板board/<board_name>,就先执行“make<board_name>_config”命令进行配置,然后执行”make all“,就可以生成 如下3个文件。
U-boot.bin:二进制可执行文件,它就是可以直接烧入ROM,NORFlash的文件u-Boot:ELF格式的可执行文件,U-Boot.srec:Motorla S-Record格式的可执行文件对于S3C2410的开发板,执行”make smdk2410_config“."make all"后生成的U-Boot.bin可以烧入NOR Flash中运行,启动后可以看到串口输出一些信息后进行控制界面。
1。
U-boot的配置过程在顶层Makefile中可以看到如下代码:...........MKCONFIG := $(SRCTREE)/mkconfig........smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0这是在根目录下的MAKEFILE文件中的两个语句,其中的MKCONFIG就是根目录下的mkconfi文件。
$(@:_config=)的结果就是将”smdk2410_config“中的_config去掉,结果为“smdk2410”.所以“make smdk2410_config”实际上就是执行如下命令:./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0mkconfig的作用,在mkconfig文件开头第6行给出了它的用法# Parameters: Target Architecture CPU Board [VENDOR][SOC]对于S3C2410 S3C2440,它们被称为Soc(systme on chip),上面除CPU外,还集成了包括UART,USB控制器,NANDFlash控制器等设备,称为片上外设。
实验一移植U-Boot 1.3.1【实验内容】移植U-Boot 1.3.1到FS2410开发平台上。
【实验目的】掌握FS2410的硬件资源。
掌握U-BOOT的目录树和移植方法。
掌握U-BOOT的调试方法。
【实验平台】优龙FS2410(ARM920T)U-Boot版本:1.3.1【实验步骤】1.了解U-boot的目录结构。
参看图1.1目录内容board 目标板相关文件,主要包含SDRAM、FLASH驱动common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测cpu 与处理器相关的文件driver 通用设备驱动,如CFI FLASH驱动doc U-Boot的说明文档examples 可在U-Boot下运行的示例程序;如hello_world.c,timer.c include 头文件;configs目录下存放与目标板相关的配置头文件lib_xxx 处理器体系相关的文件net 与网络功能相关的文件目录post 上电自检文件目录rtc RTC驱动程序tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具图1.1 U-BOOT目录树2.建立自己的开发板类型首先在/home/linux目录下建立自己的工作目录。
#mkdir /home/linux2.2进入U-Boot源码目录。
#cd u-boot-1.3.12.3创建自己的开发板.#cd board#cp smdk2410 fs2410 –a#cd fs2410#mv smdk2410.c fs2410/fs2410.c#vi Makefile (将smdk2410修改为fs2410)#cd ../../include/configs#cp smdk2410.h fs2410.h退回U-Boot根目录:#cd ../../3.建立编译选项#vi Makefile3.1具体的修改代码如下:把 smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 修改为fs2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t fs2410 NULL s3c24x03.2 具体的详解注释arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
U-Boot实验指导实验环境:宿主机:RHEL4(Linux vm-dev 2.6.9-42.ELsmp)目标机:博创经典S2410平台交叉编译器:arm-linux-gcc V3.4.1本次实验目录下存放着已经修改好的博创经典2410平台的U-Boot源码包,将该源码包拷贝到宿主机LINUX系统中,解压至本次实验目录,配置编译生成二进制文件烧写到ARM 设备中。
一、编译U-Boot1、建立u-boot实验目录:[root@vm-dev ~]# mkdir u-boot2、进入该实验目录,将u-boot源码解压至该目录下:[root@vm-dev ~]# cd u-boot/[root@vm-dev u-boot]# lsu-boot-1.3.2.tar.bz2[root@vm-dev u-boot]# tar xjvf u-boot-1.3.2.tar.bz2[root@vm-dev u-boot]# lsu-boot-1.3.2 u-boot-1.3.2.tar.bz2[root@vm-dev u-boot]#3、进入解压后的目录u-boot-1.3.2,首先清除原来编译环境依赖关系:[root@vm-dev u-boot]# cd u-boot-1.3.2[root@vm-dev u-boot-1.3.2]# make distclean4、配置开发板:[root@vm-dev u-boot-1.3.2]# make uptech_2410class_configConfiguring for uptech_2410class board...[root@vm-dev u-boot-1.3.2]#5、编译u-boot:[root@vm-dev u-boot-1.3.2]# make编译成功后会在当前目录下生成u-boot二进制文件:二、烧写U-Boot将编译得到的u-boot.bin拷贝到XP的D盘下,将我们光盘中的sjf2410-s.exe文件也拷贝到D盘下。
uboot源码分析(2)uboot环境变量实现简析uboot 环境变量实现简析----------基于u-boot-2010.03u-boot的环境变量是使⽤u-boot的关键,它可以由你⾃⼰定义的,但是其中有⼀些也是⼤家经常使⽤,约定熟成的,有⼀些是u-boot⾃⼰定义的,更改这些名字会出现错误,下⾯的表中我们列出了⼀些常⽤的环境变量:bootdelay 执⾏⾃动启动的等候秒数baudrate 串⼝控制台的波特率netmask 以太⽹接⼝的掩码ethaddr 以太⽹卡的⽹卡物理地址bootfile 缺省的下载⽂件bootargs 传递给内核的启动参数bootcmd ⾃动启动时执⾏的命令serverip 服务器端的ip地址ipaddr 本地ip 地址stdin 标准输⼊设备stdout 标准输出设备stderr 标准出错设备上⾯只是⼀些最基本的环境变量,请注意,板⼦⾥原本是没有环境变量的,u-boot的缺省情况下会有⼀些基本的环境变量,在你执⾏了saveenv之后,环境变量会第⼀次保存到flash或者eeprom中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。
环境变量可以通过printenv命令查看环境变量的设置描述,通过setenv 命令进⾏重新设置,设置完成后可以通过saveenv将新的设置保存在⾮易失的存储设备中(nor flash 、nand flash 、eeprom)。
例如:setenv bootcmd "nand read 0x30008000 0x80000 0x500000;bootm 0x30008000"saveenv通过这两条命令就完成了环境变量bootcmd的重新设置,并讲其保存在固态存储器中。
下⾯简单分析下uboot中环境变量的实现流程。
uboot启动后,执⾏玩start.S中的汇编程序,将跳⼊board.c 中定义的start_arm_boot()函数中,在该函数中,uboot讲完成板⼦外设和相关系统环境的初始化,然后进⼊main_loop循环中进⾏系统启动或者等待与⽤户交互,这其中就包括环境变量的初始化和重定位。
U-BOOT移植实验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的启动过程1 启动流程我们一般把bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
1 阶段1,汇编代码,对于s3c2410是cpu/arm920t/start.s文件。
主要流程如下:关闭看门狗禁掉所有中断设置以CPU的频率把自己拷贝到RAM配置内存区控制寄存器配置的栈空间进入C代码部分2 阶段2是C语言代码,在lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。
这个函数调用一系列的初始化函数,然后进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
当用户输入启动linux的命令的时候,u-boot会将kernel 映像(zImage)和从nand flash 上读到RAM 空间中,为内核设置启动参数,调用内核,从而启动linux。
u-boot移植要点:我们可以总结出bootloader的两大功能:1 是下载功能,既通过网口、串口或者USB口下载文件到RAM中。
2 是对flash芯片的读写功能。
u-boot对S3C2410已经有了很好的支持,我们在移植过程中主要是完善u-boot对nand flash的读写功能。
Uboot编译与下载实验一、 实验目的掌握UBoot的编译方法,以及如何将生成的UBoot BIN文件下载到目标板二、 实验资源硬件资源CPU PIII以上内存512M硬盘80G软件资源Uboot源代码 uboot_1.2.0cross toolchain 3.4.1RedHat Linux 9.0操作系统三、 实验前的准备1、一台PC机(装有PC版Linux)。
2、实验平台。
3、串口线、网络线。
4、SJF2440烧写软件与驱动。
5、ICE16仿真器。
四、 实验步骤1、建立实验目录#mkdir /root/Myjob#cd /root/Myjob2、挂载实验光盘通过下面的命令把实验光盘挂接到/mnt/cdrom目录上。
#mount /dev/cdrom /mnt/cdrom#cd /mnt/cdrom/SourceCode/3、拷贝并解压缩交叉编译工具包#cp u-boot1.2.0.tar.gz /root/Myjob#cd /root/Myjob4、编译UBoota)进入U-Boot代码目录#cd u-boot1.2.0b)进行配置#make smdk2440_configc)进行编译#make然后就会在/u-boot1.2.0目录下生成u-boot.bin5、仿真器与驱动的定装接下来对SJF2440软件进行安装,并对并口JTAG驱动程序进行安装。
a、并口JTAG驱动程序的安装下面以WinXP为例,介绍驱动的安装方法。
在XP下以管理员身份登陆。
拷贝giveio.sys文件(光盘\Tools\sjf2440_Rev02\GIVEIO)到 “C:\windows\system32\drivers.”目录下,记住去掉只读属性(如图1)。
图1 拷贝giveio.sys文件选择控制面板,“添加硬件”。
出现对话框后点击下一步按钮,出现如图2对话框。
图2 添加硬件向导1选择“是,硬件已连接好”,点击下一步按钮。
实验报告--------- U-Boot的分析与移植实验目的●了解嵌入式开发的基本思想和过程●深入理解BootLoader,通过分析一款具体的BootLoader -- U-boot ,掌握BootLoader的作用,及其运行过程。
实验内容●本次实验具体分析uboot中基于arm9 系列为内核的开发板的bootloader的相关代码;●分析在uboot中,bootloader怎么与linux内核进行交互;●搭建交叉编译环境,将bootloader编译成在开发平台上能用的二进制文件,并将其烧入flash中,为做下一步实验进行准备。
实验设备及工具●硬件:ARM 嵌入式开发平台、PC 机Pentium100 以上、用于ARM920T 的JTAG 仿真器、串口线。
●软件:PC 机操作系统Win2000 或WinXP、Linux 9 ,交叉编译环境,仿真器驱动程序、超级终端通讯程序,第一章实验板的基本了解1.1嵌入式开发平台本次实验的硬件平台是基于ARM体系结构,由北京博创兴业科技有限公司开发的UP-NetARM2410-S实验仪器。
UP-NetARM2410-S的CPU为ARM920T 内核的三星S3c2410芯片,有MMU可以运行标准的ARM-LINUX内核。
该硬件平台的基本架构如图1.1所示;在图1.1中,2410核心板的结构为:●CPU: ARM920T结构芯片:工作频率202MHz ,SAMSUNG公司的S3c2410X ●FLASH:64M NAND型,SAMSUNG的K9F1208●RAM:64MB SDRAM,HY57V561620AT-H●200管脚精密插座S3c2410X芯片集成了大量的功能单元,包括:1).内部1.8V,存储器3.3V,外部IO3.3V,16KB数据CACHE,16KB指令CACHE,MMU;2).内置外部存储器控制器(SDRAM 控制和芯片选择逻辑);3). LCD控制器(最高4K色 STN和256K彩色TFT),一个LCD专用DMA;4). 4路带外部请求线的DMA;5).三个通用异步串行端口(IrDA1.0, 16-Byte Tx FIFO, and 16-Byte Rx FIFO),2通道SPI;6).一个多主IIC总线,一个IIS总线控制器;7). SD主接口版本1.0和多媒体卡协议版本2.11兼容;8). 2个USB HOST ,一个USB DEVICE(VER1.1);9). 4个PWM定时器和一个内部定时器;10).看门狗定时器;11).117个通用IO;12).24个外部中断;13).电源控制模式:标准、慢速、休眠、掉电;14).8通道10位ADC和触摸屏接口;15).带日历功能的实时时钟;16).芯片内置PLL;图1.1 UP-NetARM2410-S的架构示意图17).设计用于手持设备和通用嵌入式系统;18).16/32位RISC体系结构,使用ARM920T CPU核的强大指令集;19).ARM带MMU的先进的体系结构支持WINCE、EPOC32、LINUX;20).指令缓存(cache)、数据缓存、写缓冲和物理地址TAG RAM,减小了对主存储器带宽和性能的影响;21).ARM920T CPU 核支持 ARM 调试的体系结构;22).内部先进的位控制器总线(AMBA2.0, AHB/APB) .图1.2 S3c2410X芯片1.2嵌入式Linux 开发流程嵌入式Linux 开发,根据应用需求的不同有不同的配置开发方法,但是一般都要经过以下过程:1.建立开发环境操作系统一般使用REDHAT-LINUX,版本7 到9 都可以,选择定制安装或全部安装,通过网络下载相应的GCC 交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。
Tiny4412u-boot分析(2)u-boot启动流程从⼤⽅⾯来说,u-boot的启动分成两个阶段,第⼀个阶段主要的职责是准备初始化的环境,主要有以下⼏点①设置异常向量表②把CPU的⼯作模式设置为SVC32模式③关闭中断、MMU和cache④关闭看门狗⑤初始化内存、时钟、串⼝⑥设置堆栈⑦代码搬移⑧清bss段⑨跳转到c语⾔中执⾏(第⼆阶段)此时系统还没有进⼊C语⾔的运⾏阶段,并没有堆栈,也就不需要额外的RAM。
第⼆阶段在上⼀段建⽴好C语⾔运⾏环境的基础上,进⾏各种外设的初始化,并循环执⾏⽤户命令。
主要流程图如下当我们执⾏make命令来构建u-boot时,它的构建过程是:⾸先使⽤交叉编译⼯具将各⽬录下的源⽂件⽣成⽬标⽂件(*.o),⽬标⽂件⽣成后,会将若⼲个⽬标⽂件组合成静态库⽂件(*.a),最后通过链接各个静态库⽂件⽣成ELF格式的可执⾏⽂件。
在链接的过程中,需要根据链接脚本(⼀般是各个以lds为后缀的⽂本⽂件),确定⽬标⽂件的各个段,链接⽂件通常是board/<board>/⽬录中的u-boot.lds⽂件。
⼀般在链接脚本中通过ENTRY(_start)来指定⼊⼝为_start标号,通过⽂本段(.text)的第⼀个⽬标来制定u-boot⼊⼝⽂件。
所以我们通过这个链接脚本⽂件可以确定u-boot执⾏的⼊⼝。
Tiny4412 u-boot的链接脚本内容为// board/samsung/tiny4412/u-boot.ldsOUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{arch/arm/cpu/armv7/start.o (.text)board/samsung/tiny4412/libtiny4412.o (.text)arch/arm/cpu/armv7/exynos/libexynos.o (.text)*(.text)}. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }. = ALIGN(4);.data : {*(.data)}. = ALIGN(4);. = .;__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;. = ALIGN(4);.rel.dyn : {__rel_dyn_start = .;*(.rel*)__rel_dyn_end = .;}.dynsym : {__dynsym_start = .;*(.dynsym)}.bss __rel_dyn_start (OVERLAY) : {__bss_start = .;_end = .;}/DISCARD/ : { *(.dynstr*) }/DISCARD/ : { *(.dynamic*) }/DISCARD/ : { *(.plt*) }/DISCARD/ : { *(.interp*) }/DISCARD/ : { *(.gnu*) }}在本链接脚本⽂件中,定义了起始地址为0x00000000,每个段使⽤4字节对齐(.ALIGN(4)),⼏个段分别为代码段(.text)、只读数据段(.rodata)、数据段(.data)其中,代码段的第⼀个⽬标为arch/arm/cpu/armv7/start.o,在其中定义了映像⽂件的⼊⼝_start。
U-Boot实验指导书一、获得U-Boot源码我们的光盘中提供了直接从U-Boot的官方网站下载的源代码,版本是1.3.2.,放在src 目录下。
将u-boot-1.3.2.tar.bz2拷贝了工作目录下,解压源码包:[root@vm-dev 2410-s]# pwd/root/2410-s[root@vm-dev 2410-s]# cp /mnt/hgfs/e/u-boot-1.3.2.tar.bz2 ./[root@vm-dev 2410-s]# tar jxvf u-boot-1.3.2.tar.bz2[root@vm-dev 2410-s]# cd u-boot.1.3.2二、建立板级支持包在board目录下,每一块开发板都有一个对应的目录,因此我们需要为我们的开发板建立一个目录,名字叫做up2410,并创建相应的文件:[root@vm-dev u-boot-1.3.2]# cd board/[root@vm-dev board]# mkdir up2410[root@vm-dev board]# cp smdk2410/* up2410[root@vm-dev board]# cd ../上面的步骤中,我们把smdk2410目录下的所有文件都拷贝到了我们的up2410目录下,因为我们的开发板和smdk2410开发板的配置差不多。
每个开发板都有一个自己的配置文件,如smdk2410开发板的配置文件为include/configs/smdk2410.h,我们也需要为我们的开发板建立自己的配置文件。
可以直接从smdk2410开发板的配置文件中修改而来。
因此我们先把smdk2410的配置文件复制到我们开发板的配置文件当中:[root@vm-dev u-boot-1.3.2]# cp include/configs/smdk2410.h include/configs/up2410.h然后,修改Makefile,使得可以配置我们的开发板:[root@vm-dev u-boot-1.3.2]# vi Makefile在Makefile中找到下面两行:smdk2400_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0紧接这这两行添加如下两行:up2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t up2410 NULL s3c24x0注意第二行开始部分的空白是按TAB键获得的!红色的部分显示了不同处!这样,我们自己的板级支持包就建好了。
uboot中内存测试、内存检测方法DDR内存子系统常见硬件错误及Uboot中检测流程在 U-Boot中,Denx(U-Boot的开发商)针对常见的DDR内存故障进行了严格的检测处理,下图描述了该检测处理过程的三个步骤:检测数据线、地址线和DDR物理存储部件,主要涉及这三个步骤的处理过程和方法,对于DDR子系统,是很容易出故障并且是很难debug 检测出来的,而Denx所针对 DDR内存故障设计的检测方法是非常严谨,值得学习研究的。
下面主要是相关的检测处理思路及问题:1、为什么先检测数据线?因为如果数据线是断开的,那么一切无从谈起!接下来是检测地址线,只有数据线和地址线都通过,检测内存的存储单元才有意义,这样的流程也利于分割定位问题。
上面testing sequence框图将整个检测过程分成三大步,用三个虚线方框表示。
2、数据线的连接错误数据线的连接可能存在两种错误,一种是被断开,另一种布线或生产造成互相短路。
3、如何检测数据线的连接错误Denx 设计的数据线检测算法还是很Tricky和精秒的,整个处理流程如下例子:如果是两根数据线,只需要写入并读出一个pattern=0b01(0b开头表示二进制数)就能判断它们是否短路或断开。
很明显,大部分的嵌入式平台不止两根数据线,我们以64位地址线为例,pattern = 0b101010101010101010.... 能检测出奇偶位之间的数据错误。
如果这个错误被排除,每两根数据线组成一组(这是理解下一个pattern的关键),再用相同的办法,检测每相邻两组之间是否有短路,就得到第二个pattern,就是0b110011001100...... 依次类推,以4根数据线为一组,8根线为一组,相继得到共6个pattern,分别是0xaaaaaaaaaaaaaaaa,0xcccccccccccccccc,0xf0f0f0f0f0f0f0f0,0xff00ff00ff00ff00,0xffff0000ffff0000,0xffffffff00000000。
Uboot的使用
一、 实验目的
在实验平台上使用uboot常用命令及使用Tftp工具传输文件。
二、 实验资源
硬件资源
CPU Samsung S3C2440A
Nand flash Samsung K9D1208V0M 64M
RAM64M
软件资源
bootloader uboot
Tftp server tftpd32.exe
三、 实验前的准备
1、一台PC机。
2、实验平台。
3、串口线、网络线。
4、tftpd32.exe软件。
四、 实验步骤
1、实验前的准备
a)将串口线、网络线连接到实验平台与PC机上。
b)在PC机上运行超级终端串口软件。
2、进入Uboot命令输出状态
实验平台上电,在超级终端串口软件中按空格键进入Uboot命令输出状态。
3、查看Uboot命令
运行help命令显示uboot提供的所有命令。
4、学习U-Boot的几个常用的命令
根据每一条命令的帮助信息,说明这些命令的功能、参数和用法。
z bootm
=> help bootm
bootm [addr [arg ...]]
- boot application image stored in memory
passing arguments 'arg ...'; when booting a Linux kernel,
'arg' can be the address of an initrd image
bootm 命令可以引导启动存储在内存中的程序映像。
这些内存包括RAM 和可以永久保存的Flash。
第1 个参数addr 是程序映像的地址,这个程序映像必须转换成U-Boot 的格式。
第2 个参数对于引导Linux 内核有用,通常作为U-Boot 格式的RAMDISK 映像存储地址;也可以是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。
例如:
——从内存地址0x300000启动
0x300000
bootm
z cp
=> help cp
cp [.b, .w, .l] source target count
- copy memory
cp命令可以在内存中复制数据块,包括对Flash的读写操作。
第1 个参数source是要复制的数据块起始地址。
第2 个参数target是数据块要复制到的地址。
这个地址如果在Flash中,那么会直接调用写Flash的函数操作。
所以U-Boot 写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。
第3 个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。
例如:
cp.b 0x300000 0xFE040000 0x180000将1.5M数据从内存拷到flash 0xFE040000位
置。
z loadb
=> help loadb
loadb [ off ] [ baud ]
- load binary file over serial line with offset 'off' and baudrate 'baud'
loadb命令可以通过串口线下载二进制格式文件。
z printenv
=> help printenv
printenv
- print values of all environment variables
printenv name ...
- print value of environment variable 'name'
printenv命令打印环境变量。
可以打印全部环境变量,也可以只打印参数中列出的环境变量。
z setenv
=> help setenv
setenv name value ...
- set environment variable 'name' to 'value ...'
setenv name
- delete environment variable 'name'
setenv命令可以设置环境变量。
第1 个参数是环境变量的名称。
第2 个参数是要设置的值,如果没有第2 个参数,表示删除这个环境变量。
例如:
=> set ipaddr 192.168.1.20 ——设置设备地址为192.168.1.20
z tftpboot
=> help tftpboot
tftpboot [loadAddress] [bootfilename]
tftpboot命令可以使用TFTP协议通过网络下载文件。
按照二进制文件格式下载。
另外使用这个命令,必须配置好相关的环境变量。
例如serverip和ipaddr。
第1 个参数loadAddress是下载到的内存地址。
第2 个参数是要下载的文件名称,必须放在TFTP服务器相应的目录下。
例如:
=> tftpboot 0x300000 uImage ——设置从TFTP server上取uImage到内存地址0x300000
z修改启动参数,启动内核
主要是修改环境变量:bootargs与 bootcmd,实现自动从NAND Flash中复制内核,启动内核.
=>setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
设置Linux内核启动的命令行参数。
=>setenv bootcmd nand read 0x31000000 0x30000 0x1d0000;bootm 0x31000000 设置U-Boot启动运行命令:启动时,从Flash中读取内核,,然后执行bootm命令,启动Linux内核,以实现Linux系统的自动启动。
5、U-Boot命令的使用实例
a)通过kermit协议使用串口向实验平台的SDRAM传送文件u-boot.bin。
=>loadb
b)输出完毕后使用,nand擦除和写入命令将文件u-boot.bin写入实验平台的nand
flash里,如果烧写正确实验平台重新上电后可正常运行。
=>nand erase 0x0 0x100000 //擦除NAND Flash
=>nand write 0x33000000 0x0 0x100000 //对NAND Flash进行写操作
c)查看环境变量命令printenv。
d)使用环境设置命令setenv和存储命令saveenv。
Environment size: 507/65532 bytes
SMDK2440 # setenv ipaddr 192.168.0.111 SMDK2440 # saveenv
Saving Environment to NAND...
Erasing Nand...Writing to Nand... done
e)使用TFTP命令传输文件。
当然这前提是PC与实验平台这间网络是通畅的。
(1)启动TFTP SERVER软件。
(在光盘/tools目录下)
(2)在终端上运行tftp 0x31000000 u-boot.bin命令,将文件传输到地址内存地址0x31000000。
(3)使用nand擦除和写入命令将文件u-boot.bin写入实验平台的nand flash里,如果烧写正确实验平台重新上电后可正常运行。
=>nand erase 0x0 0x100000 //擦除NAND Flash
=>nand write 0x31000000 0x0 0x100000 //对NAND Flash进行写操作。