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. MVC5 Entity Framework学习之Entity Framework高级功能(转)

    在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...

  2. 屏蔽zencart logs文件夹下不断生成的日志文件

    在根目錄下的logs文件夾中,經常生成一些錯誤文件類似myDEBUGxxxxx.log這樣的錯誤文件(而且這樣的錯誤文件由來并非網站出現什麽嚴重不可挽救的錯誤,大部分是一些未定義變量這樣的不起眼的小錯 ...

  3. hdu1754 I Hate It

    题目链接:hdu1754 I Hate It 树状数组学习参考博客:http://blog.csdn.net/u010598215/article/details/48206959 树状数组之前没看懂 ...

  4. action和servlet的关系

      在struts2.0中,可以通过ServletActionContext.getRequest()获取request对象. 在action的方法中return一个字符串,该字符串对应struts. ...

  5. 设置apache登陆密码验证

    一.编辑虚拟目录配置文件,设置认证方式 Alias /test"/var/www/test"<Directory "/var/www/test">O ...

  6. ORACLE 自定义聚合函数

    用户可以自定义聚合函数  ODCIAggregate,定义了四个聚集函数:初始化.迭代.合并和终止. Initialization is accomplished by the ODCIAggrega ...

  7. Microsoft.Office.Interop第三方程序 ppt 转换为PDF出错

    错误信息:Retrieving the COM class factory for component with CLSID {91493441-5A91-11CF-8700-00AA0060263B ...

  8. blade and soul Group Combos

    Group Combos A martial artist always make friends along their way. They learn how to work and fight ...

  9. 设立点击ProgressDialog外的区域对话框不消失

    设置点击ProgressDialog外的区域对话框不消失ProgressDialog mpDialog = new ProgressDialog(OrderTable.this);  mpDialog ...

  10. 前端工程师IE6兼容性问题随笔(未完待续)

    1 height.在IE6下元素高度小于19px的时候,会被当做19px来处理.解决办法:用overflow:hidden;来处理.box{height:2px;background:red;over ...