S3C6410之uboot回炉再造(1)start.S - SVC模式设置

发布者:JoyfulMelody最新更新时间:2024-09-03 来源: cnblogs关键字:S3C6410  uboot  start  SVC  模式设置 手机看文章 扫描二维码
随时随地手机看文章

  虽然已经写了几篇关于uboot移植的、但是觉得整体对uboot的理解还是只停留在copy的层面。


  狠下心来,从代码进行uboot的分析,并从新移植一次uboot。


  这次更侧重于记录代码分析心得。


  使用uboot的版本仍为2010.3版本。


  这里有一个很是详尽的start.S分析网站,分析过程借鉴了网站的方法,但也有一些不同的地方


http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analysis.html

  总的不同有如下


  在网站的分析中,基于代码为arm920t,即ARM9系列芯片,ARM9系列芯片的初始化过程为:


1、设置CPU模式

2、关闭看门狗

3、关闭中断

4、设置堆栈sp指针

5、清除bss段

6、异常中断处理


  然后我现在选择的修改模板是arm1176,即ARM11系列芯片,ARM11系列芯片的初始化过程为:


1、设置CPU模式

// -- 关闭看门狗

// -- 关闭中断

2、初始化MMU  // ++

3、设置堆栈sp指针

4、清除bss段

5、异常中断处理


  两种芯片的start.S的区别一目了然。


  接着开始分析代码了。


  一切的开始:start.S  (文件路径为/cpu/arm1176/start.S)


  为了方便跳转阅读,启用行号。


  为避免误导,在此说明:


  此时我使用的是未经修改的uboot2010版本的start.S,在这篇分析中不会对它进行任何修改。


  在随后的blog中才对start.S进行修改并阐述理由,修改处必有类似 git diff 的说明


  1、头文件


 1 /*

 2  * ……

 3  */

 4 

 5 #include

 6 #include

 7 #ifdef CONFIG_ENABLE_MMU

 8 #include

 9 #endif

10 #include

11 

12 #if !defined(CONFIG_ENABLE_MMU) && !defined(CONFIG_SYS_PHY_UBOOT_BASE)

13 #define CONFIG_SYS_PHY_UBOOT_BASE    CONFIG_SYS_UBOOT_BASE

14 #endif


  头文件部分不必赘述,但是这里有一个不得不说的地方


13 #define CONFIG_SYS_PHY_UBOOT_BASE    CONFIG_SYS_UBOOT_BASE

  为了解析这个定义,找到了 /include/configs/smdk6400.h


/* NAND U-Boot load and start address */

#define CONFIG_SYS_UBOOT_BASE        (CONFIG_SYS_MAPPED_RAM_BASE + 0x07e00000)

  继续跳转搜索 CONFIG_SYS_MAPPED_RAM_BASE:


#ifdef CONFIG_ENABLE_MMU

#define CONFIG_SYS_MAPPED_RAM_BASE    0xc0000000

#define CONFIG_BOOTCOMMAND    'nand read 0xc0018000 0x60000 0x1c0000;'

                'bootm 0xc0018000'

#else

#define CONFIG_SYS_MAPPED_RAM_BASE    CONFIG_SYS_SDRAM_BASE

#define CONFIG_BOOTCOMMAND    'nand read 0x50018000 0x60000 0x1c0000;'

                'bootm 0x50018000'

#endif


  很显然了,在MMU工作的状态下:


#define CONFIG_SYS_MAPPED_RAM_BASE    0xc0000000

  MMU工作就是开发板播到从NAND flash启动的状态。


 


  而在MMU未工作的状态下:


#define CONFIG_SYS_MAPPED_RAM_BASE    CONFIG_SYS_SDRAM_BASE

....

#define CONFIG_SYS_SDRAM_BASE  0x50000000

  从这里,可以理解在使用dnw下载的时候,Download Address为


#define CONFIG_SYS_UBOOT_BASE        (CONFIG_SYS_MAPPED_RAM_BASE + 0x07e00000)

