之前做过的boot flash driver,记录下。

BSP配置

首先要确保配置正确。

  • mmu cache not: vxworks中sysPhysMem的vm state必须是VM_CACHE_NOT,否则访问不到。linux中是ioremap。
  • address map: vx中要添加flash map space,否则d时不能访问;另,bsp mmu的配置要和cpu bus controller配置一致,否则d 访问时显示不全。例如,ppc的Local Bus的BR0,OR0用于boot访问,BR0和OR0的address mask配置要和mmu的map address一致。

Flash操作

  • how cpu access flash, define the cpu_read/write interface of your target

cpu和flash之间有没有其他的dev(如pld),如果有就要知道这个dev是如何从cpu address译码成flash address的。根据这个我们定义cpu上rd/wr flash的接口:

#define FLASHDATA BYTE /* or WORD or DWORD */
#define FLASH_OFFSET(b,o)   (*(( (volatile FLASHDATA*)(b) ) + (o)))
#define FLASH_WR(b,o,d)     FLASH_OFFSET((b),(o)) = (d)
#define FLASH_RD(b,o)       FLASH_OFFSET((b),(o))
  • where to operation

小容量的flash(1M)基本是全片操作,而在大容量的flash里,如s29gl128n是16M,会对flash划分空间,只有某个空间是可以操作的。就要注意flash空间的address map了。

  • first find device id then erase/write

先找device id 因为这个操作最简单,确保能找到flash的前几个bus cycle,后面擦写数据也用到这几个bus cycle。如果成功找到chip id,flash的大片地方全有规律显示出id值。注意有的片子可能支持x8,x16两种模式,这个 FLASHDATA 用来标识。在找chip id时,FLASHDATA按x8和x16应该都能找到,然后根据datasheet确定是x8还是x16的id,确定x8 or x16后再擦写。

LLD接口

这里主要说下spansion LLD在移植中的问题。

  • lld_GetDeviceId: 在lld_AutoselectEntryCmd后需延迟下读id,防止你的cpu过快;
  • lld_Poll: 在erase 大片时verify时需要loop delay,如erase sector, 而在verify program时只需要简单的loop就可以,否则program速度就太慢拉。
  • lld_StatusGet: erase和program都没有必要去check DQ2,因为手册提到DQ2是在erase supend/program supend模式,而我就没用。不去掉这个lld_Poll中会有问题。
  • lld_memcpy: 其实这个接口没必要用,自己写个loop, call write buffer or write byte都可以。