nor flash xip

XIP:execute in place,即芯片内执行,指应用程序可以直接在flash闪存中取指然后译码、执行,不必再把代码读到系统RAM中,flash内执行时指Nor flash不需要初始化,可以直接在flash内执行代码,但往往只执行部分代码,比如用于初始化RAM等。

cadence qspi flash controller ip的手册上有XIP模式的相关描述:

XIP 模式操作
本小节介绍了进入和退出 XIP 模式。大多数 SPI flash 器件都支持 XIP 模式。 然而, flash器件制造商不采用统一的标准方法,大多数使用签名比特,签名比特在地址字节 之后立即发送到器件。某些器件使用签名比特,同时也需要 flash器件配置寄存器写 操作来使能 XIP 模式。

进入 XIP 模式
以下部分介绍了各种类型 flash 器件进入 XIP 模式的软件步骤。

支持 Basic-XIP 的 Micron Quad SPI Flash 器件 要在支持 Basic-XIP 的 Micron quad SPI flash 器件中进入 XIP 模式,需要执行下面 的步骤:

  1. 如果想要在退出时还原模式比特的值,则需要以模式比特保存这些值。
  2. 禁止直接访问控制器和间接访问控制器以确保没有新的读或写访问发送到 flash 器 件。
  3. 将 modebit 寄存器中的 XIP 模式设为 0x80。
  4. 通过将 cfg 寄存器的 enterxipnextrd 比特设成 1 来使能 quad SPI 控制器的 XIP 模 式。
  5. 重使能直接访问控制器,和间接访问控制器 ( 如果需要 )。

不支持 Basic-XIP 的 Micron Quad SPI Flash 器件 要在不支持 Basic-XIP 的 Micron quad SPI flash 器件中进入 XIP 模式,需要执行下 面的步骤:

  1. 如果想要在退出时还原模式比特的值,则需要以模式比特保存这些值。
  2. 禁止直接访问控制器和间接访问控制器以确保没有新的读或写访问发送到 flash 器 件。
  3. 确保通过将易失配置寄存器 (VCR) bit 3 设成 1,在 flash 器件中使能 XIP 模式。 使用 flashcmd 寄存器发出 VCR 写命令。
  4. 将 modebit 寄存器中的 XIP 模式比特设为 0x00。
  5. 通过将 cfg 寄存器的 enterxipnextrd 比特设成 1 来使能 quad SPI 控制器的 XIP 模 式。
  6. 重新使能直接访问控制器,和间接访问控制器 ( 如果需要 )。

Winbond Quad SPI Flash 器件
执行下面的步骤在 Winbond quad SPI flash 器件中进入 XIP模式:

  1. 如果想要在退出时还原模式比特的值,则需要以模式比特保存这些值。
  2. 禁止直接访问控制器和间接访问控制器以确保没有新的读或写访问发送到 flash 器 件。
  3. 将 modebit 寄存器中的 XIP 模式比特设为 0x20。
  4. 通过将 cfg 寄存器的 enterxipnextrd 比特设成 1 来使能 quad SPI 控制器的 XIP 模 式。
  5. 重新使能直接访问控制器,和间接访问控制器 ( 如果需要 )。

Spansion Quad SPI Flash 器件
执行下面的步骤在 Spansion quad SPI flash 器件中进入 XIP 模式:

  1. 如果想要在退出时还原模式比特的值,则需要以模式比特保存这些值。
  2. 禁止直接访问控制器和间接访问控制器以确保没有新的读或写访问发送到 flash 器 件。
  3. 将 modebit 寄存器中的 XIP 模式比特设为 0xA0。
  4. 通过将 cfg 寄存器的 enterxipnextrd 比特设成 1 来使能 quad SPI 控制器的 XIP 模 式。
  5. 重新使能直接访问控制器,和间接访问控制器 ( 如果需要 )。

退出 XIP Mode
执行下面的步骤退出 XIP 模式:

  1. 禁止直接访问控制器和间接访问控制器以确保没有新的读或写访问发送到 flash 器 件
  2. 根据 flash 器件和制造商,将模式比特还原到进入 XIP 模式之前的值。
  3. 将 cfg 寄存器的 enterxipnextrd 比特设为 0。

