25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

1463 satır
34 KiB

/************************************************************************
* Copyright(c) 2023 Levetop Semiconductor Co.,Led. All rights reserved.
* @file    	main.c
* @author  	UartTFT Application Team
* @version  V1.0.0
* @date     2023-02-24
* @brief 	This file include main function.
*************************************************************************/
#include <stdio.h>
#include "sys.h"
#include "uart.h"
#include "delay.h"
#include "data.h"
#include "common.h"
#include "usb_const.h"
#include "string.h"
//#include "levetop.h"
#include "eflash_drv.h"
#include "cache_drv.h"
#include "spi_drv.h"
#include "eport_drv.h"
#include "ccm_drv.h"
#include "LT768_Lib.h"
#include "ioctrl_drv.h"
#include "pit32_drv.h"
#include "pwm.h"
#include "pit.h"
#include "dac.h"
#include "flash.h"
//#include "bsp.h"
#include "ctp.h"
#include "rtp.h"
#include "math.h"
#include "iomacros.h"
#include "wdt_drv.h"
#include "usb_drv.h"
#include "usb_const.h"
#include "UI_H.h"
#include "OTA_H.h"
#include "meg.h"
#include "CRC.h"
#include "cpm_drv.h"
#include "Updata.h"
#include "flash.h"
#include "LT768_Lib.h"
#include "Uart_Vcom.h"
#include "OTA_H.h"
extern unsigned int gBaudrate;
extern void my_APP(u32 appxaddr);
uint8_t  hid_rec_index;
/******************my debug**************************/
unsigned char ota_lt7689_flag = 0;
unsigned char ota_lt7689_flag1 = 0;
unsigned char ota_lt7689_flag2 = 0;
unsigned char ota_lt7689_buf1[512];
unsigned char ota_lt7689_buf2[512];
unsigned int  ota_lt7689_length1 =0;
unsigned int  ota_lt7689_length2 =0;
unsigned int  ota_address = 0;
#define LT_APP  0x08010000
#define LT_APP2 0x8049000
unsigned int 	ota_offset = 0;
/********************************************/
static void Printf_Version(void)
{
	printf("/**************************************************/\n");
	printf(" date = %s,time = %s    \r\n", (char *)__DATE__, (char *)__TIME__);
	printf(" LT7689_LoadDown_Uart_V1.01  \r\n");
	printf(" system clk = %dMHz         \r\n", g_sys_clk / 1000000);
	printf(" ips clk    = %dMHz         \r\n", g_ips_clk / 1000000);
	printf("/**************************************************/\n");
}
extern UINT8 hid_rx_buf[512];
/******************bootloader****************************/
char showbuff[9];
void display_manu(u8 sd_ok)
{
		//提供 5M晶振
		PWM_OutputInit(PWM_PORT1,2,PWM_CLK_DIV_1,4,2,0);     //更改了库函数,根据实际设定打开PWM,作用提供LT768的晶振
							
		Parallel_Init();
		LT768_Init(); 
		
#if MCU_SPI		
		*(volatile unsigned char*)(0x40019000+0x03) |= (1<<(6));				//EPORT_ConfigGpio(EPORT_PIN6,GPIO_OUTPUT);EPORT6和LT768——TEST1连接
		*(volatile unsigned char*)(0x40019000+0x05) |= (1<<(6));				//EPORT_WriteGpioData(EPORT_PIN6,Bit_SET);
		MUC_SS_flag = 1;  //先SPI1.SS;
		SPI1_Flash_Init();
#if UartTFT_Flash_0
		MUC_CS0_OUTPUT
		MUC_CS0_SET
#endif	
		
#else 
		*(volatile unsigned char*)(0x40019000+0x03) |= (1<<(6));			//EPORT_ConfigGpio(EPORT_PIN6,GPIO_OUTPUT);EPORT6和LT768——TEST1连接
		*(volatile unsigned char*)(0x40019000+0x05) &= ~(1<<(6));			//EPORT_WriteGpioData(EPORT_PIN6,Bit_RESET);
		Close_SPI1();
		LT768_SPI_Init(1,1);    //先设定LT768的CS1
	
#endif	
		Main_Image_Start_Address(0);				
		Main_Image_Width(LCD_XSIZE_TFT);
		Main_Window_Start_XY(0,0);
		Canvas_Image_Start_address(0);
		Canvas_image_width(LCD_XSIZE_TFT);
		Active_Window_XY(0,0);
		Active_Window_WH(LCD_XSIZE_TFT,LCD_YSIZE_TFT);
		
		if(sd_ok)					LT768_DrawSquare_Fill(0,0,LCD_XSIZE_TFT-1,LCD_YSIZE_TFT-1,Back_color);
		else								LT768_DrawSquare_Fill(0,0,LCD_XSIZE_TFT-1,LCD_YSIZE_TFT-1,Blue2);
		LT768_Select_Internal_Font_Init(24,1,1,0,0);
		LT768_PWM1_Init(1,0,5,800,400);
		
		Display_ON();            // 开启显示
}
char  Flash_find(void)
{
		
		Flash_ID = W25QXX_ReadID();Flash_type = 0;
		if(Flash_ID == 0xef13) {strcpy(showbuff,"W25Q80");} 
		else if(Flash_ID == 0xef14)	{strcpy(showbuff,"W25Q16");} 
		else if(Flash_ID == 0xef15)	{strcpy(showbuff,"W25Q32");} 
		else if(Flash_ID == 0xef16)	{strcpy(showbuff,"W25Q64");} 
		else if(Flash_ID == 0xef17)	{strcpy(showbuff,"W25Q128");} 
		else if(Flash_ID == 0x5e17)	{strcpy(showbuff,"ZB25VQ128");} 
		else if(Flash_ID == 0xef18)	{strcpy(showbuff,"W25Q256");W25Q256 = 1;W25QXX_Enter_4Byte_AddressMode();} 
		else
		{
			Flash_ID = W25N01GV_ReadID();
	//		printf("%x \r\n",Flash_ID);
			if(Flash_ID == 0xefaa21){ Flash_type = 1;strcpy(showbuff,"W25N01GV");} 
			else 					{ Flash_type = 2;strcpy(showbuff,"No Flash");}
		}
	//	printf("%x \r\n",Flash_ID);
		LT768_DrawSquare_Fill(10,LINE0,300,LINE0+L_OFFSET,Back_color);
		LT768_Print_Internal_Font_String(10  ,LINE0,Black,White,"Flash Model:");
//		LT768_Print_Internal_Font_String(144,LINE0,File_name_color,White,showbuff);	
		
		if(Flash_type == 2)
		{
			LT768_Print_Internal_Font_String(164,LINE0,Warm_color,White,showbuff);	
			return 1;
		}
		else
		{
			LT768_Print_Internal_Font_String(164,LINE0,Black,White,showbuff);	
			return 0;
		}
}
typedef  void (*iapfun)(void);
iapfun jump2app; 
void APP(u32 appxaddr)
{
//		printf("***enter app()***\r\n");
//		Disable_Interrupts;
//		__set_PRIMASK(1);
	
		jump2app = (iapfun)*(vu32*)(appxaddr + 4);
		
		MSR_MSP(*(vu32*)appxaddr);
//		printf("***ready jumpapp()***\r\n");
//		DCACHE_Init(cacheOff, cacheOff, cacheOff, cacheOff);
//		ICACHE_Init(cacheOff, cacheOff, cacheOff, cacheOff);
//		WDT_FeedDog();
		DelayMS(10);
//		printf("***ready jumpapp()***\r\n");
		jump2app();						
//		printf("***ready jumpapp() fail\r\n");
//		Enable_Interrupts
}
void SCI1_Init(uint32_t pclk, uint32_t bound,uint8_t parity)	
{
			u32 band_rate=0;
			SCI1->SCIBRDF=(((pclk*8/bound)+1)/2)&0x003f;
			band_rate =(pclk*4/bound)>>6;
			SCI1->SCIBDH=(u8)((band_rate>>8)&0x00ff);
			SCI1->SCIBDL=(u8)(band_rate&0x00ff);
			SCI1->SCICR2 |= (1<<2)|(1<<3)|(1<<5);// |(1 << 4)
			NVIC_Init(1, 1, SCI1_IRQn, 2);
}
void SCI2_Init(uint32_t pclk, uint32_t bound,uint8_t parity)	
{
			u32 band_rate=0;
			SCI2->SCIBRDF=(((pclk*8/bound)+1)/2)&0x003f;
			band_rate =(pclk*4/bound)>>6;
			SCI2->SCIBDH=(u8)((band_rate>>8)&0x00ff);
			SCI2->SCIBDL=(u8)(band_rate&0x00ff);
			SCI2->SCICR2 |= (1<<2)|(1<<3)|(1<<5);
			NVIC_Init(0, 0, SCI2_IRQn, 2);
}
void SCI3_Init(uint32_t pclk, uint32_t bound,uint8_t parity)	
{
			u32 band_rate=0;
			SCI3->SCIBRDF=(((pclk*8/bound)+1)/2)&0x003f;
			band_rate =(pclk*4/bound)>>6;
			SCI3->SCIBDH=(u8)((band_rate>>8)&0x00ff);
			SCI3->SCIBDL=(u8)(band_rate&0x00ff);
			SCI3->SCICR2 |= (1<<2)|(1<<3)|(1<<5);//|(1 << 4)
			NVIC_Init(0, 0, SCI3_IRQn, 2);
}
int fputc(int ch, FILE *f)
{
	while ((SCI1->SCISR1 & 0x40) == 0x00)
	{
	};
	SCI1->SCIDRL = (uint8_t)ch; //SCI1->SCIDRL = (uint8_t)data;
	
//	while ((SCI2->SCISR1 & 0x40) == 0x00)
//	{
//	};
//	SCI2->SCIDRL = (uint8_t)ch; //SCI1->SCIDRL = (uint8_t)data;
	return ch;
}
void SCI2_IRQHandler(void)
{
//	uint8_t ch = 0;
	if ((SCI2->SCISR1 & 0x20) == 0x20)
	{
//		ch = SCI2->SCIDRL;
//		if (Rx_Count_long > 4096 + 2)
//			Rx_Count_long = 0;
//		Rx_Buffer_long[Rx_Count_long++ % RX_SIZE] = ch;
//		Rx_Num++;
//		mcu_buf[mcu_buf_length] = ch ;
//		mcu_buf_length ++ ;
		
		
	}
		if((SCI2->SCISR1 & 0x10) == 0x10) //空闲中断
	{
			//清除标志位
				uint8_t clear_idle_flag;
				clear_idle_flag	=	SCI2->SCIDRL;
				clear_idle_flag	= SCI2->SCISR1;
//				uart1_idle_flag = 1;		
	}
}
#if 0
void SCI1_IRQHandler(void)
{
//	u8 cjc=0;
	WDT_FeedDog();
	if((SCI1->SCISR1 & 0x20)== 0x20)
	{
//		cjc = SCI1->SCIDRL;
//		LT_SingleByteToPc_uart3(cjc);
//		uart_buf[uart_rx_number++] = SCI1->SCIDRL;
//			if(ota_lt7689_flag1==0)
//			{
				ota_lt7689_buf1[ota_lt7689_length1++]=SCI1->SCIDRL;
//			}
//			else if(ota_lt7689_flag2==0)
//			{
//				ota_lt7689_buf2[ota_lt7689_length++]=SCI1->SCIDRL;
//			}
//			printf("%x ",ota_lt7689_buf[ota_lt7689_length]);
//			ota_lt7689_length++;
//			ota_offset++;
			
//				if(uart_rx_number>(4096+512))
//							uart_rx_number =0 ;
//				PIT1_reload();
	}
	
		if((SCI1->SCISR1 & 0x10) == 0x10) //空闲中断
	{
			//清除标志位
				uint8_t clear_idle_flag;
	
				
		
				clear_idle_flag	=	SCI1->SCIDRL;
				clear_idle_flag	= SCI1->SCISR1;
				ota_lt7689_flag = 1;
				
	}
	
}
#endif
extern unsigned char app_flag;
/******************************************************************/
extern uint8_t Rx_Buffer_short[512] ;
extern uint8_t Rx_Buffer1_short[512] ;
extern uint16_t Rx_Count_short ;
unsigned int number1 =0;
unsigned int number =0;
//unsigned int time = 0;
extern unsigned char ui_buf[2050];
extern  unsigned int ui_offset;
unsigned int offset=0;
extern unsigned short block ;
extern unsigned int page ;
extern unsigned int ui_addr;
extern unsigned char last_flag;
extern unsigned char dma_flag;
//unsigned char flash[2050] = {0};
unsigned char write_eflash =0;
unsigned char send_wifi_one = 1;
unsigned char ota_check[300];
unsigned int ota_check_len = 0;
unsigned char rev_check_number =0;
unsigned char wri_check_number =0;
int main(void)
{
	NVIC_SetVectorTable(0x800A000, 0);//0x800A000 0x8010000
//		NVIC_SetVectorTable(0x800F800, 0);
	Sys_Init();
	Enable_Interrupts;
	SCI1_Init(g_ips_clk,115200 ,0);	//115200 921600
//	SCI2_Init(g_ips_clk, 115200,0);	
	SCI3_Init(g_ips_clk,38400 ,0);
	/********************升级*******************/
//	ota_address = LT_APP;
	Make_CRC32_Table();
	ota_address = APP_ADDR;//0x8049000;//0x08010000; APP2_ADDR APP_ADDR
	printf("***bootloader2!!**\r\n");
//	SCI3_DMA_Init(g_ips_clk,38400);
//SCI3_DMA_Init(g_ips_clk,921600);//921600 38400
#if 0	
	while(1)
	{
			WDT_FeedDog();
			printf("***bootloader3***\r\n");
			printf("***Sd_card_exist=%d***\r\n",Sd_card_exist);
		printf("***CPM_PADWKINTCR=%d***\r\n",CPM->CPM_PADWKINTCR);
		printf("***CPM_PADWKINTCR&=%d***\r\n",CPM->CPM_PADWKINTCR&0x02000000);
	//通过检测wake up脚电平来判断SD card 是否有插入 
	if((CPM->CPM_PADWKINTCR&0x02000000)==0)   //0:有插入
	{
		printf("enter if 1\r\n");
		Sd_card_exist = 1;
//		CPM->CPM_PADWKINTCR |= 0x02;
	}
//	else if((CPM->CPM_PADWKINTCR&0x02000000)==0)   //0:有插入
//	{
//		printf("enter if 2\r\n");
//		Sd_card_exist = 1;
////		CPM->CPM_PADWKINTCR |= 0x02;
//	}
	DelayMS(1000*3);
	Sd_card_exist = 1;
	printf("***Sd_card_exist=%d***\r\n",Sd_card_exist);
	if(Sd_card_exist)
	{
		printf("Sd_card_exist!\r\n");
		printf("Sd_card_exist!\r\n");
		display_manu(1);
		
		signed char res = 0;		
		LT768_Print_Internal_Font_String(10,LINE1,File_name_color,White,"1: UartTFT-II_Flash.bin");
	
		LT768_Print_Internal_Font_String(10,LINE2,File_name_color,White,"2: MCU_Code.bin");
		LT768_Print_Internal_Font_String(310,LINE0,File_name_color,White,"V2.00");
#if UartTFT_Flash_0
		LT768_Print_Internal_Font_String(0,LINE4,File_name_color,White,"3: UartTFT_Flash_0.bin");
#endif
		
//		if(Flash_find()==0)  //识别出了Flash 才操作
//		{
//			printf("***find flash****\r\n");
//			res = Flash_Updata("0:/UartTFT_Flash/UartTFT-II_Flash.bin",1);
//			if(res==FR_NO_FILE||res==FR_NO_PATH)	res = Flash_Updata("0:/UartTFT_Flash_No_CRC/UartTFT-II_Flash.bin",2);
//			if(res == 0) //UartTFT-II_Flash OK
//			{
//				LT768_Print_Internal_Font_String(370,LINE1,OK_color,White,"OK");
//				LT768_Print_Internal_Font_String(310,LINE1,Progress_color,White,"100%");
//				Download_flag++;
//			}
//			else if(res>=1 && res <=19) //FatFs 故障
//			{
//				strcpy(showbuff,"None.");
//				sprintf(&showbuff[5],"%d",res);
//				LT768_Print_Internal_Font_String(310,LINE1,None_color,White,showbuff);
//			}
//			else if(res == -1) //CRC 错误
//			{
//				LT768_Print_Internal_Font_String(370,LINE1,NG_color,White,"NG");
//				LT768_Print_Internal_Font_String(46 ,LINE5,Black,White,"NG: CRC error");
//				LT768_Print_Internal_Font_String(10 ,LINE4,Black,White,"Result:");
//				LT768_Print_Internal_Font_String(96,LINE4,Red,White,"Failed");
//				while(1) WDT_FeedDog();
//			}
//			else if(res == -2)  //BBM 错误
//			{
//				LT768_Print_Internal_Font_String(370,LINE1,NG_color,White,"NG");
//				LT768_Print_Internal_Font_String(46 ,LINE5,Black,White,"NG: BBM error");
//				LT768_Print_Internal_Font_String(10 ,LINE4,Black,White,"Result:");
//				LT768_Print_Internal_Font_String(96,LINE4,Red,White,"Failed");
//				while(1) WDT_FeedDog();
//			}
//			printf("******res = %d \r\n",res);
//		}
//		else
//		{
//			LT768_Print_Internal_Font_String(10 ,LINE6,Black,White,"Result:");
//			LT768_Print_Internal_Font_String(96,LINE6,Red,White,"Fail");
//			printf("***enter esle****\r\n");
//			while(1) WDT_FeedDog();
//		}
		
#if UartTFT_Flash_0	
		
#if MCU_SPI 
#else
#endif
#endif
		printf("next APP_Updata!!!! \r\n");
		res = APP_Updata("0:/MCU_Code/MCU_Code1.bin");		
		
		if(res == 0) //UserInfo OK
		{
			LT768_Print_Internal_Font_String(370,LINE2,OK_color,White,"OK");
			LT768_Print_Internal_Font_String(310,LINE2,Progress_color,White,"100%");
			Download_flag++;
		}
		else if(res>=1 && res <=19) //FatFs 故障
		{
			strcpy(showbuff,"None.");
			sprintf(&showbuff[5],"%d",res);
			LT768_Print_Internal_Font_String(370,LINE2,None_color,White,showbuff);
		}
		else if(res == -1) //CRC 错误
		{
			LT768_Print_Internal_Font_String(370,LINE2,NG_color,White,"NG");
			LT768_Print_Internal_Font_String(46 ,LINE5,Black,White,"NG: CRC error");
			LT768_Print_Internal_Font_String(10 ,LINE4,Black,White,"Result:");
			LT768_Print_Internal_Font_String(96,LINE4,Red,White,"Failed");
			while(1) WDT_FeedDog();
		}
		if(Download_flag == 0)
		{
			LT768_Print_Internal_Font_String(10 ,LINE4,Black,White,"Result:");
			LT768_Print_Internal_Font_String(96,LINE4,Red,White,"Failed");
		}
		else
		{
			LT768_Print_Internal_Font_String(10 ,LINE4,Black,White,"Result:");
			LT768_Print_Internal_Font_String(96,LINE4,OK_color,White,"OK");
		}
		if(LCD_XSIZE_TFT >= 800)
		{
			LT768_Print_Internal_Font_String(10,LINE5,Warm_color,White,"Remove the SD card to enter the main program");
		}
		else
		{
			LT768_Print_Internal_Font_String(10,LINE5,Warm_color,White,"Remove the SD card");
			LT768_Print_Internal_Font_String(10,LINE6,Warm_color,White,"  to enter the main program");
		}
		printf("res =%d  \r\n",res);
		while(1)
		{
			if((CPM->CPM_PADWKINTCR&0x02000000) != 0)   //0:有插入
			{
					printf("***ready enter app***\r\n");
				
					APP(APP_ADDR);
		//		CPM->CPM_PADWKINTCR |= 0x02;
			}
			WDT_FeedDog();
		}
	
				
		
	}	
}
#endif
	#if 0
	
	/********************************************/
	PIT2_Init(23438);
	WDT_Init(0x4786*2);	
//		APP(0x8000000);
	
//	Uart3_Init(g_ips_clk, 115200);
	
	/*
	uint8_t mcu_package_buf[30];
	uint8_t cmd  = 0x10 ; 
	uint16_t  adress = 0x0901 ; 
	uint16_t  data[3] =  {0x0020,0x0010,0x1314};
	uint8_t data_amount = 3;
	send_mcu_package( mcu_package_buf , //数据包地址
										 cmd , 		//指令码
										  adress , // 变量地址
										 data , 	// 数据 2字节
										 data_amount);	//数据个数
	
	*/
//		for(unsigned char i = 0 ; i < 20 ; i++)
//	printf("flash: %x\r\n",EFLASH_ByteRead(flh_sAddr1 + i));
//	SaveData();
//GetAdjdata();
//	for(unsigned char i = 0 ; i < 20 ; i++)
//	printf("flash: %x\r\n",EFLASH_ByteRead(flh_sAddr1 + i));
//	printf("flash%x \r\n",*((unsigned int *)0x0807D800));
//	SaveData();
//	GetAdjdata();
//	printf("flash%x \r\n",*((unsigned int *)0x0807D800));
//	printf("flash%x \r\n",*((unsigned char *)(0x0807D800)));
//	printf("flash%x \r\n",(*(volatile UINT8 *)(0x0807D800)));
	//(*(volatile UINT8 *)(addr))
//	EFLASH_PageErase(0x0807D800);
//	printf("flash%x \r\n",EFLASH_ByteRead(0807D800));
//					unsigned short test = 0x0064;
//					unsigned short * test_p = &test;
//					printf("test = %x\r\n",test);
//					printf("test0 = %x test1 = %x\r\n",*((unsigned char *)test_p),*(((unsigned char *)test_p)+1));
//					
//					unsigned char test_array[2];
//						test_array[0] = test ;
//						test_array[1] = *((unsigned char *)&test+1 );
//						printf("array0 = %x array1 = %x\r\n",test_array[0],test_array[1]);
//					unsigned short addr = 0x0040;
//					unsigned char data[4];
//					data[0] = var[2 * (addr + 0)];
//					data[1] = var[2 * (addr + 0) + 1];
//					data[2] = var[2 * (addr + 0) + 2];
//					data[3] = var[2 * (addr + 0) + 3];
//					printf("\r\n ***0:%d 1:%d 2:%d 3:%d*** \r\n",data[0],data[1],data[2],data[3]);
//					printf("\r\n ***var:%d *** \r\n",var[2 * (addr + 0)]);
//					data[1] = 100;
//					var[2 * (addr + 0)] = data[0];
//					var[2 * (addr + 0) + 1] =data[1];
//	printf("***APP-A***\r\n");
//	printf("ID=%x\r\n",(*(volatile UINT32 *)(0x20000000+0x37000)));
	
//	printf("EFLASH=%x\r\n",(EFLASH_WordRead(0x8009E00)));
	
	device_working_status_buff.wifi_status = 1;
	printf("wifi_status=%d\r\n",device_working_status_buff.wifi_status);
//0x8043A00
//	0x800A000		0x8043A00   180kB
//	SaveData();
	WDT_FeedDog();
//	printf("OK!!\r\n");
//	printf("\r\n*******after********\r\n");
//	EFLASH_Init(g_sys_clk / 1000);
//	EFLASH_SetWritePermission();
//	EFLASH_PageErase(0x08043A00);
//	EFLASH_ClrWritePermission();
//	GetAdjdata(0x08043A00);
//	NVIC_SetVectorTable(0x08043A00, 0);
//	PeripheralInit();
//	PIT2_Init(23438);
//	WDT_Init(0x4786*2);
//	printf("*****APP-2*****\r\n");
//	printf("***enter APP_B***\r\n");
//	my_APP(0x8043A00);
	while(1)
	{
		
		WDT_FeedDog(); //Clear watchdog
//	printf("*****APP-2!!*****\r\n");
#if !IIC_BUS
#if (UARTBUS_OPTION == 0)
		Main_From_UartRxBuff();
		if (gUsartRx.Flag)
		{
			LT_ReceiveCmd(gUsartRx.Buf);
		}
		if(UI_update == 1)
		{ 
			while(1)
			{
				WDT_FeedDog(); //Clear watchdog;
				Main_From_UartRxBuff();
				if (gUsartRx.Flag)
				LT_ReceiveCmd(gUsartRx.Buf);
				
				if(UI_update == 0) break;
			}
		}
#elif (UARTBUS_OPTION == 1)
		LT_ModBus_REG_Cmd();
#elif (UARTBUS_OPTION == 2)
		if (Sum_ModbusTX)
			Uart_cmd_Send();
		LT_ModBus_REG_Cmd();		
#elif (UARTBUS_OPTION == 3 || UARTBUS_OPTION == 4)
		
		Hid_Main_From_UartRxBuff();
		if (gHidRx.Flag)
			LT_Hid_ReceiveCmd(gHidRx.Buf);	
		if(UI_update == 1)
		{ 
			while(1)
			{
				WDT_FeedDog(); //Clear watchdog;
				Hid_Main_From_UartRxBuff();
				if (gHidRx.Flag)
					LT_Hid_ReceiveCmd(gHidRx.Buf);	
				
				if(UI_update == 0) break;
			}
		}
#else
#endif
#endif
#if IIC_BUS
		// Based on the IIC protocol, executes the functions of the registers
		LT_IIC_REG_Cmd();
#endif
		if (var[0x700e * 2 + 1])
			BackLight_control(); // Backlight control
		if (page_refreshing > 20)
		{
			page_refreshing = 0;
			Get_date_variable_Id_Regular_update(pic_id);
		}
		if(Count_reg_num > 0)
		{
			Count_reg_num--;
			reg_operation(Count_reg[Count_reg_num]);
		}
		if (gWavFlag == 1 || gWavType == 1)
			LT_PlayWav_DAC();
#if !IIC_BUS
		/*The current hardware that CTP and IIC slave use the same set of IOs
		If you use the IIC slave function, you need to block the touch function first*/
		gTpInfo.scan();
// 	打印触摸屏的坐标
//		printf("gTpInfo.x[0]=%d gTpInfo.y[0]=%d gTpInfo.x[1]=%d gTpInfo.y[1]=%d\r\n" 
//				,gTpInfo.x[0],gTpInfo.y[0],gTpInfo.x[1],gTpInfo.y[1]);
#endif
		
#if 1
		
		
		if(all_flag == 1)
		{
			all_flag = 0;
			debug_flag();		
		}
		
		if(status_flag ==1)
		{
			status_flag = 0;
			debug_status();
		}
		
#endif
#if 0		
		show_gif();				// gif
		show_Clock();	 		// Analog clock
		show_RTC();		 		// Digital clock
		scroll_text();	 		// Text scroll1
		Display_Curve(); 		// Curve
		show_Count();			// Time counter
#endif
		Check_Var_Count();
		Check_Pointer();
		
#if encoder_on
		if (gEncoderFlag)
			encoder();
#endif
		if (Ges_sc_flag)
			slide_screen();		// gesture_sliding
		if (Gesture_flag)
			Gesture_touch(); 	// gesture_no_sliding
		
		Basic_touch();			// Basic touch control
		Adj_touch();		// Variable adjustment
		slideMune();			// Slide menu
#if 0	
		
		Progress_bar_sliding();	// Sliding progress bar
		data_input();			// Data input
		RingSld_touch();		// Ring progress bar with touch
		Ascii_input();			// ASCII keyboard
		GBK_input();			// GBK keyboard
		VarKey_touch();			// Multivariable adjustment
		pop_up_touch();			// Pop-up window
#endif
		
		/**** Screen test ****/
//		if (scr_flag == 1 && scr_time > 100)
//		{
//			scr_time = 0;
//			Detection_screen(scr_flag) ;
//		}
//		else if (scr_flag == 2)
//		{
//			if (gTpInfo.sta) // press down
//			{
//				scr_key = 1;
//			}
//			if (gTpInfo.sta == 0 &&scr_key == 1)
//			{
//				scr_key = 0;
//				Detection_screen(scr_flag) ;
//			}
//		}
#if 0
		/****Keyboard cursor display****/
		if (Cusor_time > 60)
		{
			Cusor_time = 0;
			if (DioKb_flag == 1)
			{
				if (Screen_DIR == 0)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cx = cur_x + input_w;
					else
						cx = cur_x;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gDio_Info[Dio_num].zk_h;
				}
				else if (Screen_DIR == 1)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cy = cur_y + input_w;
					else
						cy = cur_y;
					cx = cur_x;
					w_temp = gDio_Info[Dio_num].zk_h;
					h_temp = cur_w;
				}
				else if (Screen_DIR == 2)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cx = cur_x - input_w;
					else
						cx = cur_x;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gDio_Info[Dio_num].zk_h;
				}
				else if (Screen_DIR == 3)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cy = cur_y - input_w;
					else
						cy = cur_y;
					cx = cur_x;
					w_temp = gDio_Info[Dio_num].zk_h;
					h_temp = cur_w;
				}
			}
			else if (AioKb_flag == 1)
			{
				if (Screen_DIR == 0)
				{
					cx = cur_x + input_w;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gAio_Info[Aio_num].zk_h;
				}
				else if (Screen_DIR == 1)
				{
					cy = cur_y + input_w;
					cx = cur_x;
					w_temp = gAio_Info[Aio_num].zk_w;
					h_temp = cur_w;
				}
				else if (Screen_DIR == 2)
				{
					cx = cur_x - input_w;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gAio_Info[Aio_num].zk_h;
				}
				else if (Screen_DIR == 3)
				{
					cy = cur_y - input_w;
					cx = cur_x;
					w_temp = gAio_Info[Aio_num].zk_h;
					h_temp = cur_w;
				}
			}
			else if (GBKioKb_flag == 1)
			{
				if (Screen_DIR == 0)
				{
					cx = cur_x + input_w;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gGBKio_Info[GBKio_num].zk_h;
				}
				else if (Screen_DIR == 1)
				{
					cy = cur_y + input_w;
					cx = cur_x;
					w_temp = gGBKio_Info[GBKio_num].zk_w;
					h_temp = cur_w;
				}
				else if (Screen_DIR == 2)
				{
					cx = cur_x - input_w;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gGBKio_Info[GBKio_num].zk_h;
				}
				else if (Screen_DIR == 3)
				{
					cy = cur_y - input_w;
					cx = cur_x;
					w_temp = gGBKio_Info[GBKio_num].zk_h;
					h_temp = cur_w;
				}
			}
			if (Cusor_sw == 0)
			{
				Cusor_sw++;
				LT768_BTE_Memory_Copy(MAIN_BUFF, LCD_XSIZE_TFT, cx, cy,
									  MAIN_BUFF, LCD_XSIZE_TFT, cx, cy,
									  Display_Layer, LCD_XSIZE_TFT, cx, cy,
									  0x0c, w_temp, h_temp);
			}
			else
			{
				Cusor_sw = 0;
				LT768_BTE_Memory_Copy(LAY_BUFF5, LCD_XSIZE_TFT, cur_x, cur_y,
									  LAY_BUFF5, LCD_XSIZE_TFT, cur_x, cur_y,
									  Display_Layer, LCD_XSIZE_TFT, cx, cy,
									  0x0c, w_temp, h_temp);
			}
		}
