最简单的bootloader的编写
目标:写出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的编写的更多相关文章
- (嵌入式开发)自己写bootloader之编写第一阶段
最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH 2. 如果bootloader比较大,要把它重定位到SDRAM 3. 把内核 ...
- 简单的Poc Exp编写(上)
简单的POC EXP 编写 (上) 作者BY Greekn 今天主要讲的 是关于web 方面的 poc 编写 关于web 安全 个人理解的话 一个就是攻击 另一个就是漏洞挖掘了 防御的话 看 ...
- selenium从入门到应用 - 2,简单线性脚本的编写
本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...
- 一个简单的Makefile的编写【用自己的话,解释清楚这些】
用自己的话,解释清楚这些~ Makefile是程序员编写出来指导编译器编译程序源码为目标文件(可执行文件,或链接库) 这里只写一个简单的Makefile 作为例子 其需求如下: frank@ubunt ...
- 一个简单的makefile文件编写
下午闲来无聊,就打开很久没动过的linux系统想熟悉熟悉在linux上面编译代码,结果一个makefile文件搞到晚上才搞定,哈哈! 先把代码简单贴上来,就写了一个冒泡排序: sort.h: #ifn ...
- Slickflow.NET 开源工作流引擎快速入门之一: 简单序列流程代码编写示例
前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试.本文试图从一个最简单的流程来示例说明,如何快速了解引擎代码的编写. 版本: .NETCore 2.1 ...
- 最简单的Go Dockerfile编写姿势,没有之一!
1. Dockerfile一些额外注意点 选择最简单的镜像 比如alpine,整个镜像5M左右 设置镜像时区 RUN apk add --no-cache tzdata ENV TZ Asia/Sha ...
- hive 中简单的udf函数编写
.注册函数,使用using jar方式在hdfs上引用udf库. $hive.注销函数,只需要删除mysql的hive数据记录即可. delete from func_ru ; delete from ...
- OD 实验(十八) - 简单注册机的编写
程序: 运行 这是一个注册机 随便输入点内容,点击 Check 弹出错误的对话框 逆向: 用 OD 载入程序 在文本框处下断点 按 Alt+B 查看断点 这个断点在动态链接库那里 跑一下程序,输入内容 ...
随机推荐
- Recsys2018 music recomendation
http://www.recsyschallenge.com/2018/ January 2018 Release of the "One Million Playlists" d ...
- check_mk通用应用检测插件
客户端mk_tvmapp import json filename = '/tmp/tvmapp.json' print '<<<tvmapp>>>' for a ...
- 收缩事务日志(sqlserver)
sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件 可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候 ...
- day009-IO流
什么叫流?就是数据的流动.以内存为基准,分为输入input和输出output.输入也叫做读取数据,输出也叫写出数据. 分类 按数据的流向分: 输入流.输出流 按数据类型分: 字节流.字符流 1. ...
- Laravel 教程 - 实战 iBrand 开源电商 API 系统
iBrand 简介 IYOYO 公司于2011年在上海创立.经过8年行业积累,IYOYO 坚信技术驱动商业革新,通过提供产品和服务助力中小企业向智能商业转型升级. 基于社交店商的核心价值,在2016年 ...
- Python——追加学习笔记(一)
映射.字典 ## 映射类型内建函数 * dict Error: Python核心编程(第二版)p170 >>> dict([['x', 1], ['y', 2]]) {'y': 2, ...
- March 2 2017 Week 9 Thursday
The first duty of love is to listen. 爱的首要责任是倾听. Yesterday, I read an article that says a successful ...
- PHP使用memcache长连接作为RPC客户端需要注意的地方
memcache扩展版本 3.0.8 一. retry_interval $retry_interval 某个rpc服务器端失败后故障转移的时间,retry_interval的时间内,该节点会被一直标 ...
- 笔记本win8系统共享wifi上网方法
华硕笔记本电脑,安装了win8系统,使用wifi上网,由于连接无线路由的机器太多,超过路由连接数上限,因此转为使用笔记本共享wifi方式给手机上网. 最终上网方式为: 笔记本网卡接入无线路由器上网,笔 ...
- C语言 字符串处理函数
#include <stdio.h> #include <string.h> // strlen void test() { // 测量字符串常量的字符长度(不包括\0这个字符 ...