A27两个不同版本的UI合并到同一个工程

This commit is contained in:
2025-07-10 15:16:58 +08:00
parent caf35e2429
commit f0d004e8c5
542 changed files with 53381 additions and 32365 deletions

View File

@ -52,296 +52,8 @@ static uint8_t file_state = UART_FILE_NORMAL;//文件接收状态
static uint8_t uup_file_type = UART_FILE_NORMAL;//文件接收状态
uint8_t wifi_file_state = UART_FILE_NORMAL;//文件接收状态
#define BYTESPERPAGE 256
#define PAGESPERSECTORS 32//32//16
#define UUP_BUF_SIZE (BYTESPERPAGE * PAGESPERSECTORS)
#define NEW_APPLDR_CHECKSUM_OFFSET 0x14
static unsigned int checksum = 0,calc_checksum = 0xffffffff,test_checksum = 0xffffffff;
#define NEW_APPFOOSET 0x17F0000
#define AMT630_BIN_MAX_SIZE 0x700000
static uint32_t uup_burn_offset;
// static unsigned char uup_buf[4096];
static unsigned char uup_buf[8192];
static unsigned int uup_buf_len = 0;
static unsigned int uup_buf_len_detection = 0;
static uint8_t checksum_flag = 0;
static int test_flag = 0;
// static int number = 0;
static void ota_update(char *framebuf, size_t len)
{
unsigned int framelen;
framelen = len;
sfud_flash *sflash = sfud_get_device(0);
if(strcmp(framebuf, "AT_OTA_FINISH") == 0){
if(file_state == UART_FILE_FILEXFER)
file_state = UART_FILE_FINISH;
}
switch(file_state){
case UART_FILE_NORMAL://检测是否是升级
if(strcmp(framebuf, "AT_OTA_START") == 0)
file_state = UART_FILE_TYPE;
break;
case UART_FILE_TYPE://检测传输文件类型
if(strncmp(framebuf, "AT_OTA_TYPE=",12) == 0 && (framelen == 13)){
uup_file_type = framebuf[12] - '0';
printf("uup_file_type = %d .\r\n",uup_file_type);
if(uup_file_type<6){
//擦除flash
uup_burn_offset = NEW_APPFOOSET;
printf("start erase add %X , size %X .\r\n",uup_burn_offset,AMT630_BIN_MAX_SIZE);
if(sfud_erase(sflash, uup_burn_offset, AMT630_BIN_MAX_SIZE)==SFUD_SUCCESS){
vTaskDelay(100);
printf("UART_FRAME_START sfud erase ok.\n");
}else{
vTaskDelay(100);
printf("UART_FRAME_START sfud erase fail.\n");
}
checksum_flag = 1;
calc_checksum = 0xffffffff;
test_checksum = 0xffffffff;
test_flag = 0;
uup_buf_len =0;
checksum = 0;
// number = 0;
file_state = UART_FILE_START;
}else
file_state = UART_FILE_NORMAL;
}else{
file_state = UART_FILE_NORMAL;
}
break;
case UART_FILE_START://第一包数据 用于获取当前数据包的校验和
if (uup_file_type == UART_FILE_AMT630H) {//代码文件
unsigned int magic = framebuf[0] | (framebuf[1] << 8) | (framebuf[2] << 16) | (framebuf[3] << 24);
if (magic != UPFILE_APP_MAGIC) {
printf("Wrong app file magic. 0x%08X\n",magic);
file_state = UART_FILE_NORMAL;
break;
}
unsigned char *tmp = framebuf + NEW_APPLDR_CHECKSUM_OFFSET;
checksum = tmp[0] | (tmp[1] <<8) | (tmp[2] << 16) | (tmp[3] << 24);
}else if (uup_file_type == UART_FILE_BOOTANIM) {//动画文件
BANIHEADER *header = (BANIHEADER *)&framebuf[0];
if (header->magic != MKTAG('B', 'A', 'N', 'I')) {
printf("Wrong animation file magic.\n");
file_state = UART_FILE_NORMAL;
break;
}
checksum = header->checksum;
}else if (uup_file_type == UART_FILE_ROM) {//资源文件
RomHeader *header = (RomHeader *)&framebuf[0];
if (header->magic != MKTAG('R', 'O', 'M', 'A')) {
printf("Wrong resource file magic.\n");
file_state = UART_FILE_NORMAL;
break;
}
checksum = header->checksum;
}
printf("uup_file_type = %d ,No1.checksum = 0x%X\n",uup_file_type,checksum);
uup_buf_len_detection = (uup_buf_len + framelen)>UUP_BUF_SIZE?(UUP_BUF_SIZE-uup_buf_len):0;
// printf("1-- framelen = %d uup_buf_len_detection = %d .\r\n",framelen,uup_buf_len_detection);
if(!uup_buf_len_detection){
memcpy(uup_buf + uup_buf_len, framebuf, framelen);
uup_buf_len += framelen;
if (uup_buf_len == UUP_BUF_SIZE) {
if(!checksum_flag)
test_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, test_checksum);//计算校验和
sfud_write(sflash, uup_burn_offset, UUP_BUF_SIZE, uup_buf);
if(checksum_flag){
if (uup_file_type == UART_FILE_AMT630H) {//代码文件
unsigned int *tmp = (unsigned int *)(uup_buf + NEW_APPLDR_CHECKSUM_OFFSET);
*tmp = 0;
}else if (uup_file_type == UART_FILE_BOOTANIM) {//动画文件
BANIHEADER *pheader = (BANIHEADER *)uup_buf;
pheader->checksum = 0;
}else if (uup_file_type == UART_FILE_ROM) {//资源文件
RomHeader *pheader = (RomHeader *)uup_buf;
pheader->checksum = 0;
}
checksum_flag = 0;
test_flag = 1;
}
calc_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, calc_checksum);//计算校验和
if(test_flag){
test_checksum = calc_checksum;
printf("test_checksum == calc_checksum 0x%08X.\r\n",test_checksum);
test_flag = 0;
}
if(calc_checksum != test_checksum){
printf("error!!!test_checksum=0x%08X,calc_checksum=0x%08X.\r\n",test_checksum,calc_checksum);
}
uup_buf_len =0;
uup_burn_offset += UUP_BUF_SIZE;
//number++;
//printf("number =%d,checksum = 0x%08X.\n",number,calc_checksum,checksum);
}
}else{
memcpy(uup_buf + uup_buf_len, framebuf, uup_buf_len_detection);
uup_buf_len += uup_buf_len_detection;
if (uup_buf_len == UUP_BUF_SIZE) {
if(!checksum_flag)
test_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, test_checksum);//计算校验和
sfud_write(sflash, uup_burn_offset, UUP_BUF_SIZE, uup_buf);
if(checksum_flag){
if (uup_file_type == UART_FILE_AMT630H) {//代码文件
unsigned int *tmp = (unsigned int *)(uup_buf + NEW_APPLDR_CHECKSUM_OFFSET);
*tmp = 0;
}else if (uup_file_type == UART_FILE_BOOTANIM) {//动画文件
BANIHEADER *pheader = (BANIHEADER *)uup_buf;
pheader->checksum = 0;
}else if (uup_file_type == UART_FILE_ROM) {//资源文件
RomHeader *pheader = (RomHeader *)uup_buf;
pheader->checksum = 0;
unsigned int *tmp = (unsigned int *)(uup_buf + 0x0F);
}
checksum_flag = 0;
test_flag = 1;
}
calc_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, calc_checksum);//计算校验和
if(test_flag){
test_checksum = calc_checksum;
printf("test_checksum == calc_checksum 0x%08X.\r\n",test_checksum);
test_flag = 0;
}
if(calc_checksum != test_checksum){
printf("error!!!test_checksum=0x%08X,calc_checksum=0x%08X.\r\n",test_checksum,calc_checksum);
}
uup_buf_len =0;
uup_burn_offset += UUP_BUF_SIZE;
//number++;
//printf("number =%d,checksum = 0x%08X.\n",number,calc_checksum,checksum);
}
// printf("2-- (framelen - uup_buf_len_detection) = %d .\r\n",(framelen - uup_buf_len_detection));
memcpy(uup_buf + uup_buf_len, framebuf, (framelen - uup_buf_len_detection));
uup_buf_len += (framelen - uup_buf_len_detection);
}
// printf(">>UART_FILE_FILEXFER.\r\n");
file_state = UART_FILE_FILEXFER;
break;
case UART_FILE_FILEXFER://传输过程中
uup_buf_len_detection = (uup_buf_len + framelen)>UUP_BUF_SIZE?(UUP_BUF_SIZE-uup_buf_len):0;
// printf("uup_buf_len_detection=%d.\r\n",uup_buf_len_detection);
if(!uup_buf_len_detection){
memcpy(uup_buf + uup_buf_len, framebuf, framelen);
uup_buf_len += framelen;
// printf("uup_buf_len = %d .\r\n",uup_buf_len);
if (uup_buf_len == UUP_BUF_SIZE) {
if(!checksum_flag)
test_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, test_checksum);//计算校验和
sfud_write(sflash, uup_burn_offset, UUP_BUF_SIZE, uup_buf);
if(checksum_flag){
if (uup_file_type == UART_FILE_AMT630H) {//代码文件
unsigned int *tmp = (unsigned int *)(uup_buf + NEW_APPLDR_CHECKSUM_OFFSET);
*tmp = 0;
}else if (uup_file_type == UART_FILE_BOOTANIM) {//动画文件
BANIHEADER *pheader = (BANIHEADER *)uup_buf;
pheader->checksum = 0;
}else if (uup_file_type == UART_FILE_ROM) {//资源文件
RomHeader *pheader = (RomHeader *)uup_buf;
pheader->checksum = 0;
unsigned int *tmp = (unsigned int *)(uup_buf + 0x0F);
}
checksum_flag = 0;
test_flag = 1;
}
calc_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, calc_checksum);//计算校验和
if(test_flag){
test_checksum = calc_checksum;
printf("test_checksum == calc_checksum 0x%08X.\r\n",test_checksum);
test_flag = 0;
}
if(calc_checksum != test_checksum){
printf("error!!!test_checksum=0x%08X,calc_checksum=0x%08X.\r\n",test_checksum,calc_checksum);
}
uup_buf_len =0;
uup_burn_offset += UUP_BUF_SIZE;
//number++;
//printf("number =%d,checksum = 0x%08X.\n",number,calc_checksum,checksum);
}
}else{
memcpy(uup_buf + uup_buf_len, framebuf, uup_buf_len_detection);
uup_buf_len += uup_buf_len_detection;
// printf("2---------------- uup_buf_len = %d .\r\n",uup_buf_len);
if (uup_buf_len == UUP_BUF_SIZE) {
if(!checksum_flag)
test_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, test_checksum);//计算校验和
sfud_write(sflash, uup_burn_offset, UUP_BUF_SIZE, uup_buf);
if(checksum_flag){
if (uup_file_type == UART_FILE_AMT630H) {//代码文件
unsigned int *tmp = (unsigned int *)(uup_buf + NEW_APPLDR_CHECKSUM_OFFSET);
*tmp = 0;
}else if (uup_file_type == UART_FILE_BOOTANIM) {//动画文件
BANIHEADER *pheader = (BANIHEADER *)uup_buf;
pheader->checksum = 0;
}else if (uup_file_type == UART_FILE_ROM) {//资源文件
RomHeader *pheader = (RomHeader *)uup_buf;
pheader->checksum = 0;
unsigned int *tmp = (unsigned int *)(uup_buf + 0x0F);
}
checksum_flag = 0;
test_flag = 1;
}
calc_checksum = xcrc32(uup_buf, UUP_BUF_SIZE, calc_checksum);//计算校验和
if(test_flag){
test_checksum = calc_checksum;
printf("test_checksum == calc_checksum 0x%08X.\r\n",test_checksum);
test_flag = 0;
}
if(calc_checksum != test_checksum){
printf("error!!!test_checksum=0x%08X,calc_checksum=0x%08X.\r\n",test_checksum,calc_checksum);
}
uup_buf_len =0;
uup_burn_offset += UUP_BUF_SIZE;
// number++;
// printf("number =%d,checksum = 0x%08X.\n",number,calc_checksum,checksum);
}
memcpy(uup_buf + uup_buf_len, framebuf, (framelen - uup_buf_len_detection));
uup_buf_len += (framelen - uup_buf_len_detection);
// printf("2----uup_buf_len = %d .\r\n",uup_buf_len);
}
// file_state = UART_FILE_FILEXFER;
break;
case UART_FILE_FINISH://传输完成
if(uup_buf_len){//若最后一包数据不为0 则存数据并且继续计算校验和
sfud_write(sflash, uup_burn_offset, uup_buf_len, uup_buf);
test_checksum = xcrc32(uup_buf, uup_buf_len, test_checksum);//计算校验和
calc_checksum = xcrc32(uup_buf, uup_buf_len, calc_checksum);
printf("enter2 uup_buf_len =%d calc_checksum================0x%08X,test_checksum=0x%08X\n",uup_buf_len,calc_checksum,test_checksum);
}
printf("calc_checksum = 0x%08X,checksum = 0x%08X.\n",calc_checksum,checksum);
printf("test_checksum=0x%08X.\r\n",test_checksum);
if (calc_checksum != checksum) {
printf("fail !!!!!!!!!!!!\n");
}else
printf("whole crc check after burn ok!\n");
file_state = UART_FILE_NORMAL;
break;
default:
break;
}
if(file_state != UART_FILE_FILEXFER)
printf("now > file_state = %d .\r\n",file_state);
}
static int uup_rx_state = 0;
#define UUP_PACKET_SIZE 128
#define UUP_MAX_FRAME_LEN (UUP_PACKET_SIZE + 16)
@ -438,7 +150,6 @@ static void wifi_update_judge(char *uartrx, size_t len){
uup_rx_state++;
wifi_ota_request[6] = Get_sys_softwar_host();
}else{
uup_rx_state = 0;
}
break;
@ -559,15 +270,9 @@ static void wifi_ota_update(char *framebuf, size_t len)
wifi_update_judge(framebuf,len);//升级判断
printf("wifi_file_state > %d.\r\n",wifi_file_state);
break;
// case UART_FILE_TYPE://检测传输文件类型
// break;
case UART_FILE_START://升级流程
wifi_update_technological_process(framebuf,len);//升级流程
break;
// case UART_FILE_FILEXFER://传输过程中
// break;
// case UART_FILE_FINISH://传输完成
// break;
default:
break;
}
@ -659,13 +364,8 @@ void app_wifi_update_demo(void)
printf("client is disconnected\r\n");
continue;
}
// printf("recv len:%d.\r\n", ret);
if(timeout)
timeout = 0;
// if(ret<100)
// printf("recv len:%d %s\r\n", ret, buf);
// else
// printf("recv len:%d.\r\n", ret);
wifi_ota_update(buf,ret);
memset(buf, 0, sizeof(buf));
}
@ -680,11 +380,7 @@ exit:
static void wifi_update_rx_thread(void *param)
{
// vTaskDelay(7000);
// while(1){
app_wifi_update_demo();
// vTaskDelay(3000);
// }
app_wifi_update_demo();
}
int wifi_update_init(void){
@ -698,120 +394,3 @@ int wifi_update_init(void){
return 0;
}
#if 0
int test_udp_client(const char *ip_str, int port)
{
/* socket文件描述符 */
int sock_fd = -1;
/* 建立udp socket */
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0)
{
printf("client socket create failed.\r\n");
goto exit;
}
/* 设置address */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, 0, sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = inet_addr(ip_str);
addr_serv.sin_port = htons(port);
len = sizeof(addr_serv);
int send_num;
int recv_num;
char send_buf[20] = "hey, who are you?";
char recv_buf[20];
printf("###client send: %s\n", send_buf);
send_num = sendto(sock_fd, send_buf, strlen(send_buf), 0, (struct sockaddr *)&addr_serv, len);
if(send_num < 0)
{
printf("sendto erro\r\n");
goto exit;
}
recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_serv, (socklen_t *)&len);
if(recv_num <= 0)
{
printf("socket recv failed\r\n");
goto exit;
}
recv_buf[recv_num] = '\0';
printf("client receive %d bytes: %s\n", recv_num, recv_buf);
exit:
if (-1 != sock_fd)
close(sock_fd);
return 0;
}
int test_udp_server(int port)
{
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0)
{
printf("server socket create failed.\r\n");
goto exit;
}
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, 0, sizeof(struct sockaddr_in));
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(port);
addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
len = sizeof(addr_serv);
if(bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(addr_serv)) < 0)
{
printf("bind error\r\n");
goto exit;
}
int recv_num;
int send_num;
char send_buf[20] = "i am server!";
char recv_buf[20];
struct sockaddr_in addr_client;
while(1)
{
printf("server wait:\n");
recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, (socklen_t *)&len);
if(recv_num < 0)
{
printf("recvfrom error:\r\n");
goto exit;
}
recv_buf[recv_num] = '\0';
printf("server receive %d bytes: %s\n", recv_num, recv_buf);
send_num = sendto(sock_fd, send_buf, recv_num, 0, (struct sockaddr *)&addr_client, len);
if(send_num <= 0)
{
printf("sendto error:");
break;
}
}
exit:
if (-1 != sock_fd)
close(sock_fd);
return 0;
}
#endif