1.对于bootloader这样的程序,作为板卡刚开始启动的部分,大致的顺序是一致的,大部分都是分为两个部分,一部分是汇编编写的,一部分是用c语言编写的。一般在汇编部分完成各种初始化的操作,比如关闭看门狗,防止开发板每3s启动一次,初始化SDRAM,初始化NANDFLASH,由于希望裸板有可以工作在更加高的频率下,因此要初始化时钟,设置FCLK:HCLK:PCLK的比例,另外nandflash有个特殊操作,会将前4k大小的空间自动复制到cpu中的前4kRAM中,这时cpu这4k代码其实是将存在nandflash中的bootloader复制到sdram中。然后跳转利用位置无关码的指令ldr pc,=main跳到sdram中的main处执行。然后在主函数中设置内核参数,开始tag,命令行tag,memrory tag,以及end tag,之后将内核读入到内存中。之后跳转执行。但是当内核启动时会输出一些打印信息,例如根文件系统在什么地方,终端是什么的信息。因此还需要设置串口,设置串口当然有一些初始化,例如设置GPIO为端口复用,设置内部上拉,设置是否用流控,设置传输的长度,设置奇偶校验位,设置波特率,设置查询还是用中断。之后编写读函数。

2.对于nandflash来说,对其读写是以页为单位来进行读写的因此,对于一个nandflash来说,其一共有多少页,之后选中这其中的某一页之后,之后将这一页的数据读到移位页中,然后再发送出去,一页的大小是0到2047,每一页都会有oob,大小是64字节,这是由nandflash的特性决定的,这是因为读nandflash可能读写过程中会出现读写的坏块,oob是校验用的,通过某种算法,当读取到某一页时,会生成相应的效验码,与之前的对比,如果不相同,则对其坏块进行修正。读nandflash时首先需要设置时序,这需要我们去看时序图,去计算出这三个参数是多少,之后设置地址。注意nandflash只有8个IO读写的口,因此命令,地址,数据肯定是分时复用的。在设置nandflash时要注意的是时间要延迟一会儿,不然会出问题。

3.对于bootloader从norflash启动还是nandflash启动还是有很大的差别i的,对于bootloader从norflash启动的话,此时cpu看到的0地址是在norflash上,bootloader从norflash上复制到sdram中,链接地址在sdram中。

对于bootloader从nandflash启动,根据nandflash的特性,此时cpu看到的0地址是在cpu的片内ram中,上电后将前4k移动到ram中,此时cpu看到的是ram中的地址0,在这4k代码中,将nandflash中的bootloader复制到sdram中,当运行这4k代码中的跳转到main函数时,它会直接跳到nandflash中的bootloader中的main处执行,用的位置无关码。

4.对于bootloader的调试,用openjtag下载程序到norflash,然后重启,可以看到中端会打印一些信息,但是将程序下载到nandflash,然后重启,就什么也不会显示,说明在问题出在nand_read()函数里面。检查发现是里面的读地址的函数写错了。在修改之后,重新编译,然后下载,重启,从nandflash启动,在终端可以看到一些打印信息。说明nand_read()函数没有问题了。至此,uboot的功能已经实现了。

bootloader新的理解的更多相关文章

  1. 不同ORM新的理解

    对于ORM你怎么理解?你用过的ORM有什么区别?这是面试的时候基本上会问的问题. 问题很简单,本文不在阐述.本文主要讨论Dapper 和 EF Core First的区别. 从直观上来看两个都是ORM ...

  2. 238. Product of Array Except Self(对O(n)和递归又有了新的理解)

    238. Product of Array Except Self     Total Accepted: 41565 Total Submissions: 97898 Difficulty: Med ...

  3. 对OO的封装了有了新的理解——希望是普通函数来写总体流程来统管类似的业务,但却又涉及具体操作的函数,仍然可以达到目的

    就是不厌其烦,把那个具体操作函数封装成虚函数,只需要返回它的结果就行.而总体流程根据这个结果继续进行处理,这样就能总体流程和虚函数两不误了.

  4. 对于python 作用域新的理解

    今天看Python习题,看到如下题目 def num(): return [lambda x: i*x for i in range(4)] print([m(2) for m in num()]) ...

  5. 对Delphi控件作用的新理解(控件本身的源代码就是一个很强的工业级源码)

    最近几天,对Delphi控件的含义有了一个新的理解.其实它不仅仅是给程序员提供功能的一个表层调用,控件本身的源代码就是一个很强的工业级源码.而且它的Main例子,往往就已经是半成品.而别的语言里没有那 ...

  6. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  7. 深入理解javascript闭包(二)

    在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给 ...

  8. 从ord()中对Unicode编码的理解

    刚开始学习编程的时候,老对字符串编码的理解模模糊糊.也一直看这方便的资料,今天在看Dive in python时,突然有了新的理解(不知道是否正确). Python有个built-in函数ord(), ...

  9. Html文档流和文档对象模型DOM理解

    前言 在理解浮动和定位时,触碰到文档流概念.为了更好理解浮动和定位,学习了文档流和DOM(文档对象模型). 正文 DOM(文档对象模型)简单理解就是编写的html页面所有内容构成的树形结构.例如: 根 ...

随机推荐

  1. node.js 爬虫中文乱码 处理

    爬虫中文乱码可做如下处理 import request from 'superagent'; import cheerio from 'cheerio';//类似jquery写法 const Icon ...

  2. des加密delphi与c#

    des加密delphi与c# C#默认是CBC,PKCS7

  3. word中怎样设置页码包含总页数

    一个同事做毕业论文,论文是Word格式,1-2页是封面和目录,不需要页码,第3-10页是论文内容,需要从第1页开始显示,并显示论文内容的总页数8 页.具体为页脚处显示“第*页共*页”.他让我帮忙设置一 ...

  4. 字符串md5之后转成int类型, 方便数据库索引

    function hashStringToInt($string){ $stringHash = substr(md5($string), 0, 8); return base_convert($st ...

  5. zookeeper windows7下集群搭建

    模拟分布式环境!!!  搞了好几天,各种错误!!终于成功了. 环境: windows7 /centos/xsheel    安装了三个虚拟机... 1.下载zookeeper http://archi ...

  6. docker之docker-machine用法

    转自:https://www.cnblogs.com/jsonhc/p/7784466.html docker-machine 是docker官方提供的docker管理工具.通过docker-mach ...

  7. tomcat8 web工程启动,登陆页面失败问题解决

    编辑该文件context.xml 增加以下内容 <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookie ...

  8. 讲一讲Servlet的生命周期

    1 实例化    servlet 容器创建servlet的实例; 2初始化   该容器调用init()方法;   每个实例,init()方法只被调用一次 3 服务    如果请求Servlet,则容器 ...

  9. 跨年操作--new Date()

    //时间在2017/12/31 17:00 --- 2018/1/1 06:00区间,提示用户无法操作公告. //time.js (function(){ var date = new Date(); ...

  10. redis异常Redis:java.util.NoSuchElementException: Unable to validate object at

    前两天项目上线的时候遇到了redis的一个问题,在测试环境的时候项目运行正常,项目一上线redis便开始抛异常. redis.clients.jedis.exceptions.JedisConnect ...