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页面所有内容构成的树形结构.例如: 根 ...
随机推荐
- groovy Date 格式化
刚开始使用Java,瞬间爱上:换了个厂接触到了groovy,开始有点嫌弃Java了... 看看时间的格式化 java玩法: new SimpleDateFormat("yyyy-MM-dd ...
- 网易云音乐api资料
https://github.com/LanFD/music_163 网易云音乐常用API浅析:http://moonlib.com/606.html
- android平台yuv缩放相关<转>
Android的视频相关的开发,大概一直是整个Android生态,以及Android API中,最为分裂以及兼容性问题最为突出的一部分.摄像头,以及视频编码相关的API,Google一直对这方面的控制 ...
- flash推流工具<转>
https://github.com/young-cowboy/young-cowboy.github.io https://www.cnblogs.com/xiaoniuzai/p/7129036. ...
- ACM__队列
今天学回顾bfs的时候遇到了,遂总结一下 队列是一种特殊的线性表,只允许在队列的前端(front)进行删除操作,在队尾进行插入操作,进行插入操作的端称作队尾,进行删除操作的端称作对头.(来自百度百科) ...
- 自己写一个spring boot starter
https://blog.csdn.net/liuchuanhong1/article/details/55057135
- 如何启用windows8, windows10中被停用的远程桌面,如何连接windows10远程桌面?
针对windows8.x中文版以及win10无远程桌面功能的解决办法: 第一步到一个网站上下载一个工具包. 这个是开源的.可以放心使用.下载地址: https://github.com/binarym ...
- vscode项目配置 vue-loader-webpack
使用vsCode进行项目配置 一.准备工作 1.下载Visual Studio Code 下载地址 2.打开vscode,根据自己需求下载相应插件,可以提高工作效率. 点击下角选项(我作了红框标记), ...
- 吴裕雄 python 熵权法确定特征权重
一.熵权法介绍 熵最先由申农引入信息论,目前已经在工程技术.社会经济等领域得到了非常广泛的应用. 熵权法的基本思路是根据各个特征和它对应的值的变异性的大小来确定客观权重. 一般来说,若某个特征的信息熵 ...
- Python基础学习Day6 is id == 区别,代码块,小数据池 ---->>编码
一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...