硬件初始化,nand flash固化操作,系统启动简单流程
2015.3.27
星期五 晴
链接脚本定义代码的排放顺序
硬件系统初始化:
一:arm核初始化:(里面有指令)初始化ARM核的时候需要看arm核的手册指令:
1.异常向量(最起码有个复位异常,初始化模式-svc)
ldr r0, =_start
mcr p15, 0, r0, c12, c0, 0
2.处理器模式-SVC
3.关闭中断
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3 @1101 0011 //关闭irq,fiq和设置SVC
msr cpsr,r0
4.初始化栈(不一定初始化堆),初始化很重要,也很容易栈溢出
ldr sp, =0x30000000
5.初始化协处理 mmu D-cache I-cache(一般关掉他们)
6.清bss段(没初始化的全局或静态变量或初始化为0的全局变量)
下面是清bss段和点亮三个小灯:
clear_bss:
mov r2, #0
ldr r0, =_bss_start
ldr r1, =_bss_end
bss_loop:
cmp r0, r1
strneb r2, [r0], #1
bne bss_loop
ldr r0, =0xe03001c4
ldr r1, =0x7
str r1, [r0]
二:核心外设初始化:
1.关狗(默认看门狗是开的),将最低位写0就行了
@关狗
ldr r0, =S5PC100_WATCHDOG_BASE @0xEA200000
str r5, [r0]
2.时钟CLOCK
@初始化时钟系统
bl system_clock_init
3.DRAM
4.NAND
@初始化nand控制器
bl nand_asm_init
@初始化内存控制器
bl mem_ctrl_asm_init
三:需要用到的外设
1.UART
2.NET
3.LCD
4.USB
....................
点灯的程序,检测程序走到什么地方了
程序跳转之前保存lr的地址,进入程序后,因为程序里面可能再次发生跳转,所以在进入程序
的一开始的地方将保存的地址用一个在程序中不用的寄存器保存起来,防止Lr被冲掉
mrc 写协处理器
mcr 读协处理器 后面的给前面的
mcr p15 ,0,r0,c12,c0,0
开发板通过串口和主机相连,将代码的运行情况显示在终端上,通过网线下载TFTP里面的文件,当开发板里面的内核启动后,开发板将主机nfs里面的
文件系统映射到自己的内存并运行
print bootcmd
bootcmd=tftp 20008000 zImage;go 20008000
设置上面的环境变量:
setenv bootcmd tftp 20008000 zImage\;go 20008000
一:nand flash 的固化操作:擦除和写入:
1.tftp 20008000 zImage
2.nand erase 100000 300000
3,nand write 20008000 100000 300000 从内存的20008000 写到nand flash中的100000,写的大小是300000
已经写进nand flash,关掉电源运行试试
测试:nand read 20008000 100000 30000 从nand flash中地址100000读300000大小的程序到内存的20008000
二:还要讲文件系统固化到nand flash中:rootfs.cramfs
tftp 20008000 rootfs.cramfs
nand erase 400000 400000
nand write 20008000 400000 400000
三:设置nand flash 的启动,修改bootcmd
setenv bootcmd nand read 20008000 100000 300000\;go 20008000
run bootcmd
四:修改加载的文件系统路径
setenv bootargs root=/dev/mtdblock2 ip=192.168.1.200 init=/linuxrc console=ttySAC0,115200 //这里的ip是开发板的ip
要想板子上真正运行的是固化在板子中的内核和文件,还需要修改:(一个简单的方法看是否运行的是板子里面固化的程序:在主机中
添加和删除目录,看看板子终端是否有相关更新,没有就对了)
reset 复位一下看看
具体的实际操作:
命令拷贝:
FSC100 # tftp 20008000 zImage
Using dm9000 device
TFTP from server 192.168.1.139; our IP address is 192.168.1.200
Filename 'zImage'.
Load address: 0x20008000
Loading: #################################################################
#################################################################
##
done
Bytes transferred = 1932932 (1d7e84 hex)
FSC100 # nand erase 1000000 300000
NAND erase: device 0 offset 0x1000000, size 0x300000
Erasing at 0x12e0000 -- 100% complete.
OK
FSC100 # nand write 20008000 100000 300000
NAND write: device 0 offset 0x100000, size 0x300000
3145728 bytes written: OK
FSC100 # tftp 20008000 rootfs.cramfs
Using dm9000 device
TFTP from server 192.168.1.139; our IP address is 192.168.1.200
Filename 'rootfs.cramfs'.
Load address: 0x20008000
Loading: timeHandler
T #################################################################
#################################################################
#################################################################
#######################################
done
Bytes transferred = 3424256 (344000 hex)
FSC100 # nand erase 400000 400000
NAND erase: device 0 offset 0x400000, size 0x400000
Erasing at 0x7e0000 -- 100% complete.
OK
FSC100 # nand write 20008000 400000 400000
NAND write: device 0 offset 0x400000, size 0x400000
4194304 bytes written: OK
FSC100 # print bootargs
bootargs=root=/dev/mtdblock2 ip=192.168.1.200 init=/linuxrc console=ttySAC0,115200
FSC100 # print bootcmd
bootcmd=nand read 20008000 100000 300000;go 20008000
FSC100 #
寻找soc部署空间的时候到soc手册的memery address map中找
DRAM和SRAM区别,下课查查
系统的呢内存和外设是统一编址的,都在系统的4G空间里面
系统启动:
系统执行的时候先从映射的0地址开始执行,在s5pc100中是BL0,在BL0中判断系统是从哪里启动的(这个也可以通过拨码开关设置),
比如是nand flash,如果是nand flash,则BL0将BL1中nand flash前16k的内容搬移到SRAM中96k空间特定的地址处(例如0x3400),
然后再运行(不是全部的内容,那么剩下的内容怎么办呢???),在这之前BL0会初始化一些东西,比如说栈等,在nand flash中
剩下的程序,BL1通过自搬移将代码搬移到DRAM中。
地址无关的跳转指令:相对寻址
但是: ldr pc, =start 是和地址相关的,理解一下
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
硬件初始化,nand flash固化操作,系统启动简单流程的更多相关文章
- u-boot分析(九)----nand flash初始化|nand flash读写分析
u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...
- Nand Flash驱动(实现初始化以及读操作)
简单制作一个Nand Flash驱动(只需要初始化Flash以及读Flash) 打开2440芯片手册,K9F2G08U0M芯片手册(因为2440中Nand Flash是用的256MB(2Gb)内存,8 ...
- u-boot移植总结(三)(转)S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A) 转载自:http://www.cnblogs.com/idle_man/archive/2010/12/23/19153 ...
- 总结NAND FLASH控制器的操作
初始化 NAND FLASH: 1)寄存器 NFCONT,用于开启 NAND FLASH控制器: 2)向寄存器NFCMD写入命令: 3)向寄存器NFADDR写入地址: 4)使用寄存器NFDATA进行数 ...
- nand flash详解及驱动编写
https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
- 说说NAND FLASH以及相关ECC校验方法
Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将 ...
- 如何编写linux下nand flash驱动-4
2. 软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架.弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做 ...
- 嵌入式Linux学习笔记 NAND Flash控制器
一.NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Fla ...
随机推荐
- EF6 CodeFirst 实践系列文章列表
2015 Jul.16 EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一) 来自:wangweimutou 本系列源自对EF6 CodeFirst的探索 ...
- BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...
- Python笔记-集合,拷贝
对于列表,元组,集合的异同,有如下解释 #list ----> 允许重复的集合,修改# tuple ----> 允许重复的集合,不修改# set ----> 不允许重复的集合下面是示 ...
- selenium+python环境搭建
1.安装python-2.7.3.msi 2.安装pywin32-216.win32-py2.7.exe 3.下selenium包,selenium-2.35.0.tar.gz,放到D:\autote ...
- CSS布局学习笔记之position
CSS知识点 之 position布局 前段时间被同学怂恿,参加了百度前端技术学院的一个小培训,第一个阶段下来学到不少东西.课程的第一个阶段主要是HTML5 和 CSS 基础知识的一个小培训,给出的一 ...
- oracle 用户创建这个挺靠谱
CREATE TEMPORARY TABLESPACE test_tempTEMPFILE 'C:\oracle\product\10.1.0\oradata\orcl\test_temp01.dbf ...
- Python的平凡之路(13)
一.Python的paramiko模块介绍 Python 的paramiko模块,该模块和SSH用于连接远程服务器并执行相关操作 SSH client 用于连接远程服务器并执行基本命令 基于用户名和密 ...
- MySQL 通过semi join 优化子查询
半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...
- iOS 自动化打包
理想的情况:不打开工程的情况下,直接双击就能打包出一个IPA文件,这样就可以让测试直接使用 itools 进行安装. 分如下两种情况: 1)不依赖cocoapod 管理项目的自动化. 如果没有一个简 ...
- Scrum领取任务
这次主要讨论了产品的构造流程,怎么将任务分配到个人,讨论什么功能具体怎么实现,然后各自选取了任务. 在团队项目“广商百货”的SCRUM项目中我认领的任务是对登录功能的实现.现在还没正式开始,还在看书和 ...