static rt_err_t nand_mtd_write ( struct rt_mtd_nand_device * dev, rt_off_t page, const rt_uint8_t * data, rt_uint32_t data_len,//will be 2048 always! const 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 write position rt_uint32_t page_offs = page*512; for(i=0;i<data_len/2;i++) Mem_Wr(*(rt_uint16_t *)((rt_uint16_t *)data+i),page_offs+i); } if (spare != RT_NULL && spare_len != 0) { // get spare offset of sst39vf's write position rt_uint32_t spare_offs = page*16 + NOR_SPARE_BLOCK; for(i=0;i<spare_len/2;i++) Mem_Wr(*(rt_uint16_t *)((rt_uint16_t *)spare+i),spare_offs+i); } rt_mutex_release(&nand); return result; }
static rt_err_t nand_mtd_erase_block( struct rt_mtd_nand_device* device, rt_uint32_t block) { rt_err_t result=RT_EOK; int i; rt_uint16_t data=0xffff; rt_uint32_t block_offs=block*32*512; rt_uint32_t spare_offs = NOR_SPARE_BLOCK+block*32; rt_mutex_take(&nand, RT_WAITING_FOREVER); //erase block offs , len=one block size /2 , 16bit wr for(i=0;i<(32*512)/2;i++) Mem_Wr(data,block_offs+i); //erase spare offs, len=one block spare size /2 , 16bit wr for(i=0;i<(32*16)/2;i++) Mem_Wr(data,spare_offs+i); rt_mutex_release(&nand); return result; }
//#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_mark_bad_block( struct rt_mtd_nand_device* device, rt_uint32_t block) { rt_err_t result=RT_EOK; rt_uint16_t data=0xff00; rt_uint32_t spare_offs = NOR_SPARE_BLOCK+block*32; rt_mutex_take(&nand, RT_WAITING_FOREVER); //write spare_offs to 0xff00 Mem_Wr(data,spare_offs); rt_mutex_release(&nand); return result; }