|  File I/O Products  
 smxNOR™
 
 Flash Driver
 
 The smxNOR flash driver makes NOR flash memory appear to a file system like a disk drive.
 
 General
 
 smxNOR works with both the smxFFS Flash File System and the smxFS FAT file system. It is a two-level driver. The high-level driver presents a sector-oriented interface to a file system. The low-level driver presents a hardware-independent interface, or abstraction layer, to the high-level driver. The standard low-level driver interfaces directly to standard NOR flash chips and serial NOR flash chips. Small modifications are normally required to adapt it to specific hardware configurations. smxNOR can be restricted to operate within a partition of NOR flash memory, so that other partitions can be used for other purposes, such as for execute-in-place code.
 
 smxNOR is designed for use in embedded systems. It has a small code footprint and a very small RAM footprint. Performance is moderate. This is normally adequate because NOR flash does not have fast write speed. The algorithm chosen favors small- to medium-size NOR flash memories in order to reduce RAM usage. smxNOR is best used to store static data such as downloaded code, tables, HTML pages, etc. It can also be used to log data being acquired at low rates. If high-speed operation or large capacity is needed, the smxNAND flash driver is recommended. For simple data logging operations, with very small flash and RAM space, smxFLog may be the best choice.
 
 Definitions
 
 
  Block: Minimum erasable unit of a flash chip. (Note: some flash chip vendors use the term sector, instead.)
  Flash partition: The portion of the NOR flash memory allocated to smxNOR.    
  Sector:  Minimum unit of data for a file system.       It is 512 bytes, by default.
  Free Sector: An erased sector ready to store new data. (Each byte contains 0xFF.) NOR Flash Requirements
 
 
 
 Must support block erase (changes all cells to 0xFF)
 Each byte or word can be written at least 3 times, changing selected bits from �1� to �0� each time, without disturbing other bits.
 Limitations
 
 
 Uses only full size flash blocks. Small contiguous blocks can be merged together to form full blocks that start on full block boundaries.
 Intended for moderate performance. Use smxNAND or smxFLog for data streaming.
 A portion of each block is used for control information, so the total data capacity is somewhat less than the total media size.
 Structure
 
 smxNOR is a two-level flash driver
 
 High-Level Driver 
 Low-Level Driver or Hardware Interface Layer (HIL)
 
 High-Level Driver
 
 The high-level driver performs most of the functions of smxNOR and it makes a NOR flash memory partition look like a disk drive to a file system.
 
 API
 
 The following API is presented to the file system and the application: (smxFS includes a wrapper to map its standard driver interface to this interface � see the smxFS data sheet. Some functions, such as nor_BlockReclaim() may be called directly by the application.)
 
 
 
  
    | int  	nor_FlashInit (id) | Initializes the NOR flash driver internal data structures and the flash chip hardware. Also does power up check and does the recovery, if necessary. |  
    | int 	nor_FlashRelease (id) | Releases the NOR flash driver when  the file system un-mounts this disk. |  
    | int  	nor_BlockReclaim (id, eesn) | Does a block reclaim. Should be  called only when the system is idle. smxFS calls this function through a custom  sfs_ioctl() function. |  
    | int  	nor_SectorRead (id, rp, si) | Reads one data sector from the  flash. |  
    | int  	nor_SectorWrite (id, wp, si) | Writes one data sector from the  flash. |  
    | int  	nor_SectorDiscard (id, si) | Discards one sector. Used when  deleting a file. |  
    | u32  	nor_SectorNum (id) | Returns the number of sectors in  the flash partition. |  
    | u32  	nor_SectorSize (id) | Returns the sector size. |  
    | u32  	nor_WearLeveling(id) | Does  static wear leveling based on wear counters and a configurable threshold. |  id = chip id, si = sector index, rp = read buffer pointer, wp = write buffer pointer, eesn = expected empty sector number.
 
 Operation
 
 The high-level driver performs the following functions:
 
 
