rda5981 ota (#1839)

* rda5981 ota

* easyflash and lfs

* adjust offsets

* mac change
This commit is contained in:
NonPIayerCharacter 2025-10-21 10:08:48 +03:00 committed by GitHub
parent 5a83d0268b
commit 365a0dbcf9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 158 additions and 44 deletions

View File

@ -261,7 +261,7 @@ jobs:
uses: actions/checkout@v4
- uses: actions/setup-python@v5
if: ${{ matrix.platform == 'OpenBL602' || matrix.platform == 'OpenRTL8721DA' || matrix.platform == 'OpenRTL8720E' }}
if: ${{ matrix.platform == 'OpenBL602' || matrix.platform == 'OpenRTL8721DA' || matrix.platform == 'OpenRTL8720E' || matrix.platform == 'OpenRDA5981' }}
with:
python-version: '3.10'
architecture: 'x64'

View File

@ -371,6 +371,10 @@ prebuild_OpenTXW81X: berry
fi
prebuild_OpenRDA5981: berry
ifdef GITHUB_ACTIONS
# just so that there would be no cache error
pip3 install fdt toml configobj pycryptodomex
endif
git submodule update --init --recursive --depth=1 sdk/OpenRDA5981
@if [ -e platforms/RDA5981/pre_build.sh ]; then \
echo "prebuild found for OpenRDA5981"; \
@ -684,11 +688,12 @@ OpenTXW81X: prebuild_OpenTXW81X
OpenRDA5981: prebuild_OpenRDA5981
$(MAKE) -C sdk/OpenRDA5981 APP_VERSION=$(APP_VERSION) OBK_VARIANT=$(OBK_VARIANT) -j $(shell nproc)
mkdir -p output/$(APP_VERSION)
cp sdk/OpenRDA5981/.build/OpenBeken.bin output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION).img
#cp sdk/OpenRDA5981/ota_lzma/bootloader_lzma.bin output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION).bin
#dd conv=notrunc bs=1K if=sdk/OpenRDA5981/.build/OpenBeken.bin of=output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION).bin seek=12
#./sdk/OpenRDA5981/ota_lzma/imgpkt e sdk/OpenRDA5981/.build/OpenBeken.bin sdk/OpenRDA5981/.build/OpenBeken.bin.lzma
#python3 sdk/OpenRDA5981/ota_lzma/ota_pack_image_lzma.py sdk/OpenRDA5981/.build/OpenBeken.bin sdk/OpenRDA5981/.build/OpenBeken.bin.lzma output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION)_ota.img
#cp sdk/OpenRDA5981/.build/OpenBeken.bin output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION).img
python3 sdk/OpenRDA5981/ota_lzma/image_pack_firmware.py sdk/OpenRDA5981/.build/OpenBeken.bin $(APP_VERSION) 0
cp sdk/OpenRDA5981/ota_lzma/bootloader_lzma.bin output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION).bin
dd conv=notrunc bs=1K if=sdk/OpenRDA5981/.build/OpenBeken_fwpacked.bin of=output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION).bin seek=8
./sdk/OpenRDA5981/ota_lzma/imgpkt e sdk/OpenRDA5981/.build/OpenBeken.bin sdk/OpenRDA5981/.build/OpenBeken.bin.lzma
python3 sdk/OpenRDA5981/ota_lzma/ota_pack_image_lzma.py sdk/OpenRDA5981/.build/OpenBeken.bin sdk/OpenRDA5981/.build/OpenBeken.bin.lzma output/$(APP_VERSION)/OpenRDA5981_$(APP_VERSION)_ota.img $(APP_VERSION)
# Add custom Makefile if required
-include custom.mk

View File

@ -139,8 +139,8 @@
#elif PLATFORM_RDA5981
#define EF_START_ADDR 0xF7000
#define ENV_AREA_SIZE 0x4000
#define EF_START_ADDR 0xF4000
#define ENV_AREA_SIZE 0xA000
#elif WINDOWS

@ -1 +1 @@
Subproject commit 5567e5398be98328d4e2d544c41063b7a89b4fce
Subproject commit 7f22eafe2d6d054d4d24552c43a7185d00544008

View File

@ -1,17 +1,29 @@
#ifdef PLATFORM_RDA5981
#if PLATFORM_RDA5981
#include "../hal_flashConfig.h"
#include "wland_flash.h"
#include <easyflash.h>
static int g_easyFlash_Ready = 0;
void InitEasyFlashIfNeeded()
{
if(g_easyFlash_Ready == 0)
{
easyflash_init();
g_easyFlash_Ready = 1;
}
}
int HAL_Configuration_ReadConfigMemory(void* target, int dataLen)
{
return rda5981_read_flash(0x180fc000, target, dataLen) == 0;
InitEasyFlashIfNeeded();
return ef_get_env_blob("ObkCfg", target, dataLen, NULL);
}
int HAL_Configuration_SaveConfigMemory(void* src, int dataLen)
{
rda5981_erase_flash(0x180fc000, 0x1000);
return rda5981_write_flash(0x180fc000, src, dataLen) == 0;
InitEasyFlashIfNeeded();
ef_set_env_blob("ObkCfg", src, dataLen);
return 1;
}
#endif // PLATFORM_RDA5981

