//#endif int Mem_Check(unsigned long offset) { static rt_uint16_t test_data[2] = { 0x55AA, 0xAA55 }; rt_uint16_t tmp = 0x3C3C; int ret = 1; if (offset<PSRAM_CY) { Mem_Wr ( test_data[0], offset); Mem_Rd ( &tmp, offset); if (tmp != test_data[0]) ret = 0; Mem_Wr ( test_data[1], offset); Mem_Rd ( &tmp, offset); if (tmp != test_data[1]) ret = 0; } return (ret); }
static rt_err_t nand_mtd_read( struct rt_mtd_nand_device * dev, rt_off_t page, rt_uint8_t * data, rt_uint32_t data_len, //may not always be 2048 rt_uint8_t * spare, rt_uint32_t spare_len) { rt_err_t result=RT_EOK; int i; rt_mutex_take(&nand, RT_WAITING_FOREVER); if (data != RT_NULL && data_len != 0) { // get offset of sst39vf's read position rt_uint32_t page_offs = page*512; if(data_len>512 && data_len<=528) { //read back both main data and spare data rt_uint32_t spare_offs = page*16 + NOR_SPARE_BLOCK; for(i=0;i<256;i++) Mem_Rd((rt_uint16_t *)data+i,page_offs+i); for(i=0;i<(data_len-512)/2;i++) Mem_Rd((rt_uint16_t *)data+256+i,spare_offs+i); } else { for(i=0;i<data_len/2;i++) Mem_Rd((rt_uint16_t *)data+i,page_offs+i); } } if (spare != RT_NULL && spare_len != 0) { rt_uint32_t spare_offs = page*16 + NOR_SPARE_BLOCK; for(i=0;i<spare_len/2;i++) Mem_Rd((rt_uint16_t *)spare+i,spare_offs+i); } rt_mutex_release(&nand); return result; }
static rt_err_t nand_mtd_check_block( struct rt_mtd_nand_device* device, rt_uint32_t block) { rt_err_t result=RT_EOK; rt_uint16_t bad; rt_uint32_t spare_offs = NOR_SPARE_BLOCK+block*32; rt_mutex_take(&nand, RT_WAITING_FOREVER); Mem_Rd(&bad,spare_offs); rt_mutex_release(&nand); return ((bad&0xff)==0xff) ? RT_EOK:RT_ERROR; }