Micron MT29F NAND driver
|
MT_uint8 NAND_OTP_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. Use this function only to read OTP area!
[in] | nand_addr_t | addr: address where to start reading (column is ignored) |
[in] | MT_uint32 | lenght: number of byte (or word) to read [out] flash_width *buffer: the buffer contains the data read from the spare area |
DRIVER_STATUS_NOT_INITIALIZED | |
NAND_INVALID_NAND_ADDRESS | |
NAND_PROGRAM_FAILED_WRITE_PROTECT | |
NAND_PROGRAM_FAILED | |
NAND_SUCCESS | |
NAND_TIMEOUT |
Definition at line 1904 of file nand_MT29F_lld.c.
References __build_cycle_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_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; 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; }