static int nand_read_page( uffs_Device *dev, u32 block, u32 page, u8 *data, int data_len, u8 * ecc, rt_uint8_t *spare, int spare_len) { int res; page = block * dev->attr->pages_per_block + page; if (data == NULL && spare == NULL) { #if defined(RT_UFFS_USE_CHECK_MARK_FUNCITON) RT_ASSERT(0); //should not be here #else /* check block status: bad or good */ rt_uint8_t spare[UFFS_MAX_SPARE_SIZE]; rt_memset(spare, 0, UFFS_MAX_SPARE_SIZE); rt_mtd_nand_read(RT_MTD_NAND_DEVICE(dev->_private), page, RT_NULL, 0, spare, dev->attr->spare_size);//dev->mem.spare_data_size res = spare[dev->attr->block_status_offs] == 0xFF ? UFFS_FLASH_NO_ERR : UFFS_FLASH_BAD_BLK; return res; #endif } rt_mtd_nand_read(RT_MTD_NAND_DEVICE(dev->_private), page, data, data_len, spare, spare_len); return UFFS_FLASH_NO_ERR; }
static URET ReadPageWithLayout(uffs_Device *dev, u32 block, u32 page, u8 *data, int data_len, u8 *ecc, //NULL uffs_TagStore *ts, u8 *ecc_store) //NULL { int res = UFFS_FLASH_NO_ERR; int spare_len; rt_uint8_t spare[UFFS_MAX_SPARE_SIZE]; RT_ASSERT(UFFS_MAX_SPARE_SIZE >= dev->attr->spare_size); page = block * dev->attr->pages_per_block + page; spare_len = dev->mem.spare_data_size; if (data == RT_NULL && ts == RT_NULL) { #if defined(RT_UFFS_USE_CHECK_MARK_FUNCITON) RT_ASSERT(0); //should not be here #else /* check block good or bad */ rt_mtd_nand_read(RT_MTD_NAND_DEVICE(dev->_private), page, RT_NULL, 0, spare, dev->attr->spare_size);//dev->mem.spare_data_size dev->st.io_read++; res = spare[dev->attr->block_status_offs] == 0xFF ? UFFS_FLASH_NO_ERR : UFFS_FLASH_BAD_BLK; return res; #endif } if (data != RT_NULL) { dev->st.io_read += data_len; dev->st.page_read_count++; } res = rt_mtd_nand_read(RT_MTD_NAND_DEVICE(dev->_private), page, data, data_len, spare, spare_len); if (res == 0) res = UFFS_FLASH_NO_ERR; else if (res == -1) { //TODO ecc correct, add code to use hardware do ecc correct res = UFFS_FLASH_ECC_OK; } else res = UFFS_FLASH_ECC_FAIL; if (ts != RT_NULL) { // unload ts and ecc from spare, you can modify it if you like uffs_FlashUnloadSpare(dev, (const u8 *)spare, ts, RT_NULL); if ((spare[spare_len - 1] == 0xFF) && (res == UFFS_FLASH_NO_ERR)) res = UFFS_FLASH_NOT_SEALED; dev->st.io_read += spare_len; dev->st.spare_read_count++; } return res; }