从零开始写bootloader(1)
下面是具体的代码实现:
.global _start:
_start: /* 关闭看门狗 * /
ldr r0, =0x53000000
mov r1,#0
str r1,[0]
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,这是根据数据手册来的,数据手册要求这样做(条件:如果FCLK不等于HCLK的话)*/
mrc p15,0,r1,cl,c0,0 /*读出控制寄存器*/
orr r1,r1,#0xc0000000 /*设置为"asynchronous bus mode"*/
mcr p15,0,r1,c1,c0,0 /*写入控制寄存器*/
/*设置MPLLCON= S3C2440_MPLL_200MHZ*/
ldr r0,= 0x4c000004
ldr r1,= s3c2440_MPLL_200MHZ /*伪汇编指的是在编译时,如果这个值比较复杂的话,那就会将这个值拆分放在内存的某个地方,然后再读那个内存地址*/
str r1,[r0]
adr r1,sdram_config /*得到当前地址*/
add r3,r0,#(13*4)
1b:
ldr r2,[r1],#4
str r2,[r0],#4
cmp r0,r3
bne 1b
sdram_config:
.long 0x22011110 //BWSCOON
.long 0x00000700 //BANKCON0
.long 0x00000700 //BANKCON1
.long 0x00000700 //BANKCON2
.long 0x00000700 //BANKCON3
.long 0x00000700 //BANKCON4
.long 0x00000700 //BANKCON5
.long 0x00018005 //BANKCON6
.long 0x008c04F4
.long 0x000000B1 //BANKSIZE
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7
ldr sp,= 0x34000000
mov r0,#0
ldr r1, =_start /*计算需要拷贝的文件的大小*/
ldr r2, =__bss_start
sub r2,r3,r1
bl copy_code_to_sdram /*将代码拷贝到sdram中*/
bl clear_bss /*bss段中的变量都赋值为0,至于为甚麽,我认为是语法的问题*/
ldr lr,=halt
ldr pc,=main
halt:
b halt /*假设main函数有返回值的话,一直停在这里,避免单板跑飞。*/
{
extern int __bss_start,__bss_end;
int *p = &__bss_start;
*p = 0;
}
#define TWTPH0 3
#define TERPH1 0
S3C2440nand->NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
/*使能nand flash控制器,初始化ECC,禁止片选*/
s3c2440nand->NFCONT = (1<<4) | (1<<1)| (1<<0);
/*nand发出命令函数*/
void nand_cmd(unsigned char cmd)
{
int i;
NFCMMMD cmd;
for (i = 0;i < 10;i++); /*必须等待一会,否则程序会出错*/
}
void nand_addr(unsigned int addr)
{
unsigned int col = addr /2048;
unsigned int page = addr % 2048;
volatile int i;
for (i = 0;i < 10;i++);
NFADDR = (col >> 8) & 0xff;
for (i = 0;i < 10;i++);
NFADDR = page & 0xff;
for (i = 0;i < 10;i++);
NFADDR = (page >> 8) & 0xff;
for (i = 0;i < 10;i++);
NFADDR = (page >> 16) & 0xff;
for (i = 0;i < 10;i++)
}
void nand_wait_ready()
{
while(!(NFSTAT & 1));
}
void unsigned char nand_data(void)
{
return NFDATA;
}
void nand_select(void)
{
NFCONT &= ~(1<<1);
}
void nand_deselect(void)
{
NFCONT |= (1<<1);
}
void nand_read(unsigned int addr,unsigned char *buf.unsigned int len)
{
int col = addr /2048; /*col指的是读的是第一页的某个地址,并不是从0开始读的*/
int i = 0;
/*选中*/
nand_select();
while(1)
{/*发出读命令00h*/
nand_cmd(0x00);
/*发出地址(分5步发出)*/
nand_addr(addr);
/*发出读命令*/
nand_cmd(0x30);
/*判断状态*/
nand_wait_ready();
/*读数据*/
for(;col< 2048;&&(i<len);col++)
{
buf[i] = nand_data();
i++;
addr++;
}
col =0;
}
nand_deselect();
从零开始写bootloader(1)的更多相关文章
- 从零开始写bootloader(2)
下图是设置内核启动参数的存放图示,由于bootloader启动内核时,需要给内核传输一些启动参数,但是由于当bootloader把内核 启动之后,程序就跳转到内核中执行了,再也不会回到bootload ...
- 深入浅出React Native 3: 从零开始写一个Hello World
这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...
- 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案
引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...
- 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...
- 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)
从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...
- 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
- 从零开始写一个Tomcat(叁)--请求解析
挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...
- 使用USBASP给Arduino烧写bootloader教程
源:使用UsbAsp给UNO烧写bootloader ATMEGA16U2.ATMEGA328P固件烧写教程 arduino板由于操作不发导致固件损坏,或者想更新固件怎么办?今天给大家介绍一下如何使用 ...
随机推荐
- 我的母校zbvc试做
一.观察分析页面布局 可以从上至下分为6大部分 logo栏 menu菜单栏 slide幻灯片 news新闻区域 other其他 bottom底部 二.logo 分为三部分 ①左侧logo ②中间log ...
- 重置mysql5.7密码
其实想要重置 5.7 的密码很简单,就一层窗户纸: 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不 ...
- 企业应用--Nginx&web部署
一.Nginx介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务. Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler ...
- pycharm 直接删掉数据表之后,makemigration和migrate 之后,数据库中依然没有生成数据表的问题
综合分析一下行程这个问题的原因: 在终端中运行 select * from django_migrations; 查看 提交的记录,如果你的表删掉了,记录还在,那么数据库会觉得,这个表依然是存在的,所 ...
- vue:页面跳转和传参(页面之间,父传子,子传父)
1.返回上一个页面: A.<a @click="$router.back(-1)" class="btn">重新加载</a> B.thi ...
- Structs复习 字符编码问题
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...
- 3Ds Max 2014
原文地址:https://blog.csdn.net/u011518678/article/details/50764835 1.3Ds Max 2014 的安装和激活 激活地址: https://j ...
- linux安装memcached和php的memcache扩展 (已使用)
所需软件libevent-1.4.6-stable.tar.gz (http://monkey.org/~provos/libevent/)memcache-2.2.3.tgz (http://pec ...
- Node KeyNote
[Node KeyNote] 1.实际上,.node文件在windows下它是一个.dll文件,在*nix下则是一个.so文件. 2.默认变量 function(exports, require, m ...
- Windows 2012设置允许单个用户连接多个会话的方法
WINDOWS 2012 服务器默认只允许单个用户连接一个远程桌面会话,如果已有连接登陆,另外的连接再登陆会踢掉之前的连接.如果需要两个远程桌面同时连接 找到:HKEY_LOCAL_MACHINE\S ...