最简单的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 查看断点 这个断点在动态链接库那里 跑一下程序,输入内容 ...
随机推荐
- GridCellChoiceEditor
choice_editor = wx.grid.GridCellChoiceEditor(choices_list, True) grid.SetCellEditor(row, col, choice ...
- IEEP-网络实施-项目交付流程
1.项目交付流程 1.1 定义 项目交付流程规定了对项目实施的管理和作业控制要求,保证了工程项目实施按照规定的程序进行 1.2 重要性 1.2.1提高客户满意度 1.2.2 提高工程效率,节约成本 1 ...
- linux虚拟机最优测试环境搭建
目标:创建一个最优的linux虚拟机环境 环境:vmware12.0 系统:centos6.5 (* 以下配置是建立在配置完成基础网络环境后创建的,用static静态IP地址) 1.关闭selinux ...
- python入门4 python查看数据类型及类型转换
查看数据类型:type() 类型转换:int(),float(),char(),ord(),str(),bool() #coding:utf-8 #/usr/bin/python "&quo ...
- 读REDIS数据结构
一.DICT 主要有两个问题: 1.散列冲突,解决办法是拉链法 typedef struct dictEntry { void *key; union { void *val; uint64_t u6 ...
- thrift基本概念和实例
一.thrift可以做什么 thrift是一个跨语言通信的工具,支持的语言多,而且还提供服务器端的众多网络模型,使服务端的开发可以只专于服务本身的逻辑. 二.thrift重要概念 1.processo ...
- libevent将信号封装为socket通知的核心代码
#include"stdafx.h" #include"iostream" #include "algorithm" #include&qu ...
- 围绕react衍生出来的思考
优势一.声明式开发 首先react是声明式的开发方式,这个与之对应的是命令式开发方式,之前在用jquery写代码的时候,都是直接来操作dom,直接操作dom的这种编程方式,我们把他叫做命令式的编程,也 ...
- Java中Thread类的join方法到底是如何实现等待
现在的场景是A线程执行:public void run(){ bThread.join(0);//把b线程加入到当前线程(a线程),等待b结束,当前a线程才会结束.}B线程执行public void ...
- HBuilder实现WiFi调试Android
要求手机是开发模式 wifi实现 条件:已ROOT手机.手机和电脑需要在一个网段 第一步:安装在应用商店下载WiFi ADB (注意这里显示的ip等下使用) 第二步:打开WIFI ADB 第三步:切换 ...