// 0x5000000 + 0x07e00000 = 0x57e00000

  uboot是bootloader的一种,要更为准确地描述这两种状态可以说为


  1、启动加载(Boot loading)模式,即自主'(Autonomous)模式;


  2、下载(Downloading)模式。


  更为详细的描述可以参详


http://blog.csdn.net/r91987/article/details/6695007

  


  接下来进入正文分析了


 1 /*

 2  *************************************************************************

 3  *

 4  * Jump vector table as in table 3.1 in [1]

 5  *

 6  *************************************************************************

 7  */

 8 

 9 .globl _start

10 _start: b    reset      //跳转到reset处执行,即下一段代码的44行

                  //但此时不必急着看reset的执行代码,可以继续顺序往下

11 #ifndef CONFIG_NAND_SPL   //定义NAND_SPL时

12     ldr    pc, _undefined_instruction  //ldr = Load Register 

13     ldr    pc, _software_interrupt    //软件中断

14     ldr    pc, _prefetch_abort      //预取指中止

15     ldr    pc, _data_abort         //数据中止

16     ldr    pc, _not_used          //保留

17     ldr    pc, _irq             //IRQ中断

18     ldr    pc, _fiq             //FIQ中断

19           //这里的七种异常就是ARM的七种异常处理类型,对应的声明在 20 - 33行

20 _undefined_instruction:    //.word = 32bit , 这里可以理解为 _undef.. = &undef..

21     .word undefined_instruction //这里将地址放入 _undef.. ,而_undef的地址又放入pc

22 _software_interrupt:     //双层取址,所以最终送入pc的数据为 undefined_instruction

23     .word software_interrupt //以下含义相同

24 _prefetch_abort:       

25     .word prefetch_abort   //pc 是 ARM 的指令寄存器

26 _data_abort:     //将这些异常送入 pc ,意为让 ARM 运行这些指令的初始化代码(后文可见)

27     .word data_abort

28 _not_used:

29     .word not_used

30 _irq:

31     .word irq

32 _fiq:

33     .word fiq

34 _pad:

35     .word 0x12345678 /* now 16*4=64 */

36 #else

37     . = _start + 64

38 #endif

39 

40 .global _end_vect

41 _end_vect:

42     .balignl 16,0xdeadbeef  // .balignl 为对其指令,意为让以下的代码按16位对其

                   //不足为则补上0xdeadbeef

                   //很有意思的dead beef,为数不多的能用16进制表示的单词


  接下来为正式的启动指令了


1 /*

 2  *************************************************************************

 3  *

 4  * Startup Code (reset vector)

 5  *

 6  * do important init only if we don't start from memory!

 7  * setup Memory and board specific bits prior to relocation.

 8  * relocate armboot to ram

 9  * setup stack

10  *

11  *************************************************************************

12  */

13 

14 _TEXT_BASE:

15     .word    TEXT_BASE  //这里是 .text 的 base ,即代码段的基址

16 

17 /*

18  * Below variable is very important because we use MMU in U-Boot.

19  * Without it, we cannot run code correctly before MMU is ON.

20  * by scsuh.

21  */

22 _TEXT_PHY_BASE:      //上面的注释很清晰了

23     .word    CONFIG_SYS_PHY_UBOOT_BASE

24 

25 .globl _armboot_start  //此处声明了 _armboot_start 指向 _start

26 _armboot_start:      

27     .word _start

28 

29 /*

30  * These are defined in the board-specific linker script.

31  */

32 .globl _bss_start    //此处的标号其实最终指向的是链接脚本文件(.lds)中的定义

33 _bss_start:

34     .word __bss_start

35 

36 .globl _bss_end     //同上

37 _bss_end:

38     .word _end

39 

40 /*

41  * the actual reset code

42  */

43 

44 reset:        //这里就是start之后跳转的地方了

45     /*

46      * set the cpu to SVC32 mode

47      */      //SVC模式也成为管理模式,是操作系统的一种保护模式

48     mrs    r0, cpsr      //mrs为读寄存器指令 

49     bic    r0, r0, #0x3f   //清除r0的低7位

