自制bootloader 之 文本代码

发布者:huanguu最新更新时间:2015-07-27 来源: 51hei关键字:bootloader  文本代码 手机看文章 扫描二维码
随时随地手机看文章
   想移植uboot1.4到板子上,搞了半天没成功,决心弄明白uboot原理,大概流程,所以决定写个简单的bootloader来理顺一下应该做些什么,怎么做~~~~

    首先应该描述一下该bootloader的基本功能:板子上电后能进行LED流水灯(万能的流水灯啊)。实现该功能分两步:第一步,真正的bootloader功能,即实现硬件的初始化以及将内核程序(LED流水灯)从ROM(flash)搬移到RAM(sdram);第二步,内核程序的实现

    第一步也可分两段:1,板子硬件初始化;2,内核程序的搬移。代码文件:boot.s

    板子硬件初始化:1. 异常向量初始化
              2. 初始化CPSR,包括关闭中断及设定svc模式等
              3. 关闭看门狗定时器
              4. 初始化系统时钟
                    5. 初始化CPU Cache(这步可以不做,但是系统效率会明显下降许多)

    内核执行流程:1,内核异常向量初始化

        2,初始化堆栈

        3,跳转到C程序中执行万能的流水灯~~~~

代码如下:  

equ     SYSCFG,        0x01c00000    
.equ     BWSCON,        0x01c80000   
.equ     WTCON,         0x01d30000   
.equ     PLLCON,        0x01d80000   
.equ     CLKCON,        0x01d80004   

.equ     KERNEL_START,  0x0c000100        @ 内核执行的起始位置(RAM)    

.equ     KERNEL_VECTOR, 0x0c000000        @ 内核的异常向量入口(RAM)    

.equ     KERNEL_DATA,   0x00000100        @ 内核数据在ROM中的起始位置    

.equ     KERNEL_CPLMT,  0x00001000        @ 复制界限(内核数据在ROM中的终止位置,4KB)

.equ     REFEN,    0x01

.equ  TREFMD,   0x0

.equ  Trp,      0x1

.equ  Trc,          0x1

.equ      Tchr,       0x2

.equ      REFCNT,   1550

vectors:

    b    reset

    ldr    pc, = KERNEL_VECTOR            @ 未定义协处理器指令    
       ldr    pc, = KERNEL_VECTOR + 4        @ SWI(软中断)    
              ldr    pc, = KERNEL_VECTOR + 8        @ 预取指令中止     

              ldr    pc, = KERNEL_VECTOR + 12       @ 数据中止    
              b      .   
              ldr    pc, = KERNEL_VECTOR + 16       @ IRQ(普通中断请求)    
             ldr    pc, = KERNEL_VECTOR + 20       @ FIQ(快速中断请求)

reset:

    mov    r0,0xd3    ;禁止IRQ,FIQ,SVC模式

    msr    cpsr_c,r0

 

    ldr    r0,=WTCON     ;关看门狗

    mov    r1,#0

    str    r1,[r0]

 

    ldr    r0,=PLLCON       ;初始化PLLCON

    mov    r1,#0x48032      ;Fin=10M Fpllo=40M Mdiv=0x48 Pdiv=0x3 Sdiv=0x2

    str    r1,[r0]

    ldr    r0,=CLKCON

    ldr    r1,=0x7f88    ;提供给所有外设时钟

    str    r1,[r0]

 

    ldr    r0,=SYSCFG     ;初始化cpu cach

    mov    r1,#0x0e            ;8K cache  写缓冲使能

    str    r1,[r0]

 

    ldr    r0,=SMRDATA        ;初始化存储器

    ldmia   r0,{r1-r13}

    ldr    r0,=BWSCON

    stmia   r0,{r1-r13}

;将内核程序(LED流水灯)从0x00000100(flash)复制到0x0c000000(sdram)

    ldr    fp,=KERNEL_DATA

    ldr    ip,=KERNEL_VECTOR

    ldr    sp,=KERNEL_CPLMT

1:   ldmia   fp!,{r0-r7}

    stmia   ip!,{r0-r7}

    cmp    fp,ip

    bcc     1b

    ldr    pc,=KERNEL_START

smrdata :   
.word      0x11110090

.word      0x00000600

