U-BOOT第一阶段程序分析(1)

分析移植之前先介绍下我的软硬件环境:

开发板:JZ2440v2板

CPU   :ARM920T

SOC   :S3C2440

晶振freq:12MHz

NorFlash:2MB => Am29LV160DB

NandFlash:256MB => K9F2G08U0A

SDRAM:32MB X 2pieces => K4S561632H-T(U)C(16M X 16bit)

U-BOOT版本:u-boot-1.1.6.tar.bz2

我移植的uboot是基于nand启动的,所以代码的分析过程也是基于nand启动的情况,uboot一上电首先执行的是cpu/arm920t/start.s文件。下面我从该文件开始一步步按代码流程分析:

	1. start.s中用到的头文件
      	#include <config.h>  // 等效包含#include <configs/MY_JZ2440.h>
        #include <version.h> // 等效包含#include "version_autogenerated.h" 
        2. 加入LED灯调试宏定义,这个是我个人在移植的时候加的,在初始化串口之前你无法用printf调试,所以在uboot的第一阶段一般会用汇编点灯的手段去调试程序。
        #define DEBUG_LED 0  //0表示该调试已经被我关闭了
        3. 异常向量表,这个arm架构下的分布
.globl _start //声明全局标号供外部使用
       系统一旦发生异常一定会进入相应的异常地址,比如上电复位时进入0x0地址,由于该地址上放置了"b reset",所以系统上电初始化的时候会进入到reset对应的标号处执行。
_start:
	b      reset    		  //复位
	ldr    pc, _undefined_instruction //未定义指令
	ldr    pc, _software_interrupt    //软中断
	ldr    pc, _prefetch_abort        //预取指中止
	ldr    pc, _data_abort     	  //预取数据中止
	ldr    pc, _not_used       	  //保留
	ldr    pc, _irq        		  //IRQ
	ldr    pc, _fiq        		  //FIQ
_undefined_instruction: .wordundefined_instruction
_software_interrupt:    .wordsoftware_interrupt
_prefetch_abort:       	.wordprefetch_abort
_data_abort:       	.worddata_abort
_not_used:       	.wordnot_used
_irq:           	.wordirq
_fiq:     		.wordfiq
	/*just for match addr*/
	.balignl 16,0xdeadbeef 
        4. 开发板上电复位后真正开始执行的代码
reset:
	/*设置ARM芯片的工作模式*/ 
	mrs r0, cpsr  	   //读cpsr
	bic r0, r0,#0x1f   //清零bit[4:0]
	orr r0, r0,#0xd3   //或指令,0xd3 = 11010011b
                           //=>设置bit[7:6]=11b,禁止FIQ和IRQ中断
                           //=>设置bit[4:0]=10011b,supervisor管理模式
	msr cpsr, r0 	   //回写cpsr
        5. 关闭看门狗(寄对看门狗寄存器写0),屏蔽所有中断,并且在这里把uboot中原来对时钟的设置先去掉,暂时无需配置直接使用默认的(板子上是使用的12M晶振)时钟频率就好了。
	/* 在MY_JZ2440.h中定义了:CONFIG_MY_S3C2440 */
	#if defined(CONFIG_MY_S3C2440)
	#define pWTCON0x53000000
	#define INTMOD    0x4A000004 //Interrupt mode register:0 = IRQ mode , 1 = FIQ mode
	#define INTMSK    0x4A000008 //mask register:0=available , 1=masked
	#define INTSUBMSK 0x4A00001C //mask register:0=available , 1=masked
	#define CLKDIVN   0x4C000014
	#endif  /* CONFIG_MY_S3C2440 */
	#if defined(CONFIG_MY_S3C2440)
	/*关看门狗*/
	ldr  r0, =pWTCON //伪指令,加载看门狗寄存器的地址到r0
	mov  r1, #0x0
	str  r1, [r0] 	 //设置看门狗寄存器的值为0
	/*屏蔽所有IRQ*/
	mov  r1, #0xffffffff//bit[31:0]
	ldr  r0, =INTMSK
	str  r1, [r0]
	ldr  r1, =0x7fff  //bit[14:0]
	ldr  r0, =INTSUBMSK
	str  r1, [r0]
	#endif  /* CONFIG_MY_S3C2440 */
        6. 在完成这次操作之后我加了一个LED灯的调试程序:全亮1s左右。一般只要你配置好的uboot能顺利编译出来,那么此处的LED调试输出信息一般是正常的,毕竟在这之前我们几乎什么也没有做。除非你uboot配置编译就出了问题。
	//=============================>
	#ifDEBUG_LED 	/*LED调试信息:0关闭1打开*/
	#define  REG_GPFCON0x56000050  //GPIO控制寄存器
	#define  REG_GPFDAT0x56000054  //GPIO控制数据器
	#define  REG_GPFPUL0x56000058  //GPIO控制上拉器
	ldr  r0, =REG_GPFCON
	mov  r1, #0x00001500	//0000 0000 0000 0000 0001 0101 0000 0000
	str  r1, [r0]		//设置GPF4/5/6为输出口, 位[13:8]=010101
	ldr  r0, =REG_GPFDAT
	mov  r1, #0x00000000	//xxxx xx[0(000)][0000]  (0亮1灭)
	str  r1, [r0]
	/*延时1s*/
	mov  r0, #0x00100000
