NAND flash 信号线的理解
上一篇我们已经讲了NAND flash的分类,这一篇介绍NAND flash 的硬件接口。例如
由NAND Flash的原理图封装,然后查看芯片手册。
由图可知:IO0-IO7:既可传送数据也可传送地址,也可以送传命令。那到底是读是写,还是擦除?怎么区分IO0-IO7传送的是数据?地址?命令? 那么就需要通过CLE与ALE的状态来区分了。
假如2440要读取A地址的数据,或将数据写入B地址。当CLE为高电平表示IO0-IO7传送的是命令;当ALE为高电平表示IO0-IO7传送的是地址;当ALE与CLE都为低电平的时候,表示IO0-IO7传送的是数据。
CE:片选。当2440要操作访问Nand的时候,首先必须选中。
RE:读信号,当RE为低的时候,表示数据由Nand流向2240;
WE:写信号,当RE为低电的时候,表示数据由2240流向Nand;
WP:写保护,只能写,不能擦除。
R/B:Ready信号,表示Nand Flash烧写完成
这些引脚具体怎么组合起来的,需要查看手册中的时序图。
发(写)命令的时序图:
首先CE发出片选信号,CLE发出高电平,IO 0-7将命令驱动出去,WE写脉冲,在写脉冲的上升沿,Nand flash在上升沿,将IO 0-7中数据读取出来。
发地址的时序图:
CE片选, ALE由低变高,IO 0-7驱动 数据,WE发出写脉冲。
输入(写)数据的时序图:
CE选中,ALE、CLE低电平,2440 IO 0-7驱动 数据,WE写信号,Nand flash根据ALE、CLE低电平,读取数据。
输出(读)数据的时序图:
CE低电平选中,RE由高变为低(Nand flash收到RE由高变低时,马上准备数据,然后在RE的上升沿将数据发送出去),Nand flash 驱动数据到IO 0-7,在上升沿,2440取数据。
2440这些引脚发出的数据,必须满足Nand flash的时序要求。需要查看2440芯片手册,查看设备哪个寄存器的某些位来控制时序
Linux 的启动流程
本篇的重点是讲解设备和驱动的启动流程,设备和驱动的流程是整个内核启动的核心,也是工作中最常面对的问题。出于知识点的系统性考虑,在进入主题之前我们先看下整个 Linux 在 ARM 中的启动流程如何。
Uboot 的启动流程
ARM Linux 的启动流程大致为:Uboot → Kernel → Root filesystem。Uboot 在上电的时候就拿到 CPU 的控制权,实现了硬件的初始化。具体是怎么实现的呢?一起来看一下,CPU 的内部集成了小容量的 Sram,而 PC 指针一上电就指向 Sram 的起始地址 0x00000000,所以一上电 Uboot 代码就得到了运行。
Uboot 拿到 CPU 使用权就开始做初始化工作,比如关闭看门狗、设置 CPU 运行模式、设置堆栈、初始化内存、网卡、nand flash 等,最后把 Linux 内核加载到内存中。
初始化 RAM
因为内核要在 RAM 中运行,所以在调用内核之前必须初始化和设置 RAM,为调用内核做好准备。
初始化串口
内核在启动过程中可以将信息通过串口输出,这样就可以清楚的知道内核启动信息。虽然串口不是 Uboot 必须要完成的工作,但是通过串口可以方便调试 Uboot 和内核的各种信息。
检测处理器类型
Uboot 在调用内核前需要检测系统的处理器类型,并将其保存在某个变量中提供给内核,内核在启动过程中会根据该处理器的类型调用相应的初始化程序。
设置内核启动参数
内核在启动过程中会根据该启动参数进行相应的初始化工作。
调用内核镜像
值得注意的是存储 Uboot 的存储器不同,Uboot 的执行过程也并不相同,一般来讲 Flash 分为 nor Flash 和 nand Flash 两种:nor Flash 支持芯片内执行(XIP,eXecute In Place),这样代码可以在 Flash 上直接执行而不必复制到 RAM 中去执行。
但是 nand Flash 并不支持 XIP,所以要想执行 nand Flash 上的代码,必须先将其复制到 RAM 中去,然后跳到 RAM 中去执行。如果内核存放在 nor Flash 中,那么可直接跳转到内核中去执行。但通常由于在 nor Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将内核复制到 RAM 中,然后跳转到 RAM 中去执行。不论哪种情况,在跳到内核执行之前 CPU 的寄存器必须满足以下条件:r0 = 0,r1 = 处理器类型,r2 = 标记列表在 RAM 中的地址。
Linux 内核的启动流程(设备和驱动的加载)
关于 Uboot 的启动本课程不做详细介绍,因为本课程的主要内容是内核。在讲述内核启动之前让我们先了解下内核的组成结构:
其中,
(1)vmlinusx 是 ELF 格式的 Object 文件,这种文件只是各个源代码经过连接以后得到的文件,并不能在 ARM 平台上运行。
(2)经过 objcopy 这个工具转换以后,得到了二进制格式文件 Image,Image 文件相比于 vmlinusx 文件,除了格式不同以外,还被去除了许多注释和调试的信息。
(3)Image 文件经过压缩以后得到了 piggy.gz,这个文件仅仅是 Image 的压缩版,并无其他不同。
(4)接着编译生成另外几个模块文件 misc.o、big_endian.o、head.o、head-xscale.o,这几个文件组成一个叫 Bootstrap Loader 的组件,又叫引导程序,编译生成 piggy.o 文件。
(5)最后 piggy.o 文件和 Bootstrap Loader 组成一个 Bootable Kernel Image 文件(可启动文件)。
经过上面的分析不难知道 piggy.o 就是内核镜像,而剩下的几个文件就组成了引导程序。知道了内核的组成结构,Uboot 就是按照内核的组成结构一层一层剥开然后引导内核的:
可以说 start_kernel之前的所有工作都是为了将环境准备好,满足start_kernel的要求,然后由start_kernel开始进行内核的加载:
关于 start_kernl函数的内容太多,可以通过红色回调函数看出,start_kernel函数基本是在回调很多对应的注册函数。为了本系列课程的结构性这里就不展开所有知识点讲解,本篇内容接着前一篇设备树的内容重点讲解下设备和驱动的匹配过程。
还记得上一篇讲到的设备树三大作用吗?
平台标识;
运行时配置;
设备信息集合。
接下来我们就看看内核在启动的时候是如何寻找设备,驱动又如何和设备绑定的。
首先在平台目录下可以看到有很多平台描述的文件,如图:
有那么多的平台,我们到底要执行哪个平台是首先要考虑的事情。这也是设备三大功能的第一个功能——平台标识。
设备树里有对设备根节点的 Compatible 描述,平台文件里有对 __initconst的描述,如果两个字段一致则找到了对应的板级文件,这样就通过设备树把要用的设备平台与其他平台区分开来了,如图:
找到平台后就可以根据回调函数的指针调用该平台的注册函数。这里以飞思卡尔 imx.6dl 平台为例,回调的时候会调用 imx6q_init_machine函数,如下:
这里补充一个知识点,细心的读者也许发现了在 Compatible 字段里用逗号分隔了两个字符串。板级匹配的时候用的是哪个字符串,另外一个字符串又是做什么用?首先后面的字段 "fsl,imx6dl" 是抽象共用平台描述符,前面的字段 "fsl,imx6dl-sabresd" 是通用平台下的具体平台描述符,可以理解为母板和子板的区别。在具体的子板文件中我们可以通过前面的字段进行设备信息的获取,如图:
接着是运行时配置,让内核在启动的时候根据参数设置进行不同的处理。有经验的读者清楚在 Uboot 里也有对 Bootargs 的配置,这里为什么多此一举呢,是为了在 Uboot 中更灵活的对内核启动进行配置。
最后的作用就是设备信息集合,这是设备和驱动匹配的核心,也是工作中面对最多的情况。出于这一作用的内容是工作中经常遇到的重点也是难点,我们专门用一篇内容来详细讲解各级设备是如何展开的,并且手把手教你如何定制一套自己的开发板全新案例。
相关问答
怎么安装flashtool 驱动 ?可以按照以下方法在win8.1下安装Flashtool驱动1、点击“设置”;2.选择最下面的“更改电脑设置”;3.界面变化以后,选择最下面的“更新和恢复”;4.接着点击...
NANDflash 和NORflash的区别?1、存储架构不同NORFlash架构提供足够的地址线来映射整个存储器范围。这提供了随机访问和短读取时间的优势,这使其成为代码执行的理想选择。另一个优点是100%...
miflash刷机 驱动 安装不了怎么办?首先,检查电脑是否已经安装了其他手机驱动程序,如果有,需要先卸载。其次,尝试更换USB数据线或者更换USB接口,有时候驱动安装不成功是因为USB连接不稳定。...
Linux内核开发与Linux 驱动 开发有什么关系?我做过驱动开发,说说我的看法。本质上说Linux内核开发和Linux驱动开发是不一样的,或者说驱动开发是内核开发的一部分,因为驱动属于内核。目前国内驱动开发和内...
电脑连接投影仪显示安装 flash驱动 ?在连接电脑和投影仪后,如果在显示过程中出现需要安装flash驱动的提示,需要在电脑浏览器中下载并安装flash插件。在安装完成后,重新打开浏览器即可正常显示投影...
如何编写 nandflash驱动 ?实际上与其他嵌入式系统一样。给没有操作系统的手机写驱动:查看datasheet,一点一点写吧;有操作系统的,先学习操作系统提供的API接口,再学习操作系统提供给...
如何编写Linux下 NandFlash驱动 ?实现ubifs相对简单,框架都搭好了,根据nandflash控制器写mtd接口就好了。主要关注pagelayout,硬ECC能力是否与nand要求匹配,ECC最好有纠错比特数预警,以实...
电视上怎么样安装adobe flash player-ZOL问答gengjie212你说的是那种比较智能的电视吧?这个有点困难,一般电视买的时候都...确是预装的支持FLASH视频格式的观看FLASHPLAYER似乎是7.0吧而且你下的那...
在座的好基友!谁能给我说一下 flash 烧录和ic烧录?,IC烧录座...[回答]NandFlash擦除很简单,而NorFlash需要将所有位全部写0(这里要说明一下,Flash器件写入只能把...容量差别:NandFlash容量要比NorFlash大得多,Nand:8M-...
华硕电脑开机一直出现aptio setup utility-copyright (c) 201...如果安装的是克隆版系统或者win7可用以下方法试试在BIOS设置中找到Security标签,找到SecureBOOTmenu项,回车找到SecureBOOTControl项,回车将Ena...