.word      0x00000700                    @ BANKCON1: 默认    
.word      0x00000700                    @ BANKCON2: 默认    
.word      0x00000700                    @ BANKCON3: 默认    
.word      0x00000700                    @ BANKCON4: 默认    
.word      0x00000700                    @ BANKCON5: 默认    
.word      0x00018000                    @ BANKCON6: SDRAM,SCAN=8位,Trcd=2个时钟    
.word      0x00000700                    @ BANKCON7: 默认   

.word      ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)  ;refresh register 
    
.word      0x00000016                    @ BANKSIZE: SLCKEN=1, BK76MAP=8M    
.word      0x00000020                    @ MRSRB6: CL=2个时钟  

.word   0x20                                @MRSRB7

第二步:内核程序的实现,代码文件 head.s

内核程序大致三步:1,内核异常向量初始化;2,内核堆栈初始化;3,执行LED程序;

代码如下:

.equ    KERNEL_STACK,    0x0c002000

.equ    KERNEL_LIMIT,       0x0c001000

vectors:

 b     undef_handler                  @ 内核异常向量0    
    b     swi_handler                    @ 内核异常向量1    
    b     pabort_handler                 @ 内核异常向量2    
    b     dabort_handler                 @ 内核异常向量3    
    b     irq_handler                    @ 内核异常向量4    
    b     fiq_handler                    @ 内核异常向量5

.space    0x100-6*4       @字节填充至地址:0x0c000100

start:

    ldr    sp,=KERNEL_STACK

    ldr    sl,=KERNEL_LIMIT

    bl    entry

undef_handler:   

swi_handler:   

pabort_handler:   

dabort_handler:   

irq_handler:   

fiq_handler:   

    b     .                              @ 目前什么都不做 

  以上两个文本程序基本实现了一个bootloader的功能,至少符合我的板子,只要再加上上一篇LED篇中的LED程序,就是一个完整的bootloader程序了。当然,还是需要几番调试的。而大debug之前还是有很多工作要做滴。下一篇再说吧,这里太长了~~~~

关键字:bootloader  文本代码 引用地址:自制bootloader 之 文本代码

上一篇:uboot之\cpu\s3c44b0\start.S文件的详解
下一篇:LPC2103的PWM编程

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

