Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
//#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);
}
Beispiel #4
0
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;
}