uboot_freescale_imx51_start.s_详解
uboot代码完全解析
目录
u-boot-1.1.6 之 cpu/arm920t........................................................................2 u-boot 中.lds 连接脚本文件的分析 ...................................................................................................12 分享一篇我总结的 uboot 学习笔记(转) .....................................................................................15 U-BOOT 内存布局及启动过程浅析 ...................................................................................................22 u-boot 中的命令实现 ..........................................................................................................................25 U-BOOT 环境变量实现 ........................................................................................................................28
u-boot启动代码start.S详解
U-BOOT一、U-BOOT的目录结构u-boot目录下有18个子目录,分别存放管理不通的源程序。
这些目录中所要存放的文件有其规则,可以分成三类。
■第一类目录与处理器体系结构或者开发板硬件直接相关;■第二类目录是一些通用的函数或者驱动程序;■第三类目录是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:文档。
Drivers:通用设备驱动程序,比如各种网卡、支持CFI的flash、串口和USB总线等。
Dtt:数字温度测量器或者传感器的驱动Examples:一些独立运行的应用程序的例子。
Fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。
Include:头文件,还有对各种硬件平台支持的会变文件,系统的配置文件和对文件系统支持的文件。
Net:与网络有关的代码,BOOTP协议、TFTP协议RARP协议和NFS文件系统的实现。
Lib_ppc:存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数,与PowerPC体系结构相关的代码。
Freescale单片机概述.PPT
.
7
第2章 Freescale单片机概述
④子系列型号标志。如GP、GB、GZ等。 ⑤存储器大小。如256表示内部集成256KB的Flash等。 ⑥Flash版本标志,反映不同的擦写电压、时间等。 ⑦工作温度范围标志。“无”表示商用温度范围0℃~70℃;
.
4
第2章 Freescale单片机概述
MC68HCS08系列
MC68HCS08系列单片机采用了比CPU08速度快的S08内核。 有多种电压管理模式,包括具有20nA的power-down模式。 采用“零组件”设计,实现MCU从“STOP”模式的自动启动,电流可降
到0.7mA。 工作电压为2.1V时,CPU和总线速率最高分别可达40MHz与20MHz;工
第2章 Freescale单片机概述
§-1 Freescale单片机发展历程
位数 32
MC68000 MC68020
M.Core PowerPC Core ColdFire
DragonBall
ARM Core
HC16
16
MC6809
HC11
8
MC6800 MC6801 MC6805 HC05
HC12 HC08
5. 以M.Core为CPU的32位单片机 M.Core是Freescale公司自行设计的一款RISC级低功耗32位CPU内 核,性能和功耗方面都优于ARM7。M.Core 仅用了8万个晶体管, 0.25mm工艺下面积只有1.1mm2。M.Core 有较高的码密度和编程 效率,应用程序比其它32位CPU少占用约30%存储空间。该系列 单片机有MMC2001/3、MMC2107、MMC2113/4等型号 。
51单片机超详细教程PPT(绝对值)
00
3区
外部
FFH 80H 7FH (低128B) 00H (高128B) 专用 寄存器 内部 RAM 0000H
1FH 18H 17H 10H 0FH 08H 07H 00H
2区
工作寄存器区
1区 0区
数据存储器
内部RAM存储器
RAM位寻址区位地址表
单元地址 MSB
2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 27H 26H 25H 24H 23H 22H 21H 20H 7F 77 6F 67 5F 57 4F 47 3F 37 2F 27 1F 17 0F 07 7E 76 6E 66 5E 56 4E 46 3E 36 2E 26 1E 16 0E 06 7D 75 6D 65 5D 55 4D 45 3D 35 2D 25 1D 15 0D 05
【转】iMX51的BOOT说明(主要是LPDDR)
【转】iMX51的BOOT说明(主要是LPDDR)iMX51的代码还是比较成熟的!上次简单描述了下其NAND的BOOT过程,说了要开个文章说MMC启动的,其实我想了想,没这个必要,因为BBG的参考板就是这种启动模式!这个文章主要说明一些我遇到BOOT问题!其实硬件做了初步的供电测试后,软件就应该协助其尝试跑bootloader了,初步的测试可以使用ATK或者Mfgtool来测试!可以用它们来测试处理器和DDR两个设备,测试NAND,MMC,NOR 都可以!看是否可以读写,擦除等!如果可以,说明硬件板子基本可以运行!但是请注意不代表这个板子就可以正常运行!我们当初是因为硬件第一次lay这个LPDDR,没做过,而参考板是DDR2的,所以能基本运行!后来发现在200M的高频下,LPDDR根本不能正确运行!差一点的用ATK烧进去bootloader后,如果BOOT_MODE没有问题,串口可以有输出信息!但是也许就一点信息,就死了!基本就是DDR的问题,请硬件要考虑布线是否按照文档的规则等长,字节交替等防干扰规则布局的!因为LPDDR没有DDR2那么高级,没有ODT 这些高级的可以辅助的功能!主要是电源的层,屏蔽层,还有LPDDR 那层走线对应的两层要有屏蔽!这样可以保证在高频下,可以正常运行!要不数据会出错的!导致跑的频率只能非常低!我们当初就只能跑80M左右!后来硬件参照别人的LPDDR重新Lay了一次!后来可以跑180左右了!算是这块没有问题了!一般DDR过了,BOOT在硬件上的问题就算排除了!后面就是bootloader加载起来后的启动过程,我觉得这个不算在这个文章里面的!那是存的软件了!这里还有一点告诉大家,如果你是调试boot的,那么不要总是怀疑自己软件哪里不对,请也怀疑下是否是硬件问题!但是一般有经验的硬件工程师还是可以的,但是我们不能排除的!请考虑全面点!要不死的一定是你!强调boot没反应,串口没有任何输出,硬件测试供电正常!那一定是boot模式的问题或者boot设备的问题,请硬件和软件协同确保管脚,这个时候一般软件什么要注意的,唯一注意的就是DDR的参数初始化,上篇文章说了bootloader前面要完成的就是DDR的初始化!我们LPDDR的参数做了修改,这个其实要心细就好!一个一个确认!参考51的datasheet关于LPDDR初始化的就可以了!然后结合LPDDR的文档,很容易的!完成后,ATK烧写到NAND或者MMC或者NOR中就可以了!这些软件确保后,起不来就去找BOOT_MODE的原因!请仔细点找找!要有耐心!硬件必须协助软件的!我们当初因为硬件lay的第一板,我们耽误了一个月时间去尝试各种软件LPDDR参数的配置,结果硬件不死心!最后他们不得不承认的!做BOOT工作需要的能力很简单,就是细心,耐心,还有恒心!。
51单片机读写内部EEPROM详解
/*
函数:擦除某一扇区(每个扇区512字节)
入口:addr=某一扇区首地址
*/
void cc(uint addr)
//打开lAP功能(ISP_CONTR.7)=允许编程改变Flash设置Flash操作等待时 间
// 0x83(晶振<5M)0x82(晶振v10M)0x81(晶振<20M)0x80(晶振<40M)
uchar dat;
ISP_CONTR=0x81;
ISP_CMD= 0x01;/用户可以对"Data Flash/EEPROM区"进行字节读ISP_ADDRL = addr;
ISP_ADDRH=addr>>8;
EA= 0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
_nop_();
dat=ISP_DATA;
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD16O2写入8位数据子函数*/
void LcdWriteData(uchar dat);
/*LCD16O2初始化子程序*/
void LcdInit();
/*LCD16O2写入字符串*/
void LCDWrite_String(uchar x, uchar y,uchar z, uchar *s);
/*设置LCD1602写入字符串的位置*/
void LCD_set_xy(uchar x, uchar y, uchar z);
uchar ON_Hour=0x07;//初始开灯时间07:OOluchar Warning_TempH=32;//高 温报警温度
u-bootUBIFS移植及文件系统烧写
u-bootUBIFS移植及文件系统烧写imx515 uboot UBIFS移植及android UBIFS文件系统烧写作者:longfeey1.1 Uboot UBI的移植关于uboot的UBI的移植几乎没有说明介绍,移植首先要保证你的flash驱动能够跑起来,我是在nand flash 上跑的UBI。
刚开始的时候我也没有什么头绪,只能够从uboot的readme开始查找一些蛛丝马迹。
- MTD Support (mtdparts command, UBI support)CONFIG_MTD_DEVICEAdds the MTD device infrastructure from the Linux kernel.Needed for mtdparts command support.CONFIG_MTD_PARTITIONSAdds the MTD partitioning infrastructure from the Linuxkernel. Needed for UBI support.因此,要UBI支持首先得要MTD支持,因此在配置文件中要添加以上两项的定义。
要移植UBI还要添加:#define CONFIG_CMD_UBIFS#define CONFIG_CMD_UBI总的关于UBI的部分是以下几个宏:#define CONFIG_CMD_UBI#define CONFIG_CMD_UBIFS#define CONFIG_CMD_MTDPARTS#define CONFIG_MTD_DEVICE#define CONFIG_MTD_PARTITIONS#define CONFIG_RBTREE#define CONFIG_LZO同时要给NAND建立个默认的分区,方便以后操作。
分区如下:#define MTDIDS_DEFAULT "nand0=nand0"#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootf s),-(reserved)"#define MTD_ACTIVE_PART "nand0,2"以上的配置都在uboot_imx/include/configs/mx51_vdphone.h 文件中进行配置。
关于imx51的uboot代码的启动流程分析
关于imx51的uboot代码的启动流程分析2012.11.19baodingsheng1.首先bootrom代码会拷贝uboot的前2KB/4KB到IRAM中去,紧接着就会处理DDR2的配置数据表(即flash_header.S中的DCD段)。
2.执行完后进行CSF check,如果passed,则跳转到app_code_jump_v:.word_start接下来要开始执行的地方就是uboot中的start入口3.接下来在start.S中做的工作是:设置cpu为SVC模式、关闭中断IRQ和FIQ、MMU和L1cache的初始化、GPIO口的初始化、enable L1NEON bit、L2cache的初始化、AIPS的初始化、M4IF的初始化、clock的初始化、relocate U-Boot to RAM、设置堆栈、清除bss段、board_mmu_inint、这里使能了MMU、而后进入C代码段:dr pc,_start_armboot@jump to C codetart_armboot:.word start_armboot4.接下在void start_armboot(void)中做的工作是:a.全局变量gdgd->bd指针指向数据类型为bd_t的结构体,bd_t结构体记录开发板的参数,例如串口波特率、ip地址、机器类型、启动参数、环境变量位置等。
b.定义二级指针init_fnc_ptr指向一个存放函数指针的数组,接下来在for循环中执行的这些函数:init_fnc_t*init_sequence[]={#if defined(CONFIG_ARCH_CPU_INIT)arch_cpu_init,/*basic arch cpu dependent setup*/#endifboard_init,*basic board dependent setup*/#if defined(CONFIG_USE_IRQ)interrupt_init,/*set up exceptions*/#endiftimer_init,/*initialize timer*/env_init,/*initialize environment*/init_baudrate,/*initialze baudrate settings*/serial_init,*serial communications setup*/console_init_f,/*stage1init of console*/display_banner,/*say that we are here*/#if defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo,/*display cpu info(and speed)*/#endif#if defined(CONFIG_DISPLAY_BOARDINFO)checkboard,/*display board info*/#endif#if defined(CONFIG_HARD_I2C)||defined(CONFIG_SOFT_I2C)init_func_i2c,#endifdram_init,/*configure available RAM banks*/#if defined(CONFIG_CMD_PCI)||defined(CONFIG_PCI)arm_pci_init,#endifdisplay_dram_config,NULL,};c.arch_cpu_init函数的工作是:enable L1icache和dcache、enable L2cached.board_init函数的工作是:选择启动设备、SOC的版本、board的版本、板子的id号(bi_arch_number)、启动参数的地址(bi_boot_params),设置串口、设置nandflash控制器、设置expio、设置FEC(快速以太网控制器)、设置I2Ce.timer_init,设置GPT。
MCS-51系列单片机的存储器配置
字节 地址
位地址/位功能标记
符号 名称 位寻址
D7
D6
D5
D4
D3
D2
D1
D0
F7H
F6H
F5H
F4H
F3H
F2H
F1H
F0H
F0H
B.7
B.6
B.5
B.4
B.3
B.2
B.1
B.0
B
B 寄存器
是
E7H
E6H
E5H
E4H
E3H
E2H
E1H
E0H
E0H
A
累加器
是
ACC.7 ACC.6 ACC.5 ACC.4 ACC.3 ACC.2 ACC.1 ACC.0
在8051片内存储器中,有6个特殊的地址单元。0000H~0002H单元是执行 所有程序的入口地址。通常情况下,该单元存放的是一条无条件转移指令。 因为当单片机复位后,CPU总是从此单元开始执行程序。存放在此单元中的跳 转指令将引导CPU进入真正的程序入口地址继续读取指令。0003H、000BH、 0013H、001BH、0023H分别是5个中断源的中断服务子程序的入口地址。因此, 用户程序的存放位置选在002EH之后才会比较安全。
2CH
2BH
2AH
29H
28H
24H
27H
26H
25H
24H
23H
22H
21H
20H
23H
1FH
1EH
1DH
1CH
1BH
1AH
19H
18H
22H
17H
16H
15H
14H
13H
12H
uboot启动代码详细讲解
·1 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。
一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1. 引导加载程序。
固化在固件(firmware)中的 boot 代码,也就是 Boot Loader,它的启动通常分为两个阶段。
2. Linux 核。
特定于嵌入式板子的定制核以及核的启动参数。
3. 文件系统。
包括根文件系统和建立于 Flash 存设备之上文件系统,root fs。
4. 用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 等。
引导加载程序是系统加电后运行的第一段软件代码。
回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。
BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。
Boot Loader 的主要运行任务就是将核映象从硬盘上读到 RAM 中,然后跳转到核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。
比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
·2 bootloader简介简单地说,Boot Loader (引导加载程序)就是在操作系统核运行之前运行的一段小程序,它的作用就是加载操作系统,它是系统加电后运行的第一段软件代码。
ARM上电启动及Uboot代码分析
ARM 上电启动及 Uboot 代码分析
部 门: 作 者: 联系方式: ຫໍສະໝຸດ 期:2013.03.08
文件修订记录
时间
作者
主要修订内容
目录
目录
文件修订记录 ...............................................................................................................................1 目录 ...............................................................................................................................................2 摘要 ...............................................................................................................................................4 1 ARM 上电取第一条指令流程 .................................................................................................5 1.1 上电后的第一条指令在哪里? ...........................................................................................5 1.1.1 norflash 和 nandfl
阐述51单片机中断初始化的流程
阐述51单片机中断初始化的流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 开总中断和相应中断源的中断允许位使用 EA 位(IE.7)来开总中断,将其设置为 1。
51芯片手册
51芯片手册51芯片手册是一本关于51单片机芯片的详细使用说明书,以下是一篇1000字的51芯片手册:51芯片手册目录一、芯片介绍二、主要特性三、芯片引脚定义四、芯片功能说明五、软件编程指南六、常见问题解答七、参考资料一、芯片介绍51芯片是一种基于MCS-51标准的8位单片机芯片,由Intel公司开发。
该芯片是广泛应用于各种嵌入式系统的核心处理器。
51芯片具有成本低、易于开发、适用范围广等特点,广泛应用于电子设备、家电控制、工业自动化等领域。
二、主要特性1. 8位处理器核心,运行频率高,性能稳定。
2. 内置RAM和ROM,满足程序存储和数据存储的需求。
3. 多种通信接口,包括串口、SPI和I2C等。
4. 多个定时器/计数器,可用于实现定时、计数和脉冲生成等功能。
5. 具有强大的中断处理能力,可实现对外部中断的响应。
6. 多种外设接口,如GPIO、PWM、ADC等,可满足各种外设的连接需求。
三、芯片引脚定义1. VCC:芯片供电引脚,与正极电源连接。
2. GND:芯片接地引脚,与负极电源连接。
3. P0~P3:通用输入/输出引脚,可配置为输入或输出模式。
4. XTAL1和XTAL2:外部晶振引脚,用于提供芯片的时钟信号。
5. RST:复位引脚,用于芯片的复位操作。
6. ALE/PROG:地址锁存使能/编程使能引脚,用于芯片的编程操作。
7. PSEN:程序存储使能引脚,与外部存储器的CS引脚连接。
8. EA/VPP:外部访问使能/编程电压引脚,可用于外部存储器的访问和芯片的编程操作。
四、芯片功能说明1. CPU:芯片的核心处理单元,负责执行指令和控制系统的运行。
2. RAM:芯片的随机存储器,用于存储程序的数据。
3. ROM:芯片的只读存储器,用于存储程序的指令。
4. I/O口:芯片的输入/输出引脚,用于与外部设备进行数据交互。
5. 定时器/计数器:用于实现定时、计数和脉冲生成等功能。
6. 中断系统:用于实现对外部中断的响应和处理。
Uboot启动过程详解
Uboot启动过程详解u-boot系统启动流程大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。
依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
1、Stage1 start.S代码结构u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下(1)定义入口。
:该工作通过修改连接器脚本来完成。
(2)设置异常向量(Exception Vector)。
(3)设置CPU的速度、时钟频率及终端控制寄存器。
(4)初始化内存控制器。
(5)将ROM中的程序复制到RAM中。
(6)初始化堆栈。
(7)转到RAM中执行,该工作可使用指令ldr pc来完成。
2、Stage2C语言代码部分 lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作:(1)调用一系列的初始化函数。
(2)初始化Flash设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有NAND设备,则初始化NAND设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写IP、MAC地址等。
(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
3、U-Boot的启动顺序主要顺序如下图所示函数顺序初始化顺序图为 U-Boot顺序下面就根据代码进行解释:/*********************** 中断向量 ***********************/.globl _start //u-boot启动入口_start: b reset //复位向量并且跳转到resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irq //中断向量ldr pc, _fiq //中断向量b sleep_setting //跳转到sleep_setting并通过下段代码拷贝到内存里relocate: //把uboot重新定位到RAMadr r0, _start // r0 是代码的当前位置ldr r2, _armboot_start //r2 是armboot的开始地址ldr r3, _armboot_end //r3 是armboot的结束地址sub r2, r3, r2 // r2得到armboot的大小ldr r1, _TEXT_BASE // r1 得到目标地址add r2, r0, r2 // r2 得到源结束地址copy_loop: //重新定位代码ldmia r0!, {r3-r10} //从源地址[r0]中复制stmia r1!, {r3-r10} //复制到目标地址[r1]cmp r0, r2 //复制数据块直到源数据末尾地址[r2]ble copy_loop系统上电或reset后,cpu的PC一般都指向0x0地址,在0x0地址上的指令是reset: //复位启动子程序/******** 设置CPU为SVC32模式***********/mrs r0,cpsr //将CPSR状态寄存器读取,保存到R0中bic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0//将R0写入状态寄存器中/************** 关闭看门狗 ******************/ldr r0, =pWTCONmov r1, #0x0str r1, [r0]/************** 关闭所有中断 *****************/mov r1, #0xffffffffldr r0, =INTMSKstr r1, [r0]ldr r2, =0x7ffldr r0, =INTSUBMSKstr r2, [r0]/************** 初始化系统时钟 *****************/ldr r0, =LOCKTIMEldr r1, =0xffffffstr r1, [r0]clear_bss:ldr r0, _bss_start //找到bss的起始地址add r0, r0, #4 //从bss的第一个字开始ldr r1, _bss_end // bss末尾地址mov r2, #0x00000000 //清零clbss_l:str r2, [r0] // bss段空间地址清零循环add r0, r0, #4cmp r0, r1bne clbss_l/***************** 关键的初始化子程序************************// * cpu初始化关键寄存器* 设置重要寄存器* 设置内存时钟* /cpu_init_crit:/** flush v4 I/D caches*/mov r0, #0mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB *//************* disable MMU stuff and caches ****************/ mrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)orr r0, r0, #0x00000002 @ set bit 2 (A) Alignorr r0, r0, #0x00001000 @ set bit 12 (I) I-Cachemcr p15, 0, r0, c1, c0, 0/******* 在重新定位前,我们要设置RAM的时间,因为内存时钟依赖开发板硬件的,你将会找到board目录底下的memsetup.S。
uboot中start.S详解
/*************************************************分析**********************************************************
* 上面这段代码,主要保存一些全局变量,用于BOOT程序从FLASH拷贝到RAM,或者其它的使用。
ldr pc, _data_abort /* 数据操作异常向量 */
ldr pc, _not_used /* 未使用 */
ldr pc, _irq /* 慢速中断异常向量 */
ldr pc, _fiq /* 快速中断异常向量 */
_undefined_instruction:
.word undefined_instruction
* (2) 将相应的CPSR(当前程序状态寄存器)复制到SPSR(备份的程序状态寄存器)中。从异常退出的时候,就可以由SPSR来恢复CPSR。
* (3) 根据异常类型,强制设置CPSR的运行模式位。
* (4) PC(程序计数器)被强制成相关异常向量处理函数地址,从而跳转到相应的异常处理程序中。
/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
/******************************************************************************
_software_interrupt:
imx5的板子烧写系统的方法(2)
imx5的板子烧写系统的方法三、从DOM盘使用uboot通过网络烧写1、在uboot 下,setenv ethaddr 12:23:34:45:56:67setenv ipaddr 192.168.0.247setenv serverip 192.168.0.140saveenv设置板子的ip地址及主机的ip地址2、将板子通过网线与PC机关连起来,在PC机上打开Tftpd32.exe,设置好目录(将需要用到的所有文件放在该目录下)及server 的ip地址(为PC机ip )。
3、在uboot下,使用如下命令tftpboot ulmage0tftpboot 70b00000 initramfs.cpio.g z.uboot将所需的内核文件及ramdisk文件系统传到板子的内存中4、bootm 70800000 70b00000启动该内核及文件系统,进入到系统中。
5、ls /dev/*发现没有mmc设备,从完好的系统中查得mmc的主设备号为179,从设备号为0mknod /dev/mmcblk0 b 179 0创建了一个mmc的节点fdisk /dev/mmcblk0发现该节点正常udnp18192[Enter]w同样删除其原有分区,重新新建一个分区。
6、ls /dev/mmcblk0p1发现没有该设备,但是我们已经从DOM盘分了一个新区mknod /dev/mmcblk0p1 b 179 1创建该分区的设备节点,主从设备号也是从好的系统中找到的,因为驱动没有变过,其驱动的设备号也没变。
mkfs.ext3 /dev/mmcblk0p1将该分区格式化mount /dev/mmcblk0p1 /mnt将该设备挂载到/mnt目录下7、使用tftp命令将需要烧写的文件下载到板子上tftp -g -l u-boot.bin 192.168.0.140tftp -g -l ulmage 192.168.0.140tftp -g -l rootfs.tar.bz2 192.168.0.140文件为要烧写到DOM 盘中的文件8、dd if=u-boot.bin of=/dev/mmcblk0 bs=512 seek=2 skip=2将uboot 烧到DOM 盘中(若不想更换uboot 不使用这条命令即可)dd if=uImage of=/dev/mmcblk0 bs=512 seek=2048 将 ulmage 烧到 DOMI 中 tar -jxvf rootfs.tar.bz2 -C /mnt将文件系统解压到 DOM 盘的分区中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/***Purpose: the document is used to learn detailed information aboutimx51 cpu start.S, *referring to some documents on websites.*file address: U-boot-2009.08/Cpu/Arm_cortexa8/start.S** writer: xfhai 2011.7.22**Instruction:*1.@xxxx : indicates annotation*2./*************/ : stand for code in my files*3.instructions refers to code not included in my file**/Section 1: uboot overview大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。
依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
1、Stage1 start.S代码结构u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下:==> (1)定义入口。
由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
==>(2)设置异常向量(Exception Vector)。
==>(3)设置CPU的速度、时钟频率及终端控制寄存器。
==>(4)初始化内存控制器。
==>(5)将ROM中的程序复制到RAM中。
==>(6)初始化堆栈。
==>(7)转到RAM中执行,该工作可使用指令ldr pc来完成。
2、Stage2 C语言代码部分lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作:==>(1)调用一系列的初始化函数。
==>(2)初始化Flash设备。
==>(3)初始化系统内存分配函数。
==>(4)如果目标系统拥有NAND设备,则初始化NAND设备。
==>(5)如果目标系统有显示设备,则初始化该类设备。
==>(6)初始化相关网络设备,填写IP、MAC地址等。
==>(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
Section 2: demos3、U-Boot的启动顺序(示例,其他u-boot版本类似)cpu/arm920t/start.S(my file is U-boot-2009.08/Cpu/Arm_cortexa8/start.S )@文件包含处理#include <config.h>@由顶层的mkconfig生成,其中只包含了一个文件:configs/<顶层makefile中6个参数的第1个参数>.h#include <version.h>#include <status_led.h>/**************************************************************************** Jump vector table as in table 3.1 in [1]***************************************************************************/注:ARM微处理器支持字节(8位)、半字(16位)、字(32位)3种数据类型向量跳转表,每条占四个字节(一个字),地址范围为0x0000 0000~@0x0000 0020,ARM体系结构规定在上电复位后的起始位置,必须有8条连续的跳转指令,通过硬件实现。
他们就是异常向量表。
ARM在上电复位后,是从0x00000000开始启动的,其实如果bootloader存在,在执行下面第一条指令后,就无条件跳转到start_code,下面一部分并没执行。
设置异常向量表的作用是识别bootloader。
以后系统每当有异常出现,则CPU会根据异常号,从内存的0x00000000处开始查表做相应的处理/******************************************************;当一个异常出现以后,ARM会自动执行以下几个步骤:;1.把下一条指令的地址放到连接寄存器LR(通常是R14).---保存位置;2.将相应的CPSR(当前程序状态寄存器)复制到SPSR(备份的程序状态寄存器)中---保存CPSR;3.根据异常类型,强制设置CPSR的运行模式位;4.强制PC(程序计数器)从相关异常向量地址取出下一条指令执行,从而跳转到相应的异常处理程序中*********************************************************/.globl _start /*系统复位位置,整个程序入口*/@_start是GNU汇编器的默认入口标签,.globl将_start声明为外部程序可访问的标签,.globl是GNU汇编的保留关键字,前面加点是GNU汇编的语法_start: b start_code @0x00//diff here: _start: b reset@ARM上电后执行的第一条指令,也即复位向量,跳转到start_code@reset用b,就是因为reset在MMU建立前后都有可能发生@其他的异常只有在MMU建立之后才会发生ldr pc, _undefined_instruction /*未定义指令异常,0x04*/ldr pc, _software_interrupt /*软中断异常,0x08*/ldr pc, _prefetch_abort /*内存操作异常,0x0c*/ldr pc, _data_abort /*数据异常,0x10*/ldr pc, _not_used /*未适用,0x14*/ldr pc, _irq /*慢速中断异常,0x18*/ldr pc, _fiq /*快速中断异常,0x1c*/@对于ARM数据从内存到CPU之间的移动只能通过L/S(load && storage)指令,如:ldr r0,0x12345678为把0x12345678内存中的数据写到r0中,还有一个就是ldr伪指令,如:ldr r0,=0x12345678为把0x12345678地址写到r0中,mov只能完成寄存器间数据的移动,而且立即数长度限制在8位_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//three more lines here://.pad: .word 0x12345678 /*now 16*4=64*///.global _end_vector//_end_vect://don’t make sense@.word为GNU ARM汇编特有的伪操作,为分配一段字内存单元(分配的单元为字对齐的),可以使用.word把标志符作为常量使用。
如_fiq:.word fiq即把fiq存入内存变量_fiq中,也即是把fiq放到地址_fiq中。
.balignl 16,0xdeadbeef.balign是意思是:以当前地址为开始开始,找到第一次出现的以第一个参数为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据,存储内容正是第二个参数。
如果当前地址正好是第一个参数的倍数,则没有数据被写入到内存。
.balign 8, 0xde这条指令的含义可以用下图表示:图解:以当前地址为开始开始,找到第一次出现的以8为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据0xde。
如果当前地址正好是8的倍数,则没有数据被写入到内存。
以此类推,.balignw则表示第二个参数存入的内容长度为2字节:.balignw 4, 0x368d因为现在填入的内容为2个字节,那就存在以下几种情况:当前地址没有偏移就满足了以4为倍数的地址当前地址偏移了1个字节就满足了以4为倍数的地址当前地址偏移了2个字节就满足了以4为倍数的地址当前地址编移了3个字节就满足了以4为倍数的地址分析一下这四种情况:当没有偏移的时候,地址中间肯定没有办法填上信息当偏移1个字节的时候,地址中间空隙不够,所以填入的数值,是末定义,也就是说,填入什么值,不清楚当偏移2个字节的时候,地址中间的空隙正好填入0x368d两个字节的内容当偏移3个字节的时候,地址中间的空隙大于所要填的内容。
此时填入的数值,是末定义,填入什么值,不清楚以此类推,.balignl,这个指令用来填与一个字,即4个字节的长度仔细分析一下就知道,对于.balignl 16, 0xdeadbeef,如果想要0xdeadbeef一定填到当前地址后面某个部分,当前地址偏移量就必须为4字节,这样才能保证在任何情况下,偏移的地址所留的空隙刚好填入所要填的内容。
//伪操作指机器码里没有对应的汇编指令,由编译器实现其功能/**************************************************************************** Startup Code (called from the ARM reset exception vector)** do important init only if we don't start from memory!* relocate armboot to ram* setup stack* jump to second stage**************************************************************************@保存变量的数据区,保存一些全局变量,用于BOOT程序从FLASH拷贝@到RAM,或者其它的使用。