build: W600-SDK importiert, Firmware-Build und Hello am EVK
Docker-Build mit gcc-arm-none-eabi 4.9-2014q4 (statt Homebrew-Cask) verwendet, Dockerfile/tools/docker.sh dafür aus Task 13 vorgezogen. cmake/sdk.cmake schont gcc 4.9 (kennt -fcommon/-Wno-error=... nicht). Zwei zusätzliche SDK-Stubs (EarlyInit, pre_gpio_config) in src/sys/sdk_stubs.c ergänzt, siehe sdk/PATCHES.md.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# THE VERSION NUMBER
|
||||
SET(CMAKE_SYSTEM_NAME Generic)
|
||||
CMAKE_MINIMUM_REQUIRED (VERSION 3.10)
|
||||
PROJECT(WMOTA)
|
||||
|
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
|
||||
SET(CMAKE_NINJA_FORCE_RESPONSE_FILE 1 CACHE INTERNAL "")
|
||||
|
||||
set(CMAKE_VERBOSE_MAKEFILE OFF)
|
||||
|
||||
# ENABLE ASM
|
||||
ENABLE_LANGUAGE(ASM)
|
||||
|
||||
SET(CMAKE_STATIC_LIBRARY_PREFIX)
|
||||
SET(CMAKE_STATIC_LIBRARY_SUFFIX)
|
||||
|
||||
SET(CMAKE_EXECUTABLE_LIBRARY_PREFIX)
|
||||
SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX)
|
||||
|
||||
# C FLAGS
|
||||
SET(CMAKE_C_FLAGS " -mthumb --function-sections --data-sections -mcpu=cortex-m3 -std=gnu99 -mabi=aapcs -march=armv7-m -fno-builtin ")
|
||||
STRING(APPEND CMAKE_C_FLAGS "-DGCC_COMPILE=1 -DWOLFSSL_USER_SETTINGS -D_IN_ADDR_T_DECLARED -D__MACHINE_ENDIAN_H__ -D_TIMEVAL_DEFINED -D__INSIDE_CYGWIN_NET__ ")
|
||||
|
||||
SET(CMAKE_C_FLAGS_DEBUG "-O0 -g3 -gdwarf-2 -Wall -DDEBUG ")
|
||||
SET(CMAKE_C_FLAGS_RELEASE "-Os -Wall")
|
||||
|
||||
|
||||
# DEBUG ASM FLAGS
|
||||
SET(CMAKE_ASM_FLAGS_DEBUG "${CMAKE_ASM_FLAGS_DEBUG} -O0 -g3 -gdwarf-2 -Wall -mthumb-interwork -mthumb -std=gnu99 -mcpu=cortex-m3 -march=armv7-m -mabi=aapcs -fno-builtin -DDEBUG ")
|
||||
SET(CMAKE_ASM_FLAGS_RELEASE "${CMAKE_ASM_FLAGS_RELEASE} -Os -Wall -mthumb-interwork -mthumb -std=gnu99 -mcpu=cortex-m3 -march=armv7-m -mabi=aapcs -fno-builtin ")
|
||||
|
||||
# Library sources
|
||||
SET(LIBRARY_SOURCES
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/wm_http_fwup.c"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/wm_socket_fwup.c"
|
||||
)
|
||||
|
||||
function(ADD_LIB_TARGET LIBTARGET)
|
||||
add_library(${LIBTARGET} OBJECT ${LIBRARY_SOURCES})
|
||||
# ADD_CUSTOM_COMMAND(TARGET ${LIBTARGET} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${EXECUTABLE_OUTPUT_PATH}/${LIBTARGET} ${CMAKE_CURRENT_SOURCE_DIR}/../../../Lib/GNU/${LIBTARGET})
|
||||
endfunction()
|
||||
|
||||
ADD_LIB_TARGET(wmota.a)
|
||||
@@ -0,0 +1,237 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "wm_socket_fwup.h"
|
||||
#include "wm_fwup.h"
|
||||
#include "wm_http_fwup.h"
|
||||
#include "wm_debug.h"
|
||||
#include "wm_mem.h"
|
||||
|
||||
#if TLS_CONFIG_HTTP_CLIENT
|
||||
|
||||
#define HTTP_CLIENT_BUFFER_SIZE 2048
|
||||
#define USE_BREAK_POINT_RESUME 1
|
||||
#define RECV_TIMEOUT 5
|
||||
|
||||
|
||||
|
||||
enum ota_state {PREPARE_PACKET, SETUP_LINK_AND_REQ, RECV_RSP, HANDLE_HEADER, HANDLE_BODY, SHUTDOWN_LINK, QUIT_OTA};
|
||||
|
||||
int http_fwup(HTTPParameters ClientParams)
|
||||
{
|
||||
char* Buffer = NULL;
|
||||
char token[32];
|
||||
char headRange[32] = {0};
|
||||
int nRetCode = 0;
|
||||
u32 content_length=0, size=32;
|
||||
u32 partLen;
|
||||
u32 totalLen = 0;
|
||||
u32 recvLen = 0;
|
||||
T_BOOTER *booter;
|
||||
#if USE_BREAK_POINT_RESUME == 0
|
||||
u32 breakFlag = 0;
|
||||
u32 breakLen = 0;
|
||||
#endif
|
||||
struct pbuf *p;
|
||||
HTTP_SESSION_HANDLE pHTTP;
|
||||
enum ota_state now_state = PREPARE_PACKET;
|
||||
|
||||
Buffer = (char*)tls_mem_alloc(HTTP_CLIENT_BUFFER_SIZE);
|
||||
if (!Buffer)
|
||||
return HTTP_CLIENT_ERROR_NO_MEMORY;
|
||||
memset(Buffer, 0, HTTP_CLIENT_BUFFER_SIZE);
|
||||
|
||||
while(1)
|
||||
{
|
||||
switch(now_state)
|
||||
{
|
||||
case PREPARE_PACKET:
|
||||
{
|
||||
memset(token, 0, 32);
|
||||
size = 32;
|
||||
pHTTP = HTTPClientOpenRequest(0);
|
||||
#if USE_BREAK_POINT_RESUME
|
||||
HTTPClientSetVerb(pHTTP,VerbGet);
|
||||
sprintf(headRange, "bytes=%d-", recvLen);
|
||||
if((nRetCode = HTTPClientAddRequestHeaders(pHTTP,"Range", headRange, 1))!= HTTP_CLIENT_SUCCESS){
|
||||
now_state = QUIT_OTA;
|
||||
}
|
||||
#else
|
||||
if( recvLen != 0 ){
|
||||
breakFlag = 1;
|
||||
breakLen = 0;
|
||||
}
|
||||
#endif
|
||||
now_state = SETUP_LINK_AND_REQ;
|
||||
}
|
||||
break;
|
||||
|
||||
case SETUP_LINK_AND_REQ:
|
||||
{
|
||||
if( (nRetCode = HTTPClientSendRequest(pHTTP,ClientParams.Uri,NULL,0,FALSE,0,0)) != HTTP_CLIENT_SUCCESS ){
|
||||
tls_os_time_delay(HZ*2);
|
||||
now_state = SHUTDOWN_LINK;
|
||||
}
|
||||
else
|
||||
now_state = RECV_RSP;
|
||||
}
|
||||
break;
|
||||
|
||||
case RECV_RSP:
|
||||
{
|
||||
if((nRetCode = HTTPClientRecvResponse(pHTTP, RECV_TIMEOUT)) != HTTP_CLIENT_SUCCESS)
|
||||
now_state = SHUTDOWN_LINK;
|
||||
else
|
||||
now_state = HANDLE_HEADER;
|
||||
}
|
||||
break;
|
||||
|
||||
case HANDLE_HEADER:
|
||||
{
|
||||
if((nRetCode = HTTPClientFindFirstHeader(pHTTP, "content-length", (CHAR *)token, &size)) != HTTP_CLIENT_SUCCESS){
|
||||
HTTPClientFindCloseHeader(pHTTP);
|
||||
now_state = SHUTDOWN_LINK;
|
||||
}
|
||||
else
|
||||
{
|
||||
HTTPClientFindCloseHeader(pHTTP);
|
||||
content_length = atol(strstr(token,":")+1);
|
||||
printf("content_length: %d\n", content_length);
|
||||
now_state = HANDLE_BODY;
|
||||
if(recvLen == 0){
|
||||
nRetCode = socket_fwup_accept(0, ERR_OK);
|
||||
if(nRetCode != ERR_OK)
|
||||
now_state = QUIT_OTA;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case HANDLE_BODY:
|
||||
{
|
||||
partLen = 0;
|
||||
while(nRetCode != HTTP_CLIENT_EOS )
|
||||
{
|
||||
u32 nSize = HTTP_CLIENT_BUFFER_SIZE;
|
||||
nRetCode = HTTPClientReadData(pHTTP,Buffer+3,nSize,RECV_TIMEOUT,&nSize);
|
||||
if( recvLen == 0 ){
|
||||
//fileSize = headerSize(fixed: 56) + appCodeSize
|
||||
booter =(T_BOOTER *) (Buffer+3);
|
||||
if (TRUE == tls_fwup_img_header_check(booter))
|
||||
{
|
||||
totalLen = booter->upd_img_len + sizeof(T_BOOTER);
|
||||
//OTA_ResetProgress();
|
||||
//OTA_SetTotalBytes(totalLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
now_state = QUIT_OTA;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(nRetCode != HTTP_CLIENT_SUCCESS && nRetCode != HTTP_CLIENT_EOS){
|
||||
now_state = SHUTDOWN_LINK;
|
||||
break;
|
||||
}
|
||||
#if USE_BREAK_POINT_RESUME == 0
|
||||
if(breakFlag == 1){
|
||||
breakLen += nSize;
|
||||
if(breakLen <= recvLen){
|
||||
continue;
|
||||
}
|
||||
else{
|
||||
Buffer = Buffer+3+nSize-(breakLen-recvLen)-3;
|
||||
nSize = (breakLen-recvLen);
|
||||
breakFlag = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
p = pbuf_alloc(PBUF_TRANSPORT, nSize + 3, PBUF_REF);
|
||||
while( !p){
|
||||
tls_os_time_delay(1);
|
||||
p = pbuf_alloc(PBUF_TRANSPORT, nSize + 3, PBUF_REF);
|
||||
}
|
||||
|
||||
if(recvLen == 0)
|
||||
*(Buffer+0) = SOCKET_FWUP_START;
|
||||
else if(nRetCode == HTTP_CLIENT_EOS && recvLen == (totalLen-nSize))
|
||||
*(Buffer+0) = SOCKET_FWUP_END;
|
||||
else
|
||||
*(Buffer+0) = SOCKET_FWUP_DATA;
|
||||
|
||||
*(Buffer+1) = (nSize>>8) & 0xFF;
|
||||
*(Buffer+2) = nSize & 0xFF;
|
||||
p->payload = Buffer;
|
||||
p->len = p->tot_len = nSize + 3;
|
||||
// Send received data to fwup thread and deal with socket issues.
|
||||
s8 ret = socket_fwup_recv(0, p, ERR_OK);
|
||||
if(ret != ERR_OK){
|
||||
now_state = SHUTDOWN_LINK;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
//OTA_IncrementProgress(nSize);
|
||||
recvLen += nSize;
|
||||
partLen += nSize;
|
||||
//printf("download %d / %d\n", recvLen, totalLen); //Status is being printed in our source
|
||||
if(partLen == content_length){
|
||||
now_state = SHUTDOWN_LINK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (now_state == QUIT_OTA);
|
||||
else
|
||||
now_state = SHUTDOWN_LINK;
|
||||
}
|
||||
break;
|
||||
|
||||
case SHUTDOWN_LINK:
|
||||
{
|
||||
if(pHTTP){
|
||||
HTTPClientCloseRequest(&pHTTP);
|
||||
(recvLen == totalLen)?(now_state = QUIT_OTA):(now_state = PREPARE_PACKET);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
//printf("now_state %d\n", now_state);
|
||||
if(now_state == QUIT_OTA)
|
||||
break;
|
||||
}
|
||||
|
||||
tls_mem_free(Buffer);
|
||||
if(pHTTP)
|
||||
HTTPClientCloseRequest(&pHTTP);
|
||||
if(ClientParams.Verbose == TRUE)
|
||||
{
|
||||
printf("\n\nHTTP Client terminated %d (got %d kb)\n\n",nRetCode,(recvLen/ 1024));
|
||||
}
|
||||
if(nRetCode)
|
||||
socket_fwup_err(0, nRetCode);
|
||||
return nRetCode;
|
||||
}
|
||||
|
||||
int t_http_fwup(char *url)
|
||||
{
|
||||
HTTPParameters httpParams;
|
||||
memset(&httpParams, 0, sizeof(HTTPParameters));
|
||||
if (url == NULL)
|
||||
{
|
||||
httpParams.Uri = "http://192.168.1.100:8080/WM_W600_SEC.img";
|
||||
}
|
||||
else
|
||||
{
|
||||
httpParams.Uri = url;
|
||||
}
|
||||
printf("Location: %s\n",httpParams.Uri);
|
||||
httpParams.Verbose = TRUE;
|
||||
return http_fwup(httpParams);
|
||||
}
|
||||
|
||||
#endif //TLS_CONFIG_HTTP_CLIENT && TLS_CONFIG_SOCKET_RAW
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* File Name : wm_http_fwup.h
|
||||
*
|
||||
* Description: Http firmware update header file.
|
||||
*
|
||||
* Copyright (c) 2014 Winner Microelectronics Co., Ltd.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Author : wanghf
|
||||
*
|
||||
* Date : 2014-6-5
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef WM_HTTP_FWUP_H
|
||||
#define WM_HTTP_FWUP_H
|
||||
|
||||
#include "wm_type_def.h"
|
||||
#include "wm_http_client.h"
|
||||
|
||||
/***************************************************************************
|
||||
* Function: http_fwup
|
||||
* Description: Download the firmware from internet by http and upgrade it.
|
||||
*
|
||||
* Input: ClientParams: The parameters of connecting http server.
|
||||
*
|
||||
* Output: None
|
||||
*
|
||||
* Return: 0-success, other- failed
|
||||
*
|
||||
* Date : 2014-6-5
|
||||
****************************************************************************/
|
||||
int http_fwup(HTTPParameters ClientParams);
|
||||
|
||||
#endif //WM_HTTP_FWUP_H
|
||||
@@ -0,0 +1,157 @@
|
||||
#include "wm_config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include "wm_debug.h"
|
||||
#include "wm_socket_fwup.h"
|
||||
#include "list.h"
|
||||
#include "wm_fwup.h"
|
||||
#include "wm_sockets.h"
|
||||
#include "wm_mem.h"
|
||||
|
||||
#define SOCKET_FWUP_PACK_SIZE 2048
|
||||
static struct socket_fwup_pack current_pack;
|
||||
static u16 current_offset;
|
||||
static u32 session_id;
|
||||
|
||||
static void free_current_pack()
|
||||
{
|
||||
session_id = 0;
|
||||
if(current_pack.data != NULL)
|
||||
{
|
||||
tls_mem_free(current_pack.data);
|
||||
memset(¤t_pack, 0, sizeof(struct socket_fwup_pack));
|
||||
}
|
||||
}
|
||||
|
||||
s8 socket_fwup_recv(u8 skt_num, struct pbuf *p, s8 err)
|
||||
{
|
||||
u16 copylen;
|
||||
int offset = 0;
|
||||
int ret = 0;
|
||||
do
|
||||
{
|
||||
if(current_pack.operation < SOCKET_FWUP_START)
|
||||
{
|
||||
current_offset = 0;
|
||||
copylen = pbuf_copy_partial(p, ¤t_pack.operation, 1, offset);
|
||||
//TLS_DBGPRT_ERR("operation = %d, p->tot_len = %d\n", current_pack.operation, p->tot_len );
|
||||
offset += copylen;
|
||||
copylen = pbuf_copy_partial(p, ¤t_pack.datalen, 2, offset);
|
||||
//TLS_DBGPRT_ERR("datalen copylen = %d\n", copylen);
|
||||
current_pack.datalen = ntohs(current_pack.datalen);
|
||||
TLS_DBGPRT_ERR("datalen = %d\n", current_pack.datalen);
|
||||
offset += copylen;
|
||||
if(current_pack.operation > SOCKET_FWUP_DATA || current_pack.operation < SOCKET_FWUP_START)
|
||||
{
|
||||
TLS_DBGPRT_ERR("current_pack.operation = %d is invalid\n", current_pack.operation);
|
||||
goto err;//return ERR_ABRT;
|
||||
}
|
||||
if(current_pack.operation == SOCKET_FWUP_START)
|
||||
{
|
||||
session_id = tls_fwup_enter(TLS_FWUP_IMAGE_SRC_WEB);
|
||||
if(session_id == 0)
|
||||
{
|
||||
TLS_DBGPRT_ERR("session_id = %d is invalid\n", session_id);
|
||||
goto err;//return ERR_ABRT;
|
||||
}
|
||||
}
|
||||
|
||||
if (current_pack.datalen == 0)
|
||||
{
|
||||
//tls_socket_close(skt_num);
|
||||
goto err;//return ERR_ABRT;
|
||||
}
|
||||
}
|
||||
else if(current_pack.datalen > 0 && current_pack.datalen <= SOCKET_FWUP_PACK_SIZE)
|
||||
{
|
||||
copylen = pbuf_copy_partial(p, ¤t_pack.data[current_offset], current_pack.datalen-current_offset, offset);
|
||||
//TLS_DBGPRT_INFO("copylen=%d, current_pack.data = %02x%02x%02x%02x%02x%02x", copylen, current_pack.data[0], current_pack.data[1], current_pack.data[2], current_pack.data[3], current_pack.data[4], current_pack.data[5]);
|
||||
offset += copylen;
|
||||
current_offset += copylen;
|
||||
if(current_offset == current_pack.datalen)
|
||||
{
|
||||
ret = tls_fwup_request_sync(session_id, current_pack.data, current_pack.datalen);
|
||||
if(ret != TLS_FWUP_STATUS_OK)
|
||||
{
|
||||
TLS_DBGPRT_ERR("up data error.\n");
|
||||
goto err;//return ERR_ABRT;
|
||||
}
|
||||
|
||||
if(current_pack.operation == SOCKET_FWUP_END)
|
||||
{
|
||||
#if TLS_CONFIG_SOCKET_RAW
|
||||
tls_socket_close(skt_num);
|
||||
#endif
|
||||
tls_fwup_exit(session_id);
|
||||
free_current_pack();
|
||||
break;
|
||||
}
|
||||
current_pack.operation = 0;
|
||||
}
|
||||
}
|
||||
else if(current_pack.datalen == 0)
|
||||
{
|
||||
if(current_pack.operation == SOCKET_FWUP_END)
|
||||
{
|
||||
#if TLS_CONFIG_SOCKET_RAW
|
||||
tls_socket_close(skt_num);
|
||||
#endif
|
||||
tls_fwup_exit(session_id);
|
||||
free_current_pack();
|
||||
break;
|
||||
}
|
||||
current_pack.operation = 0;
|
||||
}
|
||||
}while(offset < p->tot_len);
|
||||
if (p)
|
||||
pbuf_free(p);
|
||||
return ERR_OK;
|
||||
|
||||
err:
|
||||
if (p)
|
||||
pbuf_free(p);
|
||||
return ERR_ABRT;
|
||||
}
|
||||
|
||||
void socket_fwup_err(u8 skt_num, s8 err)
|
||||
{
|
||||
TLS_DBGPRT_INFO("socket num=%d, err= %d\n", skt_num, err);
|
||||
tls_fwup_exit(session_id);
|
||||
free_current_pack();
|
||||
}
|
||||
|
||||
s8 socket_fwup_poll(u8 skt_num)
|
||||
{
|
||||
//printf("socketpoll skt_num : %d\n", skt_num);
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
s8 socket_fwup_accept(u8 skt_num, s8 err)
|
||||
{
|
||||
TLS_DBGPRT_INFO("accept socket num=%d, err= %d\n", skt_num, err);
|
||||
if(ERR_OK == err)
|
||||
{
|
||||
//ret = tls_fwup_init();
|
||||
//if(ret == TLS_FWUP_STATUS_EMEM)
|
||||
// return ERR_ABRT;
|
||||
if(session_id == 0 || tls_fwup_current_state(session_id) == TLS_FWUP_STATE_UNDEF)
|
||||
{
|
||||
memset(¤t_pack, 0, sizeof(struct socket_fwup_pack));
|
||||
current_pack.data = tls_mem_alloc(SOCKET_FWUP_PACK_SIZE);
|
||||
if(NULL == current_pack.data)
|
||||
{
|
||||
printf("\nmalloc socket fwup pack fail\n");
|
||||
return ERR_ABRT;
|
||||
}
|
||||
memset(current_pack.data, 0, SOCKET_FWUP_PACK_SIZE);
|
||||
return ERR_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
TLS_DBGPRT_ERR("session_id=%d is not current session id\n", session_id);
|
||||
return ERR_ABRT;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef TLS_SOCKET_FWUP_H
|
||||
#define TLS_SOCKET_FWUP_H
|
||||
|
||||
#include "wm_socket.h"
|
||||
|
||||
#define SOCKET_FWUP_PORT 65533
|
||||
|
||||
#define SOCKET_FWUP_START 1
|
||||
#define SOCKET_FWUP_END 2
|
||||
#define SOCKET_FWUP_DATA 3
|
||||
|
||||
struct socket_fwup_pack{
|
||||
u8 operation;
|
||||
u16 datalen;
|
||||
u8 * data;
|
||||
};
|
||||
|
||||
s8 socket_fwup_recv(u8 skt_num, struct pbuf *p, s8 err);
|
||||
void socket_fwup_err(u8 skt_num, s8 err);
|
||||
s8 socket_fwup_poll(u8 skt_num);
|
||||
s8 socket_fwup_accept(u8 skt_num, s8 err);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user