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固化操作,系统启动简单流程的更多相关文章

  1. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

  2. Nand Flash驱动(实现初始化以及读操作)

    简单制作一个Nand Flash驱动(只需要初始化Flash以及读Flash) 打开2440芯片手册,K9F2G08U0M芯片手册(因为2440中Nand Flash是用的256MB(2Gb)内存,8 ...

  3. u-boot移植总结(三)(转)S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)

    S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A) 转载自:http://www.cnblogs.com/idle_man/archive/2010/12/23/19153 ...

  4. 总结NAND FLASH控制器的操作

    初始化 NAND FLASH: 1)寄存器 NFCONT,用于开启 NAND FLASH控制器: 2)向寄存器NFCMD写入命令: 3)向寄存器NFADDR写入地址: 4)使用寄存器NFDATA进行数 ...

  5. nand flash详解及驱动编写

    https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...

  6. JZ2440 裸机驱动 第8章 NAND Flash控制器

    本章目标  了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用     NAND ...

  7. 说说NAND FLASH以及相关ECC校验方法

    Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将 ...

  8. 如何编写linux下nand flash驱动-4

    2.       软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架.弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做 ...

  9. 嵌入式Linux学习笔记 NAND Flash控制器

    一.NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Fla ...

随机推荐

  1. windows下安装MongoDB要注意的问题

    1.  errno:10061 由于目标计算机积极拒绝,无法连接. 解决方法:在mongoDB的bin目录下,打开命令行,输入: mongod --dbpath "c:\data\db&qu ...

  2. Vue2.X的状态管理vuex记录

    记住上述的顺序情况:想要改变state,只能通过Mutation,虽然action可以直接改变state,这样会使每个状态可以方便的跟踪和记录(用Devtools跟踪) vue Method   -- ...

  3. PHP 数据安全问题总结

    总结:关键的判断,比较尽量使用=== 类型和值都比较的恒等比较 1.if($var) $var 遵循boolean 转换. 当转换为 boolean 时,以下值被认为是 FALSE: 布尔值 FALS ...

  4. 解决OS X系统连接VPN后无法访问内网资源的问题

    该问题是第一次使用OS X系统连接VPN遇到的问题,现象是连接VPN成功,但无法访问公司的内网资源. 主要原因还是VPN设置上的问题,在系统偏好设置中打开VPN连接,里面有个高级设置,如图: 点击高级 ...

  5. Web前端开发规范手册

    一.规范目的 1.1  概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发.  ...

  6. 使用nodejs调用微信发送红包

    前置条件:申请微信发送红包的账户及其权限 依赖 blueimg-md5和 xmlreader 库 /common/weixin.js 源码 /** * Created by chent696 on 2 ...

  7. 用markdown学习写出总结

    # PS### 快捷键:CTRL+N(新建)CTRL+1. **切片**- 套索,磁性套索,椭圆,矩形选框.2. **印章** 仿制图章工具,图案图章工具3. 钢笔4. 油漆桶5. 吸管工具, *** ...

  8. Java中将一个字符串传入数组的几种方法

    String Str="abnckdjgdag"; char a[]=new char[Str.length()]; -------------------方法1 用于取出字符串的 ...

  9. 初次接触json...

    这两天发现很多网站显示图片版块都用了瀑布流模式布局的:随着页面滚动条向下滚动,这种布局还会不断加载数据并附加至当前尾部.身为一个菜鸟级的程序员,而且以后可能会经常与网站打交道,我觉得我还是很有必要去尝 ...

  10. gitt

    一,git config core.autocrlf false 二,vi .git/config[remote "origin"] url = https://github.co ...