目标:写出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文件系统的存放地址,以便后面写程序时查找加载地址和大小。

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

最简单的bootloader的编写的更多相关文章

  1. (嵌入式开发)自己写bootloader之编写第一阶段

    最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH 2. 如果bootloader比较大,要把它重定位到SDRAM 3. 把内核 ...

  2. 简单的Poc Exp编写(上)

    简单的POC EXP 编写 (上)   作者BY Greekn   今天主要讲的 是关于web 方面的 poc 编写 关于web 安全 个人理解的话 一个就是攻击  另一个就是漏洞挖掘了 防御的话 看 ...

  3. selenium从入门到应用 - 2,简单线性脚本的编写

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  4. 一个简单的Makefile的编写【用自己的话,解释清楚这些】

    用自己的话,解释清楚这些~ Makefile是程序员编写出来指导编译器编译程序源码为目标文件(可执行文件,或链接库) 这里只写一个简单的Makefile 作为例子 其需求如下: frank@ubunt ...

  5. 一个简单的makefile文件编写

    下午闲来无聊,就打开很久没动过的linux系统想熟悉熟悉在linux上面编译代码,结果一个makefile文件搞到晚上才搞定,哈哈! 先把代码简单贴上来,就写了一个冒泡排序: sort.h: #ifn ...

  6. Slickflow.NET 开源工作流引擎快速入门之一: 简单序列流程代码编写示例

    前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试.本文试图从一个最简单的流程来示例说明,如何快速了解引擎代码的编写. 版本: .NETCore 2.1 ...

  7. 最简单的Go Dockerfile编写姿势,没有之一!

    1. Dockerfile一些额外注意点 选择最简单的镜像 比如alpine,整个镜像5M左右 设置镜像时区 RUN apk add --no-cache tzdata ENV TZ Asia/Sha ...

  8. hive 中简单的udf函数编写

    .注册函数,使用using jar方式在hdfs上引用udf库. $hive.注销函数,只需要删除mysql的hive数据记录即可. delete from func_ru ; delete from ...

  9. OD 实验(十八) - 简单注册机的编写

    程序: 运行 这是一个注册机 随便输入点内容,点击 Check 弹出错误的对话框 逆向: 用 OD 载入程序 在文本框处下断点 按 Alt+B 查看断点 这个断点在动态链接库那里 跑一下程序,输入内容 ...

随机推荐

  1. 网络基础-IP、端口等

    首先来理解一下几个概念.      白帽子:有能力破坏电脑安全但不具恶意目的的黑客.白帽子一般有清楚的定义.道德规范并常常试图同企业合作去改善发现的安全弱点.         正义技术员. 灰帽子:对 ...

  2. Tomcat中部署web应用的三种方式

    Tomcat中部署web应用的三种方式(静态部署)       第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...

  3. [工作积累点滴整理]虚拟化、云计算配置规划<一>

    目 录1. 服务器虚拟化的相关配置建议 11.1. 服务器的基本配置建议 11.1.1. CPU配置 11.1.2. 服务器内存配置 21.1.3. 物理网卡配置 21.1.4. 服务器磁盘配置 21 ...

  4. /etc/hosts.allow和/etc/hosts.deny详解

    今天遇到一台服务器22端口正常,但是通过ssh连接的问题.排查了防火墙和端口问题,半天没有找出来原因,后来求助大神,终于明白了通过etc目录下hosts.deny和hosts.allow文件可以限制远 ...

  5. tensorflow报错 tensorflow Resource exhausted: OOM when allocating tensor with shape

    在使用tensorflow的object detection时,出现以下报错 tensorflow Resource exhausted: OOM when allocating tensor wit ...

  6. leetcode 198、打家劫舍

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  7. 数据结构学习-数组A[m+n]中依次存放两个线性表(a1,a2···am),(b1,b2···bn),将两个顺序表位置互换

    将数组中的两个顺序表位置互换,即将(b1,b2···bn)放到(a1,a2···am)前边. 解法一: 将数组中的全部元素(a1,a2,···am,b1,b2,···bn)原地逆置为(bn,bn-1, ...

  8. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  9. python常见异常及解决方法

    异常1: ValueError: unsupported hash type sha224 ERROR:root:code for hash sha256 was not found. Traceba ...

  10. 用jquery写的json省市县三级联动下拉

    <form action="#" name="myform"> <label>省</label><select nam ...