CFI命令集现在大体有两个,在linux内核的MTD下我就可以看到,其中一个是:cfi_cmdset_0001.c,另一个是cfi_cmdset_0002.c,还是一个是cfi_cmdset_0020.c这个是ST后来新加的,我们一般不会去care它的,一般如果你用的是Micrion的Norflash,我们用的是cfi_cmdset_0002.c这信指命令集。这里有一个关于cfi_cmdset_0002.c中关于do_buffer_write中timeout的讨论 http://lists.infradead.org/pipermail/linux-mtd/2013-April/046446.html,这个是在do_buffer_write这个函数中发现有timeout不够的问题,在最近的内核版本中3.15,关于tiimeout的作法是这样的.
我们知道一些关于norflash的信息,我们可以通过读取CFI信息获取,关于CFI的信息,在linux内核中,主要由两个结构体来完成。先来看一下CFI总的信息表吧:我们就是Micron的MT28EW来例:
下面这张表就是部的CFI表分布,其中前三个表是存在结构体cfi_ident,而最后一个是存在结构体cfi_pri_amdstd。
/* Basic Query Structure */
struct cfi_ident {
uint8_t qry[3]; // 0x10
uint16_t P_ID; //0x13
uint16_t P_ADR; //0x15
uint16_t A_ID; //0x17
uint16_t A_ADR;
uint8_t VccMin; // unused 0x1b
uint8_t VccMax; // unused
uint8_t VppMin; // unused
uint8_t VppMax; // unused
uint8_t WordWriteTimeoutTyp; //0x1f used
uint8_t