Micron MT29F NAND driver
|
MT_uint8 NAND_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.
[in] | nand_addr_t | addr: address where to 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 |
DRIVER_STATUS_NOT_INITIALIZED | |
NAND_INVALID_NAND_ADDRESS | |
NAND_PROGRAM_FAILED_WRITE_PROTECT | |
NAND_PROGRAM_FAILED | |
NAND_SUCCESS | |
NAND_TIMEOUT |
Definition at line 956 of file nand_MT29F_lld.c.
References __build_cycle_addr(), __is_valid_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_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(), parameter_page_t::spare_bytes_per_page, 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; 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, 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; }