AM335x uboot spl分析
AM335x学习记录

AM335x 学习笔记1 硬件及其开发环境篇1.1 开发环境的搭建1.1.1 路由器方式的 NFS 启动1) 通过路由器的方式来启动 NFS 文件系统 设置路由器局域网的网关:192.168.1.1,然后将开发板和 PC 都连接在路由器的 LAN 端口,并且采用 DCHP 的 方式来实现 tftp 和 nfs。
2) uEnv.txtserverip=192.168.1.27 rootpath=/opt/ti-sdk-am335x-evm/targetNFS bootfile=uImage-am335x-evm.bin ip_method=dhcp tftp_nfs_boot=echo Booting from network...; dhcp ${loadaddr} ${bootfile}; run net_args; bootm ${loadaddr} uenvcmd=run tftp_nfs_boot1.1.2 Root 用户登陆#sudo passwd root #****** #****** #sudo –s –H 切换到 root 用户 然后就可以重启虚拟机,以用户 root 来登陆1.1.3 中文字库问题#locale –a 查看 是否有 zh_CN,zh_CN.gb18030,zh_CN.gb2312 等 #vim /var/lib/locales/supported.d/local#dpkg-reconfigure locales #locale-gen zh_CN.GB18030 #locale-gen zh_CN.GB2312 #locale-gen zh_CN.GBK1.1.4 环境变量设置路径#vim /etc/envinoment 常用的 3 个永久设置路径 #vim /etc/envirnoment #vim /etc/profile #vim ~/.bashrc (/root/.bashrc)1.1.5 设置 ubuntu 的上网 ip设置为 bridge 连接方式,设定静态 IP 地址.1.1.6 更改 sh 工具#rm /bin/sh # ln –s /bin/bash /bin/sh #apt-get install fakeroot1.1.7 安装必须的工具#apt-get install vim #apt-get install build-essential #apt-get install libtool #apt-get install bsion(干什么用的还不清楚) GNU autotools 主要包括三个工具 autoconf, automake,libtool1.1.8 虚拟机开发工具的安装$ sudo apt-get install build-essential libncurses-dev flex bison autoconf automake libmpfr-dev texinfo nfs-kernel-server tftpd-hpa libcloog-ppl1.2 AM335x BeagleBone 的 NFS 启动Sd 卡的识别:在/media/下面显示内容 在/dev/sd* 下显示分区 卸载:#unmount /dev/sdb1 这个是在 AM335X-LINUX-PSP-04.06.00.03 里面找的 1) 制作 sd 启动盘 MLO+uboot.img+uImage+rootfs#!/bin/bash if [[ -z $1 || -z $2 || -z $3 || -z $4 ]] then echo "mksd-am335x Usage:" echo " echo " exit fi if ! [[ -e $2 ]] then echo "Incorrect MLO location!" exit fi if ! [[ -e $3 ]] then echo "Incorrect u-boot.img location!" exit fi if ! [[ -e $4 ]] then echo "Incorrect uImage location!" exit fi if ! [[ -e $5 ]] then echo "Incorrect rootfs location!" exit fi echo "All data on "$1" now will be destroyed! Continue? [y/n]" read ans if ! [ $ans == 'y' ] then exit fi echo "[Partitioning $1...]" DRIVE=$1 dd if=/dev/zero of=$DRIVE bs=1024 count=1024 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` echo DISK SIZE - $SIZE bytes CYLINDERS=`echo $SIZE/255/63/512 | bc` echo CYLINDERS - $CYLINDERS mksd-am335x <device> <MLO> <u-boot.img> <uImage> <rootfs tar.gz >" Example: mksd-am335x /dev/sdc MLO u-boot.img uImage nfs.tar.gz"{ echo ,9,0x0C,* echo ,,,} | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE echo "[Making filesystems...]" mkfs.vfat -F 32 -n boot "$1"1 &> /dev/null mkfs.ext3 -L rootfs "$1"2 &> /dev/null echo "[Copying files...]" mount "$1"1 /mnt cp $2 /mnt/MLO cp $3 /mnt/u-boot.img cp $4 /mnt/uImage umount "$1"1 mount "$1"2 /mnt tar zxvf $5 -C /mnt &> /dev/null chmod 755 /mnt umount "$1"2 echo "[Done]"2) 建立 uEnv.txt (我是将 tf 卡放入读卡器,在虚拟机下面 vim 编写的。
基于AM335x的U-Boot-SPL 的CCS 调试