50     orr    r0, r0, #0xd3   //将r0置为0b1101_0011,我们只看低5位

51     msr    cpsr, r0      //查CPSR处理器模式位知SVC模式位就是0b1_0011


  至此,CPU的SVC模式设置成功了。


  最后补充一个内容,.lds文件是编译脚本文件,展开可以看成ld script。


  这里的 ld 对应于编译器的 arm-linux-ld。


  有关于.lds文件的说明,可以参阅


http://blog.csdn.net/pottichu/article/details/4261289

  在后面的篇幅中,也会涉及.lds文件的修改。


关键字:S3C6410  uboot  start  SVC  模式设置 引用地址:S3C6410之uboot回炉再造(1)start.S - SVC模式设置

上一篇:S3C6410之uboot回炉再造(3)lowlevle_init.S
下一篇:uboot nand erase 的显示错误修复

推荐阅读最新更新时间:2024-11-01 19:50

基于AT89S52单片机的太阳能环境参数测试仪设计
   引 言   为了确保太阳能发电系统能够正常的工作,需要对太阳能发电系统的各项环境参数进行测量,从而有效地控制其运行。本文介绍了一种基于单片机的太阳能参数测试仪,提供了3种参数的测量功能和通信接口,以及2种供电方式,既可作为手持设备使用,又能安装在发电系统中,具有较高的实用价值。    1 硬件电路设计   1.1 总体结构   该测试仪以AT89S52单片机为核心,外接温湿度传感器SHTll、照度传感器TSL2561、四位共阴数码管、RS485总线通信接口以及显示切换按键。单片机上电工作后,对当前温度、湿度、光强度进行实时测量,通过按键切换将测得的3种参数通过LED数码管进行轮流显示;此外,还可以通过RS485总线
[单片机]
德国R&S罗德与施瓦茨FSW 信号与频谱分析仪
R&S®FSW 信号与频谱分析仪(顶配) 高性能 R&S®FSW 信号与频谱分析仪可帮助工程师完成严苛任务。它具备较高的内部分析带宽,可对宽带组件和通信系统进行特性测量。分析仪具备出色的相位噪声,有助于开发适用于雷达等应用的高性能振荡器。先进的多点触控显示屏支持手势动作,确保操作简单直观。嵌入式 SCPI 记录器可以轻松创建可执行脚本。 主要特点 ► 频率范围介于 2 Hz 至 90 GHz(使用罗德与施瓦茨的外部谐波混频器时最高可达 500 GHz) ► 低相位噪声,在 10 kHz 偏置时为 –140 dBc (1 Hz),在 100 kHz 偏置时为 –143 dBc(1 GHz 载 波) ► 60 dBc 无杂散动态范
[测试测量]
WinCC和S7-200在橡胶三角带生产中的应用
一. 项目简介   1. 上海方电科技发展有限公司是一家由继续设计,计算机软硬件及 自动化 专业等高级技术人员组成的科技公司,主要从事帘帆布浸胶机设备及涂层设备的设计、开发和制造。该项目于2006初确定,3月开始实施,5月完成交付使用。   2. 用户单位:河南尉氏久龙橡塑集团有限公司,地处河南开封尉氏县,年产三角带以生产各种规格三角带为主。现有平版硫化机72台,硫化罐50台。久龙橡塑集团年生产三角带达7000万A米,处于行业领先地位。橡胶三角带的质量与硫化时间有关,硫化时间不能少,也不能太长。为保证质量,采用了 硫化计算机监控系统。   3. 三角带的规格繁多,小型的,采用模具固定,在硫化罐中加压、加热并保持一定硫化
[嵌入式]
S7不支持QC3.0快充 自家处理器拖后腿?
     备受大家关注度的三星Galaxy S7系列在MWC 2016上亮相,三星Galaxy S7系列在很多方面多做了提升,IP68级防尘防水、双核全像素、重新支持Micro SD卡等,但是三星Galaxy S7系列并没有在快充的性能上做出升级,没有使用最新的高通QC3.0快充技术。 三星Galaxy S7系列不支持QC3.0快充     高通QC 3.0宣称比2.0在效率上提升了38%、充电速度快27%,设备发热也降低了45%,电压可做到3.6V-20V。   外媒Sammobile猜测,之所以三星Galaxy S7/S7 Edge不支持QC3.0快充,是因为该机还有自家处理器Exynos8890的版本,该处理器只支
