A59 -V1.1版本提交
This commit is contained in:
@ -263,8 +263,8 @@
|
||||
|
||||
#ifdef WIFI_SUPPORT
|
||||
#define CARLINK_EY 0
|
||||
#define CARLINK_EC 0
|
||||
#define CARLINK_CP 1
|
||||
#define CARLINK_EC 1
|
||||
#define CARLINK_CP 0
|
||||
#define CARLINK_AA 0
|
||||
|
||||
#define WIFI_RESET_IO 12
|
||||
@ -287,7 +287,7 @@
|
||||
#error "Do not choose two car links"
|
||||
#elif (CARLINK_EC && CARLINK_AA)
|
||||
#error "Do not choose two car links"
|
||||
#elif (CARLINK_CP && CARLINK_AA)
|
||||
// #elif (CARLINK_CP && CARLINK_AA)
|
||||
#error "Do not choose two car links"
|
||||
#endif
|
||||
|
||||
@ -411,7 +411,7 @@
|
||||
#define UPDATEFILE_MAX_SIZE 0xb00000
|
||||
#define OTA_MEDIA_OFFSET 0xa00000
|
||||
#define OTA_MEDIA_SIZE 0x500000
|
||||
//#define SPI0_QSPI_MODE
|
||||
// #define SPI0_QSPI_MODE
|
||||
#elif DEVICE_TYPE_SELECT == EMMC_FLASH
|
||||
#define LOADER_OFFSET 0x0
|
||||
#define LOADERB_OFFSET 0x100000
|
||||
@ -474,7 +474,7 @@
|
||||
/*********************************************/
|
||||
|
||||
/********** update address configuration **********/
|
||||
//#define OTA_UPDATE_SUPPORT
|
||||
#define OTA_UPDATE_SUPPORT
|
||||
#ifdef OTA_UPDATE_SUPPORT
|
||||
//#define WIFI_UPDATE_SUPPORT
|
||||
#if defined(WIFI_UPDATE_SUPPORT) && !defined(USB_SUPPORT)
|
||||
|
@ -19,7 +19,9 @@ typedef struct {
|
||||
unsigned int image_offset;
|
||||
unsigned int loader_offset;
|
||||
unsigned int loader_size;
|
||||
unsigned int reserved[12];
|
||||
unsigned int reserved[10];
|
||||
unsigned int upgrade_flag;
|
||||
unsigned int upgrade_appsize;
|
||||
unsigned int checksum;
|
||||
} SysInfo;
|
||||
|
||||
|
656
ArkmicroFiles/libboard-amt630hv100/source/animation - 0912.c
Normal file
656
ArkmicroFiles/libboard-amt630hv100/source/animation - 0912.c
Normal file
@ -0,0 +1,656 @@
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
#include "board.h"
|
||||
#include "chip.h"
|
||||
|
||||
#include "sfud.h"
|
||||
#include "updatefile.h"
|
||||
#include "mfcapi.h"
|
||||
#include "dwl.h"
|
||||
#include "animation.h"
|
||||
|
||||
#if DEVICE_TYPE_SELECT == EMMC_FLASH
|
||||
#include "mmcsd_core.h"
|
||||
#endif
|
||||
|
||||
static TaskHandle_t animation_task = NULL;
|
||||
static SemaphoreHandle_t animation_mutex;
|
||||
#if ANIMATION_POLICY == ANIMATION_USE_SMALL_MEM
|
||||
static BANIHEADER ani_header;
|
||||
static BANIHEADER *aniheader = &ani_header;
|
||||
#else
|
||||
static BANIHEADER *aniheader;
|
||||
#endif
|
||||
static unsigned int anioffset;
|
||||
static unsigned int anisize;
|
||||
static int ani_playing = 0;
|
||||
static int ani_replay = 0;
|
||||
static int ani_stop = 0;
|
||||
static int ani_frames = 0;
|
||||
static int ani_display_index = 0;
|
||||
static int ani_take_vdisbuf = 0;
|
||||
static unsigned int ani_frame_addr;
|
||||
static uint32_t first_show_done = 0;
|
||||
|
||||
|
||||
#if 0
|
||||
#include "ff_stdio.h"
|
||||
|
||||
static int get_h264_single_file_from_sd(void *buf, int *len)
|
||||
{
|
||||
#define READ_SIZE (LCD_WIDTH*LCD_HEIGHT*2)
|
||||
char path_name[64] = "/sd/000.h264";
|
||||
static int count = 0;
|
||||
FF_FILE *fp;
|
||||
int ret = -1;
|
||||
|
||||
sprintf(path_name, "/sd/%.3d.h264", count++);
|
||||
*len = 0;
|
||||
|
||||
fp = ff_fopen(path_name, "rb");
|
||||
if (fp) {
|
||||
ret = ff_fread(buf, 1, READ_SIZE, fp);
|
||||
if (ret <= 0) {
|
||||
printf("read sdmmc file:%s failed, maybe read done\n", path_name);
|
||||
return -1;
|
||||
}
|
||||
*len = ret;
|
||||
} else {
|
||||
printf("### open %s fail.\n", path_name);
|
||||
count = 0;
|
||||
return -1;
|
||||
}
|
||||
if(fp)
|
||||
ff_fclose(fp);
|
||||
|
||||
//printf("###read %s len:%d.\n", path_name, *len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void h264_decode_test_thread(void *param)
|
||||
{
|
||||
#define H264DEC_SEMIPLANAR_YUV420 0x020001
|
||||
#define H264DEC_INBUF_SIZE (LCD_WIDTH*LCD_HEIGHT*2)
|
||||
#define H264DEC_DISP_COUNTS 2
|
||||
|
||||
DWLLinearMem_t inBuf;
|
||||
OutFrameBuffer outBuf = {0};
|
||||
uint32_t h264SrcSize = 0;
|
||||
MFCHandle *handle = NULL;
|
||||
uint32_t display_addr[H264DEC_DISP_COUNTS] = {0};
|
||||
uint32_t display_addr_index = 0;
|
||||
uint32_t first_show_done = 0;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
void *h264SrcBuf = pvPortMalloc(H264DEC_INBUF_SIZE);
|
||||
if(!h264SrcBuf) {
|
||||
printf("%s, h264SrcBuf pvPortMalloc failed.\n", __func__);
|
||||
return ;
|
||||
}
|
||||
|
||||
for(i=0; i<H264DEC_DISP_COUNTS; i++) {
|
||||
display_addr[i] = (uint32_t)pvPortMalloc(H264DEC_INBUF_SIZE);
|
||||
if(!display_addr[i] ) {
|
||||
printf("%s, display_addr[%d] pvPortMalloc failed.\n", __func__, i);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
mmcsd_wait_cd_changed(portMAX_DELAY);
|
||||
|
||||
handle = mfc_init(RAW_STRM_TYPE_H264);
|
||||
if(!handle) {
|
||||
printf("%s, mfc_init failed.\n", __func__);
|
||||
return ;
|
||||
}
|
||||
|
||||
while(1) {
|
||||
//memset(&outBuf, 0, sizeof(OutFrameBuffer));
|
||||
//memset(h264SrcBuf, 0, H264DEC_INBUF_SIZE);
|
||||
mdelay(30);
|
||||
#if 1 //get h264 info form sdcard.
|
||||
ret = get_h264_single_file_from_sd(h264SrcBuf, &h264SrcSize);
|
||||
if(ret != 0) {
|
||||
printf("%s, get_h264_single_file_from_sd failed.\n", __func__);
|
||||
continue;
|
||||
}
|
||||
inBuf.busAddress = (u32)h264SrcBuf;
|
||||
inBuf.virtualAddress = (u32 *)inBuf.busAddress;
|
||||
inBuf.size = h264SrcSize;
|
||||
CP15_clean_dcache_for_dma(inBuf.busAddress, inBuf.busAddress + inBuf.size);
|
||||
#else
|
||||
//1. copy your h264 data to h264SrcBuf;
|
||||
//2. set your h264 data size to h264SrcSize;
|
||||
|
||||
inBuf.busAddress = (u32)h264SrcBuf;
|
||||
inBuf.virtualAddress = (u32 *)inBuf.busAddress;
|
||||
inBuf.size = h264SrcSize;
|
||||
#endif
|
||||
|
||||
ret = mfc_decode(handle, &inBuf, &outBuf);
|
||||
if (ret < 0) {
|
||||
printf("animation decode fail.\n");
|
||||
} else {
|
||||
uint32_t align_width, align_height;
|
||||
uint32_t yaddr, uaddr, vaddr;
|
||||
|
||||
for(i=0; i<outBuf.num; i++) {
|
||||
align_width = outBuf.frameWidth;
|
||||
align_height = outBuf.frameHeight;
|
||||
if(1/*outBuf.outputFormat == H264DEC_SEMIPLANAR_YUV420*/ && align_width && align_height)
|
||||
{
|
||||
memcpy((void *)display_addr[display_addr_index], outBuf.buffer[i].pyVirAddress, align_width * align_height * 3 / 2);
|
||||
// ret = dma_m2mcpy(display_addr[display_addr_index], (uint32_t)outBuf.buffer[i].yBusAddress, align_width * align_height * 3 / 2);
|
||||
// if(ret) {
|
||||
// printf("%s() dma_m2m_memcpy failed.\n", __func__);
|
||||
// continue;
|
||||
// }
|
||||
yaddr = display_addr[display_addr_index];
|
||||
uaddr = yaddr + align_width * align_height;
|
||||
vaddr = yaddr + align_width * align_height * 5/4;
|
||||
|
||||
display_addr_index++;
|
||||
if(display_addr_index >= H264DEC_DISP_COUNTS) {
|
||||
display_addr_index = 0;
|
||||
}
|
||||
|
||||
if(!first_show_done) {
|
||||
ark_lcd_set_osd_size(LCD_VIDEO_LAYER, /*outBuf.codedWidth, outBuf.codedHeight*/LCD_WIDTH, LCD_HEIGHT);
|
||||
ark_lcd_set_osd_format(LCD_VIDEO_LAYER, LCD_OSD_FORAMT_YUV420);
|
||||
ark_lcd_set_osd_yuv420_mode(LCD_VIDEO_LAYER, LCD_OSD_Y_UV420);
|
||||
ark_lcd_osd_enable(LCD_VIDEO_LAYER, 1);
|
||||
ark_lcd_osd_enable(LCD_UI_LAYER, 0);
|
||||
first_show_done = 1;
|
||||
}
|
||||
ark_lcd_set_osd_yaddr(LCD_VIDEO_LAYER, yaddr);
|
||||
ark_lcd_set_osd_uaddr(LCD_VIDEO_LAYER, uaddr);
|
||||
ark_lcd_set_osd_vaddr(LCD_VIDEO_LAYER, vaddr);
|
||||
ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
|
||||
ark_lcd_set_osd_sync(LCD_UI_LAYER);
|
||||
ark_lcd_wait_for_vsync();
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(handle)
|
||||
mfc_uninit(handle);
|
||||
|
||||
if(h264SrcBuf)
|
||||
vPortFree(h264SrcBuf);
|
||||
|
||||
for(i=0; i<H264DEC_DISP_COUNTS; i++) {
|
||||
if(!display_addr[i]) {
|
||||
vPortFree((void *)display_addr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int save_nv12_file_to_sd(void *buf, int len)
|
||||
{
|
||||
char path_name[64] = "/sd/000.bin";
|
||||
static int count = 0;
|
||||
FF_FILE *fp;
|
||||
int ret = -1;
|
||||
|
||||
sprintf(path_name, "/sd/%.3d.bin", count++);
|
||||
|
||||
fp = ff_fopen(path_name, "w+");
|
||||
if (fp) {
|
||||
ret = ff_fwrite(buf, 1, len, fp);
|
||||
if (ret != len) {
|
||||
printf("read sdmmc file:%s failed.\n", path_name);
|
||||
ff_fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
printf("### open %s fail.\n", path_name);
|
||||
return -1;
|
||||
}
|
||||
ff_fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_file_from_sd(void *buf, int *len)
|
||||
{
|
||||
#define READ_SIZE (LCD_WIDTH*LCD_HEIGHT*2)
|
||||
#if LCD_BPP == 32
|
||||
char path_name[64] = "/sd/480x1280_rgb888.rgb";
|
||||
#else
|
||||
char path_name[64] = "/sd/480x1280_rgb565.rgb";
|
||||
#endif
|
||||
FF_FILE *fp;
|
||||
int ret = -1;
|
||||
|
||||
*len = 0;
|
||||
fp = ff_fopen(path_name, "rb");
|
||||
if (fp) {
|
||||
ret = ff_fread(buf, 1, READ_SIZE, fp);
|
||||
if (ret <= 0) {
|
||||
printf("read sdmmc file:%s failed.\n", path_name);
|
||||
return -1;
|
||||
}
|
||||
*len = ret;
|
||||
} else {
|
||||
printf("### open %s fail.\n", path_name);
|
||||
return -1;
|
||||
}
|
||||
if(fp)
|
||||
ff_fclose(fp);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mipi_disp_test(void)
|
||||
{
|
||||
u32 len;
|
||||
int ret;
|
||||
u32 *disp_addr = (u32 *)pvPortMalloc(LCD_WIDTH*LCD_HEIGHT*2);
|
||||
if(!disp_addr) {
|
||||
printf("disp_addr pvPortMalloc failed.\n");
|
||||
return ;
|
||||
}
|
||||
|
||||
mmcsd_wait_cd_changed(portMAX_DELAY);
|
||||
get_file_from_sd(disp_addr, &len);
|
||||
if(!len) {
|
||||
printf("get_file_from_sd failed.\n");
|
||||
return ;
|
||||
}
|
||||
CP15_clean_dcache_for_dma((uint32_t)disp_addr, (uint32_t)disp_addr + LCD_WIDTH*LCD_HEIGHT*2);
|
||||
|
||||
u32 layer = LCD_OSD0;
|
||||
u32 width = VIDEO_DISPLAY_WIDTH;
|
||||
u32 height = VIDEO_DISPLAY_HEIGHT;
|
||||
u32 format;
|
||||
#if LCD_BPP == 32
|
||||
format = LCD_OSD_FORAMT_ARGB888;
|
||||
#else
|
||||
format = LCD_OSD_FORAMT_RGB565;
|
||||
#endif
|
||||
|
||||
while(1) {
|
||||
ark_lcd_osd_enable(LCD_OSD0, 0);
|
||||
ark_lcd_osd_enable(LCD_OSD1, 0);
|
||||
ark_lcd_set_osd_sync(LCD_OSD0);
|
||||
ark_lcd_set_osd_sync(LCD_OSD1);
|
||||
|
||||
ark_lcd_set_osd_size(layer, width, height);
|
||||
ark_lcd_set_osd_format(layer, format);
|
||||
ark_lcd_osd_enable(layer, 1);
|
||||
ark_lcd_set_osd_yaddr(layer, (u32)disp_addr);
|
||||
ark_lcd_set_osd_sync(layer);
|
||||
ark_lcd_wait_for_vsync();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//#define PLAY_SHUTDOWN_ANIMATION
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
static int shutdown_anim = 0;
|
||||
#endif
|
||||
uint16_t animo_flag = 0;
|
||||
static void animation_thread(void *param)
|
||||
{
|
||||
MFCHandle *mfc_handle = NULL;
|
||||
#if DEVICE_TYPE_SELECT != EMMC_FLASH
|
||||
sfud_flash *sflash;
|
||||
#endif
|
||||
uint32_t size;
|
||||
uint32_t stick, etick, delaytick;
|
||||
uint32_t display_addr;
|
||||
uint32_t *tmp_addr = NULL;
|
||||
uint8_t power=1;
|
||||
|
||||
anioffset = GetUpFileOffset(MKTAG('B', 'A', 'N', 'I'));
|
||||
anisize = GetUpFileSize(MKTAG('B', 'A', 'N', 'I'));
|
||||
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
if(shutdown_anim){
|
||||
anioffset = GetUpFileOffset(MKTAG('S', 'A', 'N', 'I'));
|
||||
anisize = GetUpFileSize(MKTAG('S', 'A', 'N', 'I'));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (anisize > 0) {
|
||||
void *anibuf = pvPortMalloc(anisize);
|
||||
if (anibuf) {
|
||||
#if DEVICE_TYPE_SELECT != EMMC_FLASH
|
||||
sflash = sfud_get_device(0);
|
||||
sfud_read(sflash, anioffset, anisize, anibuf);
|
||||
#else
|
||||
emmc_read(anioffset, anisize, anibuf);
|
||||
#endif
|
||||
aniheader = (BANIHEADER*)anibuf;
|
||||
|
||||
if (aniheader->magic != MKTAG('B', 'A', 'N', 'I')
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
&& aniheader->magic != MKTAG('S', 'A', 'N', 'I')
|
||||
#endif
|
||||
) {
|
||||
printf("Read animation file error!\n");
|
||||
vPortFree(anibuf);
|
||||
vTaskDelete(NULL);
|
||||
return;
|
||||
}
|
||||
CP15_clean_dcache_for_dma((uint32_t)anibuf, (uint32_t)anibuf + anisize);
|
||||
} else {
|
||||
printf("Error! No enough memory for animation file.\n");
|
||||
vTaskDelete(NULL);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
printf("Warning! Not found animation in update file.\n");
|
||||
vTaskDelete(NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
ani_frame_addr = (uint32_t)aniheader + sizeof(BANIHEADER);
|
||||
for (;;) {
|
||||
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
||||
|
||||
xSemaphoreTake(animation_mutex, portMAX_DELAY);
|
||||
if (ani_replay) {
|
||||
ani_frame_addr = (uint32_t)aniheader + sizeof(BANIHEADER);
|
||||
ani_frames = 0;
|
||||
ani_replay = 0;
|
||||
}
|
||||
stick = xTaskGetTickCount();
|
||||
ani_playing = 1;
|
||||
|
||||
size = *(uint32_t*)ani_frame_addr;
|
||||
|
||||
if (xVideoDisplayBufTake(pdMS_TO_TICKS(10)) == pdTRUE) {
|
||||
if(!mfc_handle)
|
||||
mfc_handle = mfc_init(RAW_STRM_TYPE_JPEG);
|
||||
if(!mfc_handle) {
|
||||
printf("%s, mfc_init failed.\n", __func__);
|
||||
continue ;
|
||||
}
|
||||
|
||||
display_addr = ulVideoDisplayBufGet();
|
||||
|
||||
JpegHeaderInfo jpegInfo = {0};
|
||||
jpegInfo.handle = mfc_handle;
|
||||
jpegInfo.jpg_addr = ani_frame_addr + 8;
|
||||
jpegInfo.jpg_size = size;
|
||||
jpegInfo.dec_addry = display_addr;
|
||||
|
||||
#if LCD_ROTATE_ANGLE != LCD_ROTATE_ANGLE_0
|
||||
if(!tmp_addr) {
|
||||
uint32_t tmp_size = ulVideoDisplayBufGetSize();
|
||||
tmp_addr = (u32 *)pvPortMalloc(tmp_size);
|
||||
if(!tmp_addr) {
|
||||
printf("tmp_addr pvPortMalloc failed.\n");
|
||||
}
|
||||
}
|
||||
if(tmp_addr) {
|
||||
jpegInfo.dec_addry = VIRT_TO_PHY((u32)tmp_addr);
|
||||
}
|
||||
#endif
|
||||
if (mfc_jpegdec(&jpegInfo) != 0) {
|
||||
printf("animation decode %d frame fail.\n", ani_frames);
|
||||
vVideoDisplayBufFree(display_addr);
|
||||
} else {
|
||||
if(!first_show_done) {
|
||||
#if LCD_ROTATE_ANGLE == LCD_ROTATE_ANGLE_0
|
||||
int align_width = (LCD_WIDTH + 0xF) & (~0xF);
|
||||
int align_height = (LCD_HEIGHT + 0xF) & (~0xF);
|
||||
if((align_width == jpegInfo.dec_width) && (align_height == jpegInfo.dec_height)) {
|
||||
ark_lcd_set_osd_size(LCD_VIDEO_LAYER, LCD_WIDTH, LCD_HEIGHT);
|
||||
} else {
|
||||
ark_lcd_set_osd_size(LCD_VIDEO_LAYER, jpegInfo.dec_width, jpegInfo.dec_height);
|
||||
}
|
||||
ark_lcd_set_osd_format(LCD_VIDEO_LAYER, LCD_OSD_FORAMT_YUV420);
|
||||
ark_lcd_set_osd_yuv420_mode(LCD_VIDEO_LAYER, LCD_OSD_Y_UV420);
|
||||
#else
|
||||
ark_lcd_set_osd_size(LCD_VIDEO_LAYER, LCD_WIDTH, LCD_HEIGHT);
|
||||
ark_lcd_set_osd_format(LCD_VIDEO_LAYER, LCD_OSD_FORAMT_RGB565);
|
||||
#endif
|
||||
|
||||
ark_lcd_osd_enable(LCD_VIDEO_LAYER, 1);
|
||||
ark_lcd_osd_enable(LCD_UI_LAYER, 0);
|
||||
first_show_done = 1;
|
||||
}
|
||||
animo_flag++;
|
||||
if(animo_flag == 3){
|
||||
BrightnessPowerOnSetting();
|
||||
pwm_enable(2);
|
||||
pwm_enable(3);
|
||||
}
|
||||
// printf("animo_flag------------ %d .\r\n",animo_flag);
|
||||
#if LCD_ROTATE_ANGLE == LCD_ROTATE_ANGLE_0
|
||||
ark_lcd_set_osd_yaddr(LCD_VIDEO_LAYER, jpegInfo.dec_addry);
|
||||
ark_lcd_set_osd_uaddr(LCD_VIDEO_LAYER, jpegInfo.dec_addru);
|
||||
ark_lcd_set_osd_vaddr(LCD_VIDEO_LAYER, jpegInfo.dec_addrv);
|
||||
#else
|
||||
pxp_scaler_rotate(jpegInfo.dec_addry, jpegInfo.dec_addru, jpegInfo.dec_addrv,
|
||||
PXP_SRC_FMT_YUV2P420, jpegInfo.dec_width, jpegInfo.dec_height,
|
||||
display_addr, 0, PXP_OUT_FMT_RGB565, LCD_WIDTH, LCD_HEIGHT, LCD_ROTATE_ANGLE);
|
||||
ark_lcd_set_osd_yaddr(LCD_VIDEO_LAYER, display_addr);
|
||||
#endif
|
||||
ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
|
||||
ark_lcd_set_osd_sync(LCD_UI_LAYER);
|
||||
ark_lcd_wait_for_vsync();
|
||||
vVideoDisplayBufRender(display_addr);
|
||||
ani_take_vdisbuf = 1;
|
||||
}
|
||||
}
|
||||
|
||||
ani_frame_addr += size;
|
||||
ani_display_index = !ani_display_index;
|
||||
|
||||
if (ani_stop || (++ani_frames >= aniheader->aniCount + aniheader->hasBootlogo ? 1 : 0)
|
||||
#if ANIMATION_POLICY == ANIMATION_USE_SMALL_MEM
|
||||
|| (ani_frame_addr > anioffset + anisize))
|
||||
#else
|
||||
|| (ani_frame_addr > (uint32_t)aniheader + anisize))
|
||||
#endif
|
||||
{
|
||||
|
||||
printf("animation end.\n");
|
||||
extern void Set_sys_power_on_self_test(uint8_t value);
|
||||
Set_sys_power_on_self_test(50);
|
||||
ani_stop = 0;
|
||||
if (aniheader->aniCount > 0)
|
||||
vTaskDelay(aniheader->aniDelayHideTime);
|
||||
else if (aniheader->hasBootlogo)
|
||||
vTaskDelay(aniheader->bootlogoDisplayTime);
|
||||
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
if(shutdown_anim)
|
||||
ani_take_vdisbuf = 0;
|
||||
#endif
|
||||
if (ani_take_vdisbuf) {
|
||||
ark_lcd_osd_enable(LCD_VIDEO_LAYER, 0);
|
||||
ark_lcd_osd_enable(LCD_UI_LAYER, 1);
|
||||
ark_lcd_set_osd_sync(LCD_UI_LAYER);
|
||||
ark_lcd_set_osd_sync(LCD_VIDEO_LAYER);
|
||||
}
|
||||
vVideoDisplayBufFree(display_addr);
|
||||
vVideoDisplayBufGive();
|
||||
ani_playing = 0;
|
||||
if (ani_replay)
|
||||
xTaskNotifyGive(animation_task);
|
||||
xSemaphoreGive(animation_mutex);
|
||||
|
||||
if(mfc_handle) {
|
||||
mfc_uninit(mfc_handle);
|
||||
mfc_handle = NULL;
|
||||
}
|
||||
if(tmp_addr) {
|
||||
vPortFree(tmp_addr);
|
||||
tmp_addr = NULL;
|
||||
}
|
||||
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
break;
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
||||
vVideoDisplayBufGive();
|
||||
xSemaphoreGive(animation_mutex);
|
||||
etick = xTaskGetTickCount();
|
||||
|
||||
if (aniheader->hasBootlogo && ani_frames == 1)
|
||||
delaytick = pdMS_TO_TICKS(aniheader->bootlogoDisplayTime) > (etick - stick) ?
|
||||
pdMS_TO_TICKS(aniheader->bootlogoDisplayTime) - (etick - stick) : 0;
|
||||
else
|
||||
delaytick = pdMS_TO_TICKS(1000 / aniheader->aniFps) > (etick - stick) ?
|
||||
pdMS_TO_TICKS(1000 / aniheader->aniFps) - (etick - stick) : 0;
|
||||
|
||||
if (delaytick)
|
||||
vTaskDelay(delaytick);
|
||||
|
||||
xTaskNotifyGive(animation_task);
|
||||
}
|
||||
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
if(aniheader) {
|
||||
vPortFree(aniheader);
|
||||
aniheader = NULL;
|
||||
}
|
||||
|
||||
animation_task = NULL;
|
||||
vTaskDelete(NULL);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
int animation_init(void)
|
||||
{
|
||||
if (animation_task) {
|
||||
printf("animation is already inited.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
animation_mutex = xSemaphoreCreateMutex();
|
||||
|
||||
/* Create a task to play animation */
|
||||
//if (xTaskCreate(h264_decode_test_thread, "h264_decode_test", configMINIMAL_STACK_SIZE*2, NULL,
|
||||
if (xTaskCreate(animation_thread, "animation", configMINIMAL_STACK_SIZE, NULL,
|
||||
configMAX_PRIORITIES - 1, &animation_task) != pdPASS) {
|
||||
printf("create animation task fail.\n");
|
||||
animation_task = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void animation_start(void)
|
||||
{
|
||||
xSemaphoreTake(animation_mutex, portMAX_DELAY);
|
||||
first_show_done=0;
|
||||
if (ani_playing) {
|
||||
printf("animation is already playing.\n");
|
||||
xSemaphoreGive(animation_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
#if ANIMATION_POLICY == ANIMATION_USE_SMALL_MEM
|
||||
ani_frame_addr = anioffset + sizeof(BANIHEADER);
|
||||
#else
|
||||
ani_frame_addr = (uint32_t)aniheader + sizeof(BANIHEADER);
|
||||
#endif
|
||||
ani_frames = 0;
|
||||
if (animation_task)
|
||||
xTaskNotifyGive(animation_task);
|
||||
|
||||
xSemaphoreGive(animation_mutex);
|
||||
}
|
||||
|
||||
/* replay animation even if animation is already playing */
|
||||
void animation_restart(void)
|
||||
{
|
||||
xSemaphoreTake(animation_mutex, portMAX_DELAY);
|
||||
first_show_done=0;
|
||||
ani_stop=0;
|
||||
if (ani_playing) {
|
||||
ani_replay = 1;
|
||||
xSemaphoreGive(animation_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
#if ANIMATION_POLICY == ANIMATION_USE_SMALL_MEM
|
||||
ani_frame_addr = anioffset + sizeof(BANIHEADER);
|
||||
#else
|
||||
ani_frame_addr = (uint32_t)aniheader + sizeof(BANIHEADER);
|
||||
#endif
|
||||
ani_frames = 0;
|
||||
if (animation_task)
|
||||
xTaskNotifyGive(animation_task);
|
||||
|
||||
xSemaphoreGive(animation_mutex);
|
||||
}
|
||||
|
||||
#ifdef PLAY_SHUTDOWN_ANIMATION
|
||||
int play_shutdown_animation(void)
|
||||
{
|
||||
#define TIMEOUT_SEC 10
|
||||
uint32_t wait_tick;
|
||||
|
||||
if (animation_task) {
|
||||
printf("%s, animation is already inited.\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
xSemaphoreTake(animation_mutex, portMAX_DELAY);
|
||||
shutdown_anim = 1;
|
||||
ani_frames = 0;
|
||||
first_show_done = 0;
|
||||
ani_stop = 0;
|
||||
ani_take_vdisbuf = 0;
|
||||
xSemaphoreGive(animation_mutex);
|
||||
|
||||
if (xTaskCreate(animation_thread, "animation", configMINIMAL_STACK_SIZE, NULL,
|
||||
configMAX_PRIORITIES - 2, &animation_task) != pdPASS) {
|
||||
printf("%s, create animation task fail.\n", __func__);
|
||||
animation_task = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
xSemaphoreTake(animation_mutex, portMAX_DELAY);
|
||||
|
||||
if (ani_playing) {
|
||||
printf("%s, animation is already playing.\n", __func__);
|
||||
xSemaphoreGive(animation_mutex);
|
||||
return -1;
|
||||
}
|
||||
if (animation_task)
|
||||
xTaskNotifyGive(animation_task);
|
||||
xSemaphoreGive(animation_mutex);
|
||||
|
||||
//wait for animation_thread exit.
|
||||
wait_tick = xTaskGetTickCount();
|
||||
while(xTaskGetTickCount() - wait_tick < configTICK_RATE_HZ * TIMEOUT_SEC) {
|
||||
if(ani_stop)
|
||||
break;
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void animation_stop(void)
|
||||
{
|
||||
xSemaphoreTake(animation_mutex, portMAX_DELAY);
|
||||
ani_stop = 1;
|
||||
xSemaphoreGive(animation_mutex);
|
||||
}
|
||||
|
||||
int get_animation_status(void)
|
||||
{
|
||||
return ani_playing;
|
||||
}
|
@ -418,9 +418,9 @@ static void animation_thread(void *param)
|
||||
#endif
|
||||
if(power){
|
||||
BrightnessPowerOnSetting();
|
||||
pwm_enable(2);//?<3F><>?<3F><>?-??<3F><>?<3F><>?<3F>̨<EFBFBD><CCA8><EFBFBD>???<3F><><EFBFBD><EFBFBD>?a??<3F><>31a
|
||||
pwm_enable(3);//?<3F><>?<3F><>?-??<3F><>?<3F><>?<3F>̨<EFBFBD><CCA8><EFBFBD>???<3F><><EFBFBD><EFBFBD>?a??<3F><>?1a
|
||||
}
|
||||
pwm_enable(2);
|
||||
pwm_enable(3);
|
||||
}
|
||||
ark_lcd_osd_enable(LCD_VIDEO_LAYER, 1);
|
||||
ark_lcd_osd_enable(LCD_UI_LAYER, 0);
|
||||
first_show_done = 1;
|
||||
@ -536,7 +536,7 @@ int animation_init(void)
|
||||
/* Create a task to play animation */
|
||||
//if (xTaskCreate(h264_decode_test_thread, "h264_decode_test", configMINIMAL_STACK_SIZE*2, NULL,
|
||||
if (xTaskCreate(animation_thread, "animation", configMINIMAL_STACK_SIZE, NULL,
|
||||
configMAX_PRIORITIES - 2, &animation_task) != pdPASS) {
|
||||
configMAX_PRIORITIES - 1, &animation_task) != pdPASS) {
|
||||
printf("create animation task fail.\n");
|
||||
animation_task = NULL;
|
||||
return -1;
|
||||
|
@ -31,6 +31,7 @@ typedef struct {
|
||||
int width;
|
||||
int height;
|
||||
int format;
|
||||
int stride;
|
||||
unsigned int yaddr;
|
||||
unsigned int uaddr;
|
||||
unsigned int vaddr;
|
||||
|
@ -31,6 +31,9 @@ typedef struct sfuddata_t{
|
||||
char r_mac_address[9]; //物理地址
|
||||
uint32_t maintenance_mileage; //保养里程数max
|
||||
uint32_t mileage_flag; //设置时当前的总里程数
|
||||
uint8_t display_mileage; // 里程显示类型
|
||||
uint8_t tcs_on_off; //tcs类型
|
||||
uint8_t mile_state; //保养里程状态
|
||||
}SfudData_t;
|
||||
|
||||
typedef struct sfudmiledata_t{
|
||||
|
@ -5,7 +5,7 @@
|
||||
#include "FreeRTOS.h"
|
||||
#include "chip.h"
|
||||
|
||||
//#define CAN_USE_TX_DEMO
|
||||
#define CAN_USE_TX_DEMO
|
||||
|
||||
#define CAN_RX_BUF_NUM 32
|
||||
#define CAN_TX_BUF_NUM 32
|
||||
@ -690,40 +690,66 @@ static void can_txdemo_thread(void *param)
|
||||
{
|
||||
CanPort_t *cap = param;
|
||||
|
||||
// CanMsg txmsg = {0};
|
||||
// txmsg.IDE = CAN_Id_Standard;
|
||||
// txmsg.DLC = 4;
|
||||
// txmsg.Data[0] = 0x11;
|
||||
// txmsg.Data[1] = 0x22;
|
||||
// txmsg.Data[2] = 0x33;
|
||||
// txmsg.Data[3] = 0x44;
|
||||
CanMsg txmsg = {0};
|
||||
txmsg.StdId = 0x200;
|
||||
txmsg.IDE = CAN_Id_Standard;
|
||||
txmsg.DLC = 4;
|
||||
txmsg.Data[0] = 0x11;
|
||||
txmsg.Data[1] = 0x22;
|
||||
txmsg.Data[2] = 0x33;
|
||||
txmsg.Data[3] = 0x44;
|
||||
|
||||
//uint32_t last_time = get_timer(0);
|
||||
txmsg.DLC = 8;
|
||||
txmsg.Data[0] = Get_sys_tcs_on_off()?0x8:0x00;
|
||||
|
||||
for (;;) {
|
||||
txmsg.Data[0] = Get_sys_tcs_on_off()?0x8:0x00;
|
||||
iCanWrite(cap, &txmsg, 1, 0);
|
||||
|
||||
//printf("%d us.\n", get_timer(last_time));
|
||||
//last_time = get_timer(0);
|
||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t can101_flag = 0;
|
||||
static void can_rxdemo_thread(void *param)
|
||||
{
|
||||
CanPort_t *cap = param;
|
||||
int tlv_data_value[8] = {0};
|
||||
|
||||
for (;;) {
|
||||
CanMsg rxmsg[8] = {0};
|
||||
int revlen;
|
||||
int i, j;
|
||||
|
||||
if ((revlen = iCanRead(cap, rxmsg, 8, pdMS_TO_TICKS(200))) > 0) {
|
||||
printf("can receive %d messages:\n", revlen);
|
||||
if ((revlen = iCanRead(cap, rxmsg, 8, pdMS_TO_TICKS(10))) > 0 && (Get_sys_power_on_self_test() == 100)) {
|
||||
for (i = 0; i < revlen; i++) {
|
||||
for (j = 0; j < rxmsg[i].DLC; j++)
|
||||
printf("%.2x, ", rxmsg[i].Data[j]);
|
||||
printf("\n");
|
||||
for (j = 0; j < rxmsg[i].DLC; j++){
|
||||
tlv_data_value[j] = rxmsg[i].Data[j];
|
||||
}
|
||||
// printf("can>> Id = %03x",rxmsg[i].StdId);
|
||||
switch(rxmsg[i].StdId){
|
||||
case 0x37B:
|
||||
tcsworking_event_handing(tlv_data_value);//TCS
|
||||
break;
|
||||
case 0x12B:
|
||||
tcsswitch_event_handing(tlv_data_value);//tcs开关
|
||||
break;
|
||||
case 0x401:
|
||||
break;
|
||||
case 0x402://ECU故障码
|
||||
break;
|
||||
case 0xA5://ABS故障码
|
||||
abs_dtc_event_handing(tlv_data_value);
|
||||
break;
|
||||
case 0xA3://ABS数据
|
||||
break;
|
||||
case 0x101://发送机数据
|
||||
if(can101_flag != 10)
|
||||
can101_flag = 10;
|
||||
speed_event_handing(tlv_data_value);
|
||||
break;
|
||||
default:break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -739,13 +765,13 @@ int can_demo(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
vCanInit(cap, CAN250kBaud, CAN_MODE_NORMAL);
|
||||
vCanInit(cap, CAN500kBaud, CAN_MODE_NORMAL);
|
||||
#if 1
|
||||
CAN_FilterInitTypeDef canfilter = {0};
|
||||
/* 只接收ID的第0位为1的帧 */
|
||||
canfilter.MODE = 1; /* 单滤波器模式 */
|
||||
canfilter.ID = 0x1;
|
||||
canfilter.IDMASK = 0x7fe;
|
||||
canfilter.ID = 0x37B;
|
||||
canfilter.IDMASK = 0x7ff;
|
||||
vCanSetFilter(cap, &canfilter);
|
||||
#endif
|
||||
|
||||
|
@ -160,6 +160,7 @@ struct dw_spi {
|
||||
void (*transfer_handler)(struct dw_spi *dws);
|
||||
u32 current_freq; /* frequency in hz */
|
||||
u32 current_qspi_freq;
|
||||
int xfer_ret;
|
||||
|
||||
/* DMA info */
|
||||
int dma_inited;
|
||||
@ -404,6 +405,7 @@ static void dma_transfer(struct dw_spi *dws)
|
||||
|
||||
dw_readl(dws, DW_SPI_ICR);
|
||||
int_error_stop(dws, "dma_transfer: fifo overrun/underrun");
|
||||
dws->xfer_ret = 1;
|
||||
xQueueSendFromISR(dws->xfer_done, NULL, 0);
|
||||
|
||||
return;
|
||||
@ -626,6 +628,7 @@ xfer_continue:
|
||||
if (ndf > 0xffff) ndf = 0xffff;
|
||||
|
||||
dws->dma_mapped = 1;
|
||||
dws->xfer_ret = 0;
|
||||
dws->rx = (u8*)message->recv_buf + xfer_len;
|
||||
dws->len = (ndf + 1) * dws->n_bytes;
|
||||
dws->rx_end = (u8*)dws->rx + dws->len;
|
||||
@ -721,11 +724,30 @@ xfer_continue:
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (dws->dma_mapped && dws->rx_dummy_buffer) {
|
||||
if (dws->xfer_ret) {
|
||||
dws->xfer_ret = 0;
|
||||
ret = -1;
|
||||
if (dws->dma_mapped)
|
||||
dma_stop_channel(dws->dma_rx);
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (dws->dma_mapped) {
|
||||
/* Invalidate cache after dma read, rx and len must align to cacheline(32bytes) */
|
||||
portDISABLE_INTERRUPTS();
|
||||
if (dws->rx_dummy_buffer)
|
||||
CP15_invalidate_dcache_for_dma((uint32_t)dws->rx_dummy_buffer,
|
||||
(uint32_t)dws->rx_dummy_buffer + dws->len);
|
||||
else
|
||||
CP15_invalidate_dcache_for_dma((uint32_t)dws->rx, (uint32_t)dws->rx + dws->len);
|
||||
portENABLE_INTERRUPTS();
|
||||
|
||||
if (dws->rx_dummy_buffer) {
|
||||
memcpy(dws->rx, dws->rx_dummy_buffer, dws->len);
|
||||
vPortFree(dws->rx_dummy_buffer);
|
||||
dws->rx_dummy_buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
dma_stop_channel(dws->dma_rx);
|
||||
|
||||
@ -764,8 +786,7 @@ int dw_spi_setup(struct spi_slave *slave, struct spi_configuration *configuratio
|
||||
chip->qspi_clk_div = (DIV_ROUND_UP(dws->max_freq, configuration->qspi_max_hz) + 1) & 0xfffe;
|
||||
dws->current_freq = dws->max_freq / chip->clk_div;
|
||||
dws->current_qspi_freq = dws->max_freq / chip->qspi_clk_div;
|
||||
printf("spi max_freq %u, current freq %u, qspi_freq %u.\n", dws->max_freq,
|
||||
dws->current_freq, dws->current_qspi_freq);
|
||||
printf("spi max_freq %u, current freq %u, qspi_freq %u.\n", dws->max_freq, dws->current_freq, dws->current_qspi_freq);
|
||||
|
||||
gpio_direction_output(dws->cs_gpio,
|
||||
!(dws->slave.mode & SPI_CS_HIGH));
|
||||
@ -909,7 +930,7 @@ static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_message *message)
|
||||
cfg.direction = DMA_DEV_TO_MEM;
|
||||
cfg.src_addr = REGS_SPI0_BASE + DW_SPI_DR;
|
||||
//if (((u32)dws->rx/* | dws->len*/) & (ARCH_DMA_MINALIGN - 1)) {
|
||||
if ((u32)dws->rx & 3) {
|
||||
if ((u32)dws->rx & 31) {
|
||||
dws->rx_dummy_buffer = pvPortMalloc(dws->len);
|
||||
if (!dws->rx_dummy_buffer)
|
||||
return -ENOMEM;
|
||||
|
@ -147,7 +147,7 @@ static xPinGroup_t pin_groups[] = {
|
||||
{.groupid = PGRP_I2C1, .pins_num = 2, .pins = {{50, 1}, {51, 1}}},
|
||||
{.groupid = PGRP_LCD_TTL_CH0, .pins_num = 28,
|
||||
/* de clk vynsc hsync */
|
||||
.pins = {{88, 1}, {89, 1, PAD_DRIVE_2MA}, {90, 1}, {91, 1},
|
||||
.pins = {{88, 1}, {89, 1, PAD_DRIVE_2MA}, {90, 0}, {91, 0},
|
||||
{64, 1}, {65, 1}, {66, 1}, {67, 1}, {68, 1}, {69, 1}, {70, 1}, {71, 1}, /* B0-B7 */
|
||||
{72, 1}, {73, 1}, {74, 1}, {75, 1}, {76, 1}, {77, 1}, {78, 1}, {79, 1}, /* G0-G7 */
|
||||
{80, 1}, {81, 1}, {82, 1}, {83, 1}, {84, 1}, {85, 1}, {86, 1}, {87, 1},}}, /* R0-R7 */
|
||||
@ -316,6 +316,7 @@ void vPinctrlSetup(void)
|
||||
#endif
|
||||
pinctrl_set_group(PGRP_ITU_CH1_INV);
|
||||
pinctrl_set_group(PGRP_CAN0_CH0);
|
||||
|
||||
|
||||
#ifdef AUDIO_REPLAY
|
||||
#if (AUDIO_REPLAY_I2S == I2S_ID1)
|
||||
|
@ -12,13 +12,13 @@
|
||||
#ifndef WITH_MVVM
|
||||
|
||||
SfudData_t sfud_data_saved ={0};
|
||||
#define SFUD_DATA_FLASH_OFFSET 0xfff000
|
||||
#define SFUD_DATA_FLASH_OFFSET 0x1fff000 //32Mflash
|
||||
SfudMileData_t sfud_mile_data ={0};
|
||||
static uint32_t save_addr = 0;
|
||||
static uint16_t User_data_index = 0;
|
||||
#define SFUD_MILE_DATA_FLASH_OFFSET 0xffe000//0xffe000
|
||||
#define MILE_FLASH_OFFSET 0x1000
|
||||
|
||||
/*
|
||||
void read_mileage(uint32_t trip_data,uint32_t total_data)
|
||||
{
|
||||
uint32_t i;
|
||||
@ -96,7 +96,7 @@ void SaveMileageData(uint32_t trip_data,uint32_t total_data){
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
void Classify_SaveDataToFlash(SfudData_t user_data,uint8_t type){
|
||||
uint8_t buff[sizeof(SfudData_t)];//定义buff用于保存结构体
|
||||
memset(buff,0,sizeof(buff));//将buff内存清零
|
||||
@ -137,20 +137,20 @@ void Classify_SaveDataToFlash(SfudData_t user_data,uint8_t type){
|
||||
void SaveDataToFlash(SfudData_t user_data){
|
||||
uint8_t buff[sizeof(SfudData_t)];//定义buff用于保存结构体
|
||||
memset(buff,0,sizeof(buff));//将buff内存清零
|
||||
printf("**************save flash***********************\r\n");
|
||||
// printf("**************save flash***********************\r\n");
|
||||
// printf("user_data==> %d-%d-%d-%d-%d,%d",user_data.language,user_data.display_unit,user_data.theme
|
||||
// ,user_data.theme_state,user_data.light_value,user_data.bt_on_off);
|
||||
printf("mac:%02X%02X%02X%02X%02X%02X , %02X%02X%02X%02X%02X%02X end\r\n",user_data.f_mac_address[0],user_data.f_mac_address[1],user_data.f_mac_address[2]
|
||||
,user_data.f_mac_address[3],user_data.f_mac_address[4],user_data.f_mac_address[5]
|
||||
,user_data.r_mac_address[0],user_data.r_mac_address[1],user_data.r_mac_address[2]
|
||||
,user_data.r_mac_address[3],user_data.r_mac_address[4],user_data.r_mac_address[5]);
|
||||
// printf("mac:%02X%02X%02X%02X%02X%02X , %02X%02X%02X%02X%02X%02X end\r\n",user_data.f_mac_address[0],user_data.f_mac_address[1],user_data.f_mac_address[2]
|
||||
// ,user_data.f_mac_address[3],user_data.f_mac_address[4],user_data.f_mac_address[5]
|
||||
// ,user_data.r_mac_address[0],user_data.r_mac_address[1],user_data.r_mac_address[2]
|
||||
// ,user_data.r_mac_address[3],user_data.r_mac_address[4],user_data.r_mac_address[5]);
|
||||
// printf("data:%02X %02X%02X , %02X %02X%02X end\r\n"
|
||||
// ,user_data.f_mac_address[6],user_data.f_mac_address[7],user_data.f_mac_address[8]
|
||||
// ,user_data.r_mac_address[6],user_data.r_mac_address[7],user_data.r_mac_address[8]);
|
||||
// printf("*************************************\r\n");
|
||||
// printf("mile data: %02X,%02X end\r\n"
|
||||
// ,user_data.maintenance_mileage,user_data.mileage_flag);
|
||||
printf("*************************************\r\n");
|
||||
// printf("*************************************\r\n");
|
||||
|
||||
if(user_data.light_value==0)
|
||||
user_data.light_value=1;
|
||||
@ -169,7 +169,10 @@ void SaveDataToFlash(SfudData_t user_data){
|
||||
strcpy(((SfudData_t *)buff)->r_mac_address,user_data.r_mac_address);
|
||||
((SfudData_t *)buff)->maintenance_mileage = user_data.maintenance_mileage;
|
||||
((SfudData_t *)buff)->mileage_flag = user_data.mileage_flag;
|
||||
|
||||
((SfudData_t *)buff)->display_mileage = user_data.display_mileage;
|
||||
((SfudData_t *)buff)->tcs_on_off = user_data.tcs_on_off;
|
||||
((SfudData_t *)buff)->mile_state = user_data.mile_state;
|
||||
|
||||
sfud_flash *sflash = sfud_get_device(0);
|
||||
if (sfud_erase_write(sflash,SFUD_DATA_FLASH_OFFSET,sizeof(buff),buff)!=SFUD_SUCCESS){
|
||||
printf("sfud data write error.\r\n");
|
||||
|
@ -833,7 +833,7 @@ static int uup_rx_data_len = 0;
|
||||
#if DEVICE_TYPE_SELECT != EMMC_FLASH
|
||||
#include "ff_sfdisk.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
typedef enum {
|
||||
UART_FRAME_START,
|
||||
UART_FRAME_FILEINFO,
|
||||
@ -855,8 +855,8 @@ typedef enum {
|
||||
#define UUP_MAX_FILE_SIZE 0x1000000
|
||||
#define UUP_RX_FRAME_NUM 16
|
||||
#define UUP_MAX_LOADER_SIZE STEPLDR_MAX_SIZE//0x10000
|
||||
|
||||
static int uup_status = UUP_STATE_IDLE;
|
||||
*/
|
||||
// static int uup_status = UUP_STATE_IDLE;
|
||||
static int uup_file_type = 0;
|
||||
static int uup_file_size = 0;
|
||||
static int uup_packet_num = 0;
|
||||
@ -877,7 +877,7 @@ static void uup_send_ack(UartPort_t *uap, int type, int ret)
|
||||
|
||||
iUartWrite(uap, buf, 7, pdMS_TO_TICKS(100));
|
||||
}
|
||||
|
||||
#if 0
|
||||
void uup_ota_update(UartPort_t *uap, uint8_t *framebuf, size_t len)
|
||||
{
|
||||
int frametype = framebuf[0];
|
||||
@ -1009,6 +1009,9 @@ void uup_ota_update(UartPort_t *uap, uint8_t *framebuf, size_t len)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
static void uart_tx_demo_thread(void *param)
|
||||
{
|
||||
|
@ -69,25 +69,25 @@ static void protocol_uart_tx_thread(void *param)
|
||||
for (;;)
|
||||
{
|
||||
if(uart_tx_flag){
|
||||
if (uart_time_request[0] != 0 && uart_time_request[0] == 0xAA)
|
||||
if (uart_time_request[0] != 0 && (uart_time_request[0] == 0xAA || uart_time_request[0] == 0x27))
|
||||
{
|
||||
//printf("UART3 tx-->>> ");
|
||||
// printf("UART3 tx-->>> ");
|
||||
for (uint8_t i = 0; i < 9; i++)
|
||||
{
|
||||
//printf("%02x ", uart_time_request[i]);
|
||||
// printf("%02x ", uart_time_request[i]);
|
||||
uarttx[i] = uart_time_request[i];
|
||||
}
|
||||
if(uart_time_request[1]==0x10){
|
||||
for (uint8_t i = 9; i < 19; i++)
|
||||
{
|
||||
//printf("%02x ", uart_time_request[i]);
|
||||
// printf("%02x ", uart_time_request[i]);
|
||||
uarttx[i] = uart_time_request[i];
|
||||
}
|
||||
//printf("\r\n");
|
||||
// printf("\r\n");
|
||||
iUartWrite(uap, uarttx, 19, pdMS_TO_TICKS(100)); // 发送数据
|
||||
uart_time_request[0] = 0;
|
||||
}else{
|
||||
//printf("\r\n");
|
||||
// printf("\r\n");
|
||||
iUartWrite(uap, uarttx, 9, pdMS_TO_TICKS(100)); // 发送数据
|
||||
uart_time_request[0] = 0;
|
||||
}
|
||||
@ -126,7 +126,10 @@ static uint16_t calculate_cumulative_sum(uint8_t *buf)
|
||||
|
||||
return sum;
|
||||
}
|
||||
extern uint8_t uart3_flag;
|
||||
uint8_t device_flag = 0;
|
||||
uint8_t data_analysis_flag = 0;
|
||||
uint8_t data_count_flag = 0;
|
||||
uint8_t uart3_flag = 0;
|
||||
static void protocol_uart_rx_thread(void *param)
|
||||
{
|
||||
UartPort_t *uap = xUartOpen(UART_BT_PORT);
|
||||
@ -139,7 +142,7 @@ static void protocol_uart_rx_thread(void *param)
|
||||
|
||||
int i;
|
||||
uint8_t tlv_data_value[128] = {0};
|
||||
unsigned char ota_request[8] = {0x7e,0x00,0x05,0x02,0x03,0x01,0x00,0x01};
|
||||
// unsigned char ota_request[8] = {0x7e,0x00,0x05,0x02,0x03,0x01,0x00,0x01};
|
||||
uint32_t sum = 0;
|
||||
uint8_t equipment_data = 0;
|
||||
uint8_t mac_data = 0;
|
||||
@ -164,142 +167,152 @@ static void protocol_uart_rx_thread(void *param)
|
||||
for (;;)
|
||||
{
|
||||
len = iUartRead(uap, uartrx, BUFFER_LEN, pdMS_TO_TICKS(10));
|
||||
if(uart3_flag){
|
||||
if(len==0)
|
||||
uart3_flag = 0;
|
||||
else
|
||||
printf("len!=0.\r\n");
|
||||
}else if(Get_sys_power_on_self_test() != 150){
|
||||
|
||||
for(i=0;i<len;i++){
|
||||
switch (upgrade_state) {
|
||||
case 0:
|
||||
if (uartrx[i] == 0xAA){
|
||||
upgrade_state++;
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
equipment_data = 0;
|
||||
mac_data = 0;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (uartrx[i] == 0x18){
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
data_len = uartrx[i];
|
||||
upgrade_state++;
|
||||
}else if(uartrx[i] == 0x1b){
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
data_len = uartrx[i];
|
||||
upgrade_state++;
|
||||
mac_data = 1;
|
||||
}else if(uartrx[i] == 0x47){
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
data_len = uartrx[i];
|
||||
upgrade_state++;
|
||||
equipment_data = 1;
|
||||
}else
|
||||
upgrade_state = 0;
|
||||
break;
|
||||
case 2:
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
if(str_len > data_len+1){
|
||||
if(Get_sys_power_on_self_test() != 150 ){
|
||||
if(device_flag)
|
||||
data_count_flag++;
|
||||
for(i=0;i<len;i++){
|
||||
switch (upgrade_state) {
|
||||
case 0:
|
||||
if (uartrx[i] == 0xAA){
|
||||
upgrade_state++;
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
equipment_data = 0;
|
||||
mac_data = 0;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (uartrx[i] == 0x0a){
|
||||
sum = calculate_cumulative_sum(tlv_data_value);
|
||||
if(sum != tlv_data_value[str_len-1]){
|
||||
//printf("error.\r\n");
|
||||
case 1:
|
||||
if (uartrx[i] == 0x18){
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
data_len = uartrx[i];
|
||||
upgrade_state++;
|
||||
}else if(uartrx[i] == 0x1b){
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
data_len = uartrx[i];
|
||||
upgrade_state++;
|
||||
mac_data = 1;
|
||||
}else if(uartrx[i] == 0x47){
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
data_len = uartrx[i];
|
||||
upgrade_state++;
|
||||
equipment_data = 1;
|
||||
}else
|
||||
upgrade_state = 0;
|
||||
break;
|
||||
case 2:
|
||||
tlv_data_value[str_len] = uartrx[i];
|
||||
str_len++;
|
||||
if(str_len > data_len+1){
|
||||
upgrade_state++;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (uartrx[i] == 0x0a){
|
||||
sum = calculate_cumulative_sum(tlv_data_value);
|
||||
if(sum != tlv_data_value[str_len-1]){
|
||||
printf("error.\r\n");
|
||||
}else{
|
||||
if(equipment_data){
|
||||
device_data_analysis(tlv_data_value);
|
||||
equipment_data = 0;
|
||||
if(!data_analysis_flag)
|
||||
device_flag = 1;
|
||||
}else if(mac_data){
|
||||
tire_pressure_data_analysis(tlv_data_value);
|
||||
mac_data = 0;
|
||||
}else{
|
||||
data_analysis(tlv_data_value);
|
||||
if(!data_analysis_flag)
|
||||
data_analysis_flag = 1;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(equipment_data){
|
||||
device_data_analysis(tlv_data_value);
|
||||
equipment_data = 0;
|
||||
}else if(mac_data){
|
||||
tire_pressure_data_analysis(tlv_data_value);
|
||||
mac_data = 0;
|
||||
}else
|
||||
data_analysis(tlv_data_value);
|
||||
printf("\nuartrx[i] = %x .\n",uartrx[i]);
|
||||
}
|
||||
// }else{
|
||||
//DEBUG_PRINT("\nuartrx[i] = %x .\n",uartrx[i]);
|
||||
upgrade_state=0;
|
||||
str_len = 0;
|
||||
data_len = 0;
|
||||
break;
|
||||
}
|
||||
upgrade_state=0;
|
||||
str_len = 0;
|
||||
data_len = 0;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
switch (uup_rx_state) {
|
||||
case 0:
|
||||
if (uartrx[i] == 0x7e)
|
||||
uup_rx_state++;
|
||||
break;
|
||||
case 1:
|
||||
if (uartrx[i] == 0x05)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 2:
|
||||
if (uartrx[i] == 0x02)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 3:
|
||||
if (uartrx[i] == 0x03)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 4:
|
||||
if (uartrx[i] == 0x01)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 5:
|
||||
if (uartrx[i] == Get_sys_softwar_host())
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 6:
|
||||
if (uartrx[i] == Get_sys_softwar_order()){
|
||||
if(Get_sys_veer_velocity()){
|
||||
//DEBUG_PRINT("error ota sj. Speed present\n");
|
||||
ota_request[1] = 0x01;
|
||||
ota_request[6] = Get_sys_softwar_host();
|
||||
ota_request[7] = Get_sys_softwar_order();
|
||||
TXCMD_Other_Set(ota_request,8);
|
||||
}else{
|
||||
//DEBUG_PRINT("enter ota sj.\n");
|
||||
Set_sys_power_on_self_test(150);
|
||||
// extern uint8_t now_theme_state;
|
||||
// now_theme_state = 5;
|
||||
Set_sys_upgrade_Flag(1);//进入ota界面
|
||||
|
||||
ota_request[6] = Get_sys_softwar_host();
|
||||
ota_request[7] = Get_sys_softwar_order();
|
||||
vTaskDelay(100);
|
||||
TXCMD_Other_Set(ota_request,8);
|
||||
|
||||
if(timeout)
|
||||
timeout=0;
|
||||
switch (uup_rx_state) {
|
||||
case 0:
|
||||
if (uartrx[i] == 0x7e)
|
||||
uup_rx_state++;
|
||||
break;
|
||||
case 1:
|
||||
if (uartrx[i] == 0x05)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 2:
|
||||
if (uartrx[i] == 0x02)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 3:
|
||||
if (uartrx[i] == 0x03)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 4:
|
||||
if (uartrx[i] == 0x01)
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 5:
|
||||
if (uartrx[i] == Get_sys_softwar_host())
|
||||
uup_rx_state++;
|
||||
else
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
case 6:
|
||||
if (uartrx[i] == Get_sys_softwar_order()){
|
||||
if(Get_sys_veer_velocity()){
|
||||
printf("error ota sj. Speed present\n");
|
||||
// ota_request[1] = 0x01;
|
||||
// ota_request[6] = Get_sys_softwar_host();
|
||||
// ota_request[7] = Get_sys_softwar_order();
|
||||
// TXCMD_Other_Set(ota_request,8);
|
||||
Send_ota_state(1);
|
||||
}else{
|
||||
printf("enter ota sj.\n");
|
||||
Set_sys_power_on_self_test(150);
|
||||
Set_sys_upgrade_Flag(1);//进入ota界面
|
||||
|
||||
// ota_request[6] = Get_sys_softwar_host();
|
||||
// ota_request[7] = Get_sys_softwar_order();
|
||||
Send_ota_state(0);
|
||||
|
||||
if(timeout)
|
||||
timeout=0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
}
|
||||
uup_rx_state = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if((!data_analysis_flag) && data_count_flag == 50){
|
||||
data_count_flag = 0;
|
||||
if(uart3_flag){
|
||||
printf("uart3 open .\r\n");
|
||||
UART3_Type_regression();
|
||||
uart3_flag = 0;
|
||||
}else{
|
||||
printf("uart3 close .\r\n");
|
||||
UART3_Modification_Type();
|
||||
uart3_flag = 1;
|
||||
}
|
||||
}
|
||||
}else{//升级逻辑
|
||||
timeout ++;
|
||||
for (i = 0; i < len; i++) {
|
||||
@ -335,7 +348,7 @@ static void protocol_uart_rx_thread(void *param)
|
||||
//uup_rx_data_len |= uartrx[i];
|
||||
uup_rx_data_len = (uartrx[i]<<8) | uup_rx_data_len;
|
||||
if((uup_rx_data_len > UUP_PACKET_A27_SIZE + 2)) { //4096 + 2
|
||||
//DEBUG_PRINT("Invalid uup_rx_data_len %d\n", uup_rx_data_len);
|
||||
printf("Invalid uup_rx_data_len %d\n", uup_rx_data_len);
|
||||
uup_rx_state = 0;
|
||||
} else {
|
||||
uup_rx_state++;
|
||||
@ -365,27 +378,25 @@ static void protocol_uart_rx_thread(void *param)
|
||||
len = buf[3]<<8 | len;
|
||||
for (i = 0; i < len + 4; i++)
|
||||
checksum ^= buf[i];
|
||||
////DEBUG_PRINT("checksum = 0x%x , buf[len + 4] = 0x%x\n",checksum,buf[len + 4]);
|
||||
//printf("checksum = 0x%x , buf[len + 4] = 0x%x\n",checksum,buf[len + 4]);
|
||||
if (checksum == buf[len + 4]) {
|
||||
timeout =0;
|
||||
// uup_ota_update(uap, buf + 4, len);
|
||||
//DEBUG_PRINT("rev frame checksum err.\n");
|
||||
uup_ota_update(uap, buf + 4, len);
|
||||
} else {
|
||||
printf("rev frame checksum err.\r\n");
|
||||
}
|
||||
uup_rx_tail = (uup_rx_tail + 1) % UUP_RX_FRAME_NUM;
|
||||
}
|
||||
|
||||
if(timeout >= 3000){//超时退出升级 大约40s
|
||||
//DEBUG_PRINT("exit ota sj.\n");
|
||||
printf("exit ota sj.\n");
|
||||
Set_sys_power_on_self_test(100);
|
||||
Set_sys_upgrade_Flag(2);
|
||||
//DEBUG_PRINT("UART3_Type_regression .\n");
|
||||
printf("UART3_Type_regression .\n");
|
||||
extern void UART3_Type_regression(void);
|
||||
UART3_Type_regression();
|
||||
timeout = 0;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user