基于AM335x的U-Boot/SPL 的CCS 调试在基于Linux的AM335x软件开发流程中,第一步就是U-Boot/SPL(SecondProgram Loader)的移植。
在移植中遇到问题比较常见,而U-Boot/SPL的调试手段比较简陋,不便于迅速找到问题。
利用仿真器可以单步调试的特点,就可以迅速定位到出问题的代码所在位置,加速移植的调试过程。
本文主要介绍如何用CCS+emulator调试基于AM335x的U-Boot/SPL。
1. AM335x Linux启动过程以及U-Boot/SPL调试代码的准备1.1 [url=]AM335x Linux[/url]的启动过程AM335x Linux的启动主要包括ROM,SPL,U-Boot 和kernel四个启动步骤:A. ROM codeROM code是固化在芯片内部的代码,当上电时序正确,而且晶振等芯片启动所需的条件都具备时,AM335x 会从ROM code开始运行。
ROM code首先会读取sys_boot引脚上的配置,以确定存放SPL的存储器,或者可以获取SPL的外设。
具体可以参考AM335x technical reference manual中的第26章Initialization。
ROM code会从相应的地方读取/获取SPL,并运行SPL。
B. SPLSPL和U-Boot 是bootloader的两个阶段。
这里分为两个阶段的原因是,ROM code中不会配置DDR,时钟等最小系统,所以ROM code只能把bootloader加载到片上SRAM中,而片上SRAM对成本影响很大,所以通常很小,例如在AM335x上只有64K,不足够放下整个U-Boot,所以将U-Boot分成两部分,SPL 和U-Boot。
SPL主要的职责就是初始化DDR,时钟等最小系统,以读取U-Boot,并加载到DDR中。
具体来看,SPL 由ROM code加载到片上SRAM的起始位置,也就是0x402F0400。
AM335x的网口启动及Flash烧写用户指南

AM335x的网口启动及Flash烧写用户指南概述:鉴于AM335x可以通过网口启动的方式将MLO,u-boot.img,kernel通过TFTP的方式下载至开发板,并可通过NFS的方式完成文件系统的挂载,因此,对最小系统板而言,仅需网口便可完成整个Linux的启动。
本文基于网口的启动方式,对网口启动的操作流程进行描述,并着重介绍了如何使用网口启动方式进行flash的烧写。
由于使用该方式进行flash烧写的操作是在UBoot环境中以脚本的方式实现,因此,用户可自定义具体的操作流程,灵活性较好。
PC环境:主机: Windows 7虚拟机: Virtual Box(version 4.1.12), Ubuntu 10.04.Linux SDK版本: 06.00.00.00AM335x开发板平台:GPEVM.网口启动配置流程:1.在Ubuntu中安装TFTP服务和NFS服务,确保可以正常TFTP download和挂载NFS。
(网上关于如何TFTP kernel以及挂载NFS的资料较多,因此,本文主要针对MLO(SPL)和u-boot阶段的设计进行描述,对kernel和NFS的加载操作将不再赘述)。
本示例中,TFTP目录为”/tftpboot”,NFS目录为”/nfs_share”。
2.在Ubuntu中进行DHCP服务的安装和配置:本示例中,通过以下步骤将本机建成主机IP为192.168.1.1的服务器,地址空间为192.168.1.100至192.168.1.199。
a.使用root账户登录Ubuntu,使用该命令进行DHCP服务的安装:apt-get install dhcp3-server(本文中粗斜体为命令行输入内容,下同)b.增加dhcp服务的网卡端口(本例中使用的网口为eth0)。
安装完成后,进入/etc/default目录,修改dhcp3-server文件:i.vim /etc/default/dhcp3-serverii.在INTERFACES=””的参数中增加eth0iii.保存后退出.c.增加地址空间定义。
AM335x Flash Tool -- UniFlash 烧写工具使用简介及问题解决方案汇总

