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

The PROGRAM PAGE (80h-10h) command enables the host to input data to a cache register, and moves the data from the cache register to the specified block and page address in the array of the selected die (LUN).

Parameters:
[in]nand_addr_taddr: address where start reading
[in]flash_width*buffer: the buffer contains the data to program into the flash [in] MT_uint32 lenght: 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 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 773 of file nand_MT29F_lld.c.

References __build_cycle_addr(), __is_valid_addr(), CMD_PAGE_PROGRAM, CMD_PAGE_PROGRAM_CONFIRM, 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_PROGRAM_FAILED, NAND_PROGRAM_FAILED_WRITE_PROTECT, NAND_Read_Status(), NAND_SUCCESS, NUM_OF_ADDR_CYCLE, PLATFORM_Close(), PLATFORM_Open(), PLATFORM_SendAddr(), PLATFORM_SendCmd(), PLATFORM_SendData(), STATUS_FAIL, STATUS_WRITE_PROTECTED, 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;

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

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

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

   __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_WRITE_PROTECTED))
      return NAND_PROGRAM_FAILED_WRITE_PROTECT;

   if(status_reg & STATUS_FAIL)
      return NAND_PROGRAM_FAILED;

   return NAND_SUCCESS;
}