bootloader新的理解
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新的理解的更多相关文章
- 不同ORM新的理解
对于ORM你怎么理解?你用过的ORM有什么区别?这是面试的时候基本上会问的问题. 问题很简单,本文不在阐述.本文主要讨论Dapper 和 EF Core First的区别. 从直观上来看两个都是ORM ...
- 238. Product of Array Except Self(对O(n)和递归又有了新的理解)
238. Product of Array Except Self Total Accepted: 41565 Total Submissions: 97898 Difficulty: Med ...
- 对OO的封装了有了新的理解——希望是普通函数来写总体流程来统管类似的业务,但却又涉及具体操作的函数,仍然可以达到目的
就是不厌其烦,把那个具体操作函数封装成虚函数,只需要返回它的结果就行.而总体流程根据这个结果继续进行处理,这样就能总体流程和虚函数两不误了.
- 对于python 作用域新的理解
今天看Python习题,看到如下题目 def num(): return [lambda x: i*x for i in range(4)] print([m(2) for m in num()]) ...
- 对Delphi控件作用的新理解(控件本身的源代码就是一个很强的工业级源码)
最近几天,对Delphi控件的含义有了一个新的理解.其实它不仅仅是给程序员提供功能的一个表层调用,控件本身的源代码就是一个很强的工业级源码.而且它的Main例子,往往就已经是半成品.而别的语言里没有那 ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 深入理解javascript闭包(二)
在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给 ...
- 从ord()中对Unicode编码的理解
刚开始学习编程的时候,老对字符串编码的理解模模糊糊.也一直看这方便的资料,今天在看Dive in python时,突然有了新的理解(不知道是否正确). Python有个built-in函数ord(), ...
- Html文档流和文档对象模型DOM理解
前言 在理解浮动和定位时,触碰到文档流概念.为了更好理解浮动和定位,学习了文档流和DOM(文档对象模型). 正文 DOM(文档对象模型)简单理解就是编写的html页面所有内容构成的树形结构.例如: 根 ...
随机推荐
- 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)
函数说明: 1. from gensim.model import word2vec 构建模型 word2vec(corpus_token, size=feature_size, min_count ...
- day02-格式化输出
python格式化字符串有%和{}两种 字符串格式控制符. 字符串输入数据格式类型(%格式操作符号) %%百分号标记%c字符及其ASCII码%s字符串%d有符号整数(十进制)%u无符号整数(十进制)% ...
- 命名空间与use
以下是自己读PHP手册命名空间这一节的一些笔记,还有自己上机做命名空间测试的一些整理,原创博客,有错欢迎指正: 1.命名空间声明必须是第一条语句,若没有声明命名空间的脚本,则被认为是全局空间的脚本.若 ...
- git 合并多个commit
1,查看提交历史,git log 首先你要知道自己想合并的是哪几个提交,可以使用git log命令来查看提交历史,假如最近4条历史如下: commit 3ca6ec340edc66df13423f36 ...
- linux 3.10 一次softlock排查
x86架构.一个同事分析的crash,我在他基础上再次协助分析,也没有获得进展,只是记录一下分析过程.记录是指备忘,万一有人解决过,也好给我们点帮助. 有一次软锁,大多数cpu被锁,log中第一个认为 ...
- ASP.NET 身份验证机制
ASP.NET提供了3种认证方式:windows身份验证:IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问.Forms验证 :用Cookie来保存 ...
- 使用jQuery+huandlebars遍历数组
兼容ie8(很实用,复制过来,仅供技术参考,更详细内容请看源地址:http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) & ...
- Open Tools API :IDE Main Menus
http://www.davidghoyle.co.uk/WordPress/?p=777 http://www.davidghoyle.co.uk/WordPress/?page_id=1110 h ...
- .html() 与.text() 获取值、取值 区别
1.html代码<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- 小程序 css3走马灯效果
<view class='notable-container' style='background:#ffffff;'> <view style='z-index:2000;back ...