AM335x Flash Tool -- UniFlash 烧写工具使用简介及问题解决方案汇总大家好,目前很多人都在关注AM335x flash tool(UniFlash)的进展情况,这篇文章会对当前的进展情况进行汇总,并就客户使用过程中遇到的一些问题,给出了相应的解决方案。
目前的UniFlash官方发布的版本中,仅支持NAND FLASH的烧录,近期版本中将会更新对eMMC烧录功能的支持。
UniFlash的下载地址:/index.php/NowFlash%E2%84%A2_Programming_ToolUniFlash的主机端安装用户指南:/index.php/Sitara_Uniflash_Quick_Start_GuideUniFlash的image编译,脚本编译使用指南(Linux环境下):/index.php/Sitara_Linux_AM335x_Flash_Programming_Linux_Developmen t使用注意事项及问答:1.使用该Uniflash进行NAND FLASH烧写时,Uniflash会先将u-boot-spl-restore.bin和u-boot-restore.img下载到开发板中,启动开发板进入到UBOOT阶段,从而调用脚本文件进行FLASH的烧写,所以需要先对SDK6.0开发包进行UBOOT的移植。
移植时,一定要加入UBOOT 的patch:/index.php/Sitara_Linux_AM335x_Flash_Programming_Linux_Dev elopment#Build_SPL_.28MLO.29_and_U-Boot_for_Flashing2.请注意,制作用于NAND flash烧写的启动image时,确认使用的编译选项为:am335x_evm_restore_flash_usbspl3.在Uniflash进行u-boot-spl-restore.bin的下载时,如果出现usb网络反应超时,请确认是否已经安装我们的usb patch:0001-u-boot-Change-default-cdc_connect_timeout-to-15s.patch。
关于AM335系列的板卡和相关模块产品常见问题

关于AM335系列的板卡和相关模块产品常见问题最近有客户在使用OK335x系列开发板中遇到了一些问题,所以在这里简单地总结了几点常见问题和解决方案,在这里分享一下。
如果您手中正好有飞凌的AM335x系列板卡,请仔细阅读,可能目前困扰您的问题答案就在这里!一.关于OK335x系列开发板,启动时,调试串口循环打印CCCCC问题分析以下为打印信息:建议从两方面进行问题排查:(1)OK335x系列开发板启动方式有2种:SD卡、nand. 请检查是否设置的SD卡启动,但是没有插SD卡或者SD卡中无程序。
底板上的拨码开关要拨到相应位置,参考以下说明:1. SD 卡启动设置:直接拨到 On2. NandFlash 启动设置:直接拨到 Off注:On 代表拨到上方,Off 代表拨到下方(2)飞凌OK335x系列开发板DI8-13的引脚,是boot启动项相关引脚。
如果您这几个引脚上接的外设模块电平跟uboot(下拉)启动电平相反,也可能会影响启动。
可以排查下是否是这几个引脚导致。
(3)如果排查以上两点还未解决问题,请联系飞凌技术支持************!二.关于OK335x系列开发板启动时,串口打印信息出现:please contact forlinx问题分析。
以下为打印信息:建议从两方面进行问题排查:(1)FET335x系列核心板上有个加密芯片:DS2406,通过IIC 接的CPU,这个芯片用户不能使用,因为出厂时里面已经写入了飞凌的加密信息,只有飞凌系统可以使用。
uboot在启动过程中会取读取保存在DS2460里的密码。
验证不通过的时候,会在串口打印信息里提示“Contact Forlinx….”,这种情况一般是加密芯片里的密码丢了,也可能是出厂没有烧写加密芯片。
(2)除了加密芯片用了一路IIC接口,核心板还支持2路,有些用户需要接自己的IIC外设模块。
如果您把设备挂载到加密芯片的这路IIC上,地址出现冲突,这样也可能会有影响,出现“please contact forlinx”信息。
U-boot中SPL功能和源码流程分析