flash 器件在禁止它的内部 XIP 模式状态之前必须接收一个读指令。因此,XIP 模式内 部地保持有效 (active)直到进行下一个读指令。要确保在任何的读序列结束前 XIP 模 式是禁止的。

上电复位上的 XIP 模式
某些作为非易失配置设置的 flash 器件可以是 XIP 使能的,支持 flash 器件在无需软件的干预下在上电复位 (POR) 时进入 XIP 模式。软件不能通过状态寄存器读操作来发 现 POR 上的 XIP 状态,因为一个 XIP使能的 flash 器件只能通过 XIP 读操作进行访问。 如果您知道器件将在 POR 上进入 XIP 模式,那么您的初始引导软件要配置modebit 寄 存器,并将 cfg 寄存器的 enterxipimm 比特设为 1。 如果事先不知道器件是否将要在 POR 上进入XIP 模式,那么您的初始引导软件要通过 flashcmd寄存器发出一个XIP模式退出命令,然后执行第12–15页“进入XIP模式” 中的步骤。软件必须知道器件的模式比特要求,因为 XIP 模式的进入和退出会根据器件 的而不同而不同。

但是在项目中使用的flash不止这几个厂家,且上面的描述与寄存器也无法对应起来。

网上找到参考:Nor Flash芯片内执行(XIP)
NOR FLASH和NAND FLASH基本结构和特点

所谓片内执行不是说程序在存储器内执行,CPU的基本功能是取指、译码、运行。Nor Flash能在芯片内执行,指的是CPU能够直接从Nor flash中取指令,供后面的译码器和执行器来使用。

nor flash 和 nand flash

为什么Nor Flash可以实现XIP,而Nand flash就不行呢?
有一个概念:嵌入式系统中代码的执行方式:
(1)完全映射:嵌入式系统程序运行时,将所有代码从非易失存储器(Flash、ROM等)复制到RAM中运行。
(2)按需分页:只复制部分代码到RAM中,这种方法对RAM中的页进行导入/导出管理,如果访问位于虚存中但不在物理RAM中会产生页错位,这时才将代码和数据映射到RAM中。
(3)XIP:在系统启动时,不将代码复制到RAM,而是直接在非易失性存储位置执行,RAM中只存放需要不断变化的数据部分,如下图所示:
在这里插入图片描述
解释一:
如果非易失性存储器(Flash)的读取速度与RAM相近,则XIP可以节省复制和解压的时间,Nor flash和rom的读取速度比较看(约100ns),比较适合XIP,而Nand flash的读取操作是基于扇区的,速度相对很慢(us级),因此不适合实现XIP系统,不过Nand flash的写速度比Nor的快,更适合做存储和下载系统。

解释二:
两种芯片的结构不同
NOR flash之所以可以片内执行,就是因为他符合CPU去指令译码执行的要求。CPU送一个地址出来,Nor flash就能给出一个数据让CPU执行,中间不需要额外的处理操作。
NAND flash不一样是因为nand flash有地址,数据,命令共用IO口的问题,cpu把地址发出来之后,并不能直接得到数据,还需要控制线的操作才能完成。就是他没有专用的SRAM接口。

解释三:
芯片内执行主要是是看芯片可不可以线性存储代码(假如硬件支持芯片接口),只要能保证芯片的存储空间是线性的(也就是无坏块),都可以片上执行,在读取Flash时候,容易出现“位翻转(bitconvert),在Flash的位翻转(一个bit位发生翻转)现象上,NAND的出现几率要比NorFlash大得多。这个问题在Flash存储关键文件时是致命的,所以在使用NandFlash时建议同时使用EDC/ECC等校验算法。 ”

但是,如果能保证不出错,也还是可以进行XIP,可以在其上执行代码的: “所谓XIP,就是CODE是在FLASH上直接运行. NANDFLASH只是不适合做XIP,但并不是不能做XIP“ 要一段CODE能够正确的运行,要保证它的CODE是连续的,正确的. 由于一些电气特性的原因,NOR FLASH能够做到这一点,不存在坏道或坏块,所以能够做XIP. 而对于NAND FLASH, 它只保证它的BLOCK 0是好的,其他的块并不保证,虽然出错的几率比较低,但还是有出错的可能,所以CODE可能无法连续正确地执行.