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. Best Time to Buy and Sell Stock III [LeetCode]

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  2. 深入浅出Mybatis系列(九)---强大的动态SQL

    上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...

  3. NetworkComms V3 使用TCP通信传递IList<T>类型的数据

    客户端从服务器获取一组IList<T>类型的数据非常常见(通常从数据库中获取) 我们用NeworkComms V3来演示一下(NetworkcommsV2.x版本也同样支持) [ 使用pr ...

  4. easyui的textbox赋值小结

    使用的系统中有个后台,需要填充单号,如下图: 每次往框里面填充都是一样的数据,复制.粘贴,而且当人数颇多的时候,就是体力活. 于是就想到通过执行js代码,自动填充这些数据. chrome下F12,查看 ...

  5. 16061701(地图灯光编译Beast报错)

    [目标] 地图灯光编译报错 [思路] 1 我自己测c2_cwd_rt 附件为当时log 2 ExampleGame\BeastCache\PersistentCache 3 重新删除掉BeastCac ...

  6. Python 五个常用模块资料 os sys time re built-in

    1.os模块   os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果.   os.name:返回当前操作系统名称('posix', 'nt', ' ...

  7. leetcode6

    好吧,今天晚上赶项目确实是做不了三道题目了,最近项目在网络编程方面有些进步,学到了东西,有时间再积累下来,很深的体会就是,和别人一起写代码,虽然蛋疼但是比自己一个人写要好点,不过发现自己对链表和排序什 ...

  8. Eclipse里面Outline中图标的含义

    先说颜色:  绿色:public  黄色:protected  蓝色:no modifier  红色:private 再说形状:  实心:method  空心:variable  实心中间有字母C:c ...

  9. 腾讯云服务器centos 6.5(jdk+tomcat+vsftp)、腾讯mysql数据库 及 tomcat自启动 配置教程

    1.腾讯云数据库配置 1.考虑到安全性问题,,平常不使用root用户登录,新增一个用户名neil,用来管理项目的数据库 a.首先登录root创建db_AA数据库 b.在root用户下,创建neil用户 ...

  10. pyinstaller 用法

    参考:http://pythonhosted.org/PyInstaller/#installing-pyinstaller 1.下载pyinstaller和PyWin32  目前pyinstalle ...