uboot_freescale_imx51_start.s_详解

合集下载

uboot代码完全解析

uboot代码完全解析
1.相关文件 ....................................................................................................................................28 2.数据结构 ....................................................................................................................................28 3.ENV 的初始化...........................................................................................................................30
目录
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启动代码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

Freescale单片机概述.PPT
③芯片内核类型。如08表示HC08内核、S08表示HCS08内核、 RS08表示RS08内核、S12是基于速度更快的CPU12内核等。
.
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(绝对值)

51单片机超详细教程PPT(绝对值)
必须使必须使rstrst引脚持续引脚持续22微秒微秒高电平高电平外部时钟外部时钟12mhz12mhz10111213142827262524232221201918171615101112131428272625242322212019181716151011121314151617181920403938373635343332313029282726252424222110111213142827262524232221201918171615ram626410111213142827262524232221201918171615ram626480318751805189c51ramramromrom256b字节4k1程序存储器程序存储器程序存储器内部外部0000h0fffh4k0000hffffh64k0000h0fffh4k0000h0001h0002hpc0000h是程序执行的起始单元在这三个单元存放一条无条件转移指令中断5中断4中断3中断2中断10003h000bh0013h001bh0023h002bh外部中断0定时器0中断外部中断1定时器1中断串行口中断0fffh0ffehea1ea0程序存储器资源分布中断入口地址在单片机c语言程序设计中用户无需考虑程序的存放地址编译程序会在编译过程中按照上述规定自动安排程序的存放地址
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的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详解

51单片机读写内部EEPROM详解
while(1);
/*
函数:擦除某一扇区(每个扇区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移植及文件系统烧写

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代码的启动流程分析

关于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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,或者其它的使用。

相关文档
最新文档