U-boot中SPL功能和源码流程分析 在U-boot⽬录下,有个⽐较重要的⽬录就是SPL的,SPL到底是什么呢?为什么要⽤它呢? SPL(Secondary programloader)是uboot第⼀阶段执⾏的代码。
主要负责搬移uboot第⼆阶段的代码到系统内存(System Ram,也叫⽚外内存)中运⾏。
SPL是由固化在芯⽚内部的ROM引导的。
我们知道很多芯⽚⼚商固化的ROM⽀持从nandflash、SDCARD等外部介质启动。
所谓启动,就是从这些外部介质中搬移⼀段固定⼤⼩(4K/8K/16K等)的代码到内部RAM中运⾏。
这⾥搬移的就是SPL。
在最新版本的uboot中,可以看到SPL也⽀持nandflash,SDCARD等多种启动⽅式。
当SPL本⾝被搬移到内部RAM中运⾏时,它会从nandflash、SDCARD等外部介质中搬移uboot第⼆阶段的代码到系统内存中。
SPL复⽤的是uboot⾥⾯的代码. SPL的主要功能就是衔接系统的硬件SRAM和u-boot之间的纽带。
1.BasicArm Initialization2.UART console initialization3.Clocks and DPLL Locking(minimal)4.SDRAM initialization5.Mux(minimal)6.Boot Device Initialization, based on where we are booting from MMC1, or MMC2,or Nand, or Onenand7.Bootloading real u-boot from the Boot Device and passing control to it. 怎么编译SPL呢? 上⽂中说道“SPL复⽤的是uboot⾥⾯的代码”,那要⽣成我们所需要的SPL⽬标⽂件,我们⼜该如何下⼿呢?很容易想到,通过编译选项便可以将SPL和uboot代码分离、复⽤。
AM335x UBOOT移植记录

board_init_r 第 2 阶段的初始化,在 board.c 文件中
enable_caches 这个函数没有做什么内容
board_init
第 2 次初始化平台,这里可以初始化其他内容了,和平台相关
mem_malloc_init 初始化 malloc 内存
nanபைடு நூலகம்_init
初始化 NAND(CONFIG_CMD_NAND 需要定义)
uboot 的代码运行流程 u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7 start.s 入口运行文件
bl save_boot_params 跳转到 lowlevel_init.S 该 文 件 在 (arch\arm\cpu\armv7\omap-common) , 如 果 是 MLO 则 会 定 义
1、.boards.depend 2、include/config.h
/* Automatically generated - do not edit */ #define CONFIG_BOARDDIR board/ti/am335x #include <config_cmd_defaults.h> #include <config_defaults.h> #include <configs/am335x_evm.h> #include <asm/config.h> 3、include/config.mk ARCH = arm CPU = armv7 BOARD = am335x VENDOR = ti SOC = ti81xx
这个目录下的几个文件,start.s 这个是程序的入口执行文件 u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7/omap-common u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7/ti81xx
飞凌AM335x开发板Linux用户手册

