RTL8710C/RTL8720C support (#1468)

* Move delay us and wdt to hals, update workflow

* rtl8720c initial

* move uart to hal

* rtl uart

* obk adjustments

* sdk adjustments, fix ota

* add some features

* fix some warnings

* esp uart + tr6260/esp tcp_msl

* add bl0937, adjust ota

* enable artifacts merge

* add forgotten ln882h delay

* fix mqtt, pwm on boot

* irq fix

* fix wifi disconnect

* update sdk, change lfs location and size

* Update Makefile
This commit is contained in:
NonPIayerCharacter
2025-01-01 14:11:49 +03:00
committed by GitHub
parent 8fba7dd31e
commit 2a9a7270f2
61 changed files with 2541 additions and 630 deletions

View File

@ -40,6 +40,10 @@ static char SUBMIT_AND_END_FORM[] = "<br><input type=\"submit\" value=\"Submit\"
#include "temp_detect_pub.h"
#elif defined(PLATFORM_LN882H)
#elif defined(PLATFORM_TR6260)
#elif defined(PLATFORM_RTL87X0C)
#include "hal_sys_ctrl.h"
extern hal_reset_reason_t reset_reason;
extern uint32_t current_fw_idx;
#elif defined(PLATFORM_ESPIDF)
#include "esp_wifi.h"
#include "esp_system.h"
@ -782,7 +786,9 @@ int http_fn_index(http_request_t* request) {
// display temperature - thanks to giedriuslt
// only in Normal mode, and if boot is not failing
#ifndef NO_CHIP_TEMPERATURE
hprintf255(request, "<h5>Chip temperature: %.1f°C</h5>", g_wifi_temperature);
#endif
inputName = CFG_GetPingHost();
if (inputName && *inputName && CFG_GetPingDisconnectedSecondsToRestart()) {
@ -875,6 +881,17 @@ typedef enum {
default: break;
}
hprintf255(request, "<h5>Reboot reason: %i - %s</h5>", reason, s);
#elif PLATFORM_RTL87X0C
const char* s = "Unk";
switch(reset_reason)
{
case HAL_RESET_REASON_POWER_ON: s = "Pwr"; break;
case HAL_RESET_REASON_SOFTWARE: s = "Soft"; break;
case HAL_RESET_REASON_WATCHDOG: s = "Wdt"; break;
default: break;
}
hprintf255(request, "<h5>Reboot reason: %i - %s</h5>", reset_reason, s);
hprintf255(request, "<h5>Current fw: FW%i</h5>", current_fw_idx);
#endif
if (CFG_GetMQTTHost()[0] == 0) {
hprintf255(request, "<h5>MQTT State: not configured<br>");
@ -1308,6 +1325,8 @@ int http_fn_cfg_wifi(http_request_t* request) {
}
#elif PLATFORM_TR6260
poststr(request, "TODO TR6260<br>");
#elif defined(PLATFORM_RTL87X0C)
poststr(request, "TODO RTL87X0C<br>");
#else
#error "Unknown platform"
poststr(request, "Unknown platform<br>");
@ -2990,6 +3009,7 @@ void OTA_RequestDownloadFromHTTP(const char* s) {
#elif PLATFORM_ESPIDF
#elif PLATFORM_TR6260
#elif PLATFORM_RTL87X0C
#elif PLATFORM_W600 || PLATFORM_W800
t_http_fwup(s);
#elif PLATFORM_XR809

View File

@ -213,18 +213,21 @@ static void tcp_server_thread(beken_thread_arg_t arg)
socklen_t addr_len = sizeof(source_addr);
int new_idx = 0;
for(int i = 0; i < max_socks; ++i)
{
if(sock[i].isCompleted)
{
if(sock[i].thread != NULL)
{
rtos_delete_thread(&sock[i].thread);
sock[i].thread = NULL;
}
sock[i].isCompleted = false;
sock[i].fd = INVALID_SOCK;
}
}
for(new_idx = 0; new_idx < max_socks; ++new_idx)
{
if(sock[new_idx].isCompleted)
{
if(sock[new_idx].thread != NULL)
{
rtos_delete_thread(&sock[new_idx].thread);
sock[new_idx].thread = NULL;
}
sock[new_idx].isCompleted = false;
sock[new_idx].fd = INVALID_SOCK;
}
if(sock[new_idx].fd == INVALID_SOCK)
{
break;

View File

@ -53,6 +53,20 @@ uint32_t flash_read(uint32_t flash, uint32_t addr, void* buf, uint32_t size);
#elif PLATFORM_ESPIDF
#elif PLATFORM_RTL87X0C
#include "flash_api.h"
#include "device_lock.h"
#include "ota_8710c.h"
#include "sys_api.h"
extern flash_t flash;
extern uint32_t sys_update_ota_get_curr_fw_idx(void);
extern uint32_t sys_update_ota_prepare_addr(void);
extern void sys_disable_fast_boot(void);
extern void get_fw_info(uint32_t* targetFWaddr, uint32_t* currentFWaddr, uint32_t* fw1_sn, uint32_t* fw2_sn);
static flash_t flash_ota;
#else
extern UINT32 flash_read(char* user_buf, UINT32 count, UINT32 address);
@ -253,6 +267,8 @@ static int http_rest_post(http_request_t* request) {
return http_rest_post_flash(request, -1, -1);
#elif PLATFORM_ESPIDF
return http_rest_post_flash(request, -1, -1);
#elif PLATFORM_RTL87X0C
return http_rest_post_flash(request, 0, -1);
#else
// TODO
ADDLOG_DEBUG(LOG_FEATURE_API, "No OTA");
@ -2054,6 +2070,146 @@ static int http_rest_post_flash(http_request_t* request, int startaddr, int maxa
return -1;
}
#elif PLATFORM_RTL87X0C
uint32_t NewFWLen = 0, NewFWAddr = 0;
uint32_t address = 0;
uint32_t curr_fw_idx = 0;
uint32_t flash_checksum = 0;
uint32_t targetFWaddr;
uint32_t currentFWaddr;
uint32_t fw1_sn;
uint32_t fw2_sn;
_file_checksum file_checksum;
file_checksum.u = 0;
unsigned char sig_backup[32];
int ret = 1;
if(request->contentLength >= 0)
{
towrite = request->contentLength;
}
NewFWAddr = sys_update_ota_prepare_addr();
if(NewFWAddr == -1)
{
ret = -1;
goto update_ota_exit;
}
get_fw_info(&targetFWaddr, &currentFWaddr, &fw1_sn, &fw2_sn);
ADDLOG_INFO(LOG_FEATURE_OTA, "Current FW addr: 0x%08X, target FW addr: 0x%08X, fw1 sn: %u, fw2 sn: %u", currentFWaddr, targetFWaddr, fw1_sn, fw2_sn);
curr_fw_idx = sys_update_ota_get_curr_fw_idx();
ADDLOG_INFO(LOG_FEATURE_OTA, "Current firmware index is %d", curr_fw_idx);
int reserase = update_ota_erase_upg_region(towrite, 0, NewFWAddr);
NewFWLen = towrite;
if(reserase == -1)
{
ADDLOG_ERROR(LOG_FEATURE_OTA, "Erase failed");
ret = -1;
goto update_ota_exit;
}
if(NewFWAddr != ~0x0)
{
address = NewFWAddr;
ADDLOG_INFO(LOG_FEATURE_OTA, "Start to read data %i bytes", NewFWLen);
}
do
{
// back up signature and only write it to flash till the end of OTA
if(startaddr < 32)
{
memcpy(sig_backup + startaddr, writebuf, (startaddr + writelen > 32 ? (32 - startaddr) : writelen));
memset(writebuf, 0xFF, (startaddr + writelen > 32 ? (32 - startaddr) : writelen));
ADDLOG_DEBUG(LOG_FEATURE_OTA, "sig_backup for% d bytes from index% d", (startaddr + writelen > 32 ? (32 - startaddr) : writelen), startaddr);
}
device_mutex_lock(RT_DEV_LOCK_FLASH);
if(flash_burst_write(&flash_ota, address + startaddr, writelen, (uint8_t*)writebuf) < 0)
{
ADDLOG_ERROR(LOG_FEATURE_OTA, "Write stream failed");
device_mutex_unlock(RT_DEV_LOCK_FLASH);
ret = -1;
goto update_ota_exit;
}
device_mutex_unlock(RT_DEV_LOCK_FLASH);
rtos_delay_milliseconds(10);
ADDLOG_DEBUG(LOG_FEATURE_OTA, "Writelen %i at %i", writelen, total);
total += writelen;
startaddr += writelen;
towrite -= writelen;
// checksum attached at file end
if(startaddr + writelen > NewFWLen - 4)
{
file_checksum.c[0] = writebuf[writelen - 4];
file_checksum.c[1] = writebuf[writelen - 3];
file_checksum.c[2] = writebuf[writelen - 2];
file_checksum.c[3] = writebuf[writelen - 1];
}
if(towrite > 0)
{
writebuf = request->received;
writelen = recv(request->fd, writebuf, request->receivedLenmax, 0);
if(writelen < 0)
{
ADDLOG_DEBUG(LOG_FEATURE_OTA, "recv returned %d - end of data - remaining %d", writelen, towrite);
}
}
} while((towrite > 0) && (writelen >= 0));
ADDLOG_DEBUG(LOG_FEATURE_OTA, "%d total bytes written, verifying checksum", total);
uint8_t* buf = (uint8_t*)os_malloc(2048);
memset(buf, 0, 2048);
// read flash data back and calculate checksum
for(int i = 0; i < NewFWLen; i += 2048)
{
int k;
int rlen = (startaddr - 4 - i) > 2048 ? 2048 : (startaddr - 4 - i);
device_mutex_lock(RT_DEV_LOCK_FLASH);
flash_stream_read(&flash_ota, NewFWAddr + i, rlen, buf);
device_mutex_unlock(RT_DEV_LOCK_FLASH);
for(k = 0; k < rlen; k++)
{
if(i + k < 32)
{
flash_checksum += sig_backup[i + k];
}
else
{
flash_checksum += buf[k];
}
}
}
ADDLOG_INFO(LOG_FEATURE_OTA, "flash checksum 0x%8x attached checksum 0x%8x", flash_checksum, file_checksum.u);
if(file_checksum.u != flash_checksum)
{
ADDLOG_ERROR(LOG_FEATURE_OTA, "The checksum is wrong!");
ret = -1;
goto update_ota_exit;
}
ret = update_ota_signature(sig_backup, NewFWAddr);
if(ret == -1)
{
ADDLOG_ERROR(LOG_FEATURE_OTA, "Update signature fail");
goto update_ota_exit;
}
update_ota_exit:
if(ret != -1)
{
device_mutex_lock(RT_DEV_LOCK_FLASH);
flash_write_word(&flash, targetFWaddr, 4294967295);
flash_write_word(&flash, currentFWaddr, 0);
device_mutex_unlock(RT_DEV_LOCK_FLASH);
sys_disable_fast_boot();
if(buf) free(buf);
}
else
{
if(buf) free(buf);
return http_rest_error(request, ret, "error");
}
#else
init_ota(startaddr);
@ -2092,6 +2248,7 @@ static int http_rest_post_flash(http_request_t* request, int startaddr, int maxa
http_setup(request, httpMimeTypeJson);
hprintf255(request, "{\"size\":%d}", total);
poststr(request, NULL);
CFG_IncrementOTACount();
return 0;
}
@ -2155,6 +2312,10 @@ static int http_rest_get_flash(http_request_t* request, int startaddr, int len)
#elif PLATFORM_LN882H || PLATFORM_ESPIDF || PLATFORM_TR6260
// TODO:LN882H flash read?
res = 0;
#elif PLATFORM_RTL87X0C
device_mutex_lock(RT_DEV_LOCK_FLASH);
flash_stream_read(&flash, startaddr, readlen, (uint8_t*)buffer);
device_mutex_unlock(RT_DEV_LOCK_FLASH);
#else
res = flash_read((char*)buffer, readlen, startaddr);
#endif