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

The spare program function allows to program the spare area of a page. Please read the datasheet for more info about ECC-on-die feature. Use this function only to program OTP area!

Parameters:
[in]nand_addr_taddr: address where to start reading
[in]flash_width*buffer: the buffer contains the data to program into the flash
[in]MT_uint32lenght: number of byte (or word) to program
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 program command (80h)
  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 1732 of file nand_MT29F_lld.c.

References __build_cycle_addr(), CMD_PAGE_PROGRAM, CMD_PAGE_PROGRAM_CONFIRM, 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_PROGRAM_FAILED, NAND_Read_Status(), NAND_SUCCESS, NUM_OF_ADDR_CYCLE, PLATFORM_Close(), PLATFORM_Open(), PLATFORM_SendAddr(), PLATFORM_SendCmd(), PLATFORM_SendData(), parameter_page_t::spare_bytes_per_page, STATUS_FAIL, and SUPPORTED_16_BIT_DATA_BUS_WIDTH.

                                                                                         {
   MT_uint8 address[5];
   MT_uint8 status_reg;
   MT_uint32 k;
   int i;

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

   /* x16 */
   if((device_info.feature & SUPPORTED_16_BIT_DATA_BUS_WIDTH) != 0) {
      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, address);

   /* init board transfer */
   PLATFORM_Open();

   /* send command */
   PLATFORM_SendCmd(CMD_PAGE_PROGRAM);

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

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

   /* send command */
   PLATFORM_SendCmd(CMD_PAGE_PROGRAM_CONFIRM);

   status_reg = NAND_Read_Status();

   /* close board transfer */
   PLATFORM_Close();

   /* check if program is good */
   if(status_reg & STATUS_FAIL)
      return NAND_PROGRAM_FAILED;

   return NAND_SUCCESS;
}