uboot之\cpu\s3c44b0\start.S文件的详解

发布者:cocolang最新更新时间:2015-07-27 来源: 51hei关键字:uboot  s3c44b0  start  S文件 手机看文章 扫描二维码
随时随地手机看文章
今天总算看完了,理解完了,理解清楚了,看透了start.S~~~~~~

本来不想写的,想想还是轻描淡写吧:好理解的一笔带过,难理解的重点介绍。

.globl _start
_start: b       reset
 add pc, pc, #0x0c000000
 add pc, pc, #0x0c000000
 add pc, pc, #0x0c000000
 add pc, pc, #0x0c000000
 add pc, pc, #0x0c000000
 add pc, pc, #0x0c000000
 add pc, pc, #0x0c000000

 .balignl 16,0xdeadbeef

_start 全局变量,uboot代码入口,在uboot中偏移地址_start_offset=0。除了reset中断外,其他中断都跳到SDRAM中去执行中断,因此,用add指令,增加跳转范围。用LDR也是可以的,不过得另外定义一些变量,不如add省事,呵呵~~至于.balignl 16,0xdeadbeef网上都是说将地址对齐为16的倍数。为什么要对齐呢??不知道

*************************************************************************************************

_TEXT_BASE:
 .word TEXT_BASE

.globl _armboot_start
_armboot_start:
 .word _start
.globl _bss_start
_bss_start:
 .word __bss_start

.globl _bss_end
_bss_end:
 .word _end

全局变量定义声明:

_TEXT_BASE:全局变量指示uboot将被放在SDRAM中的地址,初始化为TEXT_BASE,在ubootoarddaveB2config.mk中赋值

_armboot_start:全局变量,指示uboot起始地址,初始化为_start,与_bss_start共同构成uboot的大小(sizeof(uboot)=_bss_start-_armboot_start)

_bss_start:BSS:Block Started by Symbol segment,全局变量,定义在ubootoarddaveB2u-boot.lds。用来存放未初始化的全局变量的一块内存。_bss_start:BSS段起始地址

_bss_start:BSS段结束地址,_bss_start-_bss_end=sizeof(BSS)

*************************************************************************************************

#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
 .word 0x0badc0de

/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
 .word 0x0badc0de
#endif

如果要用到IRQ和FIQ就设置相应堆栈

*************************************************************************************************

先到这~~吃饭去了

接着写吧,有点难继续下:

reset:
 mrs r0,cpsr
 bic r0,r0,#0x1f
 orr r0,r0,#0x13
 msr cpsr,r0

@系统上电复位后设置成SVC模式

@寄存器操作方法:读----修改-----回写

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
 bl cpu_init_crit
 bl lowlevel_init
#endif

@如果没有定义CONFIG_SKIP_LOWLEVEL_INIT(顾名思义:跳过底层初始化)

@没有定义的话那就跳进去进行初始化吧。

@cpu_init_crit函数在本文本中 后面介绍

@lowlevel_init在ubootoarddaveB2lowlevel_init.S 完成存储器初始化(<1.4的uboot不是这个名称,好像是memap.S??大概是这个名字)

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:    /* relocate U-Boot to RAM     */
 adr r0, _start  /* r0 <- current position of code   */
 ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */
 cmp     r0, r1                  /* don't reloc during debug         */
 beq     stack_setup

@如果没有定义CONFIG_SKIP_RELOCATE_UBOOT(顾名思义:跳过重定位)

@那就要进行重定位判断了

@先判断uboot放置的地址,是在flash还是在SDRAM中。如果在flash中,则要重定位,即把uboot代码整个搬@移至SDRAM中TEXT_BASE地址处;如果在SDRAM中,则不需要搬移,直接跳到堆栈设置。

@关于怎么判断的,详见日志:uboot relocate

 ldr r2, _armboot_start
 ldr r3, _bss_start
 sub r2, r3, r2  /* r2 <- size of armboot            */
 add r2, r0, r2  /* r2 <- source end address         */

@如果要搬移的话,计算uboot的大小

@并将整个搬移后的地址放入r2,以进行判断是否搬运完了

copy_loop:
 ldmia r0!, {r3-r10}  /* copy from source address [r0]    */
 stmia r1!, {r3-r10}  /* copy to   target address [r1]    */
 cmp r0, r2   /* until source end addreee [r2]    */
 ble copy_loop

@代码搬移,每次搬运r3-r10个[page]

@如果源地址和目标地址不一样,则说明没搬运完

