
#ifndef	__ROM_FUNCTIONS_C
#define __ROM_FUNCTIONS_C

#include "..\inc\OPORA\opora.h"
#include "..\inc\ROM\RomFunctions.h"

//Функция для записи 32-разрядного слова по адресу address в ПЗУ
//Параметры address - адрес, с которого необходимо записывать данные в ПЗУ
//			value - значение, которое необходимо записать в ПЗУ
//Возвращаемое значение:	0 - нет ошибки, запись прошла успешно;
//							1 - запись не выполнена, произошла ошибка.
uint32_t WriteWordToROM(uint32_t address, uint32_t value)
{
	uint32_t	*ptr;
	uint32_t	tmp;
	
	ptr=(uint32_t*)(START_ADDR+(0x555<<2));
	*ptr=0xAAAAAAAA;

	ptr=(uint32_t*)(START_ADDR+(0x2AA<<2));
	*ptr=0x55555555;

	ptr=(uint32_t*)(START_ADDR+(0x555<<2));
	*ptr=0xA0A0A0A0;

	ptr=(uint32_t*)(START_ADDR+(address<<2));
	*ptr=value;

	tmp=*ptr;

	while(1)
	{
		if((tmp&0x80808080)!=(value&0x80808080))
		{
			if((tmp&0x20202020)==0x20202020)
			{
				tmp=*ptr;
				if((tmp&0x80808080)==(value&0x80808080))	break;
				else	return 1;
			}
		tmp=*ptr;		
		}
		else	break;
	}
	return 0;
}

//Функция для стирания сектора с номером NumSector в ПЗУ
//Параметры NumSector - номер стираемого сектора (от 0 до 3)
//Возвращаемое значение:	0 - нет ошибки, стирание выполнено;
//							1 - стирание не выполнено, произошла ошибка.
uint32_t EraseSectorToROM(uint32_t NumSector)
{
	uint32_t	*ptr;
	uint32_t	tmp1, tmp2;
//первый цикл	
	ptr=(uint32_t*)(START_ADDR+(0x555<<2));
	*ptr=0xAAAAAAAA;
//второй цикл
	ptr=(uint32_t*)(START_ADDR+(0x2AA<<2));
	*ptr=0x55555555;
//третий цикл
	ptr=(uint32_t*)(START_ADDR+(0x555<<2));
	*ptr=0x80808080;
//четвертый цикл
	ptr=(uint32_t*)(START_ADDR+(0x555<<2));
	*ptr=0xAAAAAAAA;
//пятый цикл
	ptr=(uint32_t*)(START_ADDR+(0x2AA<<2));
	*ptr=0x55555555;
//шестой цикл
	ptr=(uint32_t*)(START_ADDR+(NumSector<<18));
	*ptr=0x30303030;

	while(1)
	{	
		tmp1=*ptr;
		tmp2=*ptr;
		if(tmp1!=tmp2)
		{
			if((tmp2&0x20202020)==0x20202020)
			{
				tmp1=*ptr;
				tmp2=*ptr;
				if(tmp1==tmp2) break;
				else	return 1;
			}
		}
		else break;
	}
	return 0;
}

void EraseFullChipToROM(void)
{
	
}
//Функция для проверки записанных данных в ПЗУ
//Параметры address - адрес, с которого необходимо тестировать данные в ПЗУ
//			inv - флаг проверки инверсных значений в памяти ПЗУ
//Возвращаемое значение:	0 - данные в памяти отличаются от записанных
//							1 - все данные в памяти совпадают с записанными
uint32_t TestData(uint32_t address, uint32_t inv)
{
	uint32_t *ptr, tmp, data, res;
	
	ptr=(uint32_t*)address;

	PORTE->CLRTX=0x40;
	res=1;
		
	if(!inv)
	{
		for(tmp=0;tmp<0x40000;tmp++)
		{
			data=*ptr++;
			if(data!=tmp)
			{
				res=0;
				break;
			}
		}
	}
	else
	{
		for(tmp=0;tmp<0x40000;tmp++)
		{
			data=*ptr++;
			if(data!=(~tmp))
			{
				res=0;
				break;
			}
		}
	}

	PORTE->SETTX=0x40;
	return res;
}


#endif	//__ROM_FUNCTIONS_C

