app_flash_program.c 6.46 KB
#include "os_config.h"

#include "c_def.h"
#include "debug.h"
#include "oem.h"

#include "fifo.h"


#if 1//def FLASH_PROGRAM_ENABLE

#include "regmap.h"

#include "hw_misc.h"
#include "hw_uart.h"
#include "hw_dma.h"

#include "FlashDev.h"

#include "app_uart.h"
//#include "app_main.h"
#include "interrupt.h"

#include "app_flash_program.h"

#include "hw_pll.h"

MYFILE *upgrade_fp;


U8 app_flash_program_read_data(U32 addr, U32 *buf, U32 byte_len)
{
	U32 tmp;
	U32 *pSrc;
	U8 ret = TRUE;

	pSrc = buf;
	
	DBG_Assert(addr >= FLASH_BASE_ADDR);

	ret = FlashDev.Read_Data(addr, (U32 *)pSrc, byte_len);

	return ret;
}

extern volatile I8 pre_freq;


U8 app_flash_program_user_data(U32 addr, U32 *buf, U32 byte_len) __attribute__ ((section (".internal_ram_1_text")));

U8 app_flash_program_user_data(U32 addr, U32 *buf, U32 byte_len)
{
#if 1
	//U32 i;
	U32 j;
	U32 size;
	U32 eraseAddr;
	U32 progAddr;
	U32 tmp;
	I16 tmp_pre_freq;
	U8 ret;
	//U8 freq_changed;


#if 1//ndef ALL_TEXT_LOAD
	vTaskSuspendAll(); 
	delayms(10);

	//TX_DISABLE;
	register int interrupt_save;
    interrupt_save = _interrupt_control(2);
#else
	vTaskSuspendAll(); 
	//UART_INT_DISABLE( UART2_INT_MASK );
	//UART_INT_DISABLE( UART_INT_MASK );
	register int interrupt_save;
    interrupt_save = _interrupt_control(1);
#endif


	//freq_changed = 0;

	//delayms(500);

#if 1
	DBG_FlashAssert(addr >= FLASH_BASE_ADDR);

	if (byte_len <= FLASH_BLOCK_SIZE)
	{
		eraseAddr = (addr - FLASH_BASE_ADDR);

		size = (byte_len + FLASH_SECTOR_SIZE - 1) / FLASH_SECTOR_SIZE;

		//erase
		for (j=0; j<size; j++)
		{
			FlashDev.Sector_Erase(eraseAddr);
			eraseAddr += FLASH_SECTOR_SIZE;
			//delayus(1);
		}
		delayms(10);
		asm("nop");

#if 0
		//erase verify
		progAddr = addr;
		for (j=0; j<size; j++)
		{
			ret = FlashDev.Erase_Verify(progAddr, FLASH_SECTOR_SIZE);
			progAddr += FLASH_SECTOR_SIZE;
			//delayus(1);
			if (!ret)
			{
				ret = FALSE;
				goto FLASH_PROGRAM_VERIFY_END;
				break;
			}
		}
#endif


		//program
		progAddr = addr;
		size = byte_len / FLASH_SECTOR_SIZE;
		for (j=0; j<size; j++)
		{
			ret = FlashDev.Sector_Write(progAddr, (U32 *)buf, FLASH_SECTOR_SIZE);
			progAddr += FLASH_SECTOR_SIZE;			
			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}
		delayms(10);

		tmp = byte_len - size*FLASH_SECTOR_SIZE;
		if (tmp)
		{
			ret = FlashDev.Sector_Write(progAddr, (U32 *)buf, tmp);
			//progAddr += FLASH_SECTOR_SIZE;

			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}

		delayms(10);

#if 1
		//program verify
		progAddr = addr;
		size = byte_len / FLASH_SECTOR_SIZE;
		for (j=0; j<size; j++)
		{
			ret = FlashDev.Write_Verify(progAddr, (U32 *)buf, FLASH_SECTOR_SIZE);
			progAddr += FLASH_SECTOR_SIZE; 
			
			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}

		tmp = byte_len - size*FLASH_SECTOR_SIZE;
		if (tmp)
		{
			ret = FlashDev.Write_Verify(progAddr, (U32 *)buf, tmp);
			//progAddr += FLASH_SECTOR_SIZE;
			
			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}
#endif
	}
	else
	{
		DBG_FlashAssert(FALSE);
	}

FLASH_PROGRAM_VERIFY_END:

#endif

#if 0
	if (freq_changed == TRUE)
	{
		misClockFreq_Set(tmp_pre_freq);
	}
#endif


#if 1//ndef ALL_TEXT_LOAD
	//TX_RESTORE;
	_interrupt_control(interrupt_save);
#else
	//UART_INT_ENABLE( UART2_INT_MASK );
	//UART_INT_ENABLE( UART_INT_MASK );
	_interrupt_control(interrupt_save);
#endif

#if 1
	if(!xTaskResumeAll())
   	{
    	taskYIELD ();
    }  
#endif


	return ret;
#endif
}

