收藏 分销(赏)

Bootloader基础.ppt

上传人:精**** 文档编号:10040990 上传时间:2025-04-19 格式:PPT 页数:113 大小:744KB
下载 相关 举报
Bootloader基础.ppt_第1页
第1页 / 共113页
Bootloader基础.ppt_第2页
第2页 / 共113页
点击查看更多>>
资源描述
第,9,章,BootLoader,ARM,原理与应用,上讲知识回顾,实验,5 shell,脚本练习,本讲学习内容,9.1,Bootloader,基础,1,)简介,2,)种类,3,)基本原理,9.2,ViVi,1,),ViVi,命令,2,),ViVi,配置与编译,3,),ViVi,代码分析,第九章 BootLoader,理解Bootloader的概念与作用,熟悉ViVi的配置与编译,了解ViVi代码的主要结构与作用,熟悉uboot移植与使用方法以,及,启动过程与工作原理。,9.1.1 Bootloader的简介,系统上电之后,需要一段程序来进行初始化:关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等等。如果它能将操作系统内核(从本地Flash或通过网络)复制到内存中运行,就称这段程序为Bootloader。,9.1 Bootloader基础,简,单地说,,Bootloader,就是这么一小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。,Bootloader软件通常会通过串口来输入/输出。例如:输出出错或者执行结果信息到串口终端,从串口终端读取用户控制命令等。,Bootloader的实现严重依赖于具体硬件,,在嵌入式系统中硬件配置千差万别,即使是相同的CPU,它的外设(比如Flash)也可能不同,所以需要进行一些移植。,大多数,Bootloader,包含两种不同的操作模式:,(,1,)启动加载,(Bootloading),模式,这种,模式也称为,自主,(Autonomous),模式,,也即,Bootloader,从目标机上的某个固态存储设备上将操作系统加载到,RAM,中运行,整个过程并没有用户的介入。这种模式是,Bootloader,的正常工作模式,因此在嵌入式产品发布的时侯,,Bootloader,工作在这种模式下。,(,2,)下载,(Downloading),模式,在这种模式下,目标机上的,Bootloader,将通过,串口连接,或,网络连接,等通信手段从主机,(Host),下载文件,比如下载,内核映像和根文件系统映像,等。,从,主机下载的文件通常首先被,Bootloader,保存到,目标机的,RAM,中,然后再被,Bootloader,写到目标机上的,Flash,类固态存储设备,中。,(,烧写或更新,),Bootloader,的这种模式通常在第一次安装内核与根文件系统时被使用,;,此外,以后的系统,更新,也会使用,Bootloader,的这种工作模式。,工作于这种模式下的,Bootloader,通常都会向它的终端用户提供一个简单的命令行接口。,板子,与主机间传输文件时,,可以使用:,串口,的,xmodem/ymodem/zmodem,协议,它们使用简单,只是速度比较,慢;,使用,网络通过,tftp,、,nfs,协议来传输,这时,主机上要开启,tftp,、,nfs,服务;还有其他方法,比如,USB,等。,像,vivi或U-Boot,等这样功能强大的Bootloader通常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。,比如,U-Boot在启动时处于正常的启动加载模式,但是它会延时若干秒(这可以设置)等待终端用户按下任意键而将U-Boot切换到下载模式。如果在指定时间内没有用户按键,则U-Boot继续启动Linux内核。,1,网络启动方式,这种方式,开发板不需要配置较大的存储介质。,但是使用这种启动方式之前,需要把,Bootloader,安装,/,烧写,到,板上的,EPROM,或者,Flash,中。,Bootloader,通过以太网接口远程下载,Linux,内核映像或者文件系统。网络启动方式对于嵌入式系统开发来说非常重要。,使用这种方式,目标板要有串口、以太网接口或者其他,连接方式。,串口,一般可以作为控制台,同时可以用来下载内核影像和,文件系统。,串口,通信传输速率过低,不适合用来挂接,NFS,文件系统。,所以以太网接口成为通用的互连设备,一般的开发板都可以配置,10M,以太网接口。,对于,开发的嵌入式系统,可以把,USB,接口虚拟成以太网接口通信。这种方式在开发主机和开发板两端都需要驱动程序。,另外,,可在服务器上配置启动相关网络服务。,Bootloader,下载文件一般都使用,TFTP,网络协议,,还可以通过,DHCP,的方式动态配置,IP,地址。,DHCP/BOOTP服务为Bootloader分配IP地址并配置网络参数后,才能够支持网络传输功能。如果Bootloader可以直接设置网络参数,则可不使用DHCP。,TFTP服务为Bootloader客户端提供文件下载功能,把内核映像和其他文件放在/tftpboot目录下。这样Bootloader可以通过简单的TFTP协议远程下载内核映像到内存,如图9.1.1所示。,大部分引导程序都能够支持网络启动方式。例如:vivi与U-Boot也支持网络启动功能。,2,磁盘启动方式,传统的,Linux,系统运行在台式机或者服务器上,这些计算机一般都使用,BIOS,引导,并且使用磁盘作为存储,介质。,进入,BIOS,设置菜单,可以探测处理器、内存、硬盘等设备,也可以设置,BIOS,从软盘、光盘或者某块硬盘启动。也就是说,,BIOS,并不直接引导操作系统,。那么在硬盘的主引导区,还,需要,1,个,Bootloader,,,这个,Bootloader,可以从磁盘文件系统中把操作系统引导起来。,3Flash启动方式,大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NOR Flash、NAND Flash和其他半导体盘。其中,,NOR Flash(也就是线性Flash)使用最为普遍。,NOR Flash,可以支持随机访问,所以代码可以直接在,Flash,上,执行。,Bootloader,一般是存储在,Flash,芯片上的。另外,,Linux,内核映像,和,RAMdisk,(根文件系统)也,可以存储在,Flash,上。通常需要把,Flash,分区使用,每个区的大小应该是,Flash,擦除块大小的整数倍。下,图所,示,是,Flash,存储示意图。,Bootloader,一般存贮在,Flash,的底端或者顶端,这要根据处理器的复位向量来,设置。,要,使,Bootloader,的入口位于处理器上电执行第一条指令的,位置。,接着,需要分配参数区,可以作为,Bootloader,的参数保存区域。然后是内核映像区。,Bootloader,引导,Linux,内核,就是要从此处把内核映像解压到,RAM,中去,然后跳转到内核映像入口,执行。,最后,是文件系统,区。,如果,使用,RAMdisk,文件系统,则需要,Bootloader,解压文件系统到,RAM,中。,如果,使用,JFFS2,文件系统,,将直接挂接为根,文件系统。,(,文件系统类型不同,实验箱所用为前者。,Ubifs,NAND FLASH),最后,还可以分出一些数据区,这要根据实际需要和,Flash,大小来考虑。,这些,分区是开发者定义的,,Bootloader,一般直接读,/,写对应的偏移,地址。,在,Linux,内核空间,可以配置成,MTD,设备来访问,Flash,分区。但是,有的,Bootloader,也支持分区的功能,例如:,Redboot,可以创建,Flash,分区表,并且内核,MTD,驱动可以解析出,Redboot,的分区表。,除了,NOR Flash,,还有,NAND Flash,、,Compact Flash,、,DiskOnChip,等。,这些,Flash,具有,芯片价格低、存储容量大,的,特点。,这些,芯片一般通过,专用控制器的,I/O,方式来访问,不能随机访问,,因此引导方式跟,NOR Flash,也不同。在这些芯片上,需要配置专用的,引导程序。,通常,,这种引导程序起始的一段代码将整个引导程序复制到,RAM,中运行,从而实现,自举启动,与磁盘启动相似,。,9.1.2 Bootloader,的种类,现在,Bootloader,种类繁多,比如,x86,上有,LILO,、,GRUB,等。,对于,ARM,架构的,CPU,,有,U-Boot,、,Vivi,等。它们各有特点,下面列出,Linux,的开放源代码的,Bootloader,及其支持的体系架构,,如下表所,示。,9.1.3 Bootloader的基本原理,Bootloader是依赖于硬件而实现的,特别是在嵌入式领域。因此,在嵌入式领域里建立通用的Bootloader几乎是不可能的。尽管如此,仍然可以对Bootloader归纳出通用的概念,以指导用户对特定的Bootloader设计与实现。,1操作模式,大多数Bootloader都包含,启动加载模式和下载模式,两种不同的操作模式。,2通信设备及协议,目标机上的Bootloader一般可通过串口与主机之间进行文件传输,传输协议通常是 xmodem/ymodem/zmodem协议中的一种。但是,,串口传输的速度是有限的,因此通过以太网连接并借助TFTP协议来下载文件是个更好的选择。,此外,在通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件用来提供TFTP服务。,3,Bootloader,的功能与结构,由于,Bootloader,的实现依赖于,CPU,的体系结构,大多数,Bootloader,都分为,stage1,和,stage2,两,大部分。,依赖,于,CPU,体系结构的代码,比如,设备初始化代码等,通常都放在,stage1,中,而且通常都通过汇编语言来实现,以达到短小精悍的,目的,;,stage2,则通常用,C,语言来实现,这样可以,实现更复杂的功能,而且代码会具有更好的可读性和可移植性。,1,),stage1,Bootloader,的,stage1,通常包括以下工作:,(,1,),硬件设备初始化。,(,2,),为加载,Bootloader,的,stage2,准备,RAM,空间。,(,3,),拷贝,Bootloader,的,stage2,到,RAM,空间中。,(,4,),设置堆栈。,(,5,),跳转到,stage2,的,C,入口点。,2,),stage2,stage2,的代码通常用,C,语言来实现,以便于实现更复杂的功能以及取得更好的代码可读性和可移植性。但是与普通,C,语言应用程序不同的是,在编译和链接,Bootloader,程序时,不能使用,glibc,库中的任何支持函数。其原因是,显而易见的,(,C,库的实现依赖与内核,此时内核还未启动,),。,从,哪里跳转进,main(),函数呢?直接把,main(),函数的起始地址作为整个,stage2,执行映像的入口点或许是最直接的想法,但是这样做有两个缺点:,无法通过,main(),函数传递函数参数;,无法处理,main(),函数的返回。,一,种更为巧妙的方法是利用,trampoline(,弹簧床,),的概念。,用,汇编语言写一段,trampoline,小程序,并将这段,trampoline,小程序来作为,stage2,可执行映像的执行入口,点。,然后,在,trampoline,汇编小程序中用,CPU,跳转指令跳入,main(),函数中去,执行;,当,main(),函数返回时,,CPU,执行路径显然再次回到,trampoline,程序。,简而言之,,这种方法的思想就是:用这段,trampoline,小程序来作为,main(),函数的外部包裹,(External Wrapper),。,Bootloader的stage2可执行映像刚被拷贝到RAM空间时的系统内存布局如图9.1.4所示。,Vivi,是,Mizi,公司针对,SAMSUNG,的,ARM,架构,CPU,专门设计的,基本上可以直接使用,命令简单方便。不过其初始版本只支持串口下载,速度较慢。在网上出现了各种改进版本:支持网络功能、,USB,功能、烧写,YAFFS,文件系统映像等。,9.2 ViVi,9.2.1 ViVi,命令,ViVi,有两种工作,模式:,启动,加载模式和,下载模式,启动,加载模式可以在一段时间后,(,时间可更改,),自行启动,Linux,内核,这是,ViVi,的默认,模式。,在,下载模式下,,ViVi,为用户提供一个命令行接口,通过接口可以使用,ViVi,提供的一些命令。,下面将介绍这些命令的意义。,1),reset,命令,:复位,Arm9,系统。,2),help,命令,:显示开发板上,ViVi,支持的所有命令。,param,help,:显示,param,命令的用法。,3),part,命令,:用于对分区进行操作。通过,part help,,可以显示系统对,part,系列命令的帮助提示。可以显示系统对,part,系列命令的帮助提示,分别如表,9.2.1,所示。,4),load命令,。下载程序到存储器(Flash或者RAM中)。通过load help,显示系统对load系列命令的帮助提示。load flash partname x:使用xmodom 协议通过串口下载文件并且烧写到partname分区。,例如:,load flash vivi x/注意,这里的vivi是分区名load flash kernel x load flash root x load ram partname or addr x:使用xmodom协议通过串口下载文件到内存中。,5),param命令:,用于对Bootloader参数进行操作。通过param help,显示系统对param系列命令的帮助提示。param show:显示Bootloader的当前参数值。param reset:将Bootloader参数值复位成系统默认值。,param set paramname value:设置参数值。param set linux_cmd_line“linux bootparam”:设置Linux启动参数,参数linux bootparam表示要设置的Linux Kernel命令行参数。param save:保存参数设置。,6),boot命令,:用于引导Linux kernel启动。通过boot help,显示系统对boot命令的帮助提示。boot:以默认方式启动。boot ram ramaddr lenth:启动SDRAM中ramaddr处长度为lenth的Linux内核。,7),bon命令,:用于对bon分区进行操作。通过bon help,显示系统对bon系列命令的帮助提示。bon分区是NAND Flash设备的一种简单的分区管理方式。,bon part info:显示系统中bon分区的信息。,bon part,:建立系统的,bon,分区表。,bon,分区表被保存到,NAND Flash,的最后,0 x4000,个字节中,即在,NAND Flash,的,0 x03FFC000,0 x33FFFFFF,范围内,分区表起始于,0 x03FFC000,。,例如:下列代码分为三个区:0192KB、192KB1MB、1MB以上。vivi bon part 0 192k 1M doing partition size=0 size=196608 size=1048576check bad blockpart=0 end=196608,9.2.2 ViVi的配置与编译,ViVi的配置与编译过程如下:,1.在宿主机上安装交叉编译器,首先以root 用户的身份登录到Linux下,进入/usr/local目录,创建名为arm的目录:cd/usr/local mkdir arm,将,cross-2.95.3.tar.bz2,文件解压到,/usr/local/arm,目录:,tar jxvf cross-2.95.3.tar.bz2 C /usr/local/arm,然后修改,PATH,变量:为了可以方便使用,arm-linux-gcc,编译器系统,把,arm-linux,工具链目录加入到环境变量,PATH,中;,修改/etc/profile文件,添加pathmunge /usr/local/arm/2.95.3/bin,如下所示:#Path manipulation if id-u=0;then pathmunge/sbin pathmunge/usr/sbin pathmunge/usr/local/sbin pathmunge/usr/local/arm/2.95.3/bin,fi pathmunge/usr/X11R6/bin after,保存,上述修改,进入终端控制台输入:,source /etc/profile /,使刚才的环境变量生效,注意,:,设置环境变量后,重启或注销,设置的环境变量才能生效。,最后检测环境变量是否安装成功,在终端控制台,输入:,arm-,linux-gcc,-v,2,配置和编译,ViVi,如果,vivi,的源代码已根据开发板作了相应改动,则需要对源代码进行配置,和编译,,以生成烧入,flash,的,vivi,二进制映象文件。,由于,vivi,要用到,kernel,的一些头文件,所以需要,kernel,的源代码,所以先要把,linux,的,kernel,准备好。将,vivi,和,kernel,都解到相应目录,下。,例如,:将,vivi,源代码解压到,/home/exam,目录下,,Linux kernel,源码,kernel-h2410eb.041024.tar.gz,也解压到,/home/exam,目录下。,如果,ViVi,的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成可烧入,Flash,的,ViVi,二进制映像文件。由于,ViVi,要用到一些头文件,因此需要将,ViVi,和内核都解压到相应的目录下。,修改,/vivi/Makefile,里变量设置如下:,LINUX_INCLUDE_DIR=/kernel/include/,LINUX_INCLUDE_DIR,为,kernel/include,的,对应目录,例如,:,/home/XXX/kerne-my2410eb/include/,,因此修改为:,LINUX_INCLUDE_DIR=/home/XXX/kerne-my2410eb/include/,CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-CROSS_COMPILE,为,arm-linux,安装的相应目录,例如:/usr/local/arm/2.95.3/bin/arm-linux-,因此修改为:,CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3,根据,arm-linux,的安装目录进行修改,例如,/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3,。进入,/vivi,目录,执行,make distclean,,目的是确保编译的有效性,在编译之前将,ViVi,里所有的“*,.o”,和“*,.o.flag”,文件删掉。,进入,/vivi,目录里,输入“,make menuconfig”,,开始选择,配置。,可以,安装一个写好的配置文件,也可以自己修改。注意退出时要选“,Yes”,保存配置。最后输入“,make”,正式开始编译,过程比较快。如果不报错,在,/vivi,目录里面有编译完成了的“,vivi”,,即为要烧写到,Flash,中的,Bootloader,。,9.2.3.ViVi代码分析,ViVi的代码包括arch、drivers、init、lib和include等几个目录,共200多个文件。主要目录有:arch:此目录包括了所有ViVi支持的目标板的子目录,例如s3c2410目录。drivers:包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下又分map、nand和nor三个目录。,init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,ViVi将从main函数开始执行。lib:包括一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。,include,:头文件的公共目录,其中的,s3c2410.h,定义了处理器的一些,寄存器。,Platform/smdk2410.h,定义了与开发板相关的资源配置参数,往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。,9.3.1 u-boot介绍,Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS,嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。,9.3 U-Boot,XScale,等诸多常用系列的处理器。,uboot,的源代码的下载地址是:,uboot,的启动过程及工作原理,大多数,bootloader,都分为阶段,1(stage1),和阶段,2(stage2),两大部分,,uboot,也不例外。,依赖,于,CPU,体系结构的代码(如,CPU,初始化代码等)通常都放在阶段,1,中且通常用汇编语言实现,而阶段,2,则通常用,C,语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。,1.,阶段,1,介绍,uboot,的,stage1,代码通常放在,start.s,文件中,它用汇编语言写成,其主要代码如下:,1),定义入口,由于,一个可执行的,Image,必须有一个入口点,并且只能有一个全局入口,通常这个入口,放在,ROM(Flash),的,0 x0,地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修,改连接器脚本来完成。,(1)board/gec2410/uboot.lds:ENTRY(_start)=cpu/arm920t/start.S:.globl _start,(2)uboot代码区(TEXT_BASE=0 x33F80000)定义在board/gec2410/config.mk,2),设置异常向量,_,start:b reset 0 x00000000,ldr pc,_undefined_instruction 0 x00000004,ldr pc,_software_interrupt 0 x00000008,ldr pc,_prefetch_abort 0 x0000000c,ldr pc,_data_abort 0 x00000010,ldr pc,_not_used 0 x00000014,ldr pc,_irq 0 x00000018,ldr pc,_fiq 0 x0000001c,当,发生异常时,执行,cpu/arm920t/interrupts.c,中定义的中断处理函数。,3)设置CPU的模式为SVC模式,mrs r0,cpsr,bic r0,r0,#0 x1f,orr r0,r0,#0 xd3,msr cpsr,r0,4),关闭看门狗,#if defined(CONFIG_S3C2400)|defined(CONFIG_S3C2410),ldr r0,=pWTCON,mov r1,#0 x0,str r1,r0,5),禁掉所有中断,mov r1,#0 xffffffff,ldr r0,=INTMSK,str r1,r0,#if defined(CONFIG_S3C2410),ldr r1,=0 x3ff,ldr r0,=INTSUBMSK,str r1,r0,6),设置以,CPU,的频率,ldr r0,=CLKDIVN,mov r1,#3,str r1,r0,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,#0 x00002300,/*清除 bits 13,9:8(-V-RS),*Bit 8:Disable System Protection,*Bit 7:Disable ROM Protection,*Bit 13:,异常向量表基地址,:0 x0000 0000,*/,bic r0,r0,#0 x00000087,/*清除 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,#0 x00000002,/*set bit 2(A)Align,1=Fault checking enabled*/,orr r0,r0,#0 x00001000,/*set bit 12(I)I-Cache,1=Instruction cache enabled*/,mcr p15,0,r0,c1,c0,0,8),配置内存区控制寄存器,配置内存区控制寄存器,寄存器的具体值通常由开发板厂商或硬件工程师提供,.,如果对总线周期及外围芯片非常熟悉,也可以自己确定,在,UBOOT,中的设置文件是,board/gec2410/lowlevel_init.S,该文件包含,lowleve_init,程序段,.,mov,ip,lr,bl,lowlevel_init,mov,lr,ip,9),安装,U-BOOT,使的栈空间,下面,这段代码只对不是从,Nand Flash,启动的代码段有意义,对从,Nand Flash,启动的代码,,没有,意义。因为从,Nand Flash,中把,UBOOT,执行代码搬移到,RAM.,#ifndef CONFIG_SKIP_RELOCATE_UBOOT,.,#endif,stack_setup:,ldr r0,_TEXT_BASE/*代码段的起始地址*/,sub r0,r0,#CFG_MALLOC_LEN/*分配的动态内存区*/,sub r0,r0,#CFG_GBL_DATA_SIZE/*UBOOT开发板全局数据存放*/,#ifdef CONFIG_USE_IRQ,/*分配IRQ和FIQ栈空间*/,sub r0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ),#endif,sub sp,r0,#12/*留下3个字为Abort*/,10)BSS段清0,clear_bss:,ldr r0,_bss_start,/*BSS段的起始地址*/,ldr r1,_bss_end,/*BSS段的结束地址*/,mov r2,#0 x00000000,/*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,jump to ram,ldr r1,=on_the_ram,add pc,r1,#0,nop,nop,1:b 1b infinite loop,on_the_ram:,#endif,12),进入,C,代码部分,ldr,pc,_start_armboot,_start_armboot:.word start_armboot,2.,阶段,2,介绍,lib_arm/board.c,中的,start armboot,是,C,语言开始的函数,也是整个启动代码中,C,语言的主函数,同时还是整个,uboot(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();,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(),7)I2C总线初始化,i2c_init();,8)LCD初始化,drv_lcd_init();,9)VIDEO,初始化,drv_video_init();,10),键盘初始化,drv_keyboard_init();,11),系统初始化,drv_system_init();,12),初始化网络设备,初始化相关网络设备,填写,IP,、,MAC,地址等。,/*IP Address*/,gd-bd-bi_ip_addr=getenv_IPaddr(ipaddr);,/*MAC Address*/,int i;,ulong reg;,char*s,*e;,uchar tmp64;,i=getenv_r(ethaddr,tmp,sizeof(tmp);,s=(i 0)?tmp:NULL;,for(reg=0;reg bd-bi_enetaddrreg=s?simple_strtoul(s,if(s),s=(*e)?e+1:e;,13)进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。,for(;),main_loop();/*在common/main.c*/,9.3.3 u-boot的移植,1.下载源码,建立工作目录,u-boot的源码可以从以下网址下载:,jxvf u-boot-1.1.6.tar.bz2,交叉编译工具:gcc-3.4.5-glibc-2.3.6.tar.bz2,2.移植步骤如下:,1)在board子目录中建立自己的目录my2410,rootlocalhost u-boot-1.1.6#cp -rf board/smdk2410 board/my2410rootlocalhost u-boot-1.1.6#cp include/configs/smdk2410.h include/configs/my2410.hrootlocalhost u-boot-1.1.6#cd board/my2410rootlocalhost my2410#mv smdk2410.c my2410.c,同时,修改board/my2410/Makefile,将OBJS:=smdk2410.o flash.o 改为:,OBJS:=my2410.o flash.o,my2410.h是开发板的配置文件,它包括开发板的CPU、系统时钟、RAM、FLASH系统及其他相关的配置信息,由于u-boot已经支持三星的SMDK2410开发板,所以移植的时候直接拷贝SMDK2410的配置文件,做相应的修改即可,需修改my2410.c文件,将系统时钟修改为200MHz,为了与内核的配置相对应。由于Uboot对SMDK2410板的NAND Flash初始化部分没有写,即lib_arm/board.c中的start_armboot函数中有这么一句:,#if(CONFIG_COMMANDS&CFG_CMD_NAND),puts(NAND:);,nand_init();/*go init the NAND*/,#endif,2)修改顶层Makefile,回到u-boot-1.1.6目录。,rootlocalhost u-boot-1.1.6#vi Makefile 找到1879行,,smdk2410_config:unconfig,$(MKCONFIG)$(:_config=)arm arm920t smdk2410 NULL s3c24x0,在后面添加自己的配置:,my2410_config:unconfig,$(MKCONFIG)$(:_config=)arm arm920t my2410 NULL s3c24x0,各项的意思如下:,arm:CPU的架构(ARCH)arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录。my2410:开发板的型号(BOARD),对应于board/my2410目录。NULL:开发者/或经销商(vender)。s3c24x0:片上系统(SOC)。,3)依照自己开发板的内存地址分配情况修改,board/my2410/lowlevel_init.S文件#define REFCNT0 x4f4 /HCLK=100MHZ,4)在board/my2410下加入NAND FLASH 读函数,建立nand_read.c,可拷贝vivi源码中arch/s3c2410/nand_read.c。并且要修改board/my2410/Makefile OBJS:=m2410.o flash.o nand_read.o。,5)修改cpu/arm920t/start.S文件,使2410的启动代码可以在外部的NAND FLASH上执行,启动时,NAND FLASH的前4KB(地址为0 x00000000,OM1:0=0)将被装载到SDRAM中被称Setppingstone的地址中,然后开始执行这段代码。启动以后,这4KB的空间可以做其他用途,在start.S加入搬运代码如下,以使U-BOOT可以从NAND Flash启动(参考vivi的搬运代码arch/s3c2410/head.S):,180行,#ifdef CONFIG_S3C2410_NAND_BOOT/*这个一定要放在堆栈设置之前*/bl copy_myself#endif/*CONFIG_S3C2410_NAND_BOOT*/,#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/,stack_setup:.copy u-bootto ram 放在start.S靠后的位置(231行处)#ifdef CONFIG_S3C2410_NAND_BOOT /*copy_myself:copy u-boot to ram *
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服