/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : app.c
 * Description : app source file
 * Author(s)   : Mason
 * version     : V1.0
 * Modify date : 2022-08-04
 ***********************************************************************/
#include  "system_um321xF.h"
#include  "app.h"
#include  "config.h"
#include  "common.h"
#include  "uart0.h"
#include  "uart1.h"
#include  "uart2.h"
#include  "flash.h"

#ifdef UART0_COMM
uint8_t uart0_rx_flag = 0;
uint8_t uart0_rx_buf[64];
uint8_t uart0_rx_count = 0;
#endif

#ifdef UART1_COMM
uint8_t uart1_rx_flag = 0;
uint8_t uart1_rx_buf[64];
uint8_t uart1_rx_count = 0;
#endif

#ifdef UART2_COMM
uint8_t uart2_rx_flag = 0;
uint8_t uart2_rx_buf[64];
uint8_t uart2_rx_count = 0;
#endif

#ifdef UART0_COMM
/************************************************************************
 * Function     : uart0_rec_pro
 * Description  : uart0 rec pro 串口接收处理回调函数
 * Input        : none
 * Output		: none
 * Return       : none
 ************************************************************************/
void uart0_rec_pro(void)
{
	uart0_rx_buf[uart0_rx_count] = uart0_recv_byte();
	uart0_rx_count++;
	uart0_rx_flag = 1;	
}
#endif

#ifdef UART1_COMM
/************************************************************************
 * Function     : uart1_rec_pro
 * Description  : uart1 rec pro 串口接收处理回调函数
 * Input        : none
 * Output		: none
 * Return       : none
 ************************************************************************/
void uart1_rec_pro(void)
{
	uart1_rx_buf[uart1_rx_count] = uart1_recv_byte();
	uart1_rx_count++;
	uart1_rx_flag = 1;	
}
#endif

#ifdef UART2_COMM
/************************************************************************
 * Function     : uart2_rec_pro
 * Description  : uart2 rec pro 串口接收处理回调函数
 * Input        : none
 * Output		: none
 * Return       : none
 ************************************************************************/
void uart2_rec_pro(void)
{
	uart2_rx_buf[uart2_rx_count] = uart2_recv_byte();
	uart2_rx_count++;
	uart2_rx_flag = 1;	
}
#endif

/************************************************************************
 * Function     : uart_init
 * Description  : uart_init 串口初始化
 * Input        : none
 * Output		: none
 * Return       : none
 ************************************************************************/
void uart_init(void)
{
#ifdef  UART0_COMM     
	uart0_rx_flag = 0;
	uart0_init(PCLK, UART0_BAUD_RATE);
	uart0_irq_init(UART0_IRQ_ENABLE, uart0_rec_pro);
#endif

#ifdef  UART1_COMM	
	uart1_rx_flag = 0;	
	uart1_init(PCLK, UART1_BAUD_RATE);
	uart1_irq_init(UART1_IRQ_ENABLE, uart1_rec_pro);
#endif

#ifdef  UART2_COMM    
    uart2_rx_flag = 0;	
	uart2_init(PCLK, UART2_BAUD_RATE);
	uart2_irq_init(UART2_IRQ_ENABLE, uart2_rec_pro);
#endif
}

/************************************************************************
 * Function     : eflash_sn_test
 * Description  : eflash sn test 
 * Input        : none
 * Output		: none
 * Return       : none
 ************************************************************************/
void eflash_sn_test(void)
{
	uint8_t chip_sn[16];
	uint8_t chip_UID[8];
	uint32_t temp=0;
	
	printfS("--------read chip sn for 16 bytes-------\n");
	temp = read_sequence(chip_sn);   
	if(temp) printfS("SN CRC fail\n");
	printfS("SN(16bytes): \n");
	printfB8(chip_sn,16);
	printfS("--------end-------\n\n");

	
	printfS("--------read chip UID for 8 bytes-------\n");
	temp = read_UID(chip_UID);
	if(temp) printfS("SN CRC fail\n");
	printfS("UID(8bytes): \n");
	printfB8(chip_UID,8);
	printfS("--------end-------\n\n");

}

/************************************************************************
 * function   : eflash_test
 * Description: eflash test
 * input : none
 * return: none
 ************************************************************************/
void eflash_test(void)
{	
	uint32_t readdata;
	
	printfS("um321x run at %dHz\r\n", SystemCoreClock);
	eflash_init(SystemCoreClock);
		
	if(eflash_erase_page(EFlashMainBaseAddr+0x8200))
	{
		printfS("Flash erase addr 0x8200 successful \r\n");
	}
	else
	{
		printfS("Flash erase addr 0x8200 fail  \r\n");
	}	
	if(eflash_write_word(EFlashMainBaseAddr+0x8200,0xaabbccdd))
	{
		printfS("Flash write addr 0x8200 successful \r\n");
	}
	else
	{
		printfS("Flash write addr 0x8200 fail  \r\n");
	}
	
	readdata = eflash_read_word(EFlashMainBaseAddr+0x8200);
	printfS("Flash read addr 0x8200 data is:0x%x  \r\n",readdata);
	
	
	//SN(16 Bytes or 8 Bytes)
	eflash_sn_test();

}

/************************************************************************
 * Function     : soc_test
 * Description  : soc test 
 * Input        : none
 * Output		: none
 * Return       : none
 ************************************************************************/
void soc_test(void)
{
	eflash_test(); 
}
