You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

450 lines
10 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 "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"
extern unsigned int gBaudrate;
uint8_t  hid_rec_index;
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");
}
void Check_version(void)
{
	uint8_t showbuff[10];
	if (encryption_key == 1)
	{
		LT768_Select_Internal_Font_Init(24,1,1,1,0);
		LT768_DrawSquare_Fill(0,0,LCD_XSIZE_TFT-1,LCD_YSIZE_TFT-1,Blue2) ;
		LT768_Print_Internal_Font_String(0,10,Red,White,"Illegal UI file");
		Display_ON();
		LT768_PWM1_Init(1, 0, 5, 800, 500);
		while(1) WDT_FeedDog(); //Clear watchdog;
	}
	
	if(UI_version < 1136 || UI_version >= 3000)
	{
		Flash_Read_UI(showbuff, 0x80 + 0x24, 7);
		LT768_Select_Internal_Font_Init(24,1,1,1,0);
		LT768_DrawSquare_Fill(0,0,LCD_XSIZE_TFT-1,LCD_YSIZE_TFT-1,Blue2) ;
		LT768_Print_Internal_Font_String(0,10,Red,White,"Firmware matching error");
		LT768_Print_Internal_Font_String(0,50,Black,White,"MCU_Code version : V2.300");
		LT768_Print_Internal_Font_String(0,90,Black,White,"UI_Editor-II version :");
		LT768_Print_Internal_Font_String(275,90,Black,White,showbuff);
		Display_ON();
		LT768_PWM1_Init(1, 0, 5, 800, 500);
		while(1) WDT_FeedDog(); //Clear watchdog;
	}
}
void PeripheralInit(void)
{
	/*system configuration,Obtain clock and other relevant parameters */
	Sys_Init();
	Enable_Interrupts;
#if DualFlash
	IOCTRL->SCI_CONTROL_REG &= 0x80FFFFFF;
	IOCTRL->SCI_CONTROL_REG |= (((u32)0x22) << 24); // Replace 4 IO ports with serial ports
#endif
	/****Encoder IO port initialization****/
#if encoder_on
	IOCTRL->SCI_CONTROL_REG &= 0x80FFFFFF;
	IOCTRL->SCI_CONTROL_REG |= (((u32)0x2A) << 24); // Replace 4 IO ports with serial ports
//	UART_ConfigGpio(SCI3, UART_TX, GPIO_INPUT);
	UART_ConfigGpio(SCI2, UART_RX, GPIO_INPUT);
	EPORT_ConfigGpio(EPORT_PIN2, GPIO_INPUT);
	EPORT_Init(EPORT_PIN2, FALLING_EDGE_INT);
#endif
	UART_ConfigGpio(SCI2, UART_TX, GPIO_OUTPUT);
	
	
	IOCTRL -> SPI_CONTROL_REG |= 0x03;		//drive capability 12mA
	
	#if XI_6M
	PWM_OutputInit(PWM_PORT1, 0, PWM_CLK_DIV_1, 11, 5, 0); // PWM analog 6M crystal oscillator
	#elif XI_5M
	PWM_OutputInit(PWM_PORT1, 2, PWM_CLK_DIV_1, 4, 2, 0); // PWM analog 5M crystal oscillator
	#endif
	
	
	Close_SPI1();
	EPORT_ConfigGpio(EPORT_PIN6, GPIO_OUTPUT);
	EPORT_WriteGpioData(EPORT_PIN6, Bit_RESET);
	SCI1_Init(g_ips_clk, 115200,0);	
	
	
	PIT1_Init();					  // Timer initialization for dynamic display¡¤
	spi1_dma_control->DMA_CONFIG = 1; // turn on DMA1
	LT768_Init();					  // LT768 initialization
	
	Check_version();
	LT_definition_Init();
#if !IIC_BUS
	SCI1_Init(g_ips_clk, gBaudrate,parity_flag);	
#endif
#if IIC_BUS
	I2C_Slave_TEST(0x36); // Initialize IIC slave device addressz
#endif
	Printf_Version();		// For debugging
	LT_RtcInit();			
	Address_Index(); 		// Get address index
#if !IIC_BUS
	#if Touch_selection
		IOCTRL->SCI_CONTROL_REG &= 0x80FFFFFF;
		IOCTRL->SCI_CONTROL_REG |= (((u32)0x22) << 24); // Replace 4 IO ports with serial ports
		LT_TpInit();
	#endif
#endif
	Display_ON();
	
	if (Start_page > addr_index[7])
		Display_page(0);
	else
		Display_page(Start_page);
#if !IIC_BUS
	#if !Touch_selection
		CTP_Init();
	#endif 
	
	#if Touch_selection
		DelayMS(20);
	#endif
#endif
	
LT768_PWM1_Init(1, 0, 5, 800, gDutyBuf[var[0x7001 * 2 + 1]]);
	
#if (UARTBUS_OPTION == 2)
	Get_ModBus_CMD_info();
#elif (UARTBUS_OPTION == 3)
	USB_HID_Init();
	
#elif (UARTBUS_OPTION == 4)
	USB_CDC_Init();
#endif	
}
extern UINT8 hid_rx_buf[512];
int main(void)
{
	uint16_t cx, cy;
	uint8_t w_temp, h_temp;
	NVIC_SetVectorTable(0x800A000, 0);
	PeripheralInit();
//	PIT2_Init(23438);//23437;
	WDT_Init(0x4786*2);	
//	printf("g_ips_clk=%d\r\n",g_ips_clk);//75M
	Uart_Init(g_ips_clk, 115200);
	SendData_SCI3(0x69);
	while (1)
	{
		
		WDT_FeedDog(); //Clear watchdog
//		SendData_SCI3(0x69);
//		SendData_SCI1(0x66);
//		printf("while(1)\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
		
		show_gif();				// gif
		show_Clock();	 		// Analog clock
		show_RTC();		 		// Digital clock
		scroll_text();	 		// Text scroll1
		Display_Curve(); 		// Curve
		show_Count();			// Time counter
		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
#if 1	
		
		Progress_bar_sliding();	// Sliding progress bar
		data_input();			// Data input
		slideMune();			// Slide menu
		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) ;
//			}
//		}
		
		/****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);
			}
		}
	}
}