飞凌AM335x开发板Linux用户手册OK335X-Linux用户手册第一章OK335X简介OK335X开发板基于TI AM335X处理器,运行主频最高720M,支持Linux,WinCE,Android三大操作系统,可用于工业产品设计。
OK335X有核心板和底板组成,核心板主要芯片有:CPU,NandFlash,Memory,PowerManage。
使用我们的核心板,只需要根据您的业务需求开发自己的底板,这样可加速您的产品上市时间,让您从平台搭建的复杂环境中脱离。
下面我们具体描述OK335X核心板和底板资源。
OK335X产品图片如下所示:核心板硬件资源:1CPU主频:720M(支持AM3352,AM3354,AM3356,AM3357,AM3358,AM3359)2NandFlash:256M(Micro SLC)3Memory:265M(Micro DDR2)4PowerManage IC:TPS65217B(TI AM335X专用电源IC)底板资源:14路串口(2个232电平,2个TTL电平,232电平已经使用DB9座子引出,其中COM0作为调试串口使用,注意:OK335X-V1底板中UART4暂时不能使用,下一硬件版本将修正这个问题)。
21路100M网口3音频接口(1路Phone输出,1路Line-in输入)41个SD卡接口56个用户按键63路I2C接口71个LCD接口(支持RGB888模式,支持电阻触摸和电容触摸。
默认标配7寸电阻屏)81路PWM接口,用于蜂鸣器测试。
91路Can接口101路SDIO接口11多路用户IO接口12四路USB2.0接口,一路USB2.0OTG(目前板子为一路USB Host接口,后续会增加到四路USB HUB)131路SPI接口148路AD(其中4路用于电阻触摸,1路用于滑动变阻器AD测试,其余3路通过插针引出,另外滑动变阻器端有跳线设置,通过跳线可以设置这路AD用于插针引出,还是用于可调电阻测试)15引出总线接口(缺省未焊接底座)161个RESET按钮,用于系统复位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AM335x uboot spl分析芯片到uboot启动流程ROM → SPL→ uboot.img简介在335x 中ROM code是第一级的bootlader。
mpu上电后将会自动执行这里的代码,完成部分初始化和引导第二级的bootlader,第二级的bootlader引导第三级bootader,在ti官方上对于第二级和第三级的bootlader由uboot提供。
SPLTo unify all existing implementations for a secondary program loader (SPL) and to allow simply adding of new implementations this generic SPL framework has been created. With this framework almost all source files for a board can be reused. No code duplication or symlinking is necessary anymore.1> Basic ARM initialization2> UART console initialization3> Clocks and DPLL locking (minimal)4> SDRAM initialization5> Mux (minimal)6> BootDevice initialization(based on where we are bootingfrom.MMC1/MMC2/Nand/Onenand)7> Bootloading real u-boot from the BootDevice and passing control to it.uboot spl源代码分析一、makefile分析打开spl文件夹只有一个makefile 可见spl都是复用uboot原先的代码。
主要涉及的代码文件为u-boot-2011.09-psp04.06.00.03/arch/arm/cpu/armv7u-boot-2011.09-psp04.06.00.03/arch/arm/libu-boot-2011.09-psp04.06.00.03/driversLDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-spl.lds这个为链接脚本__image_copy_end_end三、代码解析__start 为程序开始(arch/arm/cpu/armv7/start.S).globl _start 这是在定义u-boot的启动定义入口点,汇编程序的缺省入口是 start 标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。
.global是GNU ARM汇编的一个伪操作,声明一个符号可被其他文档引用,相当于声明了一个全局变量,.globl和.global相同。
该部分为处理器的异常处理向量表。
地址范围为0x0000 0000 ~ 0x0000 0020,刚好8条指令。
为什么是8条指令呢?这里来算一算。
首先,一条arm指令为32bit(位),0x0000 0020换算成十进制为2^5=32B(字节),而32(B) = 4 * 8(B) = 4 * 8 * 8( bit),所以刚好8条指令(一个字节Byte包含8个位bit)。
下面是在汇编程序种经常会遇到的异常向量表。
Arm处理器一般包括复位、未定义指令、SWI、预取终止、数据终止、IRQ、FIQ等异常,其中U-Boot中关于异常向量的定义如下:_start: b reset_start 标号表明 oot程序从这里开始执行。
b是不带返回的跳转(bl是带返回的跳转),意思是无条件直接跳转到reset标号出执行程序。
b是最简单的分支,一旦遇到一个 b 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。
注意存储在分支指令中的实际的值是相对当前的 R15 的值的一个偏移量;而不是一个绝对地址。
它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位。
ldr pc, _undefined_instr tion //未定义指令ldr pc, _software_interrupt //软中断SWIldr pc, _prefetch_abort //预取终止ldr pc, _data_abort //数访问终止ldr pc, _not_usedldr pc, _irq //中断请求IRQldr pc, _fiq //快速中断FIQ#ifdef CONFIG_SPL_BUILD //该阶段为spl执行下面代码_undefined_instruction: .word _undefined_instruction_software_interrupt: .word _software_interrupt_prefetch_abort: .word _prefetch_abort_data_abort: .word _data_abort_not_used: .word _not_used_irq: .word _irq_fiq: .word _fiq_pad: .word 0x12345678 /* now 16*4=64 */#else_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq_pad: .word 0x12345678 /* now 16*4=64 */#endif /* CONFIG_SPL_BUILD */.word为ARM汇编特有的伪操作符,语法如下:.word <word1> {,<word2>} …作用:插入一个32-bit的数据队列。
(与armasm中的DCD功能相同).balignl 16,0xdeadbeef.align伪操作用于表示对齐方式:通过添加填充字节使当前位置满足一定的对齐方式。
接下来是对各个段代码的定义略Rest: (arch/arm/cpu/armv7/start.S)bl save_boot_paramssave_boot_params: (arch/arm/cpu/armv7/ti81xx/lowlevel_init.S)#ifdef CONFIG_SPL_BUILDldr r4, =ti81xx_boot_device//ti81xx_boot_device = BOOT_DEVICE_NAND//启动方式ldr r5, [r0, #BOOT_DEVICE_OFFSET]and r5, r5, #BOOT_DEVICE_MASKstr r5, [r4]#endifbx lr回到reset:(arch/arm/cpu/armv7/start.S)//设置cpu的工作模式设置CPU的状态类型为SVC特权模式mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr,r0cpu_init_crit: (arch/arm/cpu/armv7/start.S)mov r0, #0 @ set up for MCRmcr p15, 0, r0, c8, c7, 0 @ invalidate TLBsmcr p15, 0, r0, c7, c5, 0 @ invalidate icachemcr p15, 0, r0, c7, c5, 6 @ invalidate BP arraymcr p15, 0, r0, c7, c10, 4 @ DSBmcr p15, 0, r0, c7, c5, 4 @ ISB//关闭mmu 缓存mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002000 @ clear bits 13 (--V-)bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)orr r0, r0, #0x00000002 @ set bit 1 (--A-) Alignorr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB#ifdef CONFIG_SYS_ICACHE_OFFbic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache#elseorr r0, r0, #0x00001000 @ set bit 12 (I) I-cache#endifmcr p15, 0, r0, c1, c0, 0//调用初始化函数mov ip, lr @ persevere link reg across callbl lowlevel_init @ go setup pll,mux,memorylowlevel_init:(arch/arm/cpu/armv7/ti81xx/lowlevel.S)/* The link register is saved in ip by start.S */mov r6, ip/* check if we are already running from RAM */ldr r2, _lowlevel_init_TEXT_BASE:.word CONFIG_SYS_TEXT_BASE /* Load address (RAM) */#define CONFIG_SYS_TEXT_BASE 0x80800000SDRAM的前8MB作为spl的bss段然后前64bytes做为u-boot.img的头ldr r3, _TEXT_BASEsub r4, r2, r3sub r0, pc, r4//设置堆栈指针/* require dummy instr or subtract pc by 4 instead i'm doing stack init */ ldr sp, SRAM_STACKmark1:ldr r5, _mark1sub r5, r5, r2 /* bytes between mark1 and lowlevel_init */sub r0, r0, r5 /* r0 <- _start w.r.t current place of execution */mov r10, #0x0 /* r10 has in_ddr used by s_init() */ands r0, r0, #0xC0000000 /* MSB 2 bits <> 0 then we are in ocmc or DDR */ cmp r0, #0x80000000bne s_init_startmov r10, #0x01b s_init_starts_init_start:(arch/arm/cpu/armv7/ti81xx/lowlevel.S)mov r0, r10 /* passing in_ddr in r0 */bl s_init初始化pll mux memery/* back to arch calling code */mov pc, r6call_board_init_f:(arch/arm/cpu/armv7/start.s)//设置堆栈指针,并调用board_init_fldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ldr r0,=0x00000000bl board_init_fvoid board_init_f(ulong dummy)『u-boot-2011.09-psp04.06.00.03/arch/arm/cpu/armv7/omap-common/spl.c』调用relocate_code(CONFIG_SPL_STACK, &gdata, CONFIG_SPL_TEXT_BASE);这里使用了 CONFIG_SPL_STACK#define CONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK#define LOW_LEVEL_SRAM_STACK (SRAM0_START + SRAM0_SIZE – 4) gdata 为.bss 前一段的空间描述镜像头#define CONFIG_SPL_TEXT_BASE 0x402F0400relocate_code: (arch/arm/cpu/armv7/start.s)重载定位代码jump_2_ram: (arch/arm/cpu/armv7/start.s)跳转到spl的第二阶段board_init_r:(u-boot-2011.09-psp04.06.00.03/arch/arm/cpu/armv7/omap-common/spl.c) 初始化时钟: timer_init()i2c 初始化: i2c_init();获取启动方式 omap_boot_device();判断启动方式从不同的地方装载镜像从mmc 中装载镜像 spl_mmc_load_image();从nand 中装载镜像 spl_nand_load_image();从 uart 中装载镜像 spl_ymodem_load_image();判断镜像类型跳转到镜像中执行镜像 jump_to_image_no_args();装载镜像将会从配置的存储介质中读取数据及uboot镜像然后跳转到uboot中执行uboot注:文章版权属于成都莱得科技有限公司所有,转载请注明出处。