写一个自己的bootloader(一)汇编系列

发布时间:
来源: 电子工程世界

此bootloader是根据韦东山先生的开发板而制定的 是一个最小的boot系统 必须首先把内核拷nandflash里面才行。


我们先一步步的完成这个小的bootloader


1. 首先我们需要关闭看门狗:


ldr r0, 0x53000000 //this is the address of watch 

mov r1, #0; 

str r1, [r0] //disable watch dog

看门狗的地址在0x53000000


我们给他赋值0 即可


设置时钟:


时钟的比例是 FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1


所以应该是: 

MDIV 0x5C


PDIV 0x01


SDIV 0x01

这里面 HDIVN : 01


             PDIVN:1


然后加入此段代码 进入异步模式


/* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */

    mrc    p15, 0, r1, c1, c0, 0        /* 读出控制寄存器 */ 

    orr    r1, r1, #0xc0000000            /* 设置为“asynchronous bus mode” */

    mcr    p15, 0, r1, c1, c0, 0        /* 写入控制寄存器 */

 


后面使能sram


再往后进行代码重定义:


1. 首先建立栈 初始化nandflash


2. 进行代码重定义


  ldr sp, = 0x34000000   /*set stack for c language*/


       bl nand_init                /*initialize the nand flash*/


       mov r0, #0

       ldr r1, =_start                /*get code start address from lds file*/

       ldr r2, =__bss_start       /*get bss start address from lds file  */

       sub r2, r2, r1


       bl copy_code2sdram    /*relocate the text to sdram*/


       bl clear_bss



进入主函数 注册 并且跳到内核


 /*5. excute  main*/


      ldr lr, = halt

      ldr pc, = main


      halt:

           b  halt


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。