修改记录:v1.0,完成于2020-2-9

1 NOR FLASH (mx25u12835f) lock/unlock功能介绍

        Lock/unlock功能表示对FLASH某些区域或全部进行数据保护,即在数据保护区域不允许进行Program/Erase操作。根据数据手册介绍,NOR FLASH(mx25u12835f)有两种模式的数据保护模式:BP保护模式和单块保护模式。这两种方式由Secure Register中WPSEL位决定。

  1. 1 单块保护模式

        当Secure Register中WPSEL=1时表示单块保护模式。在此模式下FLASH内存分为256个64KB块,其中第0个块和第255个块中每4KB由SRAM中一个bit保护,其它每个64KB块由一个bit保护。如下图所示:

 

        每个块(无论4KB块还是64KB块)可通过SBLK/SBULK命令进行lock/unlock。当设置为1时为保护状态,不允许此块进行Program/Erase操作。当设置为0时可以正常进行Program/Erase操作。

       命令GBLK/GBULK可以对整个FLASH区域进行保护。

  1. 2 BP保护模式

         当Secure Register中WPSEL=0时表示BP保护模式。在该模式下由Status Register中BP0~3决定被保护区域范围。整个FLASH同样也分成256个64KB块,BP0~3=[0000]表示不进行任何保护,BP0~3=[0001]表示第0块被保护,BP0~3=[0010] 表示第0-1块被保护,BP0~3=[0011] 表示第0-3块被保护…BP0~3=[0111] 表示第0-63块被保护,BP0~3=[1000] 表示第0-255块被保护,BP0~3=[1XXX]表示整个255块被保护。其中Configuration Register中TB位表示是从上到下还是从下到上进行保护。

        当TB=0时,保护区域如下所示:

        当TB=1时,保护区域如下所示:

2 Linux对lock/unlock功能的支持分析

        当前Linux代码(5.2-rc3)中SPI-NOR代码框架并不支持对单块保护模式,而对BP模式的支持仅支持3BIT模式即BP0~2。同时对于3BIT BP模式仅部分厂商的FLASH支持。

2.1 SPI-NOR代码中支持lock/unlock的FLASH类型

        对于每种类型的FLASH支持的属性由flash_info->flags决定,相关属性定义如下所示:

 

其中lock/unlock功能由SPI_NOR_HAS_LOCK决定,如下图所示表示型号s25fl512s支持lock/unlock功能。

 

2.2 SPI-NOR代码lock/unlock分析

        SPI-NOR代码框架中有三个与之相关的API接口:spi_nor_lock()/spi_nor_unlock()/spi_nor_is_locked()。Spi_nor_lock()用于对某区域进行保护操作;spi_nor_unlock()用于对某区域进行解保护操作;spi_nor_is_locked()用于查询某区域是否已保护。

2.2.1函数spi_nor_lock()

        对于在FLASH属性中设置了SPI_NOR_HAS_LOCK标志位的FLASH,支持LOCK功能,它最终会调用函数spi_nor_lock()。流程如下所示:

 

其中关键步骤为:

  1. 读取Status Register确定当前保护的BP值;
  2. 确定新的BP值;
  3. 重新设置Status Register进行新的区域保护;

2.2.2函数spi_nor_unlock()

        对于在FLASH属性中设置了SPI_NOR_HAS_LOCK标志位的FLASH,支持UNLOCK功能,它最终会调用函数spi_nor_unlock()。流程如下所示: 

 

其中关键步骤为:

  1. 读取Status Register确定当前保护的BP值;
  2. 确定新的BP值;
  3. 重新设置Status Register进行新的区域保护;

2.2.3函数spi_nor_is_locked()

        对于在FLASH属性中设置了SPI_NOR_HAS_LOCK标志位的FLASH,支持查询lock状态的功能,它最终会调用函数spi_nor_is_locked()。流程如下所示:

其中关键步骤为:

  1. 读取Status Register确定当前保护的BP值;
  2. 检查查询的区域是否在BP值保护范围内;

2.3 macronix类型FLASH支持lock/unlock遗留问题

        虽然SPI-NOR代码框架对部分FLASH支持lock/unlock功能,但对于型号mx25u12835f的FLASH,SPI-NOR代码仍存在问题。从代码分析上来看,当前存在三个问题:

  1. 当前SPI-NOR代码仅支持3BIT BP,而型号mx25u12835f的FLASH上则是支持4BIT BP;
  2. 当前SPI-NOR代码中对查询Program/Erase完成状态在FSR寄存器中确定,而型号mx25u12835f的FLASH并没有FSR寄存器,而是在Configuration Register中定义,因此若要支持mx25u12835f,需要查询CR寄存器来确定是否完成;
  3. 另外TB状态,一般都定义在SR寄存器中,而号mx25u12835f的FLASH上则定义在CR寄存器;

 

Logo

更多推荐