Converts each logical sector address to a NOR memory physical sector address.
Sector map caching. 
Power fail-safe sector writes.
Power failure recovery on power up.
Block reclaim.
Static and dynamic wear leveling.
Read back verification.
 Sector Translation. The main function of the high-level driver is to convert a logical sector address into a physical sector address. To do so, smxNOR utilizes and maintains a sector map. The sector map also contains status information for each physical sector that indicates if it is valid, erased, etc. For 512 byte sectors, the maximum memory size is 8 GB. For sizes larger than this, smxNAND is recommended.
 
 
 Sector Map Cache. The sector map is stored in flash  so that it is preserved if power is lost. However, it is not stored in a form  convenient for normal operation. Hence, a sector map cache is maintained in RAM  to improve performance. An algorithm has been chosen to achieve the best  performance under normal conditions. The cache size is determined at compile  time and can be adjusted depending upon the NOR flash partition size. Default  size is 16 entries. Power Fail-Safe Write Operation. A pointer is  maintained to the next free sector. Before starting to write, the free sector  status is set to being written. Then data is written into the sector.  After the sector write is complete, the status of the old sector, if any, is  set to discarded, and the status of the new sector is set to valid. Power Failure Recovery.  On power up the entire flash partition is  scanned for a sector with being written status. If found then the flash  partition is scanned to find the old sector having the same logical address. If  the old sector status is valid, then the new sector is deemed to be only  partially written and it is discarded. But if the old sector status is discarded,  then the new sector status is changed to valid. Block Reclaim. Block reclaim is the process of  erasing blocks so that they may be reused. It is invoked under two conditions:  (1) by the user when the system is idle, or (2) after a sector write when the  number of free sectors drops below a pre-defined level. To do a block reclaim  the entire sector map is scanned to find the block with the most discarded  sectors. Then valid sectors are moved from that block to another block and the  block is erased. During this time, the NOR flash driver is busy and will not  accept read or write operations. To minimize downtime, only one flash block is  reclaimed, at a time. Static and Dynamic Wear Leveling. Static wear leveling is done by the API function nor_WearLeveling(), which uses wear counters and a configurable threshold. Dynamic wear leveling is a natural result of  always moving pointers through flash memory in an increasing direction and  recycling from the bottom when the top of the flash partition reached. Read Back Verification. This option may be enabled at  compile time to guarantee that data has been written to NOR flash correctly. If  an error is found, the sector is marked discarded and the data is  rewritten to the next free sector.  Hardware Interface Layer (HIL)
 
 The low-level driver is referred to as the Hardware Interface Layer (HIL) because it creates a hardware-independent abstraction layer for the high-level driver.
 
 API
 
 
 
  
    | int         nor_IO_FlashInit (id, pdi)  | Initializes all necessary flash  chip hardware settings, such as chip selects. Also loads the fields of the  device info structure so that the high-level driver knows the basic flash  information. |  
    | int         nor_IO_FlashRelease (id) | Does any clean up work when the NOR  flash driver is no longer needed. |  
    | int         nor_IO_PageRead (id, rp, si)  | Reads one sector of data from sector si of the flash to the  RAM buffer at rp. |  
    | int         nor_IO_PageWrite (id, wp, si)  | Writes one sector of  data  from the RAM buffer at wp to sector si  of the flash. The target  sector is guaranteed to be empty  by the high-level driver algorithm. |  
    | int         nor_IO_BlockErase (id, bi) | Erases the selected block – i.e.  changes all bytes in the block to 0xFF. |  
    | int        nor_IO_InfoWrite  (id, pdi, ds, bi, os)  | Writes specified information into the selected block’s first  sector. |  
    | int        nor_IO_InfoRead (id, pdi, ds, bi, os) | Reads information from the specified block’s first sector. |  id = chip id, bi = block index, ds = data size, os = offset, pdi = device info pointer, si = sector index, rp = read pointer, wp = write pointer.
 
 Operation
 
 The HIL performs the following functions:
 
	  Tells the high-level driver the total number of blocks and the block size through a pre-defined device info structure so that it does not need to know the details of each NOR flash chip.
	Blocks until the current operation is completed. 
	Handles sector requests that differ from true physical sector size. For example, if a NOR chip allows reading only 256 bytes, at a time, then HIL translates a 512- byte sector read operation into two successive 256-byte read operations.
	Handles different interface widths, transparently, such as 16-bit, 8-bit, and serial.
	Handles different interface types, transparently, such as processor bus, GPIO, and SPI.
	 Available Drivers
 
 The following low-level drivers (HILs) are currently available:
 
	Common Flash Interface (CFI)
	Atmel AT45D Data Flash
	Intel 28F Strata Flash
	Spansion S29AL
	SST 39VF
	STMicro M25P
	   More drivers are being added, so contact us if you need a different driver. In most cases, one of the above will suffice with small modifications. (Small modifications are usually necessary, anyway, due differences in hardware implementations.)
 
 
 Size and Performance
 
 The following is the smxNOR code size. The STMicro flash is a serial flash. The Intel flash is a parallel bus flash.
 
 
 
        
          | ARM7/9IAR
 STMicro M25P16
 | ColdFireCodeWarrior
 Intel 28F128K3
 |  
          | 5.0 KB | 7.5 KB |  smxNOR needs less than 1KB RAM for buffer and stack.
 
 The following table shows performance for the smxNOR flash driver. The tests wrote 1MB files and were done on a Freescale M5485EVB, using Intel 28F128K3 StrataFlash, and on an Avnet M5282 board using an SPI interface to an STMicro M25P16 serial flash. These measurements were made with smxFS.
 
 
 
 
  
    | Flash Type  | Read KB/sec | Write KB/sec |  
    | Intel 28F128K3 StrataFlash | 950 | 110 |  
    | STMicro M25P16 serial flash | 150 | 30 |  
 
 
 
 |