From aeafcb08638d8979b0ade9a9b20627375c4f4ebb Mon Sep 17 00:00:00 2001 From: NonPIayerCharacter <18557343+NonPIayerCharacter@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:39:26 +0300 Subject: [PATCH] LN882H ADC (#1963) * LN882H ADC * Unify 882H and 8825 main. 8825 adc * fix * disable adc reinit on 8825 * allow log port change, basic uart, disable berry * Use UART2 instead of UART0, and allow changing UART pins * fix * tr6260 pwm duty 0 * import from tuya --------- Co-authored-by: openshwprojects <85486843+openshwprojects@users.noreply.github.com> --- docs/platforms.md | 4 +- platforms/LN8825/CMakeLists.txt | 1 - platforms/LN882H/CMakeLists.txt | 2 +- sdk/OpenLN882H | 2 +- sdk/OpenTR6260 | 2 +- src/hal/generic/hal_generic.c | 5 + src/hal/hal_generic.h | 1 + src/hal/ln882h/hal_adc_ln882h.c | 172 ++++++++++++++++++++++++---- src/hal/ln882h/hal_generic_ln882h.c | 31 +++++ src/hal/ln882h/hal_main_ln882h.c | 129 ++++++++++++++++++++- src/hal/ln882h/hal_pins_ln882h.c | 104 ++++++++--------- src/hal/ln882h/hal_uart_ln882h.c | 77 +++++++++++++ src/hal/tr6260/hal_pins_tr6260.c | 8 +- src/littlefs/lfs_util.h | 2 +- src/logging/logging.c | 43 ++++++- src/mqtt/new_mqtt.c | 5 + src/new_common.h | 1 + src/obk_config.h | 4 +- src/user_main.c | 2 + 19 files changed, 502 insertions(+), 93 deletions(-) create mode 100644 src/hal/ln882h/hal_uart_ln882h.c diff --git a/docs/platforms.md b/docs/platforms.md index 0a517ddde..ca0807a6f 100644 --- a/docs/platforms.md +++ b/docs/platforms.md @@ -12,7 +12,7 @@ | BL602/LF686 | Bouffalo Lab | ✅ | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | | W800/W801 | Winner Micro | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | | W600/W601 | Winner Micro | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅⁶ | ❌ | -| LN882H | Lightning Semi | ✅ | ✅ | ✅⁴ | ✅ | ❌ | ✅ | ❗️ | ❌ | ✅ | ✅ | ✅ | +| LN882H | Lightning Semi | ✅ | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | | ESP8266
ESP8285 | Espressif | ✅ | ⚠️¹³ | ✅²'⁴ | ✅ | ✅ | ✅⁷ | ❌ | ❗️ | ❓⁹ | ❌ | ❌ | | ESP32
-C2
-C3
-C5
-C6
-C61
-S2
-S3 | Espressif | ✅ | ⚠️¹³ | ✅⁴ | ✅ | ✅ | ✅ | ❓ | ✅¹⁰ | ✅ | ✅ | ❌ | | TR6260 | Transa Semi | ✅ | ❌ | ❗️³'⁴ | ✅ | ❌ | ✅⁸ | ❌ | ❌ | ✅⁹ | ❌ | ❌ | @@ -25,7 +25,7 @@ | ECR6600 | ESWIN | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁸ | ❗️ | ❗️¹¹ | ✅ | ❌ | ❌ | | TXW81X | Taixin | ✅ | ❌ | ❗️ | ❓ | ❌ | ❌ | ❌ | ❌ | ❓ | ❌ | ❌ | | RDA5981 | RDA | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ➖ | ❌ | -| LN8825B | Lightning Semi | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❓ | +| LN8825B | Lightning Semi | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ | ❓ | ✅ - Works
diff --git a/platforms/LN8825/CMakeLists.txt b/platforms/LN8825/CMakeLists.txt index 12461cc83..3948c4769 100644 --- a/platforms/LN8825/CMakeLists.txt +++ b/platforms/LN8825/CMakeLists.txt @@ -37,7 +37,6 @@ set(PROJ_ALL_SRC ${OBKM_SRC_CXX} ${BERRY_SRC_C} ${PRO_DIR}/main.c - ${PRO_DIR}/usr_app.c ${PRO_DIR}/bsp/serial_hw.c ${PRO_DIR}/bsp/drv_adc_measure.c ${PRO_DIR}/startup/startup_ln882x_gcc.c diff --git a/platforms/LN882H/CMakeLists.txt b/platforms/LN882H/CMakeLists.txt index 626962a1b..27c0217a7 100644 --- a/platforms/LN882H/CMakeLists.txt +++ b/platforms/LN882H/CMakeLists.txt @@ -25,8 +25,8 @@ set(PROJ_ALL_SRC ${OBK_SRCS}hal/ln882h/hal_pins_ln882h.c ${OBK_SRCS}hal/ln882h/hal_wifi_ln882h.c ${OBK_SRCS}hal/ln882h/hal_ota_ln882h.c + ${OBK_SRCS}hal/ln882h/hal_uart_ln882h.c main.c - usr_app.c bsp/serial_hw.c startup/startup_${CHIP_SERIAL}_gcc.c ${MODULE_SRC} diff --git a/sdk/OpenLN882H b/sdk/OpenLN882H index becfd847d..bec0c9113 160000 --- a/sdk/OpenLN882H +++ b/sdk/OpenLN882H @@ -1 +1 @@ -Subproject commit becfd847d58d55134fb700d310f9c3376676a4b3 +Subproject commit bec0c91134e296ba67e86a5c5279041047c32343 diff --git a/sdk/OpenTR6260 b/sdk/OpenTR6260 index 3550c2c6f..1254c05ed 160000 --- a/sdk/OpenTR6260 +++ b/sdk/OpenTR6260 @@ -1 +1 @@ -Subproject commit 3550c2c6f823c362cb53ce0f91499ba56a5964e9 +Subproject commit 1254c05ed588bffd15f5f25f569035cc8877f77f diff --git a/src/hal/generic/hal_generic.c b/src/hal/generic/hal_generic.c index fbc22769b..d31be7ba7 100644 --- a/src/hal/generic/hal_generic.c +++ b/src/hal/generic/hal_generic.c @@ -24,3 +24,8 @@ void __attribute__((weak)) HAL_Run_WDT() { } + +void __attribute__((weak)) HAL_RegisterPlatformSpecificCommands() +{ + +} diff --git a/src/hal/hal_generic.h b/src/hal/hal_generic.h index 17098c37c..b6c36638a 100644 --- a/src/hal/hal_generic.h +++ b/src/hal/hal_generic.h @@ -3,3 +3,4 @@ void HAL_RebootModule(); void HAL_Delay_us(int delay); void HAL_Configure_WDT(); void HAL_Run_WDT(); +void HAL_RegisterPlatformSpecificCommands(); diff --git a/src/hal/ln882h/hal_adc_ln882h.c b/src/hal/ln882h/hal_adc_ln882h.c index d8b288eeb..9e576b6da 100644 --- a/src/hal/ln882h/hal_adc_ln882h.c +++ b/src/hal/ln882h/hal_adc_ln882h.c @@ -1,35 +1,161 @@ -#ifdef PLATFORM_LN882H +//#include "../hal_adc.h" +#include "hal_pinmap_ln882h.h" + +#if PLATFORM_LN882H -#include "../hal_adc.h" #include "hal/hal_adc.h" -void HAL_ADC_Init(int pinNumber) { - adc_init_t_def adc_init; +void HAL_ADC_Init(int pinNumber) +{ + adc_init_t_def adc_init = { 0 }; - memset(&adc_init, 0, sizeof(adc_init_t_def)); - adc_init.adc_ch = ADC_CH0; - adc_init.adc_conv_mode = ADC_CONV_MODE_CONTINUE; - adc_init.adc_presc = 0xFF; - hal_adc_init(ADC_BASE, &adc_init); - - hal_adc_en(ADC_BASE, HAL_ENABLE); - - hal_adc_start_conv(ADC_BASE); + adc_init.adc_ch = ADC_CH0; + adc_init.adc_conv_mode = ADC_CONV_MODE_CONTINUE; + adc_init.adc_presc = 0xFF; + if(pinNumber != 0xFF) + { + adc_init.adc_ov_smp_ratio = ADC_OVER_SAMPLING_RATIO_X8; + adc_init.adc_ov_smp_ratio_en = ADC_OVER_SAMPLING_EN_STATUS_BIT0; + } + switch(pinNumber) + { + case 0: + adc_init.adc_ch = ADC_CH2; + hal_gpio_pin_mode_set(GPIOA_BASE, GPIO_PIN_0, GPIO_MODE_ANALOG); + break; + case 1: + adc_init.adc_ch = ADC_CH3; + hal_gpio_pin_mode_set(GPIOA_BASE, GPIO_PIN_1, GPIO_MODE_ANALOG); + break; + case 4: + adc_init.adc_ch = ADC_CH4; + hal_gpio_pin_mode_set(GPIOA_BASE, GPIO_PIN_4, GPIO_MODE_ANALOG); + break; + case 19: + adc_init.adc_ch = ADC_CH5; + hal_gpio_pin_mode_set(GPIOB_BASE, GPIO_PIN_3, GPIO_MODE_ANALOG); + break; + case 20: + adc_init.adc_ch = ADC_CH6; + hal_gpio_pin_mode_set(GPIOB_BASE, GPIO_PIN_4, GPIO_MODE_ANALOG); + break; + case 21: + adc_init.adc_ch = ADC_CH7; + hal_gpio_pin_mode_set(GPIOB_BASE, GPIO_PIN_5, GPIO_MODE_ANALOG); + break; + case 0xFF: break; + default: return; + } + hal_adc_init(ADC_BASE, &adc_init); + + hal_adc_en(ADC_BASE, HAL_ENABLE); } -int HAL_ADC_Read(int pinNumber) { - adc_ch_t ch = ADC_CH0; - uint16_t read_adc = 0; +int HAL_ADC_Read(int pinNumber) +{ + adc_ch_t ch; + switch(pinNumber) + { + case 0: ch = ADC_CH2; break; + case 1: ch = ADC_CH3; break; + case 4: ch = ADC_CH4; break; + case 19: ch = ADC_CH5; break; + case 20: ch = ADC_CH6; break; + case 21: ch = ADC_CH7; break; + case 0xFF: ch = ADC_CH0; break; + default: return 0; + } + uint16_t read_adc = 0; - while(hal_adc_get_conv_status(ADC_BASE, ch) == 0); - - read_adc = hal_adc_get_data(ADC_BASE, ch); - - hal_adc_clr_conv_status(ADC_BASE,ch); - - return read_adc; + hal_adc_start_conv(ADC_BASE); + + while(hal_adc_get_conv_status(ADC_BASE, ch) == 0); + + read_adc = hal_adc_get_data(ADC_BASE, ch); + + hal_adc_clr_conv_status(ADC_BASE, ch); + + return read_adc; } +void HAL_ADC_Deinit(int pinNumber) +{ + switch(pinNumber) + { + case 0: + hal_gpio_pin_mode_set(GPIOA_BASE, GPIO_PIN_0, GPIO_MODE_DIGITAL); + break; + case 1: + hal_gpio_pin_mode_set(GPIOA_BASE, GPIO_PIN_1, GPIO_MODE_DIGITAL); + break; + case 4: + hal_gpio_pin_mode_set(GPIOA_BASE, GPIO_PIN_4, GPIO_MODE_DIGITAL); + break; + case 19: + hal_gpio_pin_mode_set(GPIOB_BASE, GPIO_PIN_3, GPIO_MODE_DIGITAL); + break; + case 20: + hal_gpio_pin_mode_set(GPIOB_BASE, GPIO_PIN_4, GPIO_MODE_DIGITAL); + break; + case 21: + hal_gpio_pin_mode_set(GPIOB_BASE, GPIO_PIN_5, GPIO_MODE_DIGITAL); + break; + default: return; + } +} #endif // PLATFORM_LN882H +#if PLATFORM_LN8825 + +#include "hal/hal_adc.h" + +void OBK_HAL_ADC_Init(int pinNumber) +{ + // adc is already initialized for temp sensor + //ADC_InitTypeDef adc_init_struct; + //adc_init_struct.ADC_Autoff = FENABLE; + //adc_init_struct.ADC_ContinuousConvMode = FDISABLE; + //adc_init_struct.ADC_DataAlign = ADC_DataAlign_Right; + //adc_init_struct.ADC_WaitMode = FDISABLE; + //HAL_ADC_Init(ADC, &adc_init_struct); + //HAL_ADC_PrescCfg(ADC, 42); + HAL_SYSCON_GPIO_Digital_Analog_Select(pinNumber, GPIO_ANALOG_MOD); +} + +int HAL_ADC_Read(int pinNumber) +{ + adc_chan_t ch; + switch(pinNumber) + { + case 0: ch = EXTL_ADC_CHAN_0; break; + case 1: ch = EXTL_ADC_CHAN_1; break; + case 4: ch = EXTL_ADC_CHAN_2; break; + case 19: ch = EXTL_ADC_CHAN_3; break; + case 20: ch = EXTL_ADC_CHAN_4; break; + case 21: ch = EXTL_ADC_CHAN_5; break; + default: return 0; + } + uint16_t read_adc = 0; + + HAL_ADC_SeqChanSelect_Cfg(ADC, ch); + HAL_ADC_Cmd(ADC, FENABLE); + HAL_ADC_SoftwareStartConvCmd(ADC); + for(volatile uint32_t t = 0; t < 40 * 3; t++) + { + __NOP(); + } + + read_adc = HAL_ADC_GetConversionValue(ADC, ch); + HAL_ADC_StopConvCmd(ADC); + HAL_ADC_Cmd(ADC, FDISABLE); + + return read_adc; +} + +void HAL_ADC_Deinit(int pinNumber) +{ + HAL_SYSCON_GPIO_Digital_Analog_Select(pinNumber, GPIO_DIGITAL_MOD); +} + +#endif diff --git a/src/hal/ln882h/hal_generic_ln882h.c b/src/hal/ln882h/hal_generic_ln882h.c index dce518b41..81cae1ad2 100644 --- a/src/hal/ln882h/hal_generic_ln882h.c +++ b/src/hal/ln882h/hal_generic_ln882h.c @@ -46,4 +46,35 @@ void HAL_Delay_us(int delay) ln_block_delayus(delay); } +#if PLATFORM_LN882H + +#include "../../cmnds/cmd_public.h" + +extern int g_urx_pin; +extern int g_utx_pin; + +static commandResult_t CMD_SetUARTPins(const void* context, const char* cmd, const char* args, int cmdFlags) +{ + Tokenizer_TokenizeString(args, 0); + + int rxpin = Tokenizer_GetPin(0, -1); + int txpin = Tokenizer_GetPin(1, -1); + if(rxpin == -1 || txpin == -1) + return CMD_RES_BAD_ARGUMENT; + g_urx_pin = rxpin; + g_utx_pin = txpin; + return CMD_RES_OK; +} + +void HAL_RegisterPlatformSpecificCommands() +{ + //cmddetail:{"name":"alias","args":"[rx pin][tx pin]", + //cmddetail:"descr":"Set UART pins", + //cmddetail:"fn":"CMD_SetUARTPins","file":"hal/ln882h/hal_generic_ln882h.c","requires":"", + //cmddetail:"examples":""} + CMD_RegisterCommand("SetUARTPins", CMD_SetUARTPins, NULL); +} + +#endif + #endif // PLATFORM_LN882H diff --git a/src/hal/ln882h/hal_main_ln882h.c b/src/hal/ln882h/hal_main_ln882h.c index a4233b8d0..fc67c8bc7 100644 --- a/src/hal/ln882h/hal_main_ln882h.c +++ b/src/hal/ln882h/hal_main_ln882h.c @@ -1,7 +1,126 @@ -#ifdef PLATFORM_LN882H +#if PLATFORM_LN882H || PLATFORM_LN8825 -#include "../../new_common.h" -#include "../../logging/logging.h" -#include "../../quicktick.h" +#include "osal/osal.h" +#include "utils/debug/log.h" +#include "wifi.h" +#include "netif/ethernetif.h" +#include "wifi_manager.h" +#include "lwip/tcpip.h" +#include "utils/system_parameter.h" +#include "utils/sysparam_factory_setting.h" +#include "hal/hal_adc.h" +#include "ln_nvds.h" -#endif // PLATFORM_LN882H \ No newline at end of file +#define PM_DEFAULT_SLEEP_MODE (ACTIVE) + +#define USR_APP_TASK_STACK_SIZE (10*256) //Byte + +#if PLATFORM_LN882H +#include "utils/debug/ln_assert.h" +#include "utils/power_mgmt/ln_pm.h" +#include "ln_wifi_err.h" +#include "ln_misc.h" +#include "ln882h.h" +#include "../hal_adc.h" +#define HAL_TEMP_ADC 0xFF +#else +#include "utils/debug/art_assert.h" +#include "hal/hal_sleep.h" +#define LN_ASSERT ART_ASSERT +#define HAL_ADC_Init(x) drv_adc_init() +#define HAL_ADC_Read(x) drv_adc_read(x) +#define HAL_TEMP_ADC INTL_ADC_CHAN_0 +#define ln_pm_sleep_mode_set hal_sleep_set_mode +#endif + +static OS_Thread_t g_usr_app_thread; +float g_wifi_temperature = 0.0f; + +extern void Main_Init(); +extern void Main_OnEverySecond(); + +void usr_app_task_entry(void *params) +{ + // from tuyaopen +#if PLATFORM_LN882H + *(volatile int*)(0x40012034) = 0x540; +#endif + wifi_manager_init(); + + int8_t cap_comp = 0; + uint16_t adc_val = 0; + + if(NVDS_ERR_OK == ln_nvds_get_xtal_comp_val((uint8_t*)&cap_comp)) + { + if((uint8_t)cap_comp == 0xFF) + { + cap_comp = 0; + } + } + + HAL_ADC_Init(HAL_TEMP_ADC); + OS_MsDelay(1); + wifi_temp_cal_init(HAL_ADC_Read(HAL_TEMP_ADC), cap_comp); + + Main_Init(); + + while(1) + { + adc_val = HAL_ADC_Read(HAL_TEMP_ADC); + wifi_do_temp_cal_period(adc_val); + g_wifi_temperature = (25 + ((adc_val & 0xFFF) - 770) / 2.54f); + OS_MsDelay(1000); + Main_OnEverySecond(); + } +} + +void creat_usr_app_task(void) +{ + ln_pm_sleep_mode_set(PM_DEFAULT_SLEEP_MODE); + +#if PLATFORM_LN882H + /** + * CLK_G_EFUSE: For wifi temp calibration + * CLK_G_BLE CLK_G_I2S CLK_G_WS2811 CLK_G_DBGH CLK_G_SDIO CLK_G_EFUSE CLK_G_AES + */ + ln_pm_always_clk_disable_select(CLK_G_BLE | CLK_G_I2S | CLK_G_WS2811 | CLK_G_SDIO | CLK_G_AES); + + /** + * ADC0: For wifi temp calibration + * TIM3: For wifi pvtcmd evm test + * CLK_G_ADC CLK_G_GPIOA CLK_G_GPIOB CLK_G_SPI0 CLK_G_SPI1 CLK_G_I2C0 CLK_G_UART1 CLK_G_UART2 + * CLK_G_WDT CLK_G_TIM_REG CLK_G_TIM1 CLK_G_TIM2 CLK_G_TIM3 CLK_G_TIM4 CLK_G_MAC CLK_G_DMA + * CLK_G_RF CLK_G_ADV_TIMER CLK_G_TRNG + */ + ln_pm_lightsleep_clk_disable_select(CLK_G_GPIOA | CLK_G_GPIOB | CLK_G_SPI0 | CLK_G_SPI1 | CLK_G_I2C0 | + CLK_G_UART1 | CLK_G_UART2 | CLK_G_WDT | CLK_G_TIM1 | CLK_G_TIM2 | CLK_G_MAC | CLK_G_DMA | CLK_G_RF | CLK_G_ADV_TIMER | CLK_G_TRNG); + + + /* print sdk version */ + LOG(LOG_LVL_INFO, "LN882H SDK Ver: %s [build time:%s][0x%08x]\r\n", + LN882H_SDK_VERSION_STRING, LN882H_SDK_BUILD_DATE_TIME, LN882H_SDK_VERSION); +#else + LOG(LOG_LVL_INFO, "SDK version string: %s\r\n", LN_SDK_VERSION_STRING); + LOG(LOG_LVL_INFO, "SDK version number: 0x%08x\r\n", LN_SDK_VERSION); + LOG(LOG_LVL_INFO, "SDK build time : %s\r\n", LN_SDK_BUILD_DATE_TIME); +#endif + + if(OS_OK != OS_ThreadCreate(&g_usr_app_thread, "OBK", usr_app_task_entry, NULL, OS_PRIORITY_BELOW_NORMAL, USR_APP_TASK_STACK_SIZE)) + { + LN_ASSERT(1); + } +} + +__attribute__((weak)) +void* os_malloc(size_t size) +{ + return OS_Malloc(size); +} + +__attribute__((weak)) +void os_free(void* ptr) +{ + OS_Free(ptr); +} + +#endif diff --git a/src/hal/ln882h/hal_pins_ln882h.c b/src/hal/ln882h/hal_pins_ln882h.c index e4ad0b9f1..6e62e92e1 100644 --- a/src/hal/ln882h/hal_pins_ln882h.c +++ b/src/hal/ln882h/hal_pins_ln882h.c @@ -24,66 +24,66 @@ OBKInterruptType g_modes[PLATFORM_GPIO_MAX]; #if PLATFORM_LN882H lnPinMapping_t g_pins[] = { - { "A0", GPIOA_BASE, GPIO_PIN_0, -1 }, - { "A1", GPIOA_BASE, GPIO_PIN_1, -1 }, - { "A2", GPIOA_BASE, GPIO_PIN_2, -1 }, - { "A3", GPIOA_BASE, GPIO_PIN_3, -1 }, - { "A4", GPIOA_BASE, GPIO_PIN_4, -1 }, - { "A5", GPIOA_BASE, GPIO_PIN_5, -1 }, - { "A6", GPIOA_BASE, GPIO_PIN_6, -1 }, - { "A7", GPIOA_BASE, GPIO_PIN_7, -1 }, - { "A8", GPIOA_BASE, GPIO_PIN_8, -1 }, - { "A9", GPIOA_BASE, GPIO_PIN_9, -1 }, - { "A10", GPIOA_BASE, GPIO_PIN_10, -1 }, - { "A11", GPIOA_BASE, GPIO_PIN_11, -1 }, - { "A12", GPIOA_BASE, GPIO_PIN_12, -1 }, - { "A13", GPIOA_BASE, GPIO_PIN_13, -1 }, - { "A14", GPIOA_BASE, GPIO_PIN_14, -1 }, - { "A15", GPIOA_BASE, GPIO_PIN_15, -1 }, + { "A0 (ADC2)", GPIOA_BASE, GPIO_PIN_0, -1 }, + { "A1 (ADC3)", GPIOA_BASE, GPIO_PIN_1, -1 }, + { "A2", GPIOA_BASE, GPIO_PIN_2, -1 }, + { "A3", GPIOA_BASE, GPIO_PIN_3, -1 }, + { "A4 (ADC4)", GPIOA_BASE, GPIO_PIN_4, -1 }, + { "A5", GPIOA_BASE, GPIO_PIN_5, -1 }, + { "A6", GPIOA_BASE, GPIO_PIN_6, -1 }, + { "A7", GPIOA_BASE, GPIO_PIN_7, -1 }, + { "A8", GPIOA_BASE, GPIO_PIN_8, -1 }, + { "A9", GPIOA_BASE, GPIO_PIN_9, -1 }, + { "A10", GPIOA_BASE, GPIO_PIN_10, -1 }, + { "A11", GPIOA_BASE, GPIO_PIN_11, -1 }, + { "A12", GPIOA_BASE, GPIO_PIN_12, -1 }, + { "A13", GPIOA_BASE, GPIO_PIN_13, -1 }, + { "A14", GPIOA_BASE, GPIO_PIN_14, -1 }, + { "A15", GPIOA_BASE, GPIO_PIN_15, -1 }, // port B - { "B0", GPIOB_BASE, GPIO_PIN_0, -1 }, // 16 - { "B1", GPIOB_BASE, GPIO_PIN_1, -1 }, // 17 - { "B2", GPIOB_BASE, GPIO_PIN_2, -1 }, // 18 - { "B3", GPIOB_BASE, GPIO_PIN_3, -1 }, // 19 - { "B4", GPIOB_BASE, GPIO_PIN_4, -1 }, // 20 - { "B5", GPIOB_BASE, GPIO_PIN_5, -1 }, // 21 - { "B6", GPIOB_BASE, GPIO_PIN_6, -1 }, // 22 - { "B7", GPIOB_BASE, GPIO_PIN_7, -1 }, // 23 - { "B8", GPIOB_BASE, GPIO_PIN_8, -1 }, // 24 - { "B9", GPIOB_BASE, GPIO_PIN_9, -1 }, // 25 + { "B0", GPIOB_BASE, GPIO_PIN_0, -1 }, // 16 + { "B1", GPIOB_BASE, GPIO_PIN_1, -1 }, // 17 + { "B2", GPIOB_BASE, GPIO_PIN_2, -1 }, // 18 + { "B3 (ADC5)", GPIOB_BASE, GPIO_PIN_3, -1 }, // 19 + { "B4 (ADC6)", GPIOB_BASE, GPIO_PIN_4, -1 }, // 20 + { "B5 (ADC7)", GPIOB_BASE, GPIO_PIN_5, -1 }, // 21 + { "B6", GPIOB_BASE, GPIO_PIN_6, -1 }, // 22 + { "B7", GPIOB_BASE, GPIO_PIN_7, -1 }, // 23 + { "B8", GPIOB_BASE, GPIO_PIN_8, -1 }, // 24 + { "B9", GPIOB_BASE, GPIO_PIN_9, -1 }, // 25 // ETC TODO }; #else lnPinMapping_t g_pins[] = { - { "A0", GPIOA_0, -1 }, - { "A1", GPIOA_1, -1 }, - { "A2", GPIOA_2, -1 }, - { "A3", GPIOA_3, -1 }, - { "A4", GPIOA_4, -1 }, - { "A5", GPIOA_5, -1 }, - { "A6", GPIOA_6, -1 }, - { "A7", GPIOA_7, -1 }, - { "A8", GPIOA_8, -1 }, - { "A9", GPIOA_9, -1 }, - { "A10", GPIOA_10, -1 }, - { "A11", GPIOA_11, -1 }, - { "A12", GPIOA_12, -1 }, - { "A13", GPIOA_13, -1 }, - { "A14", GPIOA_14, -1 }, - { "A15", GPIOA_15, -1 }, + { "A0 (ADC0)", GPIOA_0, -1 }, + { "A1 (ADC1)", GPIOA_1, -1 }, + { "A2", GPIOA_2, -1 }, + { "A3", GPIOA_3, -1 }, + { "A4 (ADC2)", GPIOA_4, -1 }, + { "A5", GPIOA_5, -1 }, + { "A6", GPIOA_6, -1 }, + { "A7", GPIOA_7, -1 }, + { "A8", GPIOA_8, -1 }, + { "A9", GPIOA_9, -1 }, + { "A10", GPIOA_10, -1 }, + { "A11", GPIOA_11, -1 }, + { "A12", GPIOA_12, -1 }, + { "A13", GPIOA_13, -1 }, + { "A14", GPIOA_14, -1 }, + { "A15", GPIOA_15, -1 }, // port B - { "B0", GPIOB_0, -1 }, // 16 - { "B1", GPIOB_1, -1 }, // 17 - { "B2", GPIOB_2, -1 }, // 18 - { "B3", GPIOB_3, -1 }, // 19 - { "B4", GPIOB_4, -1 }, // 20 - { "B5", GPIOB_5, -1 }, // 21 - { "B6", GPIOB_6, -1 }, // 22 - { "B7", GPIOB_7, -1 }, // 23 - { "B8", GPIOB_8, -1 }, // 24 - { "B9", GPIOB_9, -1 }, // 25 + { "B0", GPIOB_0, -1 }, // 16 + { "B1", GPIOB_1, -1 }, // 17 + { "B2", GPIOB_2, -1 }, // 18 + { "B3 (ADC3)", GPIOB_3, -1 }, // 19 + { "B4 (ADC4)", GPIOB_4, -1 }, // 20 + { "B5 (ADC5)", GPIOB_5, -1 }, // 21 + { "B6", GPIOB_6, -1 }, // 22 + { "B7", GPIOB_7, -1 }, // 23 + { "B8", GPIOB_8, -1 }, // 24 + { "B9", GPIOB_9, -1 }, // 25 // ETC TODO }; diff --git a/src/hal/ln882h/hal_uart_ln882h.c b/src/hal/ln882h/hal_uart_ln882h.c new file mode 100644 index 000000000..689ce3643 --- /dev/null +++ b/src/hal/ln882h/hal_uart_ln882h.c @@ -0,0 +1,77 @@ +#ifdef PLATFORM_LN882H + +#include "../../new_pins.h" +#include "../../new_cfg.h" +#include "../hal_uart.h" +#include "hal/hal_uart.h" +#include "serial.h" +#include "serial_hw.h" +#include "hal/hal_misc.h" +#include "hal_pinmap_ln882h.h" + +static bool isInitialized; +int g_urx_pin = 3; +int g_utx_pin = 2; + +void HAL_UART_SendByte(byte b) +{ + while(!hal_uart_flag_get(UART2_BASE, USART_FLAG_TXE)); + hal_uart_send_data(UART2_BASE, b); +} + +int HAL_UART_Init(int baud, int parity, bool hwflowc, int txOverride, int rxOverride) +{ + if(isInitialized) + { + hal_misc_reset_uart2(); + NVIC_ClearPendingIRQ(UART2_IRQn); + NVIC_DisableIRQ(UART2_IRQn); + } + + uart_init_t_def uart_init_struct; + uart_init_struct.baudrate = baud; + uart_init_struct.word_len = UART_WORD_LEN_8; + uart_init_struct.stop_bits = UART_STOP_BITS_1; + uart_init_struct.over_sampl = UART_OVER_SAMPL_8; + switch(parity) + { + case 1: uart_init_struct.parity = UART_PARITY_ODD; break; + case 2: uart_init_struct.parity = UART_PARITY_EVEN; break; + default: uart_init_struct.parity = UART_PARITY_NONE; break; + } + + uint32_t rxbase = g_pins[g_urx_pin].base; + uint32_t txbase = g_pins[g_utx_pin].base; + gpio_pin_t rxpin = g_pins[g_urx_pin].pin; + gpio_pin_t txpin = g_pins[g_utx_pin].pin; + + hal_gpio_pin_afio_select(txbase, txpin, UART2_TX); + hal_gpio_pin_afio_select(rxbase, rxpin, UART2_RX); + hal_gpio_pin_afio_en(txbase, txpin, HAL_ENABLE); + hal_gpio_pin_afio_en(rxbase, rxpin, HAL_ENABLE); + + hal_uart_init(UART2_BASE, &uart_init_struct); + hal_uart_rx_mode_en(UART2_BASE, HAL_ENABLE); + hal_uart_tx_mode_en(UART2_BASE, HAL_ENABLE); + hal_uart_en(UART2_BASE, HAL_ENABLE); + + NVIC_SetPriority(UART2_IRQn, 4); + NVIC_EnableIRQ(UART2_IRQn); + hal_uart_it_en(UART2_BASE, USART_IT_RXNE); + + isInitialized = true; + return 1; +} + +void UART2_IRQHandler(void) +{ + if(isInitialized) + { + if(hal_uart_flag_get(UART2_BASE, USART_FLAG_RXNE) == 1 && hal_uart_it_en_status_get(UART2_BASE, USART_IT_RXNE)) + { + UART_AppendByteToReceiveRingBuffer(hal_uart_recv_data(UART2_BASE)); + } + } +} + +#endif diff --git a/src/hal/tr6260/hal_pins_tr6260.c b/src/hal/tr6260/hal_pins_tr6260.c index c64c5fb3a..4601d5305 100644 --- a/src/hal/tr6260/hal_pins_tr6260.c +++ b/src/hal/tr6260/hal_pins_tr6260.c @@ -348,10 +348,10 @@ void HAL_PIN_PWM_Update(int index, float value) return; int ch = PIN_GetPWMIndexForPinIndex(index); if(ch < 0) return; - if(value < 0.1) - value = 0.1; - if(value >= 100) - value = 99.9; + //if(value < 0.1) + // value = 0.1; + //if(value >= 100) + // value = 99.9; pwm_config(ch, g_pins[index].freq, (uint32_t)(value * 10)); pwm_start(ch); } diff --git a/src/littlefs/lfs_util.h b/src/littlefs/lfs_util.h index bf69feb10..ee16fb0c1 100644 --- a/src/littlefs/lfs_util.h +++ b/src/littlefs/lfs_util.h @@ -47,7 +47,7 @@ #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 +#elif PLATFORM_REALTEK || PLATFORM_W800 || PLATFORM_W600 || PLATFORM_LN882H || PLATFORM_LN8825 extern void* pvPortMalloc(size_t xWantedSize); extern void vPortFree(void* pv); #define os_malloc pvPortMalloc diff --git a/src/logging/logging.c b/src/logging/logging.c index 297665cbe..fdcc5b422 100644 --- a/src/logging/logging.c +++ b/src/logging/logging.c @@ -171,6 +171,47 @@ commandResult_t log_port(const void* context, const char* cmd, const char* args, return CMD_RES_OK; } +#elif PLATFORM_LN882H +#include "serial_hw.h" +#include "ln_kv_api.h" +#define KV_LOG_PORT "logport" +commandResult_t log_port(const void* context, const char* cmd, const char* args, int cmdFlags) +{ + int idx; + + Tokenizer_TokenizeString(args, 0); + + // following check must be done after 'Tokenizer_TokenizeString', + // so we know arguments count in Tokenizer. 'cmd' argument is + // only for warning display + if(Tokenizer_CheckArgsCountAndPrintWarning(cmd, 1)) + { + return CMD_RES_NOT_ENOUGH_ARGUMENTS; + } + + serial_port_id_t port; + idx = Tokenizer_GetArgInteger(0); + switch(idx) + { + case 0: + port = SER_PORT_UART0; + break; + case 1: + port = SER_PORT_UART1; + break; + //case 2: + // port = SER_PORT_UART2; + // break; + default: + return CMD_RES_BAD_ARGUMENT; + } + + ln_kv_set(KV_LOG_PORT, &port, sizeof(serial_port_id_t)); + log_deinit(); + log_init(); + + return CMD_RES_OK; +} #endif // Here is how you can get log print on UART1: @@ -213,7 +254,7 @@ static void initLog(void) //cmddetail:"fn":"log_command","file":"logging/logging.c","requires":"", //cmddetail:"examples":""} CMD_RegisterCommand("logdelay", log_command, NULL); -#if PLATFORM_BEKEN +#if PLATFORM_BEKEN || PLATFORM_LN882H //cmddetail:{"name":"logport","args":"[Index]", //cmddetail:"descr":"Allows you to change log output port. On Beken, the UART1 is used for flashing and for TuyaMCU/BL0942, while UART2 is for log. Sometimes it might be easier for you to have log on UART1, so now you can just use this command like backlog uartInit 115200; logport 1 to enable logging on UART1..", //cmddetail:"fn":"log_port","file":"logging/logging.c","requires":"", diff --git a/src/mqtt/new_mqtt.c b/src/mqtt/new_mqtt.c index 06c2f832a..af3225ce7 100644 --- a/src/mqtt/new_mqtt.c +++ b/src/mqtt/new_mqtt.c @@ -2447,6 +2447,11 @@ void MQTT_QueuePublishWithCommand(const char* topic, const char* channel, const if (newItem == NULL) { newItem = os_malloc(sizeof(MqttPublishItem_t)); + if(newItem == NULL) + { + //addLogAdv(LOG_ERROR, LOG_FEATURE_MQTT, "os_malloc failed for MqttPublishItem_t"); + return; + } newItem->next = NULL; get_queue_tail(g_MqttPublishQueueHead)->next = newItem; //Append new item } diff --git a/src/new_common.h b/src/new_common.h index 22bb4e2a8..762f3ff99 100644 --- a/src/new_common.h +++ b/src/new_common.h @@ -572,6 +572,7 @@ OSStatus rtos_suspend_thread(beken_thread_t* thread); #define hal_flash_read FLASH_Read #define hal_flash_program FLASH_Program #define hal_flash_erase FLASH_Erase +#define HAL_ADC_Init OBK_HAL_ADC_Init #define OBK_OTA_EXTENSION ".img" #define OBK_OTA_NAME_EXTENSION "_ota" #else diff --git a/src/obk_config.h b/src/obk_config.h index 8c956b2b0..f12403009 100644 --- a/src/obk_config.h +++ b/src/obk_config.h @@ -393,6 +393,7 @@ #define ENABLE_NTP 1 //#define ENABLE_TIME_DST 1 #define ENABLE_DRIVER_BL0937 1 +#define ENABLE_DRIVER_BL0942 1 #define ENABLE_DRIVER_LED 1 #define ENABLE_DRIVER_WEMO 1 #define ENABLE_DRIVER_HUE 1 @@ -407,10 +408,11 @@ #define ENABLE_OBK_SCRIPTING 1 #define ENABLE_DRIVER_SSDP 1 #define ENABLE_ADVANCED_CHANNELTYPES_DISCOVERY 1 -#define ENABLE_OBK_BERRY 1 +//#define ENABLE_OBK_BERRY 1 #define ENABLE_DRIVER_SM16703P 1 #define ENABLE_DRIVER_PIXELANIM 1 #define ENABLE_DRIVER_IRREMOTEESP 1 +#define ENABLE_DRIVER_TUYAMCU 1 #elif PLATFORM_ESPIDF diff --git a/src/user_main.c b/src/user_main.c index 8a395c6d4..b4b51cd3e 100644 --- a/src/user_main.c +++ b/src/user_main.c @@ -1359,6 +1359,8 @@ void Main_Init_BeforeDelay_Unsafe(bool bAutoRunScripts) { CMD_Init_Early(); #if WINDOWS CMD_InitSimulatorOnlyCommands(); +#else + HAL_RegisterPlatformSpecificCommands(); #endif /* Automatic disable of PIN MONITOR after reboot */