硬件初始化,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 ...
随机推荐
- Error 403--Forbidden
转自他人:From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:10.4.4 403 ForbiddenThe server understood ...
- TortoiseGit 连接Git服务器不用每次输入用户名和密码的方法
每次git push 都要输入用户名和密码. 虽然安全,但在自己电脑上每次都输有些麻烦,如何记住用户名和密码呢? 试了很多方法,找到这个最简单,亲测可行. 当你配置好git后,在C盘C:\Users\ ...
- C语言编程风格(转发)
- 1、WIN2D学习记录(win2d实现JS雨天效果)
一.Win2D Win2D是微软开源的项目 它的github地址是 https://github.com/Microsoft/Win2D 里面有详细的文档 http://microsoft.githu ...
- android 取消edittext焦点
页面中如果有EditText会默认获取焦点,如果进入页面时不想让其获取到焦点可以按如下步骤: 1.在布局的最外层添加属性: android:focusable="true" and ...
- web.xml中在Servlet中获取context-param和init-param内的参数
引自:http://blog.csdn.net/yakson/article/details/9203231 web.xml里面可以定义两种参数:1.application范围内的参数,存放在serv ...
- Parse xml/json[xpath/jpath]
import groovy.util.XmlSlurper import groovy.util.XmlParser import com.eviware.soapui.support.GroovyU ...
- Scala的第一步
第一步:学习使用Scala解释器 开始Scala最简单的方法是使用Scala解释器,它是一个编写Scala表达式和程序的交互式“shell”.在使用Scala之前需要安装Scala,可以参考 Firs ...
- Ubuntu下freeradius-server的安装与mysql-server的关联
1.创建freeradius数据库 #service mysql start ... #mysql -u root -p Enter password: 456456 ... mysql> cr ...
- sublime text 3 快捷键大全
Sublime Text 3 快捷键精华版 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所 ...