#endif
	}
	#endif
//		APP(APP_ADDR);
display_manu(0);	
printf(" date = %s,time = %s    \r\n", (char *)__DATE__, (char *)__TIME__);	
	while(1)
	{
		WDT_FeedDog();
//	printf("f:%d\r\n",ota_lt7689_flag);
	if(Run_Boot_ID ==0x12345678)	//Run_Boot_ID == 0x47210659 0x12345678 Run_Boot_ID ==0x12345678
	{	
			WDT_FeedDog();
					if(send_wifi_one==1)
					{
						send_wifi_one = 0;
							mes_length =0;
						ota_lt7689_flag = 0;
					printf("start updata\r\n");
					unsigned char length1=inf_wifi_ota_start(inf_wifi_buf, pkg_seq);
					send_meg_wifi(inf_wifi_buf, length1);
					}
		
		if(ota_lt7689_flag==1)
		{	
//			printf("ota_flag=%d\r\n",ota_lt7689_flag);
#if 0 //跳转程序
					if((wifi_buf[0]==0xA5)&&
						(wifi_buf[1]==0x5A)&&
						(wifi_buf[2]==0x08)&&
						(wifi_buf[3]==0x01)&&
						(wifi_buf[4]==0x00)&&
						(wifi_buf[5]==0x00)&&
						(wifi_buf[6]==0xFF)&&
						(wifi_buf[7]==0xFE)
					)
				{
						printf("enter APP_ADDR!\r\n");
						APP(APP_ADDR);
				}
				else if((wifi_buf[0]==0xA5)&&
								(wifi_buf[1]==0x5A)&&
								(wifi_buf[2]==0x08)&&
								(wifi_buf[3]==0x04)&&
								(wifi_buf[4]==0x90)&&
								(wifi_buf[5]==0x00)&&
								(wifi_buf[6]==0xFF)&&
								(wifi_buf[7]==0xFE)
								)
				{
					printf("enter APP2_ADDR!\r\n");
						APP(APP2_ADDR);
				}
					
#endif				
#if  0 //OTA BIN-core 初版
				ota_offset = Rx_Count_short;
//				printf("ota_address %x\r\n",ota_address);// 256		0x8010000
				printf("\r\n");
				printf("start:%x  length:%d \r\n",ota_address,Rx_Count_short);
				
				ota_lt7689(Rx_Buffer_short,Rx_Count_short,ota_address);
				
				
				printf("\r\n");
				ota_address += ota_offset;
				if(ota_offset<256)
				{
					printf("\r\n");
//					printf("end number:%d\r\n",number);
//					APP(APP_ADDR);
				}
				
				Rx_Count_short=0;
				ota_lt7689_flag=0;
#endif
			
				
				
				
#if 0 //OTA-UI-BIN 初版
					if((ui_addr%131072)==0)//128KB 擦除
					{
							W25N01GV_Erase_Block(block);
							printf("block=%d\r\n",block);
							block++;
					}
					for(offset=0;offset<Rx_Count_short;offset++)
					{
							ui_buf[offset+ui_offset]=Rx_Buffer_short[offset];
					}
					
					ui_offset+=Rx_Count_short;
					ui_addr+=Rx_Count_short;
					
					printf("addr=%x offset=%d \r\n",ui_addr,ui_offset);
					
					
					if((ui_offset%2048==0))
					{
						W25N01GV_WritePageAddr_Data(ui_buf,0,page,2048);
						printf("Write=%d\r\n",ui_offset);
						ui_offset = 0;
						printf("page=%d offset=%d\r\n",page,ui_offset);
						page++;
					}
					else if (last_flag == 1)
					{
						W25N01GV_WritePageAddr_Data(ui_buf,0,page,ui_offset);
						printf("Write=%d\r\n",ui_offset);
						ui_offset = 0;
						printf("page:%d offset:%d\r\n",page,ui_offset);
						page++;
						last_flag=0;
						printf("ui_addr=%x\r\n",ui_addr);
					}	
		
				Rx_Count_short=0;
				ota_lt7689_flag=0;
				
#endif
#if 0  //对比DMA
//			printf("ui_offset=%d\r\n",ui_offset);
			printf("\r\n**1**\r\n");
			
//		if(dma_flag==1)
//		{
//				printf("Rx_Buffer_short\r\n");
				for(unsigned short i = 0; i < Rx_Count_short ; i++) //Rx_Count_short ui_offset
				{
					printf(" %x",Rx_Buffer_short[i]);//Rx_Buffer_short[i] ui_buf[i]
//						printf(" %d",i);
				}		
//		}
//		else if (dma_flag==0)
//		{
//				printf("Rx_Buffer_short1\r\n");
//				for(unsigned short i = 0; i < Rx_Count_short ; i++) //Rx_Count_short ui_offset
//				{
//					printf(" %x",Rx_Buffer1_short[i]);//Rx_Buffer_short[i] ui_buf[i]
////						printf(" %d",i);
//				}				
//		}
				
//				ui_offset=0;
			printf("\r\n****\r\n");
				Rx_Count_short=0;
				ota_lt7689_flag=0;
#endif
		
//				printf("number=%d\r\n",number);
#if 1		//3-enhance //211	
	/*******************rev_status**********************/	
		
	// 判断校验码是否准确 
//	ota_analysis(wifi_buf,mes_length);
		printf("rev:%d check:%x\r\n",mes_length,CalCheckSum( (char *)wifi_buf, mes_length-1));
		
		if(wifi_buf[mes_length-1]!= CalCheckSum( (char *)wifi_buf, mes_length-1))
		{
				printf("%x check_erro %x\r\n",CalCheckSum( (char *)wifi_buf, mes_length-1),wifi_buf[mes_length-1]);
//				return 1;
//				inf_wifi_data_check_error( inf_wifi_buf,wifi_buf[3]);
		}
		if((wifi_buf[0]!=0xA5)&&(wifi_buf[1]!=0x5A)&&(wifi_buf[2]!=0x01))
		{
				printf("illegal_new!\r\n");
//				return 2;
		}
		
				
//				for(unsigned char i = 0 ; i < mes_length; i++)
//				{
//						printf(" %x",wifi_buf[i]);
//				}
//				printf("\r\n");
	//实现算法
		
		// 收到wifi-ota通知
		
		if((wifi_buf[4]==0x20)&&(wifi_buf[6]==0x01)&&(wifi_buf[7]==0x01))
		{
			
				pkg_seq = wifi_buf[3];
			
			//ACK
				
					unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
					
//					inf_wifi_buf[send_length] = CalCheckSum( (char *)inf_wifi_buf,send_length);
//					send_length++;
//					inf_wifi_buf_length = 0; // ACK
					mes_length =0;
					ota_lt7689_flag = 0;
					send_meg_wifi(inf_wifi_buf,send_length);
//					printf("ACK:");
//					for(unsigned char i = 0 ; i < send_length ; i++)
//					{
//						printf(" %x",inf_wifi_buf[i]);
//					}
//					printf("\r\n---\r\n");				
				
				//发送 通知wifi 开始发送固件
				DelayMS(30);//跳转Bootloader!!80
				unsigned char length=inf_wifi_ota_start(inf_wifi_buf, pkg_seq);
				
//				printf("inf:");
//					for(unsigned char i = 0 ; i < length ; i++)
//					{
//						printf(" %x",inf_wifi_buf[i]);
//					}
//					printf("\r\n---\r\n");
//				inf_wifi_buf_length = 0;
					mes_length =0;
					ota_lt7689_flag = 0;
				printf("start updata\r\n");
				
				send_meg_wifi(inf_wifi_buf, length);
		}
		
		else if ((wifi_buf[4]==0x20)&&(wifi_buf[6]==0x02)&&(wifi_buf[7]==0x01))//wifi 发送固件内容报文
		{
//					printf("%d %d\r\n",wifi_buf[8],wifi_buf[9]);
//					unsigned short updata_seq = 256*wifi_buf[8]+wifi_buf[9];//(wifi_buf[8] || (wifi_buf[9]<<8));
//					printf("0***%d %d\r\n",updata_seq,ota_seq);
					
//					updata_seq = wifi_buf[9] || (wifi_buf[8]<<8);
//					printf("1***%d %d\r\n",updata_seq,ota_seq);
					printf("***%d %d\r\n",ota_seq,256*wifi_buf[8]+wifi_buf[9]);
					if(ota_seq==(256*wifi_buf[8]+wifi_buf[9])) //wifi_buf[10] bin长度
					{
//							printf("%d bin:",wifi_buf[10]);
//							for(unsigned char i = 0 ; i < wifi_buf[10]; i++)
//							{
//									printf(" %x",wifi_buf[i+11]);
//							}
//							printf("\r\n");
							
							
						#if 1	 //bin文件
							//计算升级包信息  1.bin地址 2.bin长度 wifi_buf[10]bin长度 3.写入flash地址
							
							unsigned char * ota_buf_address = &wifi_buf[11];
							unsigned int ota_offset 				= wifi_buf[10];
							unsigned int ota_flash_addr 		= ota_address;
							unsigned short len 							=	wifi_buf[10];
							printf("len:%d addr:%x\r\n",ota_offset,ota_flash_addr);
							//写 flash
//							write_eflash = ota_lt7689(ota_buf_address,ota_offset,ota_flash_addr);
							ota_lt7689(ota_buf_address,ota_offset,ota_flash_addr);						
							//回读校验
							//EFLASH_WordsRead_8(UINT32 addr, UINT8 *des, UINT32 len)
							 		//校验写入的eflash
//								unsigned char ota_check[300];
//								unsigned int ota_check_len = 0;
								EFLASH_WordsRead_8(ota_address, ota_check, ota_offset);
							rev_check_number = CalCheckSum( ota_buf_address, len);
							wri_check_number =	CalCheckSum( ota_check, len);
							if(rev_check_number==wri_check_number)
							{
										printf("-ok\r\n");
							}
							else
							{
										printf("fail\r\n");
							}
							ota_address +=ota_offset;
												
							ota_seq++;
//							printf("write\r\n");
									//封装ACK
							pkg_seq = wifi_buf[3]; //包序号
							
							unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
									
	//					发送ACK
						
							mes_length =0;
							ota_lt7689_flag = 0;
							send_meg_wifi(inf_wifi_buf,send_length);	
							
							
							
							
				#endif 
					
					
					#if 0 //UI
					
					if((ui_addr%131072)==0)//128KB 擦除
					{
							W25N01GV_Erase_Block(block);
							printf("block=%d\r\n",block);
							block++;
					}
					for(offset=0;offset<Rx_Count_short;offset++)
					{
							ui_buf[offset+ui_offset]=Rx_Buffer_short[offset];
					}
					
					ui_offset+=Rx_Count_short;
					ui_addr+=Rx_Count_short;
					
					printf("addr=%x offset=%d \r\n",ui_addr,ui_offset);
					
					
					if((ui_offset%2048==0))
					{
						W25N01GV_WritePageAddr_Data(ui_buf,0,page,2048);
						printf("Write=%d\r\n",ui_offset);
						ui_offset = 0;
						printf("page=%d offset=%d\r\n",page,ui_offset);
						page++;
					}
					else if (last_flag == 1)
					{
						W25N01GV_WritePageAddr_Data(ui_buf,0,page,ui_offset);
						printf("Write=%d\r\n",ui_offset);
						ui_offset = 0;
						printf("page:%d offset:%d\r\n",page,ui_offset);
						page++;
						last_flag=0;
						printf("ui_addr=%x\r\n",ui_addr);
					}	
		
				Rx_Count_short=0;
				ota_lt7689_flag=0;					
					
					
					
					
					#endif
							
						
				 }
					//重复 相同序号的升级包
				 else 
				 {
						printf("***repeat!\r\n");
					 
						//封装ACK
				pkg_seq = wifi_buf[3]; //包序号
				
				unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
						
	//		发送ACK
			
				mes_length =0;
				ota_lt7689_flag = 0;
				send_meg_wifi(inf_wifi_buf,send_length);					 
				 }
				 
					
			
			
		}
		//wifi 发送固件完成
		else if ((wifi_buf[4]==0x20)&&(wifi_buf[6]==0x01)&&(wifi_buf[7]==0x02))
		{
				printf("OTA-finish\r\n");
						//封装ACK
				pkg_seq = wifi_buf[3]; //包序号
				
				unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
				
//				inf_wifi_buf[send_length] = CalCheckSum( (char *)inf_wifi_buf,send_length);
//				send_length++;	
				
	//		发送ACK
			
//				inf_wifi_buf_length = 0; // ACK
				mes_length =0;
				ota_lt7689_flag = 0;
				ota_seq = 0;
				printf("ota_seq=%d\r\n",ota_seq);
				send_meg_wifi(inf_wifi_buf,send_length);
					
			
	// mcu inform wifi 
			
			//封装 固件升级成功消息
			send_length =inf_wifi_finish( inf_wifi_buf , pkg_seq);
//			inf_wifi_buf_length = 0;
			//发送消息给wifi
			send_meg_wifi(inf_wifi_buf,send_length);
//				unsigned int tCRC = 0x21436587;
//				EFLASH_PageErase(0x8009E00);//测试:擦除Flash前将标志位清除
//				EFLASH_WordsProg(0x8009E00,&tCRC,1);	//测试:校准成功后将标志位写入0x21436587
//				EFLASH_ClrWritePermission();
				Run_Boot_ID=0x00000000;			
			
			
			// 跳转APP
				printf("turn to APP1!\r\n");
				APP(APP_ADDR); //APP_ADDR 0x8049000 APP2_ADDR 0x8049000
			
		}
		//wifi 请求失败
		else if ((wifi_buf[4]==0x20)&&(wifi_buf[6]==0x01)&&(wifi_buf[7]==0x02))
		{
				printf("OTA-request-fail\r\n");
						//封装ACK
				pkg_seq = wifi_buf[3]; //包序号
				
				unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
				
//				inf_wifi_buf[send_length] = CalCheckSum( (char *)inf_wifi_buf,send_length);
//				send_length++;	
				
	//		发送ACK
			
//				inf_wifi_buf_length = 0; // ACK
				mes_length =0;
				ota_lt7689_flag = 0;
				send_meg_wifi(inf_wifi_buf,send_length);
				
		}
		//wifi 超时
		else if ((wifi_buf[4]==0x20)&&(wifi_buf[6]==0x01)&&(wifi_buf[7]==0x02))
		{
				printf("OTA-timeout\r\n");
						//封装ACK
				pkg_seq = wifi_buf[3]; //包序号
				
				unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
				
//				inf_wifi_buf[send_length] = CalCheckSum( (char *)inf_wifi_buf,send_length);
//				send_length++;	
				
	//		发送ACK
			
//				inf_wifi_buf_length = 0; // ACK
				mes_length =0;
				ota_lt7689_flag = 0;
				send_meg_wifi(inf_wifi_buf,send_length);
				
		}
		
	//调试 app区域跳转
		#if 0
			else if  ((wifi_buf[4]==0x11)&&(wifi_buf[6]==0x11)&&(wifi_buf[7]==0x11))	
			{
				APP(APP_ADDR);
			
			}
			
			else if  ((wifi_buf[4]==0x22)&&(wifi_buf[6]==0x22)&&(wifi_buf[7]==0x22))	
			{
				APP(APP2_ADDR);
			
			}	
		#endif
		
		else
		{
			
			printf("other new!\r\n");
	//封装ACK
				
				pkg_seq = wifi_buf[3]; //包序号
				
				unsigned char send_length=inf_wifi_ack(inf_wifi_buf,pkg_seq);
				
//				inf_wifi_buf[send_length] = CalCheckSum( (char *)inf_wifi_buf,send_length);
//				send_length++;	
				
	//		发送ACK
			
//				inf_wifi_buf_length = 0; // ACK
				mes_length =0;
				ota_lt7689_flag = 0;
				send_meg_wifi(inf_wifi_buf,send_length);
				
		}
#endif
	
		}
	}
	
	
	else
	{
//	APP(APP_ADDR);
		APP(APP2_ADDR);
	}
		
		
		
		
		#if 0
		//程序跳转
		if(1)
		{
				APP();
		}
		else if()
		{
		
		
		}
		
		#endif
	}
}