[手机便携]
VFD显示模块128S64AA1及其应用
摘要:128S64AA1是一种128%26;#215;64点阵式VFD显示模块,具有使用方便、亮度高且可以调节、显示图文灵活等优点。本文介绍128S64AA1的基本原理,探讨实际应用中的硬件设计和软件编程方法。 关键词:VFD模块 点阵式显示 真空荧光显示屏 引言 目前,智能仪表常用的显示设备有发光二极管显示器LED、液晶显示器LCD等,但是由于LED不能显示复杂字符、LCD不宜在暗室中使用的缺点,无法满足智能仪表对显示的更高求;而真空荧光显示屏VFD具有亮度高、可调节、显示图案灵活的优点,在智能仪表中得到了广泛的应用。本文以Samsung公司的128S64AA1VFD显示模块为例,介绍在基于51系列单片机的智能仪表中的应
[应用]
Freescale MC9S08AW60汇编学习笔记(八)
能够实现用七段led数码管显示出数字和字母、让它们同时显示甚至于滚动显示,这些功能已经很不错了,但是这样还不够,我们还想实现更准确的控制,让数码管按照我们的想法来显示,而不是呆板的循环,这样我们引入中断的想法。也许其他人会从查询和中断的关系这些地方来引出中断,但是我还是倾向于从控制的观点来引出中断,毕竟中断也是实现更直观的人为控制的方法,程序的运行变得可以加入人的意愿来执行,如果我们要让程序进入某一个中断程序,那么给主程序发一个中断,让它跳到中断子程序中运行就行了;我们不发中断,中断子程序就不会执行。还是用七段led数码管来演示,我们没发一个中断信号,数码管就在0~9之间变化一下。代码如下: INCLUDE MC9S08AW6
[单片机]
Freescale MC9<font color='red'>S</font>08AW60汇编学习笔记(八)
国产“神机”再现:正面iPhone X 背面翻版三星S8
    我觉得若论手机山寨,估计谁都得服国产。之前,中国深圳手机厂商Doogee推出过很多全面屏手机,但是设计大多有“借鉴”友商的嫌疑。现在爆料大神@evleaks又曝光了该公司的一款新机,我们不得不说这简直就是三星、苹果的结合体。  Doogee V(图片来自@evleaks)   爆料大神称这款手机的屏幕大小为6.2英寸,正面采用了iPhone X的“刘海屏”设计,并且很有可能搭载屏下指纹识别技术。除此之外,看背面和侧面的曝光图,这款手机神似三星Galaxy S8,并且采用双曲面屏设计。   目前该机的具体配置和发布时间暂不得知,不过,如果不出意外这款手机可能只会面向海外市场。
[手机便携]
6、异常向量表的学习---设置SVC模式
这是手册的资料,我们看到,要设置svc模式,就是要把我们的cpsr的后五位设置为0b10011即可。Cpsr的结构: 接下来,我们就来把cpsr的后五位设置为0b10011. 设置的思路: 首先把这五位清零(bic指令),使用orr往这五位写入0b10011.当然,这些操作的实现必须借助mrs和msr两个指令来完成(cpsr和spsr不能直接访问). 操作如下: 看运行的结果,设置成功。 看门狗实现 看门狗的结构图: 6410的看门狗的资料: 我们通过上面的看门狗的控制寄存器的设置就可以关闭看门狗。【0】位的说明,我们只要把WTCON的第0位设置为0,就能关闭看门狗。【2】位是看门狗超时产生中断的,
[单片机]
6、异常向量表的学习---<font color='red'>设置</font><font color='red'>SVC</font><font color='red'>模式</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved