Micron MT29F NAND driver
MT_uint8 NAND_Spare_Read ( nand_addr_t  addr,
flash_width buffer,
MT_uint32  lenght 
)

The spare read function allows to read the spare area of a page. Please read the datasheet for more info about ECC-on-die feature.

Parameters:
[in]nand_addr_taddr: address where to start reading (column is ignored)
[in]MT_uint32lenght: number of byte (or word) to read [out] flash_width *buffer: the buffer contains the data read from the spare area
Returns:
Return code
Return values:
DRIVER_STATUS_NOT_INITIALIZED
NAND_INVALID_NAND_ADDRESS
NAND_PROGRAM_FAILED_WRITE_PROTECT
NAND_PROGRAM_FAILED
NAND_SUCCESS
NAND_TIMEOUT
Pseudo Code Steps
  1. Send read command (00h)
  2. Send address (5 cycles)
  3. Send data
  4. Send confirm command (30h)
  5. Wait for ready
  6. Check status register value

Definition at line 858 of file nand_MT29F_lld.c.

References __build_cycle_addr(), __is_valid_addr(), __wait_for_ready(), CMD_READ_CONFIRM, CMD_READ_MODE, nand_address_t::column, parameter_page_t::data_bytes_per_page, device_info, driver_status, DRIVER_STATUS_INITIALIZED, DRIVER_STATUS_NOT_INITIALIZED, parameter_page_t::feature, NAND_INVALID_LENGHT, NAND_INVALID_NAND_ADDRESS, NAND_READ_FAILED, NAND_Read_Status(), NAND_SUCCESS, NUM_OF_ADDR_CYCLE, PLATFORM_Close(), PLATFORM_Open(), PLATFORM_ReadData(), PLATFORM_SendAddr(), PLATFORM_SendCmd(), parameter_page_t::spare_bytes_per_page, STATUS_FAIL, and SUPPORTED_16_BIT_DATA_BUS_WIDTH.

                                                                                  {
   MT_uint8 row_address[5];
   MT_uint8 status_reg;
   MT_uint8 ret;
   MT_uint32 k;
   int i;

   /* verify if driver is initialized */
   if(DRIVER_STATUS_INITIALIZED != driver_status)
      return DRIVER_STATUS_NOT_INITIALIZED;

   /* check input parameters */
   if(NAND_SUCCESS != __is_valid_addr(addr))
      return NAND_INVALID_NAND_ADDRESS;

   if((device_info.feature & SUPPORTED_16_BIT_DATA_BUS_WIDTH) != 0) {
      /* x16 */
      if(lenght > (device_info.spare_bytes_per_page >> 1) )
         return NAND_INVALID_LENGHT;
   }

   /* x8 */
   if(lenght > device_info.spare_bytes_per_page)
      return NAND_INVALID_LENGHT;

   /* spare area starts after last main area byte */
   if((device_info.feature & SUPPORTED_16_BIT_DATA_BUS_WIDTH) == 0)
      /* x8 bus width */
      addr.column=device_info.data_bytes_per_page;
   else
      /* x16 bus width */
      addr.column=device_info.data_bytes_per_page >> 1;

   __build_cycle_addr(addr, row_address);

   /* init board transfer */
   PLATFORM_Open();

   /* send command */
   PLATFORM_SendCmd(CMD_READ_MODE);

   /* send address */
   for(i=0; i<NUM_OF_ADDR_CYCLE; i++)
      PLATFORM_SendAddr(row_address[i]);

   /* return to read mode */
   PLATFORM_SendCmd(CMD_READ_CONFIRM);

   /* wait */
   ret = __wait_for_ready();

    /* return if timeout */
    if (NAND_SUCCESS != ret)
      return ret;

   /* read data */
   for(k=0; k<lenght; k++)
      buffer[k] = PLATFORM_ReadData();

   /* read status register on exit */
   status_reg = NAND_Read_Status();

   /* close board transfer */
   PLATFORM_Close();

   if(status_reg & STATUS_FAIL)
      return NAND_READ_FAILED;

   return ret;
}