LHB_Delay_0: 
	subs r0, r0, #0x1
	bne  LHB_Delay_0
	#endif
	//=============================>

暂时先分析到这里,敬请关注后续博文。

U-BOOT第一阶段程序分析(1),码迷,mamicode.com

时间: 2024-11-09 00:47:24

U-BOOT第一阶段程序分析(1)的相关文章

uboot第一阶段详细分析

原文:uboot第一阶段详细分析 作者:程老师,华清远见嵌入式学院讲师. uboot的第一阶段设计的非常巧妙,几乎都是用汇编语言实现的,下面我们一起来看看它的精妙之处吧! 首先我们来看一下它的链接脚本,通过它我们可以知道它整个程序的各个段是怎么存放的. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")        OUTPUT_ARCH(arm)    

破解第一个程序----分析APK文件

反编译APK成功后,在outdir目录下会生成一系列目录与文件. smali:程序所有的反汇编代码: res:程序中所有的资源文件: 如何寻找突破口是分析程序的关键.错误提示一般是指引关键代码的风向标,错误提示附近一般是核心验证代码,我们需要阅读这些代码来理解软件的注册流程. 错误提示是安卓中的字符串资源: 1:硬编码到源码中: 2:引用自“res\values"目录下的string.xml文件. apk文件在打包时,string.xml文件中的字符串被加密存储在resources.arsc文件

Spring Boot第一个程序

一.创建一个Maven项目 在setting里设置本地的Maven 然后Create New Project ,选择Maven项目,选择JDK 二.项目创建完毕后打开pom文件,并在其中添加如下代码 <!--SpringBoot的依赖--><parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactI

S5PV210-uboot源码分析-第一阶段

uboot源码分析1-启动第一阶段 1.starts.S是我们uboot源码的第一阶段: 从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口.所以_start符号所在的文件,就是我们整个程序的起始文件,_start所在处的代码就是我们整个程序的起始代码. 2.我们知道了程序的入口是_start这个符号,但是却不知道是在哪一个文件中,所以要SI进行查找搜索,点击SI的大R进行搜索

2.uboot和系统移植-第5部分-2.5.uboot源码分析1-启动第一阶段

第一部分.章节目录 2.5.1.start.S引入 2.5.2.start.S解析1 2.5.3.start.S解析2 2.5.4.start.S解析3 2.5.5.start.S解析4 2.5.6.start.S解析5 2.5.7.start.S解析6 2.5.8.start.S解析7 2.5.9.uboot重定位详解 2.5.10.start.S解析8 2.5.11.start.S解析9 2.5.12.start.S解析10 2.5.13.start.S解析11 第二部分.章节介绍 2.5.

“金山杯2007逆向分析挑战赛”第一阶段第二题

注:题目来自于以下链接地址: http://www.pediy.com/kssd/ 目录:第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第二题 \ 题目 \ [第一阶段 第二题] 题目描述: 己知是一个 PE 格式 EXE 文件,其三个(section)区块的数据文件依次如下:(详见附件)  _text,_rdata,_data 1. 将 _text, _rdata, _data合并成一个 EXE 文件,重建一个 PE 头,一些关键参数,如 EntryPoint,Imp

“金山杯2007逆向分析挑战赛”第一阶段第一题分析

题目来自于如下网址: http://www.pediy.com/kssd/ 第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第一题 \ 题目 \ [第一阶段 第一题]: 现将此题目概述粘贴如下: CrackMe.exe 是一个简单的注册程序,见附件,请写一个注册机: 要求: 1. 注册机是KeyGen,不是内存注册机或文件Patch 2. 注册机可以使用ASM,VC,BC,VB,Delphi等语言书写,其他谢绝使用. 3. 注册机必须可以运行在Windows系统上. ..

u-boot 第一启动阶段简要分析

1. u-boot 整体启动流程  bootloader是板子上电到linux系统加载之间的一段执行代码.分为两个启动阶段BL1,BL2.BL1主要用汇编语言编写,做一些初始化工作,并将自身从存储介质如flash拷贝到内存中,然后跳到BL2的c程序入口.BL2加载各个设备的驱动,并提供一个命令行的界面来提供各种操作,最终目的是为了加载linux内核.bootloader将启动参数传递给linux内核让其自举,它的使命也就完成了.下面是s3c6410的启动流程,非常经典. 板子自上电开始启动流程供

黑马程序员____第一阶段Java开发前奏(1)

  黑马程序员____第一阶段Java开发前奏(1) ⒈软件开发:        软件是由一系列按照特定顺序组织的计算机数据和指令的集合,软件开发就是制作软件.软件的出现实现了人与计算机之间的交互.    ⒉人机交互方式:        图形化界面和命令行方式,图形化界面简单直观,使用者易于接受,容易上手操作.命令行方式需要有一个控制台,输入特定的指          令,让计算机完成一些操作,较为麻烦,需要记住一些命令.    3.常用的DOS命令:     dir:列出当前目录下的文件以及文