编写bootloader(一):编写前的介绍及关闭看门狗和时钟的设置
我们知道,U-Boot最大的作用就是启动内核。然而,启动内核之前,它也要做许多事情。接下来,我们就自己编写一个bootloader,让它执行启动内核的功能。 对于bootloader,我们知道,它的第一段代码就是Start.S,这是一个汇编文件,在这个文件里面,我们进行一些硬件的初始化,也就是bootloader初始化的第一阶段。在这个初始化里面,我们需要做以下事情: 1.关看门狗 2.设置时钟 3.初始化SDRAM 4.重定位代码 对于上面的步骤,我分别解释一下。首先,关看门狗,是防止程序定时重启;设置时钟,可以设置机器的运行频率,如CPU运行频率,与HCLK有关的部件的频率、与
[单片机]
编写<font color='red'>bootloader</font>(一):编写前的介绍及关闭看门狗和时钟的设置
设计一款STM32的BootLoader
之前很想做一个属于STM32的BootLoader,但是想想没什么实际用处就没有下手,但是当前的项目遇到的麻烦事情要我改变了这种看法。比如说我开发了一个产品需要测试,把一个样品送到客户手里去测试使用,但是客户在使用的过程中提出了一些修改建议,那我就在做一个样品改好程序之后发出去给客户,不久之后客户又有了新的修改要求,如此往复,大部分时间都耽误在做样品、寄快递上了,极大地耽误了产品的研发周期。但是如果我们能够远程的将修改好的程序下载到产品上去的话会减少很多研发时间。当然前提是产品本身有接出来通信接口,我们使用这个接口才能进行程序升级,或者产品本身能够连接到网络通过网络更新固件。 好的,既然BootLoader是有实际价值的,那就
[单片机]
设计一款STM32的<font color='red'>BootLoader</font>
第28章 STM32F429的系统bootloader基础知识
28.1 初学者重要提示 本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。 更多系统bootloader的基础知识看本帖的AN2606应用笔记:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96573 28.2 系统bootLoader基础知识 STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写b
[单片机]
第28章 STM32F429的系统<font color='red'>bootloader</font>基础知识
ARM7TDMI-S在嵌入式系统中的Bootloader代码设计
摘要:ARM7TDMI-S是ARM公司设计的一款32位精简指令集处理器内核,LPC210x系列是飞利浦半导体公司生产的基于ARM7TDMI-S内核的芯片。在嵌入式系统设计中,针对嵌入式处理器和操作系统的Bootloader代码的设计是一个难点。本文根据用LPC2106进行嵌入式系统设计的实际经验,总结出基于ARM7TDMI-S内核的嵌入式处理器芯片的Bootloader代码设计的一般流程;给出LPC2106芯片在基于μC/OS-II操作系统的嵌入式应用中,BootLoader程序的详细设计流程及其中的一些关键技术和代码。 关键词:ARM7TDMI-S嵌入式系统 BootLoader代码 LPC2106 μC/OS-II 引言
[嵌入式]
【dsPIC33E】Bootloader(二)Microchip的Hex文件结构介绍
市面上大多数单片机的Hex文件都是基于Intel Hex,而dsPIC33E也不例外,dsPIC33E支持的格式为Intel HEX32(INHX32)。 hex文件以ascii形式,按照行来记录数据 每一行从:开始,每至少2个字符表示一组16进制数据,格式为 :BBAAAATTHHHH....HHHCC BB -- 16进制,表示此行数据长度字节数,表示HH的数目 AAAA -- 16进制,表示数据记录的起始地址,若此行是数据记录,则表示偏移地址,其它无意义 TT -- 16进制,表示记录类型, 00-数据记录(Data Record); 01-文件记录结束(End of File record); 02-扩展段地址
[单片机]
【dsPIC33E】<font color='red'>Bootloader</font>(二)Microchip的Hex文件结构介绍
ARM7TDMI-S在嵌入式系统中的Bootloader代码设计
引言 芯片的Bootloader代码(即启动代码)就是芯片复位后进入操作系统之前执行的一段代码,主要是为运行操作系统提供基本的运行环境,如初始化CPU堆栈、初始化存储器系统等。Bootloader代码与CPU芯片的内核结构、具体芯片和使用的操作系统等因素有关。其功能有点类似于PC机的BIOS(Basic Input/Output System,基本输入输出系统)程序,但是由于嵌入式系统的软硬件都要比PC机的简单,所以它的Bootloader代码要比BIOS程序简单得多。 嵌入式系统被定义为:以应用中为心,以计算机技术为基础,软件硬件可裁剪,适用于系统对功能、可靠性、成本、何种、功耗有严格要求的专用计算机系统。嵌入式系统的核
[单片机]
ARM7TDMI-S在嵌入式系统中的<font color='red'>Bootloader</font><font color='red'>代码</font>设计
XMEGA128学习笔记1-bootloader下载程序
首先需要感谢AVR和与非网举办这次AVR大赛,其次要感谢在学习板申请当中阿呆给予我们小组的帮助,最后要感谢我们的指导老师。我们小组将在论坛版块连载《XMEGA128学习笔记》系列,分享学习心得与大家共同探讨,也欢迎大家分享自己学习的心得,共同进步。 今天主要是叙述如何使用XMEGA的BOOTLODER功能下载程序。 首先请大家将附近的内容下载,由于论文附件大小的限制,Flip Installer - 3.4.3这个软件分成三个压缩包,需要大家一起解压,解压后进行安装,安装过程大家点击下一步就可以了。 第二个附件是“AVR1927_XMEGA-A1_Xplained_Example_Applications.zip”,这个压缩包是板
[单片机]
GNU ARM汇编--(十六)bootloader与kernel之间
在 《GNU ARM汇编--(十五)linux下的printascii》 中已经初步分析了自己写的bootloader在引导kernel时候出现的commandline在bootloader和kernel之间传递的问题,今天终于解决了,并对参数传递有一些研究: 传递的参数为: view plain copy params- u1.s.page_size = LINUX_PAGE_SIZE; params- u1.s.nr_pages = (DRAM_SIZE LINUX_PAGE_SHIFT); params- commandline 设定为 noinitrd root
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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