View File

@ -3,11 +3,12 @@
#include "../../new_common.h"
#include "../hal_flashVars.h"
#include "../../logging/logging.h"
#include "wland_flash.h"
#include <easyflash.h>
FLASH_VARS_STRUCTURE flash_vars;
static int g_loaded = 0;
#define KV_KEY_FLASH_VARS "OBK_FV"
#define SAVE_CHANGE_IF_REQUIRED_AND_COUNT(target, source, counter) \
if((target) != (source)) { \
(target) = (source); \
@ -18,14 +19,32 @@ extern void InitEasyFlashIfNeeded();
static int ReadFlashVars(void* target, int dataLen)
{
g_loaded = rda5981_read_flash(0x180fd000, target, dataLen) == 0;
InitEasyFlashIfNeeded();
int readLen;
ADDLOG_DEBUG(LOG_FEATURE_CFG, "ReadFlashVars: will read %d bytes", dataLen);
readLen = ef_get_env_blob(KV_KEY_FLASH_VARS, target, dataLen, NULL);
ADDLOG_DEBUG(LOG_FEATURE_CFG, "ReadFlashVars: really loaded %d bytes", readLen);
g_loaded = 1;
return dataLen;
}
static int SaveFlashVars(void* src, int dataLen)
{
rda5981_erase_flash(0x180fd000, 0x1000);
rda5981_write_flash(0x180fd000, src, dataLen);
InitEasyFlashIfNeeded();
EfErrCode res;
res = ef_set_env_blob(KV_KEY_FLASH_VARS, src, dataLen);
if(res == EF_ENV_INIT_FAILED)
{
ADDLOG_DEBUG(LOG_FEATURE_CFG, "SaveFlashVars: EF_ENV_INIT_FAILED for %d bytes", dataLen);
return 0;
}
if(res == EF_ENV_NAME_ERR)
{
ADDLOG_DEBUG(LOG_FEATURE_CFG, "SaveFlashVars: EF_ENV_ARG_ERR for %d bytes", dataLen);
return 0;
}
ADDLOG_DEBUG(LOG_FEATURE_CFG, "SaveFlashVars: saved %d bytes", dataLen);
return dataLen;
}
@ -160,3 +179,4 @@ void HAL_FlashVars_SaveTotalConsumption(float total_consumption)
}
#endif // PLATFORM_RDA5981

View File

@ -34,9 +34,77 @@ int HAL_FlashRead(char* buffer, int readlen, int startaddr)
return rda5981_read_flash(0x18000000 + startaddr, (uint8_t*)buffer, readlen);
}
int HAL_FlashWrite(char* buffer, int writelen, int startaddr)
int HAL_FlashWrite(char* buf, unsigned int len, unsigned int addr)
{
return rda5981_write_flash(0x18000000 + startaddr, (uint8_t*)buffer, writelen);
if(len == 0) return 0;
addr += 0x18000000;
int ret;
int left;
unsigned int addr_t, len_t;
char* temp_buf = NULL;
addr_t = addr & 0xffffff00;
len_t = addr - addr_t + len;
if(len_t % 256)
len_t += 256 - len_t % 256;
//printf("addr %x addr_t %x\r\n", addr, addr_t);
//printf("len %d len_t %d\r\n", len, len_t);
temp_buf = (char*)malloc(256);
if(temp_buf == NULL)
return -1;
ret = rda5981_read_flash(addr_t, temp_buf, 256);
if(ret)
{
free(temp_buf);
return -1;
}
left = 256 - (addr - addr_t);
if(len < left)
memcpy(temp_buf + addr - addr_t, buf, len);//256-(addr-addr_t));
else
memcpy(temp_buf + addr - addr_t, buf, left);
ret = rda5981_write_flash(addr_t, temp_buf, 256);
if(ret)
{
free(temp_buf);
return -1;
}
len_t -= 256;
buf += 256 - (addr - addr_t);
len -= 256 - (addr - addr_t);
addr_t += 256;
while(len_t != 0)
{
//printf("len_t %d buf %x len %d addr_t %x\r\n", len_t, buf, len, addr_t);
if(len >= 256)
{
memcpy(temp_buf, buf, 256);
}
else
{
ret = rda5981_read_flash(addr_t, temp_buf, 256);
if(ret)
{
free(temp_buf);
return -1;
}
memcpy(temp_buf, buf, len);
}
ret = rda5981_write_flash(addr_t, temp_buf, 256);
if(ret)
{
free(temp_buf);
return -1;
}
len_t -= 256;
buf += 256;
len -= 256;
addr_t += 256;
}
free(temp_buf);
return 0;
}
int HAL_FlashEraseSector(int startaddr)

View File

@ -9,15 +9,21 @@
extern "C" {
extern void Main_Init();
extern void Main_OnEverySecond();
extern uint32_t OTA_Offset;
uint8_t macaddr[6];
}
extern WiFiStackInterface wifi;
__attribute__((used)) int main()
{
//rda5981_set_user_data_addr(0x180FB000, 0x180FC000, 3584);
rda5981_set_user_data_addr(0x180FF000, 0x180FE000, 0x1000);
wifi.init();
rda5981_flash_read_mac_addr((unsigned char*)&macaddr);
Main_Init();
char* temp_buf = (char*)malloc(256);
rda5981_read_flash(OTA_Offset, temp_buf, 256);
if(temp_buf[0] == 0xAE && temp_buf[1] == 0xAE) rda5981_erase_flash(OTA_Offset, 1024);
while(true)
{
osDelay(1000);

View File

@ -9,6 +9,8 @@
#include "rda5981_ota.h"
uint32_t OTA_Offset = 0x18095000;
int http_rest_post_flash(http_request_t* request, int startaddr, int maxaddr)
{
int total = 0;
@ -26,25 +28,27 @@ int http_rest_post_flash(http_request_t* request, int startaddr, int maxaddr)
ADDLOG_ERROR(LOG_FEATURE_OTA, "Content-length is 0");
goto update_ota_exit;
}
startaddr = 0x1807E000;
// if compressed ota
//startaddr = 0x1809C000;
int ret1 = rda5981_write_partition_start(startaddr, towrite + (towrite % 4096));
else
{
towrite = request->contentLength;
}
startaddr = OTA_Offset;
int ret1 = rda5981_erase_flash(startaddr, towrite);
if(ret1 != 0)
{
//ret = -1;
ADDLOG_ERROR(LOG_FEATURE_OTA, "rda5981_write_partition_start failed. %i", ret);
//goto update_ota_exit;
ret = -1;
ADDLOG_ERROR(LOG_FEATURE_OTA, "rda5981_erase_flash failed. %i", ret);
goto update_ota_exit;
}
do
{
ADDLOG_DEBUG(LOG_FEATURE_OTA, "Writelen %i at %i", writelen, total);
ret1 = rda5981_write_partition(startaddr, (unsigned char*)writebuf, writelen);
ret1 = HAL_FlashWrite(writebuf, writelen, startaddr - 0x18000000);
if(ret1 != 0)
{
ret = -1;
ADDLOG_ERROR(LOG_FEATURE_OTA, "rda5981_write_partition failed. %i", ret1);
ADDLOG_ERROR(LOG_FEATURE_OTA, "flash_write failed. %i", ret1);
goto update_ota_exit;
}
delay_ms(5);
@ -59,16 +63,11 @@ int http_rest_post_flash(http_request_t* request, int startaddr, int maxaddr)
{
ADDLOG_DEBUG(LOG_FEATURE_OTA, "recv returned %d - end of data - remaining %d", writelen, towrite);
ret = -1;
goto update_ota_exit;
}
}
} while ((towrite > 0) && (writelen >= 0));
int check = rda5981_write_partition_end();
if(check != 0)
{
ADDLOG_ERROR(LOG_FEATURE_OTA, "rda5981_write_partition_end failed, %i", check);
ret = -1;
}
update_ota_exit:
if (ret != -1)
{

View File

@ -14,6 +14,7 @@ extern "C" {
bool g_bOpenAccessPointMode = 0;
static void (*g_wifiStatusCallback)(int code);
extern struct netif lwip_sta_netif;
extern uint8_t macaddr[6];
const char* HAL_GetMyIPString()
{
@ -37,9 +38,12 @@ const char* HAL_GetMyMaskString()
void WiFI_GetMacAddress(char* mac)
{
r_u8 addr[6];
rda59xx_get_macaddr((r_u8*)&addr, 0);
memcpy(mac, addr, sizeof(mac));
memcpy(mac, macaddr, sizeof(mac));
}
int WiFI_SetMacAddress(char* mac)
{
return rda5981_flash_write_mac_addr((uint8_t*)mac) == 0;
}
uint8_t HAL_GetWiFiChannel(uint8_t *chan)

View File

@ -159,9 +159,9 @@
#elif PLATFORM_RDA5981
#define LFS_BLOCKS_START 0xFE000
#define LFS_BLOCKS_START_MIN 0xFE000
#define LFS_BLOCKS_END 0x100000
#define LFS_BLOCKS_START 0xE0000
#define LFS_BLOCKS_START_MIN 0xE0000
#define LFS_BLOCKS_END 0xF4000
#else
// TODO

View File

@ -567,7 +567,7 @@
#define NO_CHIP_TEMPERATURE 1
#define ENABLE_DRIVER_AHT2X 1
#define ENABLE_I2C 1
#undef ENABLE_HTTP_MAC
#define ENABLE_LITTLEFS 1
#else