diff --git a/.github/workflows/workflow.yaml b/.github/workflows/workflow.yaml index 8dafd1df5f..3b21577687 100644 --- a/.github/workflows/workflow.yaml +++ b/.github/workflows/workflow.yaml @@ -23,10 +23,20 @@ jobs: steps: - name: Source checkout uses: actions/checkout@v4 - - name: Update SDKs if required - run: make update-submodules + - name: Set outputs + id: refs + run: | + export BRANCH=${GITHUB_REF#refs/*/} + echo "branch: ${BRANCH}" + export BRANCHTRANSLATED=$(echo ${BRANCH} | tr '/' '_') + echo "short_ref: ${BRANCHTRANSLATED}" + export VERSION=${BRANCHTRANSLATED}_$(git rev-parse --short=12 HEAD) + echo "short_ref=${BRANCHTRANSLATED}" >> $GITHUB_OUTPUT + echo "sha_short=SHA-$(git rev-parse --short=12 HEAD)" >> $GITHUB_OUTPUT + echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Semantic Release id: semantic + if: github.ref == 'refs/heads/main' || github.ref_name == 'alpha' uses: cycjimmy/semantic-release-action@v4 with: dry_run: true @@ -37,22 +47,16 @@ jobs: conventional-changelog-conventionalcommits@7 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Set outputs - id: refs + - name: Set release outputs + id: refs_release + if: github.ref == 'refs/heads/main' || github.ref_name == 'alpha' run: | - export BRANCH=${GITHUB_REF#refs/*/} - echo "branch: ${BRANCH}" - export BRANCHTRANSLATED=$(echo ${BRANCH} | tr '/' '_') - echo "short_ref: ${BRANCHTRANSLATED}" - export VERSION="" if ${{ steps.semantic.outputs.new_release_published == 'true' }}; then export VERSION=${{ steps.semantic.outputs.new_release_version }} else export VERSION=${BRANCHTRANSLATED}_$(git rev-parse --short=12 HEAD) fi echo "new_release=${{ steps.semantic.outputs.new_release_published }}" >> $GITHUB_OUTPUT - echo "short_ref=${BRANCHTRANSLATED}" >> $GITHUB_OUTPUT - echo "sha_short=SHA-$(git rev-parse --short=12 HEAD)" >> $GITHUB_OUTPUT echo "version=${VERSION}" >> $GITHUB_OUTPUT build2: @@ -194,6 +198,9 @@ jobs: gcc: 10.3-2021.10 - platform: OpenECR6600 variant: default + - platform: OpenRDA5981 + variant: default + gcc: 6-2017-q2 # extras for BK7231T - platform: OpenBK7231T @@ -233,6 +240,7 @@ jobs: architecture: 'x64' cache: 'pip' - name: Install dependencies + if: ${{ matrix.platform == 'OpenLN882H' }} uses: awalsh128/cache-apt-pkgs-action@latest with: packages: cmake diff --git a/.gitmodules b/.gitmodules index df98c00180..737d2d7f95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -77,3 +77,7 @@ path = sdk/OpenTXW81X url = https://github.com/NonPIayerCharacter/OpenTXW81X branch = main +[submodule "sdk/OpenRDA5981"] + path = sdk/OpenRDA5981 + url = https://github.com/NonPIayerCharacter/OpenRDA5981 + branch = master diff --git a/.releaserc.yaml b/.releaserc.yaml index 28a6a20ae5..c8ea5f7a82 100644 --- a/.releaserc.yaml +++ b/.releaserc.yaml @@ -104,6 +104,8 @@ generateNotes: - RTL87x1DA (AmebaDplus family) (eg BW20, WR11-U, WR11-2S) - RTL87x0E (AmebaLite family) (eg PKM8710ECF) - ECR6600 (eg AXYU, AXY2S, WG236, DSM-036, CDI-WX56600A-00, BL-M6600XT1, HF-LPT6200) + - TXW81X (eg TXW817-810) + - RDA5981 (eg RDA5981AM, RDA5981BM, WRD2L, TYWRD3S, HLK-M50) footerPartial: | {{#if noteGroups}} @@ -190,6 +192,7 @@ generateNotes: | ESP8266 1MB | UART Flash | [OpenESP8266_1MB_{{version}}.factory.bin]({{host}}/{{owner}}/{{repository}}/releases/download/{{version}}/OpenESP8266_1MB_{{version}}.factory.bin) | | ESP8266 2MB | UART Flash | [OpenESP8266_2MB_{{version}}.factory.bin]({{host}}/{{owner}}/{{repository}}/releases/download/{{version}}/OpenESP8266_2MB_{{version}}.factory.bin) | | ESP8266 2MB | OTA Update | [OpenESP8266_{{version}}.img]({{host}}/{{owner}}/{{repository}}/releases/download/{{version}}/OpenESP8266_{{version}}.img) | + | RDA5981 | UART/OTA | [OpenRDA5981_{{version}}.img]({{host}}/{{owner}}/{{repository}}/releases/download/{{version}}/OpenRDA5981_{{version}}.img) | | TXW81X | | [OpenTXW81X_{{version}}.bin]({{host}}/{{owner}}/{{repository}}/releases/download/{{version}}/OpenTXW81X_{{version}}.bin) | | Win32 | | [obkSimulator_{{version}}.zip]({{host}}/{{owner}}/{{repository}}/releases/download/{{version}}/obkSimulator_{{version}}.zip) | diff --git a/Makefile b/Makefile index 149e1b9654..5a7f48c51a 100644 --- a/Makefile +++ b/Makefile @@ -362,6 +362,14 @@ prebuild_OpenTXW81X: berry else echo "prebuild for OpenTXW81X not found ... "; \ fi +prebuild_OpenRDA5981: berry + git submodule update --init --recursive --depth=1 sdk/OpenRDA5981 + @if [ -e platforms/RDA5981/pre_build.sh ]; then \ + echo "prebuild found for OpenRDA5981"; \ + sh platforms/RDA5981/pre_build.sh; \ + else echo "prebuild for OpenRDA5981 not found ... "; \ + fi + # Build main binaries OpenBK7231T: prebuild_OpenBK7231T mkdir -p output @@ -663,6 +671,16 @@ OpenTXW81X: prebuild_OpenTXW81X mkdir -p output/$(APP_VERSION) cp sdk/OpenTXW81X/project/APP.bin output/$(APP_VERSION)/OpenTXW81X_$(APP_VERSION).bin #cp sdk/OpenTXW81X/project/APP_compress.bin output/$(APP_VERSION)/OpenTXW81X_$(APP_VERSION)_ota.img + +.PHONY: OpenRDA5981 +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 # Add custom Makefile if required -include custom.mk @@ -690,6 +708,7 @@ clean: -test -d ./sdk/ameba-rtos && cd sdk/ameba-rtos/amebalite_gcc_project && ./build.py -a ../../../platforms/RTL8720E -c -test -d ./sdk/beken_freertos_sdk && $(MAKE) -C sdk/beken_freertos_sdk clean -test -d ./sdk/OpenTXW81X && $(MAKE) -C sdk/OpenTXW81X/project clean + -test -d ./sdk/OpenRDA5981 && $(MAKE) -C sdk/OpenRDA5981 clean -test -d ./sdk/OpenLN882H/build && cmake --build ./sdk/OpenLN882H/build --target clean -test -d ./platforms/ESP-IDF/build-32 && cmake --build ./platforms/ESP-IDF/build-32 --target clean -test -d ./platforms/ESP-IDF/build-c3 && cmake --build ./platforms/ESP-IDF/build-c3 --target clean diff --git a/README.md b/README.md index 5373056df6..053478b38a 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Although this repository is named "OpenBK7231T_App", it has evolved into a multi - TR6260 (eg [HLK-M20](https://fccid.io/2AD56HLK-M20), XY-WE2S-A V1.1) (see [guide](https://www.elektroda.com/rtvforum/topic4093752.html)) - ECR6600 (eg [AXYU](https://developer.tuya.com/en/docs/iot/AXYU?id=Kb0rwbv5b7aiy), [AXY2S](https://developer.tuya.com/en/docs/iot/AXY2S?id=Kb1aztk507fxf), [WG236](https://www.skylabmodule.com/product/wifi6-802-11axbluetooth-ble-5-1-combo-module-wg236), [DSM-036](https://www.dusuniot.com/product-specification/dsm-036-wi-fi6-and-ble-dual-cloud-module]), CDI-WX56600A-00, [BL-M6600XT1](https://jkrorwxhkqmllp5m-static.micyjz.com/BL-M6600XT1_datasheet_V1.0.1.0_230817-aidllBpoKqpljSRnkmnkjlnjp.pdf?dp=GvUApKfKKUAU), [HF-LPT6200](http://www.hi-flying.com/hf-lpt6200) (see [guide](https://www.elektroda.com/rtvforum/topic4111822.html)) - TXW81X (eg TXW817-810, see [development thread](https://www.elektroda.com/rtvforum/topic4033757.html)) +- RDA5981 (eg RDA5981AM, RDA5981BM, WRD2L, TYWRD3S, HLK-M50) Please use automatically compiled binaries from the Releases tab. To build OpenBeken yourself for any supported platform, fork our version of the submodule SDK first, and then check out this app repository alongside it. Details further down. Alternatively consider using the easier [override method.](https://www.elektroda.com/rtvforum/topic4082682.html) diff --git a/docs/platforms.md b/docs/platforms.md index d68291afb4..c9d73d00f6 100644 --- a/docs/platforms.md +++ b/docs/platforms.md @@ -1,30 +1,31 @@ -| Platform | Family | WPA3 | OTA | GPIO | GPIO IRQ | UART | PWM | ADC | Deep sleep | WDT | SPI LED | IR | -|---------------------------------------------------------|-----------------|------|---------|------|----------|------|------|-----|------------|-----|---------|----| -| BK7231T | Beken | ✅¹² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅¹² | ✅ | -| BK7231N | Beken | ✅¹² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| BK7231S
BK7231U | Beken | ✅ | ✅¹ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| BK7238 | Beken | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| BK7252 | Beken | ✅ | ⚠️¹'¹⁴ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| BK7252N | Beken | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| XR809 | XRadio | ❌ | ❌⁵ | ✅ | ✅ | ✅ | ✅⁸ | ✅ | ✅ | ✅ | ❌ | ❌ | -| XR806 | XRadio | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁸ | ✅ | ✅ | ✅ | ❌ | ❌ | -| XR872/XF16 | XRadio | ✅ | ✅² | ✅ | ✅ | ✅ | ✅⁸ | ✅ | ✅ | ✅ | ❌ | ❌ | -| BL602/LF686 | Bouffalo Lab | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | -| W800/W801 | Winner Micro | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | -| W600/W601 | Winner Micro | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | -| LN882H | Lightning Semi | ✅ | ✅⁴ | ✅ | ✅ | ❌ | ✅ | ❗️ | ❌ | ✅ | ✅ | ✅ | -| ESP8266
ESP8285 | Espressif | ⚠️¹³ | ✅²'⁴ | ✅ | ✅ | ✅ | ✅⁷ | ❌ | ❗️ | ❓⁹ | ❌ | ❌ | -| ESP32
-C2
-C3
-C5
-C6
-C61
-S2
-S3 | Espressif | ⚠️¹³ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ❓ | ✅¹⁰ | ✅ | ✅ | ❌ | -| TR6260 | Transa Semi | ❌ | ❗️³'⁴ | ✅ | ❌ | ❌ | ✅⁸ | ❌ | ❌ | ✅⁹ | ❌ | ❌ | -| RTL8711AM (Ameba1) | Realtek | ❗️ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❌ | -| RTL8710B (AmebaZ) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❌ | -| RTL8710C
RTL8720C (AmebaZ2) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ➖ | ❌ | ✅ | ✅ | ✅ | -| RTL8720D (AmebaD)
RTL872xCSM
RTL8720CS (AmebaCS) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❗️ | -| RTL8721DA
RTL8711DAF (AmebaDplus) | Realtek | ✅ | ✅⁶ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❗️ | -| RTL8720E
RTL8710ECF (AmebaLite) | Realtek | ✅ | ✅⁶ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❗️ | -| ECR6600 | ESWIN | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁸ | ❗️ | ❗️¹¹ | ✅ | ❌ | ❌ | -| TXW81X | Taixin | ❌ | ❗️ | ✅ | ❓ | ❌ | ❌ | ❌ | ❌ | ❓ | ❌ | ❌ | +| Platform | Family | WPA3 | OTA | GPIO | GPIO IRQ | UART | PWM | ADC | Deep sleep | WDT | SPI LED | IR | +|---------------------------------------------------------|----------------|------|---------|------|----------|------|------|-----|------------|-----|---------|----| +| BK7231T | Beken | ✅¹² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅¹² | ✅ | +| BK7231N | Beken | ✅¹² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| BK7231S
BK7231U | Beken | ✅ | ✅¹ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| BK7238 | Beken | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| BK7252 | Beken | ✅ | ⚠️¹'¹⁴ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| BK7252N | Beken | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| XR809 | XRadio | ❌ | ❌⁵ | ✅ | ✅ | ✅ | ✅⁸ | ✅ | ✅ | ✅ | ❌ | ❌ | +| XR806 | XRadio | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁸ | ✅ | ✅ | ✅ | ❌ | ❌ | +| XR872/XF16 | XRadio | ✅ | ✅² | ✅ | ✅ | ✅ | ✅⁸ | ✅ | ✅ | ✅ | ❌ | ❌ | +| BL602/LF686 | Bouffalo Lab | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | +| W800/W801 | Winner Micro | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | +| W600/W601 | Winner Micro | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | +| LN882H | Lightning Semi | ✅ | ✅⁴ | ✅ | ✅ | ❌ | ✅ | ❗️ | ❌ | ✅ | ✅ | ✅ | +| ESP8266
ESP8285 | Espressif | ⚠️¹³ | ✅²'⁴ | ✅ | ✅ | ✅ | ✅⁷ | ❌ | ❗️ | ❓⁹ | ❌ | ❌ | +| ESP32
-C2
-C3
-C5
-C6
-C61
-S2
-S3 | Espressif | ⚠️¹³ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ❓ | ✅¹⁰ | ✅ | ✅ | ❌ | +| TR6260 | Transa Semi | ❌ | ❗️³'⁴ | ✅ | ❌ | ❌ | ✅⁸ | ❌ | ❌ | ✅⁹ | ❌ | ❌ | +| RTL8711AM (Ameba1) | Realtek | ❗️ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❌ | +| RTL8710B (AmebaZ) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❌ | +| RTL8710C
RTL8720C (AmebaZ2) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ➖ | ❌ | ✅ | ✅ | ✅ | +| RTL8720D (AmebaD)
RTL872xCSM
RTL8720CS (AmebaCS) | Realtek | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅⁸ | ❌ | ❌ | ✅ | ✅ | ❗️ | +| RTL8721DA
RTL8711DAF (AmebaDplus) | Realtek | ✅ | ✅⁶ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❗️ | +| RTL8720E
RTL8710ECF (AmebaLite) | Realtek | ✅ | ✅⁶ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❗️ | +| ECR6600 | ESWIN | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁸ | ❗️ | ❗️¹¹ | ✅ | ❌ | ❌ | +| TXW81X | Taixin | ❌ | ❗️ | ✅ | ❓ | ❌ | ❌ | ❌ | ❌ | ❓ | ❌ | ❌ | +| RDA5981 | RDA | ❌ | ❓ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ➖ | ❌ | ✅ - Works
❓ - Not tested
diff --git a/libraries/easyflash/inc/ef_cfg.h b/libraries/easyflash/inc/ef_cfg.h index 47ce7a2299..5cb6f43d56 100644 --- a/libraries/easyflash/inc/ef_cfg.h +++ b/libraries/easyflash/inc/ef_cfg.h @@ -137,6 +137,11 @@ #define EF_START_ADDR 0xEF000 #define ENV_AREA_SIZE 0x6000 +#elif PLATFORM_RDA5981 + +#define EF_START_ADDR 0xF7000 +#define ENV_AREA_SIZE 0x4000 + #elif WINDOWS #define EF_START_ADDR 0 diff --git a/libraries/easyflash/ports/ef_port.c b/libraries/easyflash/ports/ef_port.c index 03e25093d3..b9649db28b 100644 --- a/libraries/easyflash/ports/ef_port.c +++ b/libraries/easyflash/ports/ef_port.c @@ -30,7 +30,7 @@ #include #include #include -#if !WINDOWS && !PLATFORM_TXW81X +#if !WINDOWS && !PLATFORM_TXW81X && !PLATFORM_RDA5981 #include "FreeRTOS.h" #include "semphr.h" #include "queue.h" @@ -72,6 +72,16 @@ typedef k_mutex_handle_t QueueHandle_t; #define xSemaphoreGive(a) csi_kernel_mutex_unlock(a) extern struct spi_nor_flash* obk_flash; +#elif PLATFORM_RDA5981 + +#include "stdbool.h" +#include "rda_sys_wrapper.h" + +typedef void* QueueHandle_t; +#define xSemaphoreCreateMutex rda_mutex_create +#define xSemaphoreTake rda_mutex_wait +#define xSemaphoreGive rda_mutex_realease + #elif WINDOWS #include "framework.h" @@ -172,7 +182,7 @@ EfErrCode ef_port_read(uint32_t addr, uint32_t* buf, size_t size) #elif WINDOWS memcpy(buf, env_area + addr, size); return EF_NO_ERR; -#elif PLATFORM_TXW81X +#elif PLATFORM_TXW81X || PLATFORM_RDA5981 HAL_FlashRead(buf, size, addr); return EF_NO_ERR; #endif @@ -211,7 +221,7 @@ EfErrCode ef_port_erase(uint32_t addr, size_t size) return res; #elif WINDOWS memset(env_area + addr, 0xFF, size); -#elif PLATFORM_TXW81X +#elif PLATFORM_TXW81X || PLATFORM_RDA5981 HAL_FlashEraseSector(addr); return EF_NO_ERR; #endif @@ -250,7 +260,7 @@ EfErrCode ef_port_write(uint32_t addr, const uint32_t* buf, size_t size) #elif WINDOWS memcpy(env_area + addr, buf, size); return EF_NO_ERR; -#elif PLATFORM_TXW81X +#elif PLATFORM_TXW81X || PLATFORM_RDA5981 HAL_FlashWrite(buf, size, addr); return EF_NO_ERR; #endif diff --git a/platforms/RDA5981/OpenBeken.mk b/platforms/RDA5981/OpenBeken.mk new file mode 100644 index 0000000000..ef18049216 --- /dev/null +++ b/platforms/RDA5981/OpenBeken.mk @@ -0,0 +1,46 @@ +OBK_DIR = ../../.. + +CC_FLAGS += -DPLATFORM_RDA5981=1 -DMBED_HEAP_STATS_ENABLED -DWRAP_PRINTF +CPPC_FLAGS += -DPLATFORM_RDA5981=1 -DMBED_HEAP_STATS_ENABLED -DWRAP_PRINTF + +INCLUDE_PATHS += -I$(OBK_DIR)/libraries/easyflash/inc + +SRC_C += $(OBK_DIR)/src/hal/rda5981/hal_flashConfig_rda5981.c +SRC_C += $(OBK_DIR)/src/hal/rda5981/hal_flashVars_rda5981.c +SRC_C += $(OBK_DIR)/src/hal/rda5981/hal_generic_rda5981.c +SRC_C += $(OBK_DIR)/src/hal/rda5981/hal_pins_rda5981.c +SRC_C += $(OBK_DIR)/src/hal/rda5981/hal_ota_rda5981.c +SRC_C += $(OBK_DIR)/src/hal/rda5981/hal_uart_rda5981.c +SRC_CPP += $(OBK_DIR)/src/hal/rda5981/hal_main_rda5981.cpp +SRC_CPP += $(OBK_DIR)/src/hal/rda5981/hal_wifi_rda5981.cpp + +OBK_SRCS = $(OBK_DIR)/src/ +include $(OBK_DIR)/platforms/obk_main.mk +SRC_C += $(OBKM_SRC) +#SRC_CPP += $(OBKM_SRC_CXX) +CC_FLAGS += $(OBK_CFLAGS) +CPPC_FLAGS += $(OBK_CFLAGS) +#CPPFLAGS += $(INCLUDES) -fpermissive + +SRC_C += $(OBK_DIR)/libraries/easyflash/ports/ef_port.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/easyflash.c +#SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_cmd.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_env.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_env_legacy.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_env_legacy_wl.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_iap.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_log.c +SRC_C += $(OBK_DIR)/libraries/easyflash/src/ef_utils.c + +INCLUDE_PATHS += -I$(OBK_DIR)/include -I$(OBK_DIR)/libraries/berry/src +BERRY_MODULEPATH = $(OBK_DIR)/src/berry/modules +BERRY_SRCPATH = $(OBK_DIR)/libraries/berry/src + +include $(OBK_DIR)/libraries/berry.mk + +SRC_C += $(BERRY_SRC_C) + +OBJECTS += $(SRC_C:.c=.o) +OBJECTS += $(SRC_CPP:.cpp=.o) + +LD_FLAGS += -Wl,--wrap,vsnprintf -Wl,--wrap,snprintf -Wl,--wrap,sprintf -Wl,--wrap,vsprintf diff --git a/sdk/OpenRDA5981 b/sdk/OpenRDA5981 new file mode 160000 index 0000000000..5567e5398b --- /dev/null +++ b/sdk/OpenRDA5981 @@ -0,0 +1 @@ +Subproject commit 5567e5398be98328d4e2d544c41063b7a89b4fce diff --git a/src/cmnds/cmd_eventHandlers.c b/src/cmnds/cmd_eventHandlers.c index 8f3a90abd3..0bccf9c63f 100644 --- a/src/cmnds/cmd_eventHandlers.c +++ b/src/cmnds/cmd_eventHandlers.c @@ -135,14 +135,6 @@ int EVENT_ParseEventName(const char *s) { } if (!stricmp(s, "noPingTime")) return CMD_EVENT_CHANGE_NOPINGTIME; - if (!stricmp(s, "NoMQTTTime")) - return CMD_EVENT_CHANGE_NOMQTTTIME; - if(!stricmp(s,"voltage")) - return CMD_EVENT_CHANGE_VOLTAGE; - if(!stricmp(s,"current")) - return CMD_EVENT_CHANGE_CURRENT; - if(!stricmp(s,"power")) - return CMD_EVENT_CHANGE_POWER; if(!stricmp(s,"OnRelease")) return CMD_EVENT_PIN_ONRELEASE; if (!stricmp(s, "OnPress")) @@ -169,55 +161,75 @@ int EVENT_ParseEventName(const char *s) { return CMD_EVENT_CHANNEL_ONCHANGE; if(!stricmp(s,"OnUART")) return CMD_EVENT_ON_UART; +#if ENABLE_MQTT if(!stricmp(s,"MQTTState")) return CMD_EVENT_MQTT_STATE; + if(!stricmp(s, "NoMQTTTime")) + return CMD_EVENT_CHANGE_NOMQTTTIME; + if(!stricmp(s, "OnMQTT")) + return CMD_EVENT_ON_MQTT; +#endif +#if ENABLE_NTP if (!stricmp(s, "NTPState")) return CMD_EVENT_NTP_STATE; +#endif +#if ENABLE_LED_BASIC if (!stricmp(s, "LEDState")) return CMD_EVENT_LED_STATE; if (!stricmp(s, "LEDMode")) return CMD_EVENT_LED_MODE; +#endif +#if ENABLE_BL_SHARED + if(!stricmp(s, "voltage")) + return CMD_EVENT_CHANGE_VOLTAGE; + if(!stricmp(s, "current")) + return CMD_EVENT_CHANGE_CURRENT; + if(!stricmp(s, "power")) + return CMD_EVENT_CHANGE_POWER; if(!stricmp(s,"energycounter") || !stricmp(s, "energy")) return CMD_EVENT_CHANGE_CONSUMPTION_TOTAL; if(!stricmp(s,"energycounter_last_hour")) return CMD_EVENT_CHANGE_CONSUMPTION_LAST_HOUR; +#endif +#if ENABLE_DRIVER_IRREMOTEESP || ENABLE_DRIVER_IR || ENABLE_DRIVER_IR2 || WINDOWS if(!stricmp(s,"IR_RC5")) - return CMD_EVENT_IR_RC5; + return CMD_EVENT_IR_RC5; if(!stricmp(s,"IR_RC6")) - return CMD_EVENT_IR_RC6; + return CMD_EVENT_IR_RC6; if(!stricmp(s,"IR_Samsung")) - return CMD_EVENT_IR_SAMSUNG; + return CMD_EVENT_IR_SAMSUNG; if(!stricmp(s,"IR_PANASONIC")) - return CMD_EVENT_IR_PANASONIC; + return CMD_EVENT_IR_PANASONIC; if(!stricmp(s,"IR_NEC")) - return CMD_EVENT_IR_NEC; + return CMD_EVENT_IR_NEC; if(!stricmp(s,"IR_SAMSUNG_LG")) - return CMD_EVENT_IR_SAMSUNG_LG; + return CMD_EVENT_IR_SAMSUNG_LG; if(!stricmp(s,"IR_SHARP")) - return CMD_EVENT_IR_SHARP; + return CMD_EVENT_IR_SHARP; if(!stricmp(s,"IR_SONY")) - return CMD_EVENT_IR_SONY; - // WiFi state has single argument: HALWifiStatus_t - if (!stricmp(s, "WiFiState")) - return CMD_EVENT_WIFI_STATE; + return CMD_EVENT_IR_SONY; +#endif +#if ENABLE_DRIVER_TUYAMCU if (!stricmp(s, "TuyaMCUParsed")) return CMD_EVENT_TUYAMCU_PARSED; + if(!stricmp(s, "OnDP")) + return CMD_EVENT_ON_DP; + if(!stricmp(s, "MissedHeartbeats")) + return CMD_EVENT_MISSEDHEARTBEATS; +#endif + // WiFi state has single argument: HALWifiStatus_t + if(!stricmp(s, "WiFiState")) + return CMD_EVENT_WIFI_STATE; if (!stricmp(s, "OnADCButton")) return CMD_EVENT_ADC_BUTTON; if (!stricmp(s, "OnCustomDown")) return CMD_EVENT_CUSTOM_DOWN; if (!stricmp(s, "OnCustomUP")) return CMD_EVENT_CUSTOM_UP; - if (!stricmp(s, "OnMQTT")) - return CMD_EVENT_ON_MQTT; if (!stricmp(s, "OnCMD")) return CMD_EVENT_ON_CMD; - if (!stricmp(s, "OnDP")) - return CMD_EVENT_ON_DP; if (!stricmp(s, "OnHTTP")) return CMD_EVENT_ON_HTTP; - if (!stricmp(s, "MissedHeartbeats")) - return CMD_EVENT_MISSEDHEARTBEATS; if (isdigit((unsigned char)*s)) { return atoi(s); } diff --git a/src/cmnds/cmd_main.c b/src/cmnds/cmd_main.c index f4092ef667..22fffa6e6b 100644 --- a/src/cmnds/cmd_main.c +++ b/src/cmnds/cmd_main.c @@ -315,6 +315,15 @@ static commandResult_t CMD_PowerSave(const void* context, const char* cmd, const psm_pwr_mgt_ctrl(0); psm_sleep_mode_ena_op(true, 0); } +#elif PLATFORM_RDA5981 + if(bOn) + { + wland_set_sta_sleep(1); + } + else + { + wland_set_sta_sleep(0); + } #else ADDLOG_INFO(LOG_FEATURE_CMD, "PowerSave is not implemented on this platform"); #endif diff --git a/src/driver/drv_ir2.c b/src/driver/drv_ir2.c index 34a0c9a60f..53607b35ef 100644 --- a/src/driver/drv_ir2.c +++ b/src/driver/drv_ir2.c @@ -171,7 +171,7 @@ int state = 0; int pwmIndex = -1; unsigned int period; -uint8_t group, channel; +static uint8_t group, channel; // define to 1 to enable debug timer io output #if 0 diff --git a/src/hal/rda5981/hal_flashConfig_rda5981.c b/src/hal/rda5981/hal_flashConfig_rda5981.c new file mode 100644 index 0000000000..ceec75a126 --- /dev/null +++ b/src/hal/rda5981/hal_flashConfig_rda5981.c @@ -0,0 +1,17 @@ +#ifdef PLATFORM_RDA5981 + +#include "../hal_flashConfig.h" +#include "wland_flash.h" + +int HAL_Configuration_ReadConfigMemory(void* target, int dataLen) +{ + return rda5981_read_flash(0x180fc000, target, dataLen) == 0; +} + +int HAL_Configuration_SaveConfigMemory(void* src, int dataLen) +{ + int ret = rda5981_erase_flash(0x180fc000, 0x1000); + return rda5981_write_flash(0x180fc000, src, dataLen) == 0; +} + +#endif // PLATFORM_RDA5981 diff --git a/src/hal/rda5981/hal_flashVars_rda5981.c b/src/hal/rda5981/hal_flashVars_rda5981.c new file mode 100644 index 0000000000..5665fe0466 --- /dev/null +++ b/src/hal/rda5981/hal_flashVars_rda5981.c @@ -0,0 +1,162 @@ +#ifdef PLATFORM_RDA5981 + +#include "../../new_common.h" +#include "../hal_flashVars.h" +#include "../../logging/logging.h" +#include "wland_flash.h" + +FLASH_VARS_STRUCTURE flash_vars; +static int g_loaded = 0; + +#define SAVE_CHANGE_IF_REQUIRED_AND_COUNT(target, source, counter) \ + if((target) != (source)) { \ + (target) = (source); \ + counter++; \ + } + +extern void InitEasyFlashIfNeeded(); + +static int ReadFlashVars(void* target, int dataLen) +{ + g_loaded = rda5981_read_user_data(target, dataLen, BIT18) == 0; + return dataLen; +} + +static int SaveFlashVars(void* src, int dataLen) +{ + rda5981_erase_user_data(BIT18); + rda5981_write_user_data(src, dataLen, BIT18); + return dataLen; +} + +// call at startup +void HAL_FlashVars_IncreaseBootCount() +{ + memset(&flash_vars, 0, sizeof(flash_vars)); + ReadFlashVars(&flash_vars, sizeof(flash_vars)); + flash_vars.boot_count++; + SaveFlashVars(&flash_vars, sizeof(flash_vars)); +} + +void HAL_FlashVars_SaveChannel(int index, int value) +{ + if(index < 0 || index >= MAX_RETAIN_CHANNELS) + return; + if(g_loaded == 0) + { + ReadFlashVars(&flash_vars, sizeof(flash_vars)); + } + flash_vars.savedValues[index] = value; + // save after increase + SaveFlashVars(&flash_vars, sizeof(flash_vars)); +} + +void HAL_FlashVars_ReadLED(byte* mode, short* brightness, short* temperature, byte* rgb, byte* bEnableAll) +{ + if(g_loaded == 0) + { + ReadFlashVars(&flash_vars, sizeof(flash_vars)); + } + *bEnableAll = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4]; + *mode = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3]; + *temperature = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2]; + *brightness = flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1]; + rgb[0] = flash_vars.rgb[0]; + rgb[1] = flash_vars.rgb[1]; + rgb[2] = flash_vars.rgb[2]; +} + +void HAL_FlashVars_SaveLED(byte mode, short brightness, short temperature, byte r, byte g, byte b, byte bEnableAll) +{ + int iChangesCount = 0; + + if(g_loaded == 0) + { + ReadFlashVars(&flash_vars, sizeof(flash_vars)); + } + + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 1], brightness, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 2], temperature, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 3], mode, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.savedValues[MAX_RETAIN_CHANNELS - 4], bEnableAll, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[0], r, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[1], g, iChangesCount); + SAVE_CHANGE_IF_REQUIRED_AND_COUNT(flash_vars.rgb[2], b, iChangesCount); + + if(iChangesCount > 0) + { + ADDLOG_INFO(LOG_FEATURE_CFG, "####### Flash Save LED #######"); + SaveFlashVars(&flash_vars, sizeof(flash_vars)); + } +} + +short HAL_FlashVars_ReadUsage() +{ + return 0; +} + +void HAL_FlashVars_SaveTotalUsage(short usage) +{ + +} + +// call once started (>30s?) +void HAL_FlashVars_SaveBootComplete() +{ + flash_vars.boot_success_count = flash_vars.boot_count; + SaveFlashVars(&flash_vars, sizeof(flash_vars)); +} + +// call to return the number of boots since a HAL_FlashVars_SaveBootComplete +int HAL_FlashVars_GetBootFailures() +{ + int diff = 0; + diff = flash_vars.boot_count - flash_vars.boot_success_count; + return diff; +} + +int HAL_FlashVars_GetBootCount() +{ + return flash_vars.boot_count; +} + +int HAL_FlashVars_GetChannelValue(int ch) +{ + if(ch < 0 || ch >= MAX_RETAIN_CHANNELS) + return 0; + if(g_loaded == 0) + { + ReadFlashVars(&flash_vars, sizeof(flash_vars)); + } + return flash_vars.savedValues[ch]; +} + +int HAL_GetEnergyMeterStatus(ENERGY_METERING_DATA* data) +{ + if(data != NULL) + { + if(g_loaded == 0) + { + ReadFlashVars(&flash_vars, sizeof(flash_vars)); + } + memcpy(data, &flash_vars.emetering, sizeof(ENERGY_METERING_DATA)); + } + return 0; +} + +int HAL_SetEnergyMeterStatus(ENERGY_METERING_DATA* data) +{ + if(data != NULL) + { + memcpy(&flash_vars.emetering, data, sizeof(ENERGY_METERING_DATA)); + SaveFlashVars(&flash_vars, sizeof(flash_vars)); + } + return 0; +} + +void HAL_FlashVars_SaveTotalConsumption(float total_consumption) +{ + flash_vars.emetering.TotalConsumption = total_consumption; +} + +#endif // PLATFORM_RDA5981 diff --git a/src/hal/rda5981/hal_generic_rda5981.c b/src/hal/rda5981/hal_generic_rda5981.c new file mode 100644 index 0000000000..7c7b3a0b6e --- /dev/null +++ b/src/hal/rda5981/hal_generic_rda5981.c @@ -0,0 +1,47 @@ +#if PLATFORM_RDA5981 + +#include "../hal_generic.h" +#include "wland_flash.h" +#include "rda_wdt_api.h" +#include "wait_api.h" + +static wdt_t obj; + +void HAL_RebootModule() +{ + //rda_wdt_softreset(); + rda_sys_softreset(); +} + +void HAL_Delay_us(int delay) +{ + wait_us(delay); +} + +void HAL_Configure_WDT() +{ + rda_wdt_init(&obj, 10); + rda_wdt_start(&obj); +} + +void HAL_Run_WDT() +{ + rda_wdt_feed(&obj); +} + +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) +{ + return rda5981_write_flash(0x18000000 + startaddr, (uint8_t*)buffer, writelen); +} + +int HAL_FlashEraseSector(int startaddr) +{ + return rda5981_erase_flash(0x18000000 + startaddr, 0x1000); +} + +#endif // PLATFORM_RDA5981 diff --git a/src/hal/rda5981/hal_main_rda5981.cpp b/src/hal/rda5981/hal_main_rda5981.cpp new file mode 100644 index 0000000000..5c583fee3e --- /dev/null +++ b/src/hal/rda5981/hal_main_rda5981.cpp @@ -0,0 +1,28 @@ +#if PLATFORM_RDA5981 + +#include "rda_sys_wrapper.h" +#include "console.h" +#include "rda59xx_daemon.h" +#include "wland_flash.h" +#include "WiFiStackInterface.h" + +extern "C" { + extern void Main_Init(); + extern void Main_OnEverySecond(); +} + +extern WiFiStackInterface wifi; + +__attribute__((used)) int main() +{ + //rda5981_set_user_data_addr(0x180FB000, 0x180FC000, 3584); + wifi.init(); + Main_Init(); + while(true) + { + osDelay(1000); + Main_OnEverySecond(); + } +} + +#endif diff --git a/src/hal/rda5981/hal_ota_rda5981.c b/src/hal/rda5981/hal_ota_rda5981.c new file mode 100644 index 0000000000..30037c7c47 --- /dev/null +++ b/src/hal/rda5981/hal_ota_rda5981.c @@ -0,0 +1,92 @@ +#if PLATFORM_RDA5981 + +#include "../../obk_config.h" +#include "../../new_common.h" +#include "../../new_cfg.h" +#include "../../logging/logging.h" +#include "../../httpserver/new_http.h" +#include "../hal_ota.h" + +#include "rda5981_ota.h" + +int http_rest_post_flash(http_request_t* request, int startaddr, int maxaddr) +{ + int total = 0; + int towrite = request->bodylen; + char* writebuf = request->bodystart; + int writelen = request->bodylen; + + ADDLOG_DEBUG(LOG_FEATURE_OTA, "OTA post len %d", request->contentLength); + + int ret = 0; + + if (request->contentLength > 0) + { + towrite = request->contentLength; + } + else + { + ret = -1; + ADDLOG_ERROR(LOG_FEATURE_OTA, "Content-length is 0"); + goto update_ota_exit; + } + startaddr = 0x1807E000; + // if compressed ota + //startaddr = 0x1809C000; + if(rda5981_write_partition_start(startaddr, towrite) != 0) + { + ret = -1; + ADDLOG_ERROR(LOG_FEATURE_OTA, "rda5981_write_partition_start failed"); + goto update_ota_exit; + } + + do + { + if(rda5981_write_partition(startaddr, (unsigned char*)writebuf, writelen) != 0) + { + ret = -1; + goto update_ota_exit; + } + delay_ms(5); + ADDLOG_DEBUG(LOG_FEATURE_OTA, "Writelen %i at %i", writelen, total); + total += writelen; + startaddr += writelen; + towrite -= writelen; + if (towrite > 0) + { + writebuf = request->received; + writelen = recv(request->fd, writebuf, 2048, 0); + if (writelen < 0) + { + ADDLOG_DEBUG(LOG_FEATURE_OTA, "recv returned %d - end of data - remaining %d", writelen, towrite); + ret = -1; + } + } + } while ((towrite > 0) && (writelen >= 0)); + + int check = rda5981_write_partition_end(); + if(check != 0) + { + ADDLOG_ERROR(LOG_FEATURE_OTA, "rda5981_write_partition_end failed"); + ret = -1; + } +update_ota_exit: + if (ret != -1) + { + ADDLOG_INFO(LOG_FEATURE_OTA, "OTA is successful"); + } + else + { + ADDLOG_ERROR(LOG_FEATURE_OTA, "OTA failed. Reboot to retry"); + return http_rest_error(request, ret, "error"); + } + + ADDLOG_DEBUG(LOG_FEATURE_OTA, "%d total bytes written", total); + http_setup(request, httpMimeTypeJson); + hprintf255(request, "{\"size\":%d}", total); + poststr(request, NULL); + CFG_IncrementOTACount(); + return 0; +} + +#endif diff --git a/src/hal/rda5981/hal_pinmap_rda5981.h b/src/hal/rda5981/hal_pinmap_rda5981.h new file mode 100644 index 0000000000..3e684b3fb9 --- /dev/null +++ b/src/hal/rda5981/hal_pinmap_rda5981.h @@ -0,0 +1,23 @@ +#ifdef PLATFORM_RDA5981 + +#include "../../new_common.h" +#include "../../logging/logging.h" +#include "../../new_cfg.h" +#include "../../new_pins.h" +#include +#include "pwmout_api.h" +#include "gpio_irq_api.h" + +typedef struct rdaPinMapping_s +{ + const char* name; + PinName pin; + gpio_t* gpio; + gpio_irq_t* irq; + pwmout_t* pwm; +} rdaPinMapping_t; + +extern rdaPinMapping_t g_pins[]; +extern int g_numPins; + +#endif // PLATFORM_RDA5981 diff --git a/src/hal/rda5981/hal_pins_rda5981.c b/src/hal/rda5981/hal_pins_rda5981.c new file mode 100644 index 0000000000..adce6db1ba --- /dev/null +++ b/src/hal/rda5981/hal_pins_rda5981.c @@ -0,0 +1,254 @@ +#ifdef PLATFORM_RDA5981 + +#include "../../new_common.h" +#include "../../logging/logging.h" +#include "../../new_cfg.h" +#include "../../new_pins.h" +#include "../hal_pins.h" +#include "hal_pinmap_rda5981.h" + +rdaPinMapping_t g_pins[] = { + { "IO0 (B0)", GPIO_PIN0, NULL, NULL }, + { "IO1 (B1/RX1)", GPIO_PIN1, NULL, NULL }, + { "IO2 (B2/TX1)", GPIO_PIN2, NULL, NULL }, + { "IO3 (B3)", GPIO_PIN3, NULL, NULL }, + { "IO4 (B4)", GPIO_PIN4, NULL, NULL }, + { "IO5 (B5)", GPIO_PIN5, NULL, NULL }, + { "IO6 (B6)", GPIO_PIN6, NULL, NULL }, + { "IO7 (B7)", GPIO_PIN7, NULL, NULL }, + { "IO8 (B8)", GPIO_PIN8, NULL, NULL }, + { "IO9 (B9)", GPIO_PIN9, NULL, NULL }, + { "IO10 (A8)", GPIO_PIN10, NULL, NULL }, + { "IO11 (A9)", GPIO_PIN11, NULL, NULL }, + { "IO12 (C0)", GPIO_PIN12, NULL, NULL }, + { "IO13 (C1)", GPIO_PIN13, NULL, NULL }, + { "IO14 (C2)", GPIO_PIN14, NULL, NULL }, + { "IO15 (C3)", GPIO_PIN15, NULL, NULL }, + { "IO16 (C4)", GPIO_PIN16, NULL, NULL }, + { "IO17 (C5)", GPIO_PIN17, NULL, NULL }, + { "IO18 (C6)", GPIO_PIN18, NULL, NULL }, + { "IO19 (C7)", GPIO_PIN19, NULL, NULL }, + { "IO20 (C8)", GPIO_PIN20, NULL, NULL }, + { "IO21 (C9)", GPIO_PIN21, NULL, NULL }, + { "IO22 (D0)", GPIO_PIN22, NULL, NULL }, + { "IO23 (D1)", GPIO_PIN23, NULL, NULL }, + { "IO24 (D2/RX1)", GPIO_PIN24, NULL, NULL }, + { "IO25 (D3/TX1)", GPIO_PIN25, NULL, NULL }, + { "IO26 (A0/RX0)", GPIO_PIN26, NULL, NULL }, + { "IO27 (A1/TX0)", GPIO_PIN27, NULL, NULL }, + //{ "IO14 (A2)", GPIO_PIN14A, NULL, NULL }, + //{ "IO15 (A3)", GPIO_PIN15A, NULL, NULL }, + //{ "IO16 (A4)", GPIO_PIN16A, NULL, NULL }, + //{ "IO17 (A5)", GPIO_PIN17A, NULL, NULL }, + //{ "IO18 (A6)", GPIO_PIN18A, NULL, NULL }, + //{ "IO19 (A7)", GPIO_PIN19A, NULL, NULL }, + { "VBAT", ADC_PIN2, NULL, NULL }, +}; + +int g_numPins = sizeof(g_pins) / sizeof(g_pins[0]) - 1; + +int HAL_PIN_CanThisPinBePWM(int index) +{ + if(index >= g_numPins) + return 0; + rdaPinMapping_t* pin = g_pins + index; + switch(pin->pin) + { + case PA_0: + case PA_1: + case PB_0: + case PB_1: + case PB_2: + case PB_3: + case PB_8: + case PD_0: + case PD_1: + case PD_2: + case PD_3: + return 1; + default: return 0; + } +} + +int PIN_GetPWMIndexForPinIndex(int index) +{ + rdaPinMapping_t* pin = g_pins + index; + if(index >= g_numPins) + return -1; + if(pin->pwm != NULL) return pin->pwm->channel; + else return HAL_PIN_CanThisPinBePWM(index); +} + +const char* HAL_PIN_GetPinNameAlias(int index) +{ + if(index >= g_numPins + 1) + return "error"; + return g_pins[index].name; +} + +void RDA_GPIO_Init(rdaPinMapping_t* pin) +{ + if(pin->gpio != NULL || pin->irq != NULL) + { + return; + } + pin->gpio = os_malloc(sizeof(gpio_t)); + memset(pin->gpio, 0, sizeof(gpio_t)); + gpio_init(pin->gpio, pin->pin); +} + +void HAL_PIN_SetOutputValue(int index, int iVal) +{ + rdaPinMapping_t* pin = g_pins + index; + if(index >= g_numPins || pin->gpio == NULL) + return; + gpio_write(pin->gpio, iVal ? 1 : 0); +} + +int HAL_PIN_ReadDigitalInput(int index) +{ + rdaPinMapping_t* pin = g_pins + index; + if(index >= g_numPins || pin->gpio == NULL) + return 0; + return gpio_read(pin->gpio); +} + +void HAL_PIN_Setup_Input_Pullup(int index) +{ + if(index >= g_numPins) + return; + rdaPinMapping_t* pin = g_pins + index; + RDA_GPIO_Init(pin); + if(pin->gpio == NULL) + return; + gpio_dir(pin->gpio, PIN_INPUT); + gpio_mode(pin->gpio, PullUp); +} + +void HAL_PIN_Setup_Input_Pulldown(int index) +{ + if(index >= g_numPins) + return; + rdaPinMapping_t* pin = g_pins + index; + RDA_GPIO_Init(pin); + if(pin->gpio == NULL) + return; + gpio_dir(pin->gpio, PIN_INPUT); + gpio_mode(pin->gpio, PullDown); +} + +void HAL_PIN_Setup_Input(int index) +{ + if(index >= g_numPins) + return; + rdaPinMapping_t* pin = g_pins + index; + RDA_GPIO_Init(pin); + if(pin->gpio == NULL) + return; + gpio_dir(pin->gpio, PIN_INPUT); + gpio_mode(pin->gpio, PullNone); +} + +void HAL_PIN_Setup_Output(int index) +{ + if(index >= g_numPins) + return; + rdaPinMapping_t* pin = g_pins + index; + RDA_GPIO_Init(pin); + if(pin->gpio == NULL) + return; + gpio_dir(pin->gpio, PIN_OUTPUT); + gpio_mode(pin->gpio, PullUp); +} + +void HAL_PIN_PWM_Stop(int index) +{ + if(index >= g_numPins || !HAL_PIN_CanThisPinBePWM(index)) + return; + rdaPinMapping_t* pin = g_pins + index; + if(pin->pwm == NULL) return; + //pwmout_stop(pin->pwm); + pwmout_free(pin->pwm); + os_free(pin->pwm); + pin->pwm = NULL; +} + +void HAL_PIN_PWM_Start(int index, int freq) +{ + if(index >= g_numPins || !HAL_PIN_CanThisPinBePWM(index)) + return; + rdaPinMapping_t* pin = g_pins + index; + if(pin->pwm != NULL) + { + pwmout_period_us(pin->pwm, 1000000 / freq); + return; + } + if(pin->gpio != NULL) + { + //gpio_deinit(pin->gpio); + os_free(pin->gpio); + pin->gpio = NULL; + } + pin->pwm = os_malloc(sizeof(pwmout_t)); + memset(pin->pwm, 0, sizeof(pwmout_t)); + pwmout_init(pin->pwm, pin->pin); + pwmout_period_us(pin->pwm, 1000000 / freq); +} + +void HAL_PIN_PWM_Update(int index, float value) +{ + if(index >= g_numPins || !HAL_PIN_CanThisPinBePWM(index)) + return; + rdaPinMapping_t* pin = g_pins + index; + if(pin->pwm == NULL) return; + pwmout_write(pin->pwm, value / 100); +} + +unsigned int HAL_GetGPIOPin(int index) +{ + return index; +} + +OBKInterruptHandler g_handlers[PLATFORM_GPIO_MAX]; +OBKInterruptType g_modes[PLATFORM_GPIO_MAX]; + +#include "gpio_irq_api.h" + +void RDA_Interrupt(uint32_t obkPinNum, gpio_irq_event event) +{ + if (g_handlers[obkPinNum]) { + g_handlers[obkPinNum](obkPinNum); + } +} + +void HAL_AttachInterrupt(int pinIndex, OBKInterruptType mode, OBKInterruptHandler function) { + g_handlers[pinIndex] = function; + + rdaPinMapping_t *rda_irq = g_pins + pinIndex; + rda_irq->irq = os_malloc(sizeof(gpio_irq_t)); + memset(rda_irq->irq, 0, sizeof(gpio_irq_t)); + + int rda_mode; + if (mode == INTERRUPT_RISING) { + rda_mode = IRQ_RISE; + } + else { + rda_mode = IRQ_FALL; + } + gpio_irq_init(rda_irq->irq, rda_irq->pin, RDA_Interrupt, pinIndex); + gpio_irq_set(rda_irq->irq, rda_mode, 1); + gpio_irq_enable(rda_irq->irq); + +} +void HAL_DetachInterrupt(int pinIndex) { + if (g_handlers[pinIndex] == 0) { + return; // already removed; + } + rdaPinMapping_t *rda_irq = g_pins + pinIndex; + gpio_irq_free(rda_irq->irq); + os_free(rda_irq->irq); + rda_irq->irq = NULL; + g_handlers[pinIndex] = 0; +} + +#endif // PLATFORM_RDA5981 diff --git a/src/hal/rda5981/hal_uart_rda5981.c b/src/hal/rda5981/hal_uart_rda5981.c new file mode 100644 index 0000000000..2d69b62fb7 --- /dev/null +++ b/src/hal/rda5981/hal_uart_rda5981.c @@ -0,0 +1,62 @@ +#ifdef PLATFORM_RDA5981 + +#include "../../new_pins.h" +#include "../../new_cfg.h" +#include "../hal_uart.h" +#include "serial_api.h" +#define UART0_RX PA_0 +#define UART0_TX PA_1 +#define UART1_RX PB_1 +#define UART1_TX PB_2 +#define UART1_1_RX PD_2 +#define UART1_1_TX PD_3 +#define UART1_1_RTS PD_1 +#define UART1_1_CTS PD_0 + +serial_t sobj; +static bool isInitialized; + +static void uart_cb(uint32_t id, SerialIrq event) +{ + if(event != RxIrq) + return; + + serial_t* obj = (void*)id; + uint8_t c = (uint8_t)serial_getc(obj); + UART_AppendByteToReceiveRingBuffer(c); +} + +void HAL_UART_SendByte(byte b) +{ + while(!serial_writable(&sobj)); + serial_putc(&sobj, b); +} + +int HAL_UART_Init(int baud, int parity, bool hwflowc, int txOverride, int rxOverride) +{ + if(isInitialized) + { + serial_free(&sobj); + } + PinName tx = UART0_TX, rx = UART0_RX; + if(CFG_HasFlag(OBK_FLAG_USE_SECONDARY_UART)) + { + tx = UART1_TX; + rx = UART1_RX; + } + serial_init(&sobj, tx, rx); + serial_baud(&sobj, baud); + serial_format(&sobj, 8, parity, 1); + serial_irq_handler(&sobj, uart_cb, (uint32_t)&sobj); + serial_irq_set(&sobj, RxIrq, 1); + if(hwflowc) + { + tx = UART1_1_TX; + rx = UART1_1_RX; + serial_set_flow_control(&sobj, FlowControlRTSCTS, UART1_1_RTS, UART1_1_CTS); + } + isInitialized = true; + return 1; +} + +#endif diff --git a/src/hal/rda5981/hal_wifi_rda5981.cpp b/src/hal/rda5981/hal_wifi_rda5981.cpp new file mode 100644 index 0000000000..bc77192272 --- /dev/null +++ b/src/hal/rda5981/hal_wifi_rda5981.cpp @@ -0,0 +1,136 @@ +#if PLATFORM_RDA5981 + +#include "rda59xx_daemon.h" +#include "WiFiStackInterface.h" +#undef WEAK +WiFiStackInterface wifi; + +extern "C" { +#include "../hal_wifi.h" +#include "../../new_common.h" +#include "../../logging/logging.h" +#include "../../new_cfg.h" +#undef connect +bool g_bOpenAccessPointMode = 0; +static void (*g_wifiStatusCallback)(int code); +extern struct netif lwip_sta_netif; + +const char* HAL_GetMyIPString() +{ + return g_bOpenAccessPointMode ? wifi.get_ip_address_ap() : wifi.get_ip_address(); +} + +const char* HAL_GetMyGatewayString() +{ + return g_bOpenAccessPointMode ? wifi.get_gateway_ap() : wifi.get_gateway(); +} + +const char* HAL_GetMyDNSString() +{ + return "error"; +} + +const char* HAL_GetMyMaskString() +{ + return g_bOpenAccessPointMode ? wifi.get_netmask_ap() : wifi.get_netmask(); +} + +void WiFI_GetMacAddress(char* mac) +{ + r_u8 addr[6]; + rda59xx_get_macaddr((r_u8*)&addr, 0); + memcpy(mac, addr, sizeof(mac)); +} + +uint8_t HAL_GetWiFiChannel(uint8_t *chan) +{ + *chan = wifi.get_channel(); + return *chan; +}; + +const char* HAL_GetMACStr(char* macstr) +{ + unsigned char mac[32]; + WiFI_GetMacAddress((char*)mac); + sprintf(macstr, MACSTR, MAC2STR(mac)); + return macstr; +} + +void HAL_PrintNetworkInfo() +{ + uint8_t mac[6]; + WiFI_GetMacAddress((char*)mac); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "+--------------- net device info ------------+\r\n"); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "|netif type : %-16s |\r\n", g_bOpenAccessPointMode == 0 ? "STA" : "AP"); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "|netif rssi = %-16i |\r\n", HAL_GetWifiStrength()); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "|netif ip = %-16s |\r\n", HAL_GetMyIPString()); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "|netif mask = %-16s |\r\n", HAL_GetMyMaskString()); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "|netif gateway = %-16s |\r\n", HAL_GetMyGatewayString()); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "|netif mac : ["MACSTR"] %-6s |\r\n", MAC2STR(mac), ""); + ADDLOG_DEBUG(LOG_FEATURE_GENERAL, "+--------------------------------------------+\r\n"); +} + +int HAL_GetWifiStrength() +{ + wifi.update_rssi(); + return wifi.get_rssi(); +} + +void obk_wifi_cb(WIFI_EVENT evt, void* info) +{ + switch(evt) + { + case EVENT_STA_DISCONNECTTED: + case EVENT_STA_NOFOUND_AP: + if(g_wifiStatusCallback != NULL) + { + g_wifiStatusCallback(WIFI_STA_DISCONNECTED); + } + break; + case EVENT_STA_CONNECT_FAIL: + if(g_wifiStatusCallback != NULL) + { + g_wifiStatusCallback(WIFI_STA_AUTH_FAILED); + } + break; + case EVENT_STA_GOT_IP: + if(g_wifiStatusCallback != NULL) + { + g_wifiStatusCallback(WIFI_STA_CONNECTED); + } + default: + break; + } +} +void HAL_WiFi_SetupStatusCallback(void (*cb)(int code)) +{ + g_wifiStatusCallback = cb; + rda59xx_wifi_set_event_cb(obk_wifi_cb); +} + +void HAL_ConnectToWiFi(const char* oob_ssid, const char* connect_key, obkStaticIP_t* ip) +{ + if(g_wifiStatusCallback != NULL) + { + g_wifiStatusCallback(WIFI_STA_CONNECTING); + } + wifi.set_dhcp(1); + netif_set_hostname(&lwip_sta_netif, CFG_GetDeviceName()); + wifi.connect(oob_ssid, connect_key, NULL, NSAPI_SECURITY_NONE, 0); +} + +void HAL_DisconnectFromWifi() +{ + wifi.disconnect(); +} + +int HAL_SetupWiFiOpenAccessPoint(const char* ssid) +{ + g_bOpenAccessPointMode = 1; + wifi.set_network_ap("192.168.4.1", "255.255.255.0", "192.168.4.1", "192.168.4.2", "192.168.4.254"); + wifi.start_ap(ssid, "", 1); + return 0; +} + +} +#endif \ No newline at end of file diff --git a/src/httpserver/new_tcp_server.c b/src/httpserver/new_tcp_server.c index cc7aae9635..0dc7c4c3ac 100644 --- a/src/httpserver/new_tcp_server.c +++ b/src/httpserver/new_tcp_server.c @@ -124,7 +124,14 @@ static void tcp_client_thread(tcp_thread_t* arg) lwip_close(fd); arg->isCompleted = true; +#if PLATFORM_RDA5981 + arg->thread = NULL; + arg->isCompleted = false; + arg->fd = INVALID_SOCK; + rtos_delete_thread(NULL); +#else rtos_suspend_thread(NULL); +#endif } static inline char* get_clientaddr(struct sockaddr_storage* source_addr) diff --git a/src/httpserver/rest_interface.c b/src/httpserver/rest_interface.c index 5d95301e92..da4019e36d 100644 --- a/src/httpserver/rest_interface.c +++ b/src/httpserver/rest_interface.c @@ -204,6 +204,8 @@ static int http_rest_post(http_request_t* request) { r = http_rest_post_flash(request, 0, -1); #elif PLATFORM_TXW81X r = http_rest_post_flash(request, 0, -1); +#elif PLATFORM_RDA5981 + r = http_rest_post_flash(request, 0, -1); #else // TODO ADDLOG_ERROR(LOG_FEATURE_API, "No OTA"); diff --git a/src/littlefs/lfs_util.h b/src/littlefs/lfs_util.h index 1fcb72dbed..bf69feb100 100644 --- a/src/littlefs/lfs_util.h +++ b/src/littlefs/lfs_util.h @@ -44,7 +44,7 @@ #if PLATFORM_BEKEN #include "mem_pub.h" -#elif PLATFORM_BL602 || PLATFORM_ESPIDF || PLATFORM_XRADIO || PLATFORM_ESP8266 || PLATFORM_TXW81X +#elif PLATFORM_BL602 || PLATFORM_ESPIDF || PLATFORM_XRADIO || PLATFORM_ESP8266 || PLATFORM_TXW81X || PLATFORM_RDA5981 #define os_free free #define os_malloc malloc #elif PLATFORM_REALTEK || PLATFORM_W800 || PLATFORM_W600 || PLATFORM_LN882H diff --git a/src/littlefs/our_lfs.c b/src/littlefs/our_lfs.c index f4232a261f..4c2f467a39 100644 --- a/src/littlefs/our_lfs.c +++ b/src/littlefs/our_lfs.c @@ -1131,7 +1131,7 @@ static int lfs_erase(const struct lfs_config* c, lfs_block_t block) return res; } -#elif PLATFORM_TXW81X +#elif PLATFORM_TXW81X || PLATFORM_RDA5981 static int lfs_read(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, void* buffer, lfs_size_t size) diff --git a/src/littlefs/our_lfs.h b/src/littlefs/our_lfs.h index 0788f79819..a73ac7723c 100644 --- a/src/littlefs/our_lfs.h +++ b/src/littlefs/our_lfs.h @@ -157,6 +157,12 @@ #define LFS_BLOCKS_START_MIN 0xF5000 #define LFS_BLOCKS_END 0x100000 +#elif PLATFORM_RDA5981 + +#define LFS_BLOCKS_START 0xFD000 +#define LFS_BLOCKS_START_MIN 0xFD000 +#define LFS_BLOCKS_END 0x100000 + #else // TODO // start 0x1000 after OTA addr diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index d1a77d21cc..3b8c14ac8b 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -1782,7 +1782,7 @@ static BENCHMARK_TEST_INFO* info = NULL; #if WINDOWS #elif PLATFORM_BL602 || PLATFORM_W600 || PLATFORM_W800 || PLATFORM_ESPIDF || PLATFORM_TR6260 \ - || PLATFORM_REALTEK || PLATFORM_ECR6600 || PLATFORM_ESP8266 || PLATFORM_TXW81X + || PLATFORM_REALTEK || PLATFORM_ECR6600 || PLATFORM_ESP8266 || PLATFORM_TXW81X || PLATFORM_RDA5981 static void mqtt_timer_thread(void* param) { while (1) @@ -1827,6 +1827,8 @@ commandResult_t MQTT_StartMQTTTestThread(const void* context, const char* cmd, c xTaskCreate(mqtt_timer_thread, "mqtt", 1024, (void*)info, 15, NULL); #elif PLATFORM_TXW81X os_task_create("mqtt", mqtt_timer_thread, (void*)info, 15, 0, NULL, 1024); +#elif PLATFORM_RDA5981 + rda_thread_new("mqtt", mqtt_timer_thread, NULL, 1024, osPriorityNormal); #elif PLATFORM_XRADIO || PLATFORM_LN882H OS_TimerSetInvalid(&timer); if (OS_TimerCreate(&timer, OS_TIMER_PERIODIC, MQTT_Test_Tick, (void*)info, MQTT_TMR_DURATION) != OS_OK) diff --git a/src/new_common.h b/src/new_common.h index 599fe3df2c..9c24e3433d 100644 --- a/src/new_common.h +++ b/src/new_common.h @@ -187,6 +187,11 @@ typedef long BaseType_t; #define DEVICENAME_PREFIX_SHORT "txw81x" #define PLATFORM_MCU_NAME "TXW81X" #define MANUFACTURER "Taixin" +#elif PLATFORM_RDA5981 +#define DEVICENAME_PREFIX_FULL "OpenRDA5981" +#define DEVICENAME_PREFIX_SHORT "rda5981" +#define PLATFORM_MCU_NAME "RDA5981" +#define MANUFACTURER "RDA Microelectronics" #else #error "You must define a platform.." This platform is not supported, error! @@ -246,6 +251,8 @@ This platform is not supported, error! #define USER_SW_VER "RTL8720E_Test" #elif PLATFORM_TXW81X #define USER_SW_VER "TXW81X_Test" +#elif PLATFORM_RDA5981 +#define USER_SW_VER "RDA5981_Test" #else #warning "USER_SW_VER undefined" #define USER_SW_VER "unknown" @@ -859,6 +866,56 @@ OSStatus rtos_suspend_thread(beken_thread_t* thread); #define GLOBAL_INT_DISABLE() ; #define GLOBAL_INT_RESTORE() ; +#elif PLATFORM_RDA5981 + +#include "stdbool.h" +#include "rda_sys_wrapper.h" +#include "cmsis_os.h" +#include "lwip/err.h" +#include "lwip/sockets.h" +#include "lwip/sys.h" +#include "lwip/netdb.h" +#include "lwip/dns.h" + +#define bk_printf printf + +#define rtos_delay_milliseconds osDelay +#define delay_ms osDelay +#define os_malloc malloc +#define os_free free + +#define lwip_close_force(x) lwip_close(x) +#define kNoErr 0 //! No error occurred. +typedef void* beken_thread_arg_t; +typedef void* beken_thread_t; +typedef void (*beken_thread_function_t)(beken_thread_arg_t arg); +typedef int OSStatus; +typedef void* SemaphoreHandle_t; +#define xSemaphoreCreateMutex rda_mutex_create +#define xSemaphoreTake(a, b) (rda_mutex_wait(a, b) == 0) +#define xSemaphoreGive rda_mutex_realease +#define pdTRUE true + +#define portTICK_RATE_MS osKernelSysTickMicroSec(1000 * 1000) +typedef int BaseType_t; +typedef uint64_t portTickType; +#define xTaskGetTickCount osKernelSysTick + +#define BEKEN_DEFAULT_WORKER_PRIORITY (6) +#define BEKEN_APPLICATION_PRIORITY (7) + +OSStatus rtos_delete_thread(beken_thread_t thread); +OSStatus rtos_create_thread(beken_thread_t thread, + uint8_t priority, const char* name, + beken_thread_function_t function, + uint32_t stack_size, beken_thread_arg_t arg); +OSStatus rtos_suspend_thread(beken_thread_t thread); + +#define GLOBAL_INT_DECLARATION() ; +#define GLOBAL_INT_DISABLE() ; +#define GLOBAL_INT_RESTORE() ; + + #else #include "gw_intf.h" diff --git a/src/new_pins.h b/src/new_pins.h index 32e4590644..3d1401dd2a 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -1119,6 +1119,8 @@ typedef enum channelType_e { #define PLATFORM_GPIO_MAX 27 #elif PLATFORM_BK7252 || PLATFORM_BK7252N #define PLATFORM_GPIO_MAX 40 +#elif PLATFORM_RDA5981 +#define PLATFORM_GPIO_MAX 29 #else #define PLATFORM_GPIO_MAX 29 #endif @@ -1142,7 +1144,7 @@ typedef enum channelType_e { #define SPECIAL_CHANNEL_BASECOLOR_COOL 136 #define SPECIAL_CHANNEL_BASECOLOR_WARM 137 #define SPECIAL_CHANNEL_BASECOLOR_LAST 137 -#define SPECIAL_CHANNEL_OBK_FREQUENCY 138 +#define SPECIAL_CHANNEL_OBK_FREQUENCY 138 // note: real limit here is MAX_RETAIN_CHANNELS #define SPECIAL_CHANNEL_FLASHVARS_FIRST 200 diff --git a/src/obk_config.h b/src/obk_config.h index a8fbbd6a3c..987cca9888 100644 --- a/src/obk_config.h +++ b/src/obk_config.h @@ -318,7 +318,7 @@ #undef ENABLE_DRIVER_ADCSMOOTHER #endif -#if (OBK_VARIANT == OBK_VARIANT_TUYAMCU || OBK_VARIANT == OBK_VARIANT_IRREMOTEESP || OBK_VARIANT == OBK_VARIANT_SENSORS) +#if (OBK_VARIANT == OBK_VARIANT_TUYAMCU || OBK_VARIANT == OBK_VARIANT_IRREMOTEESP || OBK_VARIANT == OBK_VARIANT_SENSORS || PLATFORM_BK7252 || PLATFORM_BK7252N) #undef ENABLE_DRIVER_BL0937 #undef ENABLE_DRIVER_BL0942 #undef ENABLE_DRIVER_BL0942SPI @@ -326,7 +326,7 @@ #undef ENABLE_DRIVER_BRIDGE #endif -#if (OBK_VARIANT == OBK_VARIANT_POWERMETERING || OBK_VARIANT == OBK_VARIANT_IRREMOTEESP || OBK_VARIANT == OBK_VARIANT_SENSORS) +#if (OBK_VARIANT == OBK_VARIANT_POWERMETERING || OBK_VARIANT == OBK_VARIANT_IRREMOTEESP || OBK_VARIANT == OBK_VARIANT_SENSORS || PLATFORM_BK7252 || PLATFORM_BK7252N) #undef ENABLE_DRIVER_TUYAMCU #endif @@ -546,6 +546,19 @@ #undef ENABLE_HTTP_MAC #undef ENABLE_LED_BASIC +#elif PLATFORM_RDA5981 + +#define ENABLE_EXPAND_CONSTANT 1 +#define ENABLE_HA_DISCOVERY 1 +#define ENABLE_MQTT 1 +#define ENABLE_OBK_SCRIPTING 1 +#define ENABLE_ADVANCED_CHANNELTYPES_DISCOVERY 1 +#define NEW_TCP_SERVER 1 +#define NO_CHIP_TEMPERATURE 1 +#define ENABLE_DRIVER_AHT2X 1 +#define ENABLE_I2C 1 +#undef ENABLE_HTTP_MAC + #else // #error "Platform not defined" diff --git a/src/user_main.c b/src/user_main.c index 0edaa25f6d..3c3c906109 100644 --- a/src/user_main.c +++ b/src/user_main.c @@ -140,10 +140,35 @@ void OTA_SetTotalBytes(int value) #if PLATFORM_XR806 || PLATFORM_XR872 + size_t xPortGetFreeHeapSize() { return sram_free_heap_size(); } + +#elif PLATFORM_RDA5981 + +#include "hal/api/mbed_stats.h" +extern uint32_t mbed_heap_size; +size_t xPortGetFreeHeapSize() +{ + mbed_stats_heap_t heap_stats; + mbed_stats_heap_get(&heap_stats); + //ADDLOGF_DEBUG("mbed_heap_size: %i\n heap_stats.current_size: %i\nheap_stats.max_size: %i\nheap_stats.total_size: %i\nheap_stats.alloc_cnt: %i\nheap_stats.alloc_fail_cnt: %i\n", + // mbed_heap_size, heap_stats.current_size, heap_stats.max_size, heap_stats.total_size, heap_stats.alloc_cnt, heap_stats.alloc_fail_cnt); + return mbed_heap_size - heap_stats.current_size; +} +int _kill(int pid, int sig) +{ + errno = EINVAL; + return -1; +} + +pid_t _getpid() +{ + return 1; +} + #endif #if PLATFORM_BL602 @@ -297,6 +322,53 @@ OSStatus rtos_suspend_thread(beken_thread_t* thread) return kNoErr; } +#elif PLATFORM_RDA5981 + +#include "rt_TypeDef.h" + +OSStatus rtos_create_thread(beken_thread_t thread, + uint8_t priority, const char* name, + beken_thread_function_t function, + uint32_t stack_size, beken_thread_arg_t arg) +{ + osThreadDef_t def; + osThreadId id; + + def.pthread = (os_pthread)function; + def.tpriority = osPriorityNormal; + def.stacksize = stack_size; + def.stack_pointer = malloc(stack_size); + if(def.stack_pointer == NULL) + { + printf("Error allocating the stack memory"); + return 1; + } + thread = osThreadCreate(&def, arg); + if(thread == NULL) + { + free(def.stack_pointer); + printf("Thread create %s - err\n", name); + return 1; + } + //printf("Thread stack at 0x%lx %lu\n", (uint32_t)def.stack_pointer, stack_size); + return 0; +} + +OSStatus rtos_delete_thread(beken_thread_t thread) +{ + if(thread == NULL) + { + thread = osThreadGetId(); + } + P_TCB tcb = rt_tid2ptcb(thread); + uint32_t* stk = tcb->stack; + if(stk == NULL) printf("rtos_delete_thread stk is null\n"); + //printf("Freeing stack at 0x%lx %u\n", (uint32_t)stk, tcb->priv_stack); + free(stk); + osThreadTerminate(thread); + return kNoErr; +} + #endif void MAIN_ScheduleUnsafeInit(int delSeconds) { @@ -1084,7 +1156,7 @@ void QuickTick(void* param) #if WINDOWS #elif PLATFORM_BL602 || PLATFORM_W600 || PLATFORM_W800 || PLATFORM_TR6260 || defined(PLATFORM_REALTEK) || PLATFORM_ECR6600 \ - || PLATFORM_ESP8266 || PLATFORM_ESPIDF || PLATFORM_XRADIO || PLATFORM_LN882H || PLATFORM_TXW81X + || PLATFORM_ESP8266 || PLATFORM_ESPIDF || PLATFORM_XRADIO || PLATFORM_LN882H || PLATFORM_TXW81X || PLATFORM_RDA5981 void quick_timer_thread(void* param) { while (1) { @@ -1104,6 +1176,8 @@ void QuickTick_StartThread(void) xTaskCreate(quick_timer_thread, "quick", QT_STACK_SIZE, NULL, 15, NULL); #elif PLATFORM_TXW81X os_task_create("quick", quick_timer_thread, NULL, 15, 0, NULL, QT_STACK_SIZE); +#elif PLATFORM_RDA5981 + rda_thread_new("quick", quick_timer_thread, NULL, QT_STACK_SIZE, osPriorityNormal); #else OSStatus result;