CARPLAY版本整理
This commit is contained in:
759
MXC_A27-PCB4.5-270T/app/main_openvg.c
Normal file
759
MXC_A27-PCB4.5-270T/app/main_openvg.c
Normal file
@ -0,0 +1,759 @@
|
||||
|
||||
/**
|
||||
* @file main
|
||||
*
|
||||
*/
|
||||
|
||||
/*********************
|
||||
* INCLUDES
|
||||
*********************/
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
|
||||
#include "board.h"
|
||||
#include "chip.h"
|
||||
#include "animation.h"
|
||||
#include "sfud.h"
|
||||
#include "romfile.h"
|
||||
#include "updatefile.h"
|
||||
#include "sysinfo.h"
|
||||
#include "mmcsd_core.h"
|
||||
#include "ff_stdio.h"
|
||||
#ifdef WIFI_SUPPORT
|
||||
#include "carlink_ey.h"
|
||||
#include "carlink_ec.h"
|
||||
#include "ark_network.h"
|
||||
#endif
|
||||
#ifdef OTA_UPDATE_SUPPORT
|
||||
#include "ota_update.h"
|
||||
#endif
|
||||
#ifdef VG_ONLY
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
*********************/
|
||||
|
||||
/**********************
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC PROTOTYPES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
||||
/**********************
|
||||
* GLOBAL FUNCTIONS
|
||||
**********************/
|
||||
#define USB_DEV_PLUGED 0
|
||||
#define USB_DEV_UNPLUGED 1
|
||||
extern int usb_wait_stor_dev_pluged(uint32_t timeout);
|
||||
extern void hub_usb_dev_reset(void);
|
||||
|
||||
#pragma data_alignment=1024
|
||||
#define VG_HEAP_SIZE 0xa00000
|
||||
__no_init static uint8_t vgHeap[VG_HEAP_SIZE];
|
||||
extern int xm_vg_init (unsigned int heap_addr, unsigned int size);
|
||||
|
||||
/* define dummy function to avoid linker error */
|
||||
void SendTouchInputEvent(void *indata)
|
||||
{
|
||||
}
|
||||
|
||||
void SendTouchInputEventFromISR(void *indata)
|
||||
{
|
||||
}
|
||||
|
||||
void SendKeypadInputEvent(void *indata)
|
||||
{
|
||||
}
|
||||
|
||||
void SendKeypadInputEventFromISR(void *indata)
|
||||
{
|
||||
}
|
||||
#ifdef WIFI_SUPPORT
|
||||
#if WIFI_TEST
|
||||
//#define RELTECK_WIFI_AP_MODE
|
||||
|
||||
#include "FreeRTOS_Sockets.h"
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_DHCP.h"
|
||||
#include "carlink_ey.h"
|
||||
#include "carlink_ey_video.h"
|
||||
#include "iperf_task.h"
|
||||
#include "iot_wifi.h"
|
||||
#include "FreeRTOS_DHCP_Server.h"
|
||||
#ifdef RELTECK_WIFI_AP_MODE
|
||||
static const uint8_t ucIPAddress[4] = {192, 168, 13, 1};
|
||||
#else
|
||||
static const uint8_t ucIPAddress[4] = {192, 168, 13, 37};
|
||||
#endif
|
||||
static const uint8_t ucNetMask[4] = {255, 255, 255, 0};
|
||||
//static const uint8_t ucGatewayAddress[4] = {192, 168, 13, 1};
|
||||
static const uint8_t ucGatewayAddress[4] = {192, 168, 13, 1};
|
||||
static const uint8_t ucDNSServerAddress[4] = {8, 8, 8, 8};
|
||||
//static const uint8_t ucMACAddress[6] = {0x00, 0x0c, 0x29, 0x5d, 0x2e, 0x03};
|
||||
//static const uint8_t ucMACAddress[6] = {0x68, 0xb9, 0xd3, 0xc1, 0x28, 0x03};
|
||||
static const uint8_t ucMACAddress[6] = {0x30, 0x4a, 0x26, 0x78, 0xfd, 0x12};
|
||||
uint8_t wifi_data_buffer[65536] = {0};
|
||||
void ark_test_h264_dec();
|
||||
|
||||
struct test_header
|
||||
{
|
||||
uint16_t id;
|
||||
uint16_t payload_len;
|
||||
};
|
||||
#if 0
|
||||
static int vCreateTCPServerSocket( void )
|
||||
{
|
||||
SocketSet_t xFD_Set;
|
||||
struct freertos_sockaddr xAddress, xRemoteAddr;
|
||||
Socket_t xSockets = FREERTOS_INVALID_SOCKET, xClientSocket = FREERTOS_INVALID_SOCKET;
|
||||
socklen_t xClientLength = sizeof( xAddress );
|
||||
static const TickType_t xNoTimeOut = portMAX_DELAY;
|
||||
|
||||
BaseType_t ret = -1;
|
||||
BaseType_t xResult;
|
||||
struct test_header header;
|
||||
uint8_t header_buf[4];
|
||||
uint8_t* header_buf_ptr;
|
||||
const int header_len = sizeof(struct test_header);
|
||||
int header_buf_len = 0;
|
||||
uint8_t *h264SrcBuf = NULL;
|
||||
uint8_t *h264SrcBufPtr = NULL;
|
||||
int32_t h264SrcSize = 0, h264SrcSizePos = 0;
|
||||
uint8_t err_flag = 0;int i;
|
||||
video_frame_s* frame = NULL;
|
||||
|
||||
xFD_Set = FreeRTOS_CreateSocketSet();
|
||||
xSockets = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
|
||||
configASSERT( xSockets != FREERTOS_INVALID_SOCKET );
|
||||
FreeRTOS_setsockopt( xSockets,
|
||||
0,
|
||||
FREERTOS_SO_RCVTIMEO,
|
||||
&xNoTimeOut,
|
||||
sizeof( xNoTimeOut ) );
|
||||
xAddress.sin_port = ( uint16_t ) 11111;
|
||||
xAddress.sin_port = FreeRTOS_htons( xAddress.sin_port );
|
||||
FreeRTOS_bind( xSockets, &xAddress, sizeof( xAddress ) );
|
||||
FreeRTOS_listen( xSockets, 1 );
|
||||
//ark_test_h264_dec();
|
||||
|
||||
carlink_ey_video_init();
|
||||
|
||||
while (1) {
|
||||
FreeRTOS_FD_CLR(xSockets, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_FD_SET(xSockets, xFD_Set, eSELECT_READ);
|
||||
if (xClientSocket && xClientSocket != FREERTOS_INVALID_SOCKET) {
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_FD_SET( xClientSocket, xFD_Set, eSELECT_READ );
|
||||
}
|
||||
|
||||
xResult = FreeRTOS_select( xFD_Set, portMAX_DELAY );
|
||||
if (xResult < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if( FreeRTOS_FD_ISSET ( xSockets, xFD_Set ) ) {
|
||||
xClientSocket = FreeRTOS_accept( xSockets, &xRemoteAddr, &xClientLength);
|
||||
if( ( xClientSocket != NULL ) && ( xClientSocket != FREERTOS_INVALID_SOCKET ) ) {
|
||||
uint8_t pucBuffer[32] = {0};
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_FD_SET(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_GetRemoteAddress( xClientSocket, ( struct freertos_sockaddr * ) &xRemoteAddr );
|
||||
FreeRTOS_inet_ntoa(xRemoteAddr.sin_addr, pucBuffer );
|
||||
printf("Carlink: Received a connection from %s:%u\n", pucBuffer, FreeRTOS_ntohs(xRemoteAddr.sin_port));
|
||||
}
|
||||
continue;
|
||||
} else if( FreeRTOS_FD_ISSET ( xClientSocket, xFD_Set ) ) {
|
||||
header_buf_ptr = header_buf;
|
||||
header_buf_len = header_len;
|
||||
err_flag = 0;
|
||||
while (header_buf_len > 0) {
|
||||
err_flag = 0;
|
||||
ret = FreeRTOS_recv(xClientSocket, (void*)header_buf_ptr, header_buf_len, 0);
|
||||
if (ret < 0) {
|
||||
err_flag = 1;
|
||||
printf("FreeRTOS_recv header err:%d\r\n", ret);
|
||||
break;
|
||||
}
|
||||
header_buf_ptr += ret;
|
||||
header_buf_len -= ret;
|
||||
}
|
||||
if (err_flag) {
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_closesocket(xClientSocket);
|
||||
xClientSocket = FREERTOS_INVALID_SOCKET;
|
||||
video_frame_s* dummy = NULL;
|
||||
notify_h264_frame_ready(&dummy);
|
||||
continue;
|
||||
}
|
||||
/*printf("##header:");
|
||||
|
||||
for (i = 0; i < header_len; i++) {
|
||||
printf("%02x ", header_buf[i]);
|
||||
}printf("\r\n");*/
|
||||
|
||||
//READ_LE16(header_buf, header.id);
|
||||
//READ_LE16(header_buf + 2, header.payload_len);
|
||||
header.id = (header_buf[0] | (header_buf[1] << 8));
|
||||
header.payload_len = (header_buf[2] | (header_buf[3] << 8));
|
||||
printf("recv id:%d len:%d\r\n", header.id, header.payload_len);
|
||||
|
||||
int retry_cnt = 0;
|
||||
h264SrcSize = header.payload_len;
|
||||
get_retry:
|
||||
frame = get_h264_frame_buf();
|
||||
if (NULL == frame) {
|
||||
printf("h264 frame is empty\r\n");
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
goto get_retry;
|
||||
//continue;
|
||||
}
|
||||
|
||||
h264SrcSizePos = h264SrcSize;
|
||||
h264SrcBufPtr = frame->cur;
|
||||
h264SrcBuf = frame->cur;
|
||||
frame->len = h264SrcSize;
|
||||
err_flag = 0;
|
||||
while (h264SrcSizePos > 0) {
|
||||
//printf("h264SrcSizePos:%d\r\n", h264SrcSizePos);
|
||||
ret = FreeRTOS_recv( xClientSocket, (void *)h264SrcBufPtr, h264SrcSizePos, 0);
|
||||
//printf("lBytes:%d h264SrcSizePos:%d\r\n", lBytes, h264SrcSizePos);
|
||||
if (ret < 0) {
|
||||
printf("FreeRTOS_recv err:%d\r\n", ret);
|
||||
err_flag = 1;
|
||||
break;
|
||||
}
|
||||
h264SrcBufPtr += ret;
|
||||
h264SrcSizePos -= ret;
|
||||
}/*printf("read finished\r\n");
|
||||
|
||||
printf("payload:");
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
printf("%02x ", h264SrcBuf[i]);
|
||||
}printf("\r\n");*/
|
||||
|
||||
if (err_flag) {
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_closesocket(xClientSocket);
|
||||
xClientSocket = FREERTOS_INVALID_SOCKET;
|
||||
video_frame_s* dummy = NULL;
|
||||
notify_h264_frame_ready(&dummy);
|
||||
continue;
|
||||
}
|
||||
notify_h264_frame_ready(&frame);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FreeRTOS_closesocket(xClientSocket);
|
||||
FreeRTOS_closesocket(xSockets);
|
||||
}
|
||||
#else
|
||||
static int vCreateTCPServerSocket( void )
|
||||
{
|
||||
SocketSet_t xFD_Set;
|
||||
struct freertos_sockaddr xAddress, xRemoteAddr;
|
||||
Socket_t xSockets = FREERTOS_INVALID_SOCKET, xClientSocket = FREERTOS_INVALID_SOCKET;
|
||||
socklen_t xClientLength = sizeof( xAddress );
|
||||
static const TickType_t xNoTimeOut = portMAX_DELAY;
|
||||
BaseType_t ret = -1;
|
||||
BaseType_t xResult;
|
||||
|
||||
xFD_Set = FreeRTOS_CreateSocketSet();
|
||||
xSockets = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
|
||||
configASSERT( xSockets != FREERTOS_INVALID_SOCKET );
|
||||
FreeRTOS_setsockopt( xSockets,
|
||||
0,
|
||||
FREERTOS_SO_RCVTIMEO,
|
||||
&xNoTimeOut,
|
||||
sizeof( xNoTimeOut ) );
|
||||
xAddress.sin_port = ( uint16_t ) 11111;
|
||||
xAddress.sin_port = FreeRTOS_htons( xAddress.sin_port );
|
||||
FreeRTOS_bind( xSockets, &xAddress, sizeof( xAddress ) );
|
||||
FreeRTOS_listen( xSockets, 1 );
|
||||
//ark_test_h264_dec();
|
||||
|
||||
carlink_ey_video_init();
|
||||
|
||||
while (1) {
|
||||
FreeRTOS_FD_CLR(xSockets, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_FD_SET(xSockets, xFD_Set, eSELECT_READ);
|
||||
if (xClientSocket && xClientSocket != FREERTOS_INVALID_SOCKET) {
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_FD_SET( xClientSocket, xFD_Set, eSELECT_READ );
|
||||
}
|
||||
|
||||
xResult = FreeRTOS_select( xFD_Set, portMAX_DELAY );
|
||||
if (xResult < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if( FreeRTOS_FD_ISSET ( xSockets, xFD_Set ) ) {
|
||||
xClientSocket = FreeRTOS_accept( xSockets, &xRemoteAddr, &xClientLength);
|
||||
if( ( xClientSocket != NULL ) && ( xClientSocket != FREERTOS_INVALID_SOCKET ) ) {
|
||||
char pucBuffer[32] = {0};
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_FD_SET(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_GetRemoteAddress( xClientSocket, ( struct freertos_sockaddr * ) &xRemoteAddr );
|
||||
FreeRTOS_inet_ntoa(xRemoteAddr.sin_addr, pucBuffer );
|
||||
printf("Carlink: Received a connection from %s:%u\n", pucBuffer, FreeRTOS_ntohs(xRemoteAddr.sin_port));
|
||||
}
|
||||
continue;
|
||||
} else if( FreeRTOS_FD_ISSET ( xClientSocket, xFD_Set ) ) {
|
||||
|
||||
ret = FreeRTOS_recv(xClientSocket, wifi_data_buffer, sizeof wifi_data_buffer, 0);
|
||||
if (ret > 0) {
|
||||
printf("recv buf size:%d\r\n", ret);
|
||||
} else {
|
||||
printf("FreeRTOS_recv err:%d\r\n", ret);
|
||||
FreeRTOS_FD_CLR(xClientSocket, xFD_Set, eSELECT_READ);
|
||||
FreeRTOS_closesocket(xClientSocket);
|
||||
xClientSocket = FREERTOS_INVALID_SOCKET;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FreeRTOS_closesocket(xClientSocket);
|
||||
FreeRTOS_closesocket(xSockets);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if ( ipconfigUSE_DHCP_HOOK != 0 )
|
||||
eDHCPCallbackAnswer_t xApplicationDHCPHook2( eDHCPCallbackPhase_t eDHCPPhase,
|
||||
uint32_t ulIPAddress )
|
||||
{
|
||||
eDHCPCallbackAnswer_t eReturn;
|
||||
//uint32_t ulStaticIPAddress, ulStaticNetMask;
|
||||
char ip_str[20] = {0};
|
||||
sprintf(ip_str, "%d.%d.%d.%d\r\n", (ulIPAddress >> 0) & 0xFF,
|
||||
(ulIPAddress >> 8) & 0xFF, (ulIPAddress >> 16) & 0xFF, (ulIPAddress >> 24) & 0xFF);
|
||||
printf("\r\n eDHCPPhase:%d ulIPAddress:%s state:%d \r\n", eDHCPPhase, ip_str, getDhcpClientState());
|
||||
if (getDhcpClientState() == 0)
|
||||
return eDHCPStopNoChanges;
|
||||
|
||||
switch( eDHCPPhase )
|
||||
{
|
||||
case eDHCPPhasePreDiscover :
|
||||
eReturn = eDHCPContinue;
|
||||
break;
|
||||
|
||||
case eDHCPPhasePreRequest :
|
||||
#if 0
|
||||
ulStaticIPAddress = FreeRTOS_inet_addr_quick( ucIPAddress[0],
|
||||
ucIPAddress[1],
|
||||
ucIPAddress[2],
|
||||
ucIPAddress[3] );
|
||||
|
||||
ulStaticNetMask = FreeRTOS_inet_addr_quick( ucNetMask[0],
|
||||
ucNetMask[1],
|
||||
ucNetMask[2],
|
||||
ucNetMask[3] );
|
||||
|
||||
ulStaticIPAddress &= ulStaticNetMask;
|
||||
ulIPAddress &= ulStaticNetMask;
|
||||
if( ulStaticIPAddress == ulIPAddress ) {
|
||||
eReturn = eDHCPUseDefaults;
|
||||
} else {
|
||||
eReturn = eDHCPContinue;
|
||||
}
|
||||
#else
|
||||
eReturn = eDHCPContinue;
|
||||
#endif
|
||||
break;
|
||||
default :
|
||||
eReturn = eDHCPContinue;
|
||||
break;
|
||||
}
|
||||
|
||||
return eReturn;
|
||||
}
|
||||
#endif
|
||||
|
||||
void wifi_test_event_handler( WIFIEvent_t * xEvent )
|
||||
{
|
||||
WIFIEventType_t xEventType = xEvent->xEventType;
|
||||
|
||||
if (0) {
|
||||
} else if (eWiFiEventConnected == xEventType) {// meter is sta
|
||||
printf("\r\n The meter is connected to ap \r\n");
|
||||
} else if (eWiFiEventDisconnected == xEventType) {// meter is sta
|
||||
printf("\r\n The meter is disconnected from ap \r\n");
|
||||
} else if (eWiFiEventAPStationConnected == xEventType) {// meter is ap
|
||||
printf("\r\n The meter in AP is connected by a sta \r\n");
|
||||
} else if (eWiFiEventAPStationDisconnected == xEventType) {// meter is ap
|
||||
printf("\r\n The sta is disconnected from the meter \r\n");
|
||||
}
|
||||
}
|
||||
|
||||
int wifi_sta_test_proc();
|
||||
int wifi_ap_test_proc();
|
||||
static void wifi_demo_test(void)
|
||||
{
|
||||
BaseType_t ret = 0;
|
||||
unsigned int status;
|
||||
uint32_t IPAddress = (32 << 24) | (13 << 16) | (168 << 8) | (192 << 0);
|
||||
|
||||
for (;;) {
|
||||
status = mmcsd_wait_sdio_ready((int32_t)portMAX_DELAY);
|
||||
if (status == MMCSD_HOST_PLUGED) {
|
||||
printf("detect sdio device\r\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
#ifndef RELTECK_WIFI_AP_MODE
|
||||
setDhcpClientState(1);
|
||||
#endif
|
||||
ret = ret;
|
||||
//vTaskDelay(pdMS_TO_TICKS(5000));//wait connect
|
||||
ret = FreeRTOS_IPInit(ucIPAddress, ucNetMask, ucGatewayAddress,ucDNSServerAddress, ucMACAddress);
|
||||
//ark_wlan_init();
|
||||
#ifdef RELTECK_WIFI_AP_MODE
|
||||
wifi_ap_test_proc();
|
||||
#else
|
||||
WIFI_RegisterEvent(eWiFiEventMax, wifi_test_event_handler);
|
||||
wifi_sta_test_proc();
|
||||
#endif
|
||||
//vTaskDelay(pdMS_TO_TICKS(8000));
|
||||
while(0) {
|
||||
//printf("send ping\r\n");
|
||||
FreeRTOS_SendPingRequest(IPAddress, 8, 1000);
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
#ifdef RELTECK_WIFI_AP_MODE
|
||||
setDhcpClientState(0);
|
||||
IPAddress = (20 << 24) | (13 << 16) | (168 << 8) | (192 << 0);
|
||||
dhcpserver_start(ucIPAddress, IPAddress, 10);
|
||||
#else
|
||||
setDhcpClientState(1);
|
||||
#endif
|
||||
//vCreateTCPServerSocket();
|
||||
vIPerfInstall();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SDMMC_SUPPORT
|
||||
static void sdcard_read_thread(void *para)
|
||||
{
|
||||
unsigned int status;
|
||||
|
||||
for (;;) {
|
||||
status = mmcsd_wait_cd_changed(portMAX_DELAY);
|
||||
if (status == MMCSD_HOST_PLUGED) {
|
||||
printf("card inserted.\n");
|
||||
#ifdef OTA_UPDATE_SUPPORT
|
||||
FF_FILE *fp = ff_fopen("/sd/update.bin", "rb");
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/sd", UPFILE_TYPE_WHOLE);
|
||||
}
|
||||
|
||||
#if DEVICE_TYPE_SELECT == EMMC_FLASH
|
||||
fp = ff_fopen("/sd/emmcldr.bin", "rb");
|
||||
#else
|
||||
fp = ff_fopen("/sd/spildr.bin", "rb");
|
||||
#endif
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/sd", UPFILE_TYPE_FIRSTLDR);
|
||||
}
|
||||
|
||||
fp = ff_fopen("/sd/stepldr.bin", "rb");
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/sd", UPFILE_TYPE_STEPLDR);
|
||||
}
|
||||
|
||||
fp = ff_fopen("/sd/lnchemmc.bin", "rb");
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/sd", UPFILE_TYPE_LNCHEMMC);
|
||||
}
|
||||
#else
|
||||
FF_FILE *fp = ff_fopen("/sd/update.bin", "rb");
|
||||
if (fp) {
|
||||
UpFileHeader header;
|
||||
SysInfo *sysinfo = GetSysInfo();
|
||||
if (ff_fread(&header, 1, sizeof(header), fp) == sizeof(header)) {
|
||||
if(header.magic != MKTAG('U', 'P', 'D', 'F')){
|
||||
printf("Wrong update file, don't update.\n");
|
||||
} else {
|
||||
if (header.checksum != sysinfo->app_checksum) {
|
||||
printf("found different update file(0x%x-0x%x), update...\n",
|
||||
header.checksum, sysinfo->app_checksum);
|
||||
sysinfo->update_media_type = UPDATE_MEDIA_SD;
|
||||
sysinfo->update_status = UPDATE_STATUS_START;
|
||||
SaveSysInfo();
|
||||
wdt_cpu_reboot();
|
||||
} else {
|
||||
printf("the update file version is same, don't update.\n");
|
||||
}
|
||||
}
|
||||
};
|
||||
ff_fclose(fp);
|
||||
|
||||
} else {
|
||||
printf("open update.bin fail.\n");
|
||||
}
|
||||
#endif
|
||||
} else if (status == MMCSD_HOST_UNPLUGED) {
|
||||
printf("card removed.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void sdcard_read_demo(void)
|
||||
{
|
||||
static StaticTask_t xSDReadTaskTCB;
|
||||
static StackType_t uxSDReadTaskStack[configMINIMAL_STACK_SIZE * 2];
|
||||
|
||||
if (xTaskCreateStatic(sdcard_read_thread,
|
||||
"sdread",
|
||||
configMINIMAL_STACK_SIZE * 2,
|
||||
NULL,
|
||||
1,
|
||||
uxSDReadTaskStack,
|
||||
&xSDReadTaskTCB) == NULL) {
|
||||
printf("create sdread task fail.\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USB_SUPPORT
|
||||
static void usb_read_thread(void *para)
|
||||
{
|
||||
unsigned int status;
|
||||
|
||||
for (;;) {
|
||||
status = usb_wait_stor_dev_pluged(portMAX_DELAY);
|
||||
if (status == USB_DEV_PLUGED) {
|
||||
printf("usb dev inserted.\n");
|
||||
#ifdef OTA_UPDATE_SUPPORT
|
||||
FF_FILE *fp = ff_fopen("/usb/update.bin", "rb");
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/usb", UPFILE_TYPE_WHOLE);
|
||||
}
|
||||
|
||||
#if DEVICE_TYPE_SELECT == EMMC_FLASH
|
||||
fp = ff_fopen("/usb/emmcldr.bin", "rb");
|
||||
#else
|
||||
fp = ff_fopen("/usb/spildr.bin", "rb");
|
||||
#endif
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/usb", UPFILE_TYPE_FIRSTLDR);
|
||||
}
|
||||
|
||||
fp = ff_fopen("/usb/stepldr.bin", "rb");
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/usb", UPFILE_TYPE_STEPLDR);
|
||||
}
|
||||
|
||||
fp = ff_fopen("/usb/lnchemmc.bin", "rb");
|
||||
if (fp) {
|
||||
ff_fclose(fp);
|
||||
update_from_media("/usb", UPFILE_TYPE_LNCHEMMC);
|
||||
}
|
||||
#else
|
||||
FF_FILE *fp = ff_fopen("/usb/update.bin", "rb");
|
||||
if (fp) {
|
||||
UpFileHeader header;
|
||||
SysInfo *sysinfo = GetSysInfo();
|
||||
if (ff_fread(&header, 1, sizeof(header), fp) == sizeof(header)) {
|
||||
if (header.magic != MKTAG('U', 'P', 'D', 'F')) {
|
||||
printf("Wrong update file, don't update.\n");
|
||||
} else {
|
||||
if (header.checksum != sysinfo->app_checksum) {
|
||||
printf("found different update file(0x%x-0x%x), update...\n",
|
||||
header.checksum, sysinfo->app_checksum);
|
||||
sysinfo->update_media_type = UPDATE_MEDIA_USB;
|
||||
sysinfo->update_status = UPDATE_STATUS_START;
|
||||
SaveSysInfo();
|
||||
hub_usb_dev_reset();
|
||||
vTaskDelay(500);
|
||||
wdt_cpu_reboot();
|
||||
} else {
|
||||
printf("the update file version is same, don't update.\n");
|
||||
}
|
||||
}
|
||||
};
|
||||
ff_fclose(fp);
|
||||
} else {
|
||||
printf("open update.bin fail.\n");
|
||||
}
|
||||
#endif
|
||||
} else if (status == USB_DEV_UNPLUGED) {
|
||||
printf("usb removed.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void usb_read_demo(void)
|
||||
{
|
||||
if (xTaskCreate(usb_read_thread, "usbread", configMINIMAL_STACK_SIZE * 16, NULL,
|
||||
1, NULL) != pdPASS) {
|
||||
printf("create usbread task fail.\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void openvg_thread(void *data)
|
||||
{
|
||||
printf("openvg thread start.\n");
|
||||
|
||||
#if DEVICE_TYPE_SELECT != EMMC_FLASH
|
||||
/* initialize the spi flash */
|
||||
sfud_init();
|
||||
#ifdef SPI0_QSPI_MODE
|
||||
sfud_qspi_fast_read_enable(sfud_get_device(0), 4);
|
||||
#endif
|
||||
#else
|
||||
mmcsd_wait_mmc_ready(portMAX_DELAY);
|
||||
#endif
|
||||
|
||||
/* read sysinfo */
|
||||
ReadSysInfo();
|
||||
GetUpFileInfo();
|
||||
|
||||
/* initialize carback */
|
||||
#ifdef CARBACK_DETECT
|
||||
carback_init();
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* play animation */
|
||||
#if ANIMATION_POLICY != ANIMATION_NONE
|
||||
animation_init();
|
||||
animation_start();
|
||||
#endif
|
||||
|
||||
/* uart rx demo */
|
||||
//uart_rx_demo();
|
||||
|
||||
/* can demo */
|
||||
//can_demo();
|
||||
|
||||
/* read sd card demo */
|
||||
#ifdef SDMMC_SUPPORT
|
||||
sdcard_read_demo();
|
||||
#endif
|
||||
#ifdef USB_SUPPORT
|
||||
extern int get_usb_mode();
|
||||
extern int ark_network_init(void);
|
||||
extern void ncm_update_demo();
|
||||
extern void ncm_log_demo();
|
||||
extern void wifi_update_demo(void);
|
||||
if (get_usb_mode()) {
|
||||
ark_network_init();
|
||||
#ifdef NCM_UPDATE_SUPPORT
|
||||
ncm_update_demo();
|
||||
#endif
|
||||
#ifdef NCM_LOG_SUPPORT
|
||||
ncm_log_demo();
|
||||
#endif
|
||||
} else {
|
||||
#ifdef WIFI_UPDATE_SUPPORT
|
||||
wifi_update_demo();
|
||||
#else
|
||||
usb_read_demo();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WIFI_SUPPORT
|
||||
#if WIFI_TEST
|
||||
wifi_demo_test();
|
||||
#else
|
||||
#if CARLINK_EY
|
||||
set_carlink_display_info(0, 0, LCD_WIDTH, LCD_HEIGHT); //璁剧疆灞忓箷鏄剧ず鍖哄煙锛堣捣濮嬪潗鏍囧拰鍒嗚鲸鐜囷級
|
||||
set_carlink_video_info(LCD_WIDTH, LCD_HEIGHT, 30); //璁剧疆璇锋眰H264瑙嗛娴佸弬鏁?
|
||||
carlink_ey_init();
|
||||
#endif
|
||||
#if CARLINK_EC
|
||||
set_carlink_display_info(0, 0, LCD_WIDTH, LCD_HEIGHT);
|
||||
set_carlink_video_info(LCD_WIDTH, LCD_HEIGHT, 30);
|
||||
carlink_ec_init(0, NULL);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* read romfile */
|
||||
ReadRomFile();
|
||||
|
||||
#ifdef TP_SUPPORT
|
||||
extern int tp_init(void);
|
||||
tp_init();
|
||||
#endif
|
||||
|
||||
#ifdef VG_DRIVER
|
||||
xm_vg_init((unsigned int)vgHeap, VG_HEAP_SIZE);
|
||||
#endif
|
||||
|
||||
while(1) {
|
||||
#ifdef TASK_STATUS_MONITOR
|
||||
static uint32_t idletick = 0;
|
||||
uint8_t CPU_RunInfo[1024];
|
||||
|
||||
if (xTaskGetTickCount() - idletick > configTICK_RATE_HZ * 10) {
|
||||
memset(CPU_RunInfo,0,1024);
|
||||
vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息
|
||||
printf("---------------------------------------------\r\n");
|
||||
printf("Task State Priority Stack #\r\n");
|
||||
printf("%s", CPU_RunInfo);
|
||||
printf("---------------------------------------------\r\n");
|
||||
memset(CPU_RunInfo,0,1024);
|
||||
vTaskGetRunTimeStats((char *)&CPU_RunInfo);
|
||||
printf("Task Abs Time % Time\r\n");
|
||||
printf("%s", CPU_RunInfo);
|
||||
printf("---------------------------------------------\r\n\n");
|
||||
idletick = xTaskGetTickCount();
|
||||
}
|
||||
#endif
|
||||
vTaskDelay(pdMS_TO_TICKS(10)); /*Just to let the system breath*/
|
||||
}
|
||||
}
|
||||
|
||||
void main_openvg(void)
|
||||
{
|
||||
static StaticTask_t xOpenVGTaskTCB;
|
||||
static StackType_t uxOpenVGTaskStack[2048];
|
||||
|
||||
/* Create a task to test driver */
|
||||
xTaskCreateStatic(openvg_thread,
|
||||
"openvg",
|
||||
2048,
|
||||
NULL,
|
||||
tskIDLE_PRIORITY + 1,
|
||||
uxOpenVGTaskStack,
|
||||
&xOpenVGTaskTCB);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user