adr r0, real_vectors
 add r2, r0, #1024
 ldr r1, =0x0c000000
 add r1, r1, #0x08
vector_copy_loop:
 ldmia r0!, {r3-r10}
 stmia r1!, {r3-r10}
 cmp r0, r2
 ble vector_copy_loop

@将flash地址中的中断向量表搬移到SDRAM中,构成二级中断向量表

@当有中断到来时,先跳转到flash地址的中断向量表(0x00000000),再在程序开始处的跳转指令跳转到

@SDRAM中的中断向量表(0x0c000000)
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

@结束重定位,进行堆栈设置

stack_setup:
 ldr r0, _TEXT_BASE  /* upper 128 KiB: relocated uboot   */
 sub r0, r0, #CFG_MALLOC_LEN /* malloc area                      */
 sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo           

@按照uboot存储器映射图,uboot被映射到SDRAM的高端。而在SDRAM地址减生长方向依次为

@CFG_MALLOC_LEN,CFG_GBL_DATA_SIZE,IRQ&FIQ(if define) abort_stack(12B)

@CFG_ENV_SIZE:环境变量存储空间,紧接着MALLOC_LEN的前面(1024)

@MALLOC_LEN:定义在 ubootincludeconfigB2.h 为malloc()函数预留的数据空间

@同时包含CFG_ENV_SIZE,大小为(CFG_ENV_SIZE + 128*1024)

@GBL_DATA_SIZE:全局信息表gd的数据空间(128)

@IRQ&FIQ:如果定义了的话就分配
#ifdef CONFIG_USE_IRQ
 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif

@如果定义了CONFIG_USE_IRQ 则分配IRQ和FIQ堆栈
 sub sp, r0, #12  /* leave 3 words for abort-stack    */

@分配12个字节空间为用户栈

@注:CFG_MALLOC_LEN + CFG_GBL_DATA_SIZE + CONFIG_USE_IRQ + 12 =

@TEXT_BASE - SDRAM_start

 ldr pc, _start_armboot

_start_armboot: .word start_armboot

@跳转到_start_armboot

@_start_armboot用start_armboot初始化,即第一个C函数

*************************************************************************************************

#define INTCON (0x01c00000+0x200000)
#define INTMSK (0x01c00000+0x20000c)
#define LOCKTIME (0x01c00000+0x18000c)
#define PLLCON (0x01c00000+0x180000)
#define CLKCON (0x01c00000+0x180004)
#define WTCON (0x01c00000+0x130000)

@cpu初始化相关的一些寄存器名宏定义

*************************************************************************************************
cpu_init_crit:
 /* disable watch dog */
 ldr  r0, =WTCON
 ldr r1, =0x0
 str r1, [r0]

@关闭看门狗

*************************************************************************************************
 ldr r1,=INTMSK
 ldr r0, =0x03fffeff
 str r0, [r1]

 ldr r1, =INTCON
 ldr r0, =0x05
 str r0, [r1]

@屏闭所有中断,只开启timer5做linux时钟

*************************************************************************************************
 ldr r1, =LOCKTIME
 ldrb r0, =800
 strb r0, [r1]

@设置时钟锁定延迟时间

 #if CONFIG_S3C44B0_CLOCK_SPEED==66
 ldr r0, =0x34031  /* 66MHz (Quartz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
 ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz  */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif

@如果定义了一些系统时钟的相关宏定义则设置相应的PLLCON

@当然自己也可以定义自己想要的时钟 只需设置相应的值即可

str r0, [r1]

ldr r1,=CLKCON
 ldr r0, =0x7ff8
 str r0, [r1]

@使能所有模块的时钟

 mov pc, lr

返回调用处

关键字:uboot  s3c44b0  start  S文件 引用地址:uboot之\cpu\s3c44b0\start.S文件的详解

上一篇:STM32学习手记③-EXTI中断
下一篇:自制bootloader 之 文本代码

推荐阅读最新更新时间:2024-03-16 14:26