#ifdef BT_HCI_ENABLE
//extern volatile I8 pre_freq;

U8 _app_flash_program_user_data(U32 addr, U32 *buf, U32 byte_len) __attribute__ ((section (".internal_ram_1_text")));

U8 _app_flash_program_user_data(U32 addr, U32 *buf, U32 byte_len)
{
#if 1
//	U32 i;
	U32 j;
	U32 size;
	U32 eraseAddr;
	U32 progAddr;
	U32 tmp;
	I16 tmp_pre_freq;
	U8 ret;
	U8 freq_changed;

	TX_INTERRUPT_SAVE_AREA;

	freq_changed = 0;

#if 0
	//-----Program Flash must set freq below 72MHz
	if (pre_freq > FREQ_72MHZ)
	{
		freq_changed = TRUE;
		tmp_pre_freq = pre_freq;
		//misClockFreq_Set(FREQ_48MHZ);
		//misClockFreq_Set(FREQ_72MHZ);
	}
#endif

	//delayms(500);

#if 1
	DBG_FlashAssert(addr >= FLASH_BASE_ADDR);

	#ifdef OPTEK_LINK_ENABLE
	extern U8 optek_link_enable;
	if (optek_link_enable)
	{
		optek_link_set_master_sleep_time(3*200,1);
		delayms(75);
	}
	#endif

#if 1
	vTaskSuspendAll(); 
	//UART_INT_DISABLE( UART2_INT_MASK );
	UART_INT_DISABLE( UART_INT_MASK );
	register int interrupt_save;
    interrupt_save = _interrupt_control(1);
	delayus(10);
#else
	TX_DISABLE;
#endif
	if (byte_len <= FLASH_BLOCK_SIZE)
	{
		eraseAddr = (addr - FLASH_BASE_ADDR);

		size = (byte_len + FLASH_SECTOR_SIZE - 1) / FLASH_SECTOR_SIZE;

		//erase
		for (j=0; j<size; j++)
		{
			FlashDev.Sector_Erase(eraseAddr);
			eraseAddr += FLASH_SECTOR_SIZE;
			//delayus(1);
		}

		asm("nop");

#if 0
		//erase verify
		progAddr = addr;
		for (j=0; j<size; j++)
		{
			ret = FlashDev.Erase_Verify(progAddr, FLASH_SECTOR_SIZE);
			progAddr += FLASH_SECTOR_SIZE;
			//delayus(1);
			if (!ret)
			{
				ret = FALSE;
				goto FLASH_PROGRAM_VERIFY_END;
				break;
			}
		}
#endif


		//program
		progAddr = addr;
		size = byte_len / FLASH_SECTOR_SIZE;
		for (j=0; j<size; j++)
		{
			ret = FlashDev.Sector_Write(progAddr, (U32 *)buf, FLASH_SECTOR_SIZE);
			progAddr += FLASH_SECTOR_SIZE;			
			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}

		tmp = byte_len - size*FLASH_SECTOR_SIZE;
		if (tmp)
		{
			ret = FlashDev.Sector_Write(progAddr, (U32 *)buf, tmp);
			//progAddr += FLASH_SECTOR_SIZE;

			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}


#if 0
		//program verify
		progAddr = addr;
		size = byte_len / FLASH_SECTOR_SIZE;
		for (j=0; j<size; j++)
		{
			ret = FlashDev.Write_Verify(progAddr, (U32 *)buf, FLASH_SECTOR_SIZE);
			progAddr += FLASH_SECTOR_SIZE; 
			
			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}

		tmp = byte_len - size*FLASH_SECTOR_SIZE;
		if (tmp)
		{
			ret = FlashDev.Write_Verify(progAddr, (U32 *)buf, tmp);
			//progAddr += FLASH_SECTOR_SIZE;
			
			if (!ret)
			{
				asm("nop");
				goto FLASH_PROGRAM_VERIFY_END;
			}
		}
#endif
	}
	else
	{
		DBG_FlashAssert(FALSE);
	}

FLASH_PROGRAM_VERIFY_END:

#endif
#if 1
	//UART_INT_ENABLE( UART2_INT_MASK );
	UART_INT_ENABLE( UART_INT_MASK );
	_interrupt_control(interrupt_save);

#if 1
	if(!xTaskResumeAll())
   	{
    	taskYIELD ();
    }  
#endif

#else
#if 1//ndef ALL_TEXT_LOAD
	TX_RESTORE;
#endif
#endif
	return ret;
#endif
}
#endif



#endif //FLASH_PROGRAM_ENABLE