zoukankan      html  css  js  c++  java
  • 硬件初始化,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 是和地址相关的,理解一下


    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************

  • 相关阅读:
    获取 .properties 配置文件中的值
    struts1.2分页实现思路
    Apache与Tomcat的3种连接方式分析
    HTML 中的rel
    自动刷新本页,定时刷新页面,定时转发
    HTML 中的rel 用法
    <globalforwards>标签
    struts1.2中从一个action跳转到另外一个action的方法
    分页传值的话,可以直接用<html:link>
    DIV+CSS效果(实现平滑投票效果等)
  • 原文地址:https://www.cnblogs.com/cnlg/p/4372914.html
Copyright © 2011-2022 走看看