mini2440_NFS 利用uboot启动
本文记录mini2440开发板如何利用uboot通过nfs服务来启动内核。 背景: 放了好久的板子,今天又得重新拿来使唤,之前换了机子,虽说除了kernel和rootfs通过nfs挂载的,但u-boot死活进不去...搞定u-boot,nfs又不好使了。 环境: 1.OS:ubuntu11.10; 2.串口工具:C-kermit 涉及: 1.nfs中exports的配置; 2.u-boot中env的设置; 3.遇到的问题... 一、nfs中配置文件:/etc/exports $sudo vim /etc/exports 1.添加开发板要挂载的nfs目录: /your/nfsroo
[单片机]
用U盘烧写Uboot.bin到Nor Flash
1.在开发板上面插上U盘 2.打到 NAND flash模式启动U-boot,输入以下命令打开usb设备。 # usb reset //以重启的方式 或者用 # usb start //以直接启动的方式 3.给USB设置驱动号: # usb dev 0 4.给USB设置端口号,有如下显示: # usb part 0 Partition Map for USB device 0 -- Partition Type: DOS Partition Start Sector Num Sectors Type 1 691968 15743232 c 5.查看usb文
[单片机]
飞思卡尔MC9S12(X)系列的内存资源分配和.prm文件的结构
一、内存分配 1.资源分布 如上图所示,单片机型号最后的数字也就代表了单片机中Flash的大小,S12G128 表示Flash有128K Byte,S12G192 表示Flash有192K Byte。但是S12(X)所使用的内核CPU12(X)的地址总线为16位,寻址范围最大为2^16 =64K Byte,而这64K Byte的寻址空间还包括寄存器、EEPROM(利用Data Flash模拟)、RAM等,因此不是所有的64K Byte都是用来寻址FLASH。所以在S12(X)系列单片机中,很多资源是以分页的形式出现的,其中包括EEPROM、RAM、FLASH。EEPROM的每页大小为1K Byte,RAM的每页大小为4K Byt
[单片机]
飞思卡尔MC9<font color='red'>S</font>12(X)系列的内存资源分配和.prm<font color='red'>文件</font>的结构
基于S3C2440的Linux内核移植和yaffs2文件系统制作--Linux源码参数
1.3.2 修改Linux源码中参数 1、解压内核源码 mkdir /opt/studyarm cd /mnt/hgfs/share tar –jxvf linux-2.6.29.1.tar.bz2 –C /opt/studyarm 2、 进入内核目录,修改makefile,并对内核进行默认配置进行修改 193行,修改 ARCH ?=arm CROSS_COMPILE ?=arm-linux- 3、 修改平台输入时钟 找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件,在函数 static void __init smdk24
[单片机]
OK6410A 开发板 (八) 20 linux-5.11 OK6410A start_kernel 功能角度 第三阶段之kthreadd进程
arch_call_rest_init rest_init pid = kernel_thread(kernel_init, NULL, CLONE_FS); pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); cpu_startup_entry(CPUHP_ONLINE); 内核进程2的创建过程 arm linux 内核源码剖析.pdf P407 内核进程2开始运行的时刻 start_kernel- rest_init- schedule_preempt_disabled - schedule - __schedule - context_sw
[单片机]
分析uboot移植第一阶段的各种代码
一直uboot的过程: 1. 选择是什么架构的单片机或者平台 在总的make file 里面 2. 更改时钟配置 3. 更改串口相关的时钟配置 4. 选用适当的norflash 5.选用适当的nandflash 1. 100ask24x0_config : unconfig @(MKCONFIG)(MKCONFIG)(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0 其中 第一个参数 ARM 表示的是架构是什么架构 我们这里的架构是ARM架构 第二个参数是 什么CPU 这里是 Arm920t的CPU 第三个参数是什么开发板:这里是 100ask24x0的开发板 第四个参数是
[单片机]
cortex-a8 uboot系列:第十七章 uboot移植-网卡DM9000移植
一、网卡基础知识 1.网卡芯片与开发板的连接方式 总线式连接方式,使用SROM总线接口。 开发板核心板,使用SROM控制器的bank1。因此有效地址是0x8800_0000 – 0xffff_ffff。 开发板上DM9000的连接。使用16-bit数据连接方式 网卡芯片有CS引脚,(CS就是chip_select,选线信号,主机向CS发送有效信号则从机芯片工作,主机向CS发送无效信号则从机芯片不工作)。这个引脚要接soc的srom控制器的片选引脚。 主机s5pv210的srom控制器每一个bank都有一个片选信号CSn(n=0-5),这里接CSn1,说明DM9000接的是srom的bank1。 所以,可以
[单片机]
cortex-a8 <font color='red'>uboot</font>系列:第十七章 <font color='red'>uboot</font>移植-网卡DM9000移植
Blob在S3C44B0上的移植
引 言   Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础 。 1 Blob简介   Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux A
[单片机]
Blob在<font color='red'>S3C44B0</font>上的移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved