diff --git a/.github/workflows/workflow.yaml b/.github/workflows/workflow.yaml index cad3e7e1f..77bde5177 100644 --- a/.github/workflows/workflow.yaml +++ b/.github/workflows/workflow.yaml @@ -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' diff --git a/Makefile b/Makefile index 197fa58ba..ee2cb937e 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/libraries/easyflash/inc/ef_cfg.h b/libraries/easyflash/inc/ef_cfg.h index 03bd28777..e64f5ccae 100644 --- a/libraries/easyflash/inc/ef_cfg.h +++ b/libraries/easyflash/inc/ef_cfg.h @@ -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 diff --git a/sdk/OpenRDA5981 b/sdk/OpenRDA5981 index 5567e5398..7f22eafe2 160000 --- a/sdk/OpenRDA5981 +++ b/sdk/OpenRDA5981 @@ -1 +1 @@ -Subproject commit 5567e5398be98328d4e2d544c41063b7a89b4fce +Subproject commit 7f22eafe2d6d054d4d24552c43a7185d00544008 diff --git a/src/hal/rda5981/hal_flashConfig_rda5981.c b/src/hal/rda5981/hal_flashConfig_rda5981.c index fa596960c..1f2220313 100644 --- a/src/hal/rda5981/hal_flashConfig_rda5981.c +++ b/src/hal/rda5981/hal_flashConfig_rda5981.c @@ -1,17 +1,29 @@ -#ifdef PLATFORM_RDA5981 +#if PLATFORM_RDA5981 #include "../hal_flashConfig.h" -#include "wland_flash.h" +#include + +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 diff --git a/src/hal/rda5981/hal_flashVars_rda5981.c b/src/hal/rda5981/hal_flashVars_rda5981.c index 1afb913cf..3e9a5941b 100644 --- a/src/hal/rda5981/hal_flashVars_rda5981.c +++ b/src/hal/rda5981/hal_flashVars_rda5981.c @@ -3,11 +3,12 @@ #include "../../new_common.h" #include "../hal_flashVars.h" #include "../../logging/logging.h" -#include "wland_flash.h" +#include 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 + diff --git a/src/hal/rda5981/hal_generic_rda5981.c b/src/hal/rda5981/hal_generic_rda5981.c index 7c7b3a0b6..e9b6dc39a 100644 --- a/src/hal/rda5981/hal_generic_rda5981.c +++ b/src/hal/rda5981/hal_generic_rda5981.c @@ -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) diff --git a/src/hal/rda5981/hal_main_rda5981.cpp b/src/hal/rda5981/hal_main_rda5981.cpp index 5c583fee3..0c5f889a9 100644 --- a/src/hal/rda5981/hal_main_rda5981.cpp +++ b/src/hal/rda5981/hal_main_rda5981.cpp @@ -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); diff --git a/src/hal/rda5981/hal_ota_rda5981.c b/src/hal/rda5981/hal_ota_rda5981.c index 09d3547d0..818f71338 100644 --- a/src/hal/rda5981/hal_ota_rda5981.c +++ b/src/hal/rda5981/hal_ota_rda5981.c @@ -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,32 +28,34 @@ 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); total += writelen; startaddr += writelen; towrite -= writelen; - if (towrite > 0) + if(towrite > 0) { writebuf = request->received; writelen = recv(request->fd, writebuf, 1024, 0); @@ -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) { diff --git a/src/hal/rda5981/hal_wifi_rda5981.cpp b/src/hal/rda5981/hal_wifi_rda5981.cpp index bc7719227..2c416e5ce 100644 --- a/src/hal/rda5981/hal_wifi_rda5981.cpp +++ b/src/hal/rda5981/hal_wifi_rda5981.cpp @@ -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) diff --git a/src/littlefs/our_lfs.h b/src/littlefs/our_lfs.h index 552f51fd1..e683544b9 100644 --- a/src/littlefs/our_lfs.h +++ b/src/littlefs/our_lfs.h @@ -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 diff --git a/src/obk_config.h b/src/obk_config.h index e58dcf8c2..78aae36e3 100644 --- a/src/obk_config.h +++ b/src/obk_config.h @@ -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