uboot copy_from_nand代码详解

copy_from_nand函数简介:

函数将会把nand flash中的uboot二进制程序镜像拷贝到内存中,通常这一步出现问题,uboot是不可能引导起来的,串口也不会有信息吐出(当然啦,因为uboot不在内存,如何执行啊

代码分析:

1.先贴函数代码,在后面再分析,copy_from_nand函数的代码我们可以在cpu/s3c64xx/start.S的278行看到,上图:

图(1)

273~277行:解释很给力,273行告诉你了这个函数的功能就是把nand flash中存放的uboot镜像文件拷贝到内存中,然后再到内存中去执行uboot,这样我们的uboot就可以在内存中运行起来了。274行告诉我们r0是会被比较的大小。293行把0x0c000000里面的值赋给r0了,我们要比较拷贝到内存的uboot和steppingstone里面是否一样啊?所以我们要比较一下咯(295和297行)

288行:copy_uboot_to_ram这个函数是在C语言里面写的,C语言的程序在编译器编译的时候肯定会有出入栈的操作,会用到sp指针,所以我们在进入这个函数之前是必须设置sp的,所以288行前的不解释了。我们直接进入这个copy_uboot_to_ram函数吧:

图(2)

这个函数的实现在cpu/s3c64xx/nand_cp.c的133行,注意的是这个函数必须在整个uboot.bin文件的前4KB,所以我们看到u-boot.lds中会把nand_cp.o链接到uboot二进制文件靠前的位置

139~148行:主要想做的事情就是判断我们的nand flash是大页得还是小页的,现在主流的的nand flash有512页和2048页两种,在后续的代码操作中有区别,所以在进行nand操作前,必须先判断出是大页还是小页。139行是在使能芯片,代码是(NFCONT_REG &= ~(1 << 1)),即会把0x70200004这个地址的[1]位清零,那么为什么清零[1]位就能够使能nand flash芯片了呢,我们看下s3c6410 datasheet才能够明白:

图(3)

我们看到图3中的[1]位为0的含义是让Xm0CSn2变成低电平,因为我们的nand flash是接在SRAM2上的,

当Xm0CSn2为低电平时,将能访问我们的nand flash芯片了。

140行:在给nand_flash发送命令,发送的值为0x90,含义是读取芯片的ID等厂商信息,话说对nand flash的控制都是这个套路,因为这就是硬件协议,先使能芯片->发送命令->发送地址序列->读或写数据寄存器->判断准备就绪状态->禁止芯片,这是对nand flash操作的大体过程,根据发送命令的不同还有些区别。我们这次发送的是0x90,代表读取ID信息。发送命令的含义通过读取你nand flash datasheet来查看,你需要看你的nand flash芯片是哪个厂家生产的,下载它的datasheet,如下图:


图(4)

你会发现图(2)在发送命令后,会读两次寄存器。这是因为我们发送完0x90,nand flash会返回5次(好像)值给我们,我们需要的值是第二次返回的值,接着148行判断是否id大于0x80,大于的话就是大页2048字节的。我的芯片是K9F84G08U0B,是大页的,所以这个读出来的值是大于0x80的;

155行:拷贝功能主函数,CFG_PHY_UBOOT_BASE第一个代表要拷贝到内存的地址(0x57e00000),第二个参数0x3c000代表要从nand flash中拷贝的大小,我们进入这个函数:

图(5)

图(5)直接看126行,这个循环会执行0x3c000>>page_shift次,如果是9代表除以512,如果是11代表除以2048,这下明白这个for循环的意思了吧,nand flash硬件一次会读取一个页的大小给我们,那么我们就进入127行的读一页吧,注意会读到buf中,buf可就是我们指定的0x57e00000哦:

图(6)

图6函数会读一页的数据到buf中,即内存中。然后一直读0x3c000/512(2048)次,看你是大页还是小页nand,我的是大页。

图6的85行使能芯片,前面已经说过,87行发送读命令,是0x0,你可以查看图(4),发送读之后,我们就要开始向地址寄存器中写一些地址,告诉nand flash我们要从什么地方开始读数据,下图:

图(7)

看图(7),我们知道我们要写5次地址来确认我们要从nand flash中读的内容,第一次是列地址,第二次也是,这是因为如果只有1次,那么8位最大表示256,而一列的大小是2K,所以需要有两个列地址来代表。那么我们一共有256K页,所以需要3次8位的行地址来代表我们要读的是哪行,其实具体的还要看你的nand flash datasheet来决定如何给定地址列表。

图6的102行,是在循环判断是否是否已经准备好了,如果准备好了,我们才能再105行把这一整页得内容读到buf里面,注意看是从那个寄存器读取的哦,NF_DATA8_REG(nand flash数据寄存器);

109行禁止芯片,然后回到图(5)的nandll_read_blocks继续读下一页,直到读了0x3c000/page_shift个页为止,正好是192K,uboot的大小,并放到了buf中(0x57e00000内存)。

好了,分析完了

uboot copy_from_nand代码详解相关推荐

  1. U-Boot启动流程详解

    参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍 作者:一只青木呀 发布时间: 2020-10-23 13:52:23 网址:https://blog.csdn.net/weixin ...

  2. 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. 主线剧情03-NXP-i.MX系列的u-boot移植基础详解

    u-boot 移植基础详解 本文系广泛撷取.借鉴和整理(相关的内容在网络上有很多,但很多相互抄,或者是版本太老,或者就是不通用的非常有平台针对性的步骤,碎片化泛滥,甚至就是有待分拣的垃圾厂,当然也有一 ...

  4. 【正点原子Linux连载】第三十一章 U-Boot顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. U-Boot 顶层 Makefile 详解

    U-Boot 顶层 Makefile 详解 1.U-Boot 工程目录分析 我们在分析 uboot 源码之前一定要 先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成 ...

  6. 嵌入式linux的u-boot系统启动过程,【站友投递】U-boot启动过程详解

    [站友投递]U-boot启动过程详解 来源:互联网 作者:denny 时间:2009-03-18 Tag:点击: 一.U-BOOT的目录结构 u-boot目录下有18个子目录,分别存放管理不通的源程序 ...

  7. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  8. html5代码转换为视频,HTML5中的视频代码详解

    摘要 腾兴网为您分享:HTML5中的视频代码详解,智学网,云闪付,易推广,小红书等软件知识,以及360win10,流量魔盒,fitbit,上港商城,安卓2.3.7,全民惠,五年级下册英语单词表图片,t ...

  9. js php base64,JavaScript实现Base64编码与解码的代码详解

    本篇文章给大家分享的是jJavaScript实现Base64编码与解码的代码详解,内容挺不错的,希望可以帮助到有需要的朋友 一.加密解密方法使用//1.加密 var str = '124中文内容'; ...

最新文章

  1. 用python读取图像_Python读取图片属性信息的实现方法
  2. 10.1.2 body标签
  3. HBase数据迁移到Kafka实战
  4. Spring Boot笔记-validation的使用及统一异常处理
  5. 你三十岁有什么巨大变化吗?
  6. Docker 从零开始制作基础镜像[centos]
  7. 《Android框架揭秘》读书笔记——JNI
  8. 数据通信与计算机网复习题,数据通信与计算机网络 复习题总.doc
  9. 手机如何远程连接服务器
  10. 王者荣耀背景html,《王者荣耀》登录界面背景怎么修改 登录背景图片更换方法...
  11. 基于plc的污水处理,组态王动画仿真,带PLC源代码,组态王源代码
  12. 结合量价持仓分析的股指期货日内交易策略
  13. fixed在ios失效解决方案
  14. 牛客网 SQL17 10月的新户客单价和获客成本
  15. 最短路:求最长最短路,求最短路的路径
  16. 拉格朗日乘子法、KKT条件、拉格朗日对偶性
  17. Mac 如何使用外部存储设备,移动硬盘备份 iPhone 数据
  18. 西南大旱之女娲补天谭: 水哪里去了?
  19. Java实现月工资个人所得税及各保险计算问题(2022年版)
  20. 体积最小,极速秒装的APK安装器

热门文章

  1. 鸿蒙硬件HI3861开发环境搭建
  2. python解析pdf得到每个字符的坐标
  3. python统计缺失值
  4. python提取字符串中的中文、数字、字母
  5. linux bash gt,linux之bash的基础特性(一)--gt;命令历史(history命令),命令补全,路径补全...
  6. 吉林省高等学校计算机水平考试,关于2014年11月高等学校计算机水平考试(吉林省考区)报名的通知...
  7. php图像处理原生函数,php图像处理函数imagecopyresampled的用法
  8. php iis session 超时设置,如何配置IIS Session超时时间
  9. 启动/关闭Spring boot服务脚本
  10. MATLAB 随机过程基本理论