目标:写出bootloader的第一阶段代码和第二阶段代码,并测试。


最简单的bootloader的编写步骤:

1. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
2. 如果bootloader比较大,要把它重定位到SDRAM
3. 把内核从NAND FLASH读到SDRAM
4. 设置"要传给内核的参数"
5. 跳转执行内核

1. 第一阶段:

编写start.S程序,主要用于初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH等

1.1 关看门狗

     /* 关看门狗 */
ldr r0, =0x53000000
mov r1, #
str r1, [r0]

s3c2440的看门狗寄存器地址为:0x53000000;1:把0x53000000这个地址写到r0中了  这时ldr是一个伪指令;  2:将数值0送入r1中;3:将r1里面的值,复制到以r0里面的值作为地址的内存里面。

1.2 设置时钟

       #define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))
1 /* 设置时钟 */
ldr r0, =0x4c000014
mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
str r1, [r0] /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
mrc p15, , r1, c1, c0, /* 读出控制寄存器 */
orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */
mcr p15, , r1, c1, c0, /* 写入控制寄存器 */ /* MPLLCON = S3C2440_MPLL_200MHZ */
ldr r0, =0x4c000004 //MPLLCON寄存器地址
ldr r1, =S3C2440_MPLL_200MHZ
str r1, [r0]

这里以200MHz为例, FCLK:HCLK:PCLK分别为:50MHz,100MHz,200MHz。

1.3 初始化SDRAM

    #define MEM_CTL_BASE    0x48000000
1 /* 初始化SDRAM */
ldr r0, =MEM_CTL_BASE
adr r1, sdram_config /* sdram_config的当前地址 */
add r3, r0, #(*)
:
ldr r2, [r1], #
str r2, [r0], #
cmp r0, r3
  sdram_config:
   .long 0x22011110  //BWSCON
   .long 0x00000700  //BANKCON0
   .long 0x00000700  //BANKCON1
   .long 0x00000700  //BANKCON2
   .long 0x00000700  //BANKCON3 
   .long 0x00000700  //BANKCON4
   .long 0x00000700  //BANKCON5
   .long 0x00018005  //BANKCON6
   .long 0x00018005  //BANKCON7
   .long 0x008C04F4  // REFRESH
   .long 0x000000B1  //BANKSIZE
   .long 0x00000030  //MRSRB6
   .long 0x00000030  //MRSRB7

 1.4 重定位 : 把bootloader本身的代码从flash复制到它的链接地址去 */

     ldr sp, =0x34000000

     bl nand_init   //NAND Flash初始化,在c程序中实现

     mov r0, #
ldr r1, =_start
ldr r2, =__bss_start
sub r2, r2, r1 bl copy_code_to_sdram
bl clear_bss

 1.5 执行main

 /*  执行main */
ldr lr, =halt
ldr pc, =main //调用C程序中的main函数
halt:
b halt // 循环

第二阶段:

第二阶段的代码由C语言完成,包括:

  1. 帮内核设置串口; 2. 从NAND FLASH里把内核读入内存; 3. 设置传入参数; 4.  跳转执行kernel;

问题

怎样查找内核加载地址和大小?

在uboot命令行下使用mtd命令,bootloader、params、kernel、root文件系统的存放地址,以便后面写程序时查找加载地址和大小。

待续。。。。。。。。。。。。

最新文章

  1. Win10全屏看视频时任务栏不隐藏
  2. EditText的小细节
  3. 翻滚吧,Spark (错误记录)
  4. 深入学习golang(2)—channel
  5. page fault rate
  6. POJ 2398 Toy Storage
  7. 【原】理解Storm拓扑的并行
  8. 错误:Duplicate interface definition for class
  9. OC中两个关键字的作用:@property和@synthesize
  10. TextView实现多个TextView对象的走马灯效果
  11. 矢量切片(Vector tile)
  12. 五.Spring与RabbitMQ集成--HelloWorld
  13. Linux系统启动详解
  14. centos7安装supervisor
  15. YAML-CPP
  16. Vc数据库编程基础MySql数据库的表查询功能
  17. jQuery 实现添加表格行,删除行,调用日期控件
  18. PHP 重置数组为连续数字索引的几种方式
  19. 使用libcurl作为Http client
  20. pipenv 方便的python 开发工作流工具

热门文章

  1. keras 保存训练的最佳模型
  2. spring框架入门day01
  3. 框架页面jquery装载
  4. 元素float以后,div高度无法自适应解决方案
  5. 数据库操作(c#)
  6. C++设计模式实现--訪问者(Visitor)模式
  7. 贪心,Gene Assembly,ZOJ(1076)
  8. CodeForces-822D 【最小素因子应用】
  9. mybatis学习记录五——动态sql
  10. java中String、StringBuffer和StringBuilder的区别(简单介绍)