diff --git a/TODO.md b/TODO.md index f69579b..b72c068 100644 --- a/TODO.md +++ b/TODO.md @@ -19,8 +19,6 @@ ### Serial -- allow selecting default output port for LT logger, as well as for `Serial` class (without a number) -- choose output port during runtime, too - configuration of RX/TX pins - SoftwareSerial library - receiving + Beken family @@ -35,7 +33,7 @@ - WiFi events - implement OTA -- test & add support for BK7231N +- fix WiFi on BK7231N, test other functionality - add generic board definition - fix SSL (mbedTLS) - I2C (Wire) diff --git a/arduino/beken-72xx/cores/arduino/wiring_analog.c b/arduino/beken-72xx/cores/arduino/wiring_analog.c index e7af064..e11fa4d 100644 --- a/arduino/beken-72xx/cores/arduino/wiring_analog.c +++ b/arduino/beken-72xx/cores/arduino/wiring_analog.c @@ -13,6 +13,18 @@ static GPIO_INDEX pwmToGpio[] = { GPIO26, // PWM5 }; +#if CFG_SOC_NAME == SOC_BK7231N +static GPIO_INDEX adcToGpio[] = { + -1, // ADC0 - VBAT + GPIONUM, // ADC1 + GPIONUM, // ADC2 + GPIO23, // ADC3 + GPIONUM, // ADC4 + GPIONUM, // ADC5 + GPIONUM, // ADC6 + GPIONUM, // ADC7 +}; +#else static GPIO_INDEX adcToGpio[] = { -1, // ADC0 - VBAT GPIO4, // ADC1 @@ -23,6 +35,7 @@ static GPIO_INDEX adcToGpio[] = { GPIO12, // ADC6 GPIO13, // ADC7 }; +#endif static uint8_t gpioToPwm(GPIO_INDEX gpio) { for (uint8_t i = 0; i < sizeof(pwmToGpio); i++) { @@ -84,7 +97,13 @@ void analogWrite(pin_size_t pinNumber, int value) { float percent = value * 1.0 / (1 << _analogWriteResolution); uint32_t dutyCycle = percent * _analogWritePeriod * 26 - 1; pwm.channel = gpioToPwm(pin->gpio); - pwm.duty_cycle = dutyCycle; +#if CFG_SOC_NAME != SOC_BK7231N + pwm.duty_cycle = dutyCycle; +#else + pwm.duty_cycle1 = dutyCycle; + pwm.duty_cycle2 = dutyCycle; + pwm.duty_cycle3 = dutyCycle; +#endif if (!pinEnabled(pin, PIN_PWM)) { // enable PWM and set its value diff --git a/arduino/libretuya/core/lt_logger.c b/arduino/libretuya/core/lt_logger.c index 8bc0e78..f867fd1 100644 --- a/arduino/libretuya/core/lt_logger.c +++ b/arduino/libretuya/core/lt_logger.c @@ -28,7 +28,7 @@ #define COLOR_BRIGHT_CYAN 0x16 #define COLOR_BRIGHT_WHITE 0x17 -static uint8_t uart_port = LT_UART_DEFAULT_LOGGER; +static uint32_t uart_port = LT_UART_DEFAULT_LOGGER; static const char levels[] = {'V', 'D', 'I', 'W', 'E', 'F'}; #if LT_LOGGER_COLOR @@ -75,8 +75,8 @@ void lt_log(const uint8_t level, const char *format, ...) { #endif fctprintf( - putchar_p, - uart_port, + (void (*)(char, void *))putchar_p, + (void *)uart_port, // format: #if LT_LOGGER_COLOR "\e[%c;3%cm" @@ -127,7 +127,7 @@ void lt_log(const uint8_t level, const char *format, ...) { va_list va_args; va_start(va_args, format); - vfctprintf(putchar_p, uart_port, format, va_args); + vfctprintf((void (*)(char, void *))putchar_p, (void *)uart_port, format, va_args); va_end(va_args); putchar_p('\r', uart_port); putchar_p('\n', uart_port); diff --git a/boards/_base/beken-7231n.json b/boards/_base/beken-7231n.json index b0b4096..1ecd45f 100644 --- a/boards/_base/beken-7231n.json +++ b/boards/_base/beken-7231n.json @@ -1,8 +1,11 @@ { "build": { "family": "BK7231N", - "ldscript_sdk": "TBD.ld", - "ldscript_arduino": "TBD.ld" + "ldscript_sdk": "bk7231n_bsp.ld", + "ldscript_arduino": "bk7231n_bsp.ld" + }, + "upload": { + "speed": 460800 }, "doc": { "params": { diff --git a/boards/_base/beken-7231t.json b/boards/_base/beken-7231t.json index 471b93d..a399230 100644 --- a/boards/_base/beken-7231t.json +++ b/boards/_base/beken-7231t.json @@ -4,6 +4,9 @@ "ldscript_sdk": "bk7231_bsp.ld", "ldscript_arduino": "bk7231_bsp.ld" }, + "upload": { + "speed": 921600 + }, "doc": { "params": { "extra": { diff --git a/boards/_base/beken-72xx.json b/boards/_base/beken-72xx.json index 609141d..00614d9 100644 --- a/boards/_base/beken-72xx.json +++ b/boards/_base/beken-72xx.json @@ -25,7 +25,6 @@ "maximum_ram_size": 262144, "flash_size": 2097152, "require_upload_port": true, - "speed": 921600, "protocol": "uart", "protocols": [ "uart" diff --git a/builder/frameworks/beken-72xx-sdk.py b/builder/frameworks/beken-72xx-sdk.py index 6b65f2c..be71267 100644 --- a/builder/frameworks/beken-72xx-sdk.py +++ b/builder/frameworks/beken-72xx-sdk.py @@ -158,6 +158,15 @@ env.AddLibrary( ], ) +# Sources - family fixups +env.AddLibrary( + name="${FAMILY_CODE}_fixups", + base_dir="$FAMILY_DIR/fixups", + srcs=[ + "+", + ], +) + # Sources - app module env.AddLibrary( name="bdk_app", diff --git a/platform/beken-7231n/fixups/sys_config.h b/platform/beken-7231n/fixups/sys_config.h new file mode 100644 index 0000000..80a97a5 --- /dev/null +++ b/platform/beken-7231n/fixups/sys_config.h @@ -0,0 +1,132 @@ +#pragma once + +#define ASSERT_HALT 1 +#define ASSERT_IGNORE 2 +#define ASSERT_REBOOT 3 +#define AT_SERVICE_CFG 0 +#define BLE_DEFAULT_WIFI_REQUEST 2 +#define BLE_VERSION_4_2 1 +#define BLE_VERSION_5_x 2 +#define BLE_WIFI_CO_REQUEST 3 +#define CFG_AIRKISS_TEST 0 +#define CFG_AP_MONITOR_COEXIST 0 +#define CFG_AP_SUPPORT_HT_IE 0 +#define CFG_ASSERT_OPTION ASSERT_IGNORE +#define CFG_BACKGROUND_PRINT 0 +#define CFG_BK_AWARE 0 +#define CFG_BK_AWARE_OUI "\xC8\x47\x8C" +#define CFG_BLE_ADV_NUM 1 +#define CFG_BLE_CONN_NUM 1 +#define CFG_BLE_INIT_NUM 0 +#define CFG_BLE_SCAN_NUM 1 +#define CFG_BLE_VERSION BLE_VERSION_5_x +#define CFG_EASY_FLASH 0 +#define CFG_ENABLE_BUTTON 0 +#define CFG_ENABLE_DEMO_TEST 0 +#define CFG_ENABLE_WPA_LOG 0 +#define CFG_GENERAL_DMA 1 +#define CFG_IEEE80211N 1 +#define CFG_IEEE80211W 0 +#define CFG_INT_WDG_ENABLED 1 +#define CFG_INT_WDG_PERIOD_MS 10000 +#define CFG_IPERF_TEST 0 +#define CFG_JTAG_ENABLE 0 +#define CFG_LESS_MEMERY_IN_RWNX 0 +#define CFG_LWIP_MEM_POLICY LWIP_REDUCE_THE_PLAN +#define CFG_MAC_PHY_BAPASS 1 +#define CFG_MSDU_RESV_HEAD_LEN 96 +#define CFG_MSDU_RESV_TAIL_LEN 16 +#define CFG_PERIPHERAL_TEST 0 +#define CFG_REAL_SDIO 0 +#define CFG_RELEASE_FIRMWARE 0 +#define CFG_ROLE_LAUNCH 0 +#define CFG_RUNNING_PLATFORM SOC_PLATFORM +#define CFG_RWNX_QOS_MSDU 1 +#define CFG_RX_SENSITIVITY_TEST 1 +#define CFG_SARADC_CALIBRATE 0 +#define CFG_SDIO 0 +#define CFG_SDIO_TRANS 0 +#define CFG_SOC_NAME SOC_BK7231N +#define CFG_SUPPOET_BSSID_CONNECT 0 +#define CFG_SUPPORT_BKREG 1 +#define CFG_SUPPORT_BLE 1 +#define CFG_SUPPORT_BLE_MESH 0 +#define CFG_SUPPORT_BSSID_CONNECT 0 +#define CFG_SUPPORT_CALIBRATION 1 +#define CFG_SUPPORT_MANUAL_CALI 1 +#define CFG_SUPPORT_OTA_HTTP 1 +#define CFG_SUPPORT_OTA_TFTP 0 +#define CFG_SUPPORT_SPI_TEST 0 +#define CFG_SUPPORT_TIANZHIHENG_DRONE 0 +#define CFG_SUPPORT_TPC_PA_MAP 1 +#define CFG_SYS_REDUCE_NORMAL_POWER 0 +#define CFG_TASK_WDG_ENABLED 1 +#define CFG_TASK_WDG_PERIOD_MS 60000 +#define CFG_TCP_SERVER_TEST 0 +#define CFG_TX_EVM_TEST 1 +#define CFG_UART_DEBUG 0 +#define CFG_UART_DEBUG_COMMAND_LINE 1 +#define CFG_UDISK_MP3 0 +#define CFG_USB 0 +#define CFG_USE_AP_IDLE 0 +#define CFG_USE_AP_PS 0 +#define CFG_USE_AUD_ADC 0 +#define CFG_USE_AUD_DAC 0 +#define CFG_USE_AUDIO 0 +#define CFG_USE_BLE_PS 1 +#define CFG_USE_CAMERA_INTF 0 +#define CFG_USE_DEEP_PS 1 +#define CFG_USE_DHCP 1 +#define CFG_USE_FAKERTC_PS 0 +#define CFG_USE_FTPD_UPGRADE 0 +#define CFG_USE_I2C1 0 +#define CFG_USE_I2C2 1 +#define CFG_USE_LWIP_NETSTACK 1 +#define CFG_USE_MCU_PS 1 +#define CFG_USE_PTA 0 +#define CFG_USE_SDCARD_HOST 0 +#define CFG_USE_SPI_DMA 1 +#define CFG_USE_SPI_MASTER 1 +#define CFG_USE_SPI_SLAVE 1 +#define CFG_USE_SPIDMA 0 +#define CFG_USE_STA_PS 1 +#define CFG_USE_TEMPERATURE_DETECT 0 +#define CFG_USE_TICK_CAL 1 +#define CFG_USE_UART1 1 +#define CFG_USE_USB_CHARGE 0 +#define CFG_USE_USB_HOST 0 +#define CFG_USE_WPA_29 1 +#define CFG_WFA_CERT 0 +#define CFG_WIFI_RAW_TX_CMD 0 +#define CFG_WIFI_SENSOR 0 +#define CFG_WLAN_FAST_CONNECT 0 +#define CFG_WPA_CTRL_IFACE 1 +#define CFG_WPA3 0 +#define CFG_XTAL_FREQUENCE CFG_XTAL_FREQUENCE_26M +#define CFG_XTAL_FREQUENCE_26M 26000000 +#define CFG_XTAL_FREQUENCE_40M 40000000 +#define CONFIG_APP_MP3PLAYER 0 +#define FPGA_PLATFORM 0 +#define LWIP_DEFAULT_MEM_POLICY 1 +#define LWIP_REDUCE_THE_PLAN 2 +#define OSMALLOC_STATISTICAL 0 +#define RF_USE_POLICY WIFI_DEFAULT_BLE_REQUEST +#define SOC_BK7221U 3 +#define SOC_BK7231 1 +#define SOC_BK7231N 5 +#define SOC_BK7231U 2 +#define SOC_BK7271 4 +#define SOC_PLATFORM 1 +#define THD_APPLICATION_PRIORITY 3 +#define THD_CORE_PRIORITY 2 +#define THD_EXTENDED_APP_PRIORITY 5 +#define THD_HOSTAPD_PRIORITY 5 +#define THD_INIT_PRIORITY 4 +#define THD_LWIP_PRIORITY 4 +#define THD_MEDIA_PRIORITY 4 +#define THD_RECONNECT_PRIORITY 4 +#define THD_UBG_PRIORITY 5 +#define THD_UMP3_PRIORITY 4 +#define THD_WPAS_PRIORITY 5 +#define THDD_KEY_SCAN_PRIORITY 7 +#define WIFI_DEFAULT_BLE_REQUEST 1 diff --git a/platform/beken-7231n/fixups/temp_detect.c b/platform/beken-7231n/fixups/temp_detect.c new file mode 100644 index 0000000..07014dd --- /dev/null +++ b/platform/beken-7231n/fixups/temp_detect.c @@ -0,0 +1,6 @@ +/* Copyright (c) Kuba SzczodrzyƄski 2022-07-07. */ + +// Fix for compiling on BK7231N with CFG_USE_TEMPERATURE_DETECT=0 +// Method is used by libuart_debug_bk7231n.a / bkreg_run_command_implement() + +void temp_detect_change_configuration(unsigned long intval, unsigned long thre, unsigned long dist) {} diff --git a/platform/beken-7231t/fixups/sys_config.h b/platform/beken-7231t/fixups/sys_config.h index 0291e51..2d382f2 100644 --- a/platform/beken-7231t/fixups/sys_config.h +++ b/platform/beken-7231t/fixups/sys_config.h @@ -40,7 +40,6 @@ #define CFG_SUPPORT_BKREG 1 #define CFG_SUPPORT_BLE 1 #define CFG_SUPPORT_BLE_MESH 0 -#define CFG_SUPPORT_BOOTLOADER 1 #define CFG_SUPPORT_BSSID_CONNECT 0 #define CFG_SUPPORT_CALIBRATION 1 #define CFG_SUPPORT_MANUAL_CALI 1 @@ -100,6 +99,7 @@ #define SOC_BK7231 1 #define SOC_BK7231N 5 #define SOC_BK7231U 2 +#define SOC_BK7271 4 #define SOC_PLATFORM 1 #define THD_APPLICATION_PRIORITY 3 #define THD_CORE_PRIORITY 2 diff --git a/platform/beken-72xx/ld/bk7231n_bsp.ld b/platform/beken-72xx/ld/bk7231n_bsp.ld new file mode 100644 index 0000000..8b507cd --- /dev/null +++ b/platform/beken-72xx/ld/bk7231n_bsp.ld @@ -0,0 +1,406 @@ +/* + * Script for GNU linker. + * Describes layout of sections, location of stack. + * + * In this case vectors are at location 0 (reset @ 0x08) + * + * +------------+ 0x00400020 + * data | + * end + * |(heap) | + * . . + * . . + * |(heap limit)| + * + * |- - - - - - | + * stack bottom 256k + * +------------+ + * + * +------------+ 0x0000000 + * |vectors | + * | | + * |------------+ + * |text | + * |data | + * | | 1024k + * +------------+ + */ + +/* Split memory into area for vectors and ram */ +MEMORY +{ + flash (rx) : ORIGIN = 0x00010000, LENGTH = 1912K + tcm (rw!x): ORIGIN = 0x003F0000, LENGTH = 60k - 512 + itcm (rwx): ORIGIN = 0x003FEE00, LENGTH = 4k + 512 + ram (rw!x): ORIGIN = 0x00400100, LENGTH = 192k - 0x100 +} + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_vector_start); +_vector_start = ORIGIN(flash); + +SECTIONS +{ + /* vectors go to vectors region */ + . = ORIGIN(flash); + .vectors : + { + KEEP(*(*.vectors)) + KEEP( *(*.boot)) + } > flash + + /* instructions go to the text region*/ + + . = ORIGIN(itcm); + .itcm.code ALIGN(8) : + { + /* itcm 4KB code */ + *(.text.intc_hdl_entry) + *(.text.intc_irq) + *(.text.intc_fiq) + *(.text.bk_timer_isr) + *(.text.power_save_wakeup_isr) + *(.text.bmsg_rx_sender) + *(.text.bmsg_null_sender) + *(.text.fclk_get_tick) + *(.text.flash_read_sr) + *(.text.flash_write_sr) + *(.text.flash_clr_qwfr) + *(.text.set_flash_protect) + *(.text.flash_read) + *(.text.flash_read_data) + *(.text.flash_set_qe) + *(.text.flash_set_qwfr) + *(.text.flash_set_line_mode*) + *(.text.flash_get_line_mode) + *(.text.flash_write) + *(.text.flash_ctrl) + *(.text.power_save_dtim_wake) + *(.text.sctrl_fix_dpll_div) + + *(.text.vTaskSuspendAll) + *(.text.xTaskGetTickCount) + *(.text.xTaskGetTickCountFromISR) + *(.text.vTaskStepTick) + *(.text.xTaskIncrementTick) + *(.text.xTaskResumeAll) + *(.text.vTaskSwitchContext) + *(.text.vApplicationIdleHook) + *(.text.platform_is_in_irq_context) + *(.text.platform_is_in_fiq_context) + *(.text.platform_is_in_interrupt_context) + *(.text.portENABLE_IRQ) + *(.text.portENABLE_FIQ) + *(.text.portDISABLE_FIQ) + *(.text.portDISABLE_IRQ) + *(.text.vPortEnterCritical) + *(.text.vPortExitCritical) + } > itcm AT>flash + _itcmcode_flash_begin = LOADADDR(.itcm.code); + _itcmcode_ram_begin = ADDR(.itcm.code); + _itcmcode_ram_end = _itcmcode_ram_begin + SIZEOF(.itcm.code); + + . = ALIGN(0x8); + /* code, instructions.for example: i=i+1; */ + .text : + { + *(.text) + *(.text.*) + *(.stub) + + /* https://www.embedded.com/building-bare-metal-arm-systems-with-gnu-part-3/ */ + KEEP(*crtbegin.o(.ctors)) + KEEP(*(EXCLUDE_FILE (*ctrend.o) .ctors)) + KEEP(*(SORT(.ctors.*))) + KEEP(*crtend.o(.ctors)) + KEEP(*crtbegin.o(.dtors)) + KEEP(*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP(*(SORT(.dtors.*))) + KEEP(*crtend.o(.dtors)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP(*(.preinit_array)) + __preinit_array_end = .; + . = ALIGN(4); + __init_array_start = .; + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + __init_array_end = .; + . = ALIGN(4); + __fini_array_start = .; + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + __fini_array_end = .; + + . = ALIGN (4); + __cmd_table_start__ = .; + KEEP(*(.cmd.table.data*)) + __cmd_table_end__ = .; + + /* https://community.silabs.com/s/article/understand-the-gnu-linker-script-of-cortex-m4?language=en_US */ + KEEP(*(.init)) + KEEP(*(.fini)) + *(.init) + *(.fini) + + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } > flash + + /* read only data.for example: const int rom_data[3]={1,2,3}; */ + .rodata ALIGN(8) : + { + *(.rodata) + *(.rodata.*) + *(.gnu.linkonce.r*) + } > flash + + .ARM.exidx : + { + __exidx_start = .; + *(.ARM.exidx*) + *(.gnu.linkonce.armexidx.*) + __exidx_end = .; + } > flash + + . = ORIGIN(tcm); + .tcm ALIGN(8) : + { + *apm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *apm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_ble_init.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_ble_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_ble_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_ble.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_comm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_sdp.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_sec.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *app.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *arbitrate.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *arch_main*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ate_app*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *bam_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *bam.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *bk_timer.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *bk7011_cal*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *bk7231N_cal.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *BkDriverFlash.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble_aes.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble_main.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble_rf_port.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble_rf_xvr.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble_ui.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble_util_buf.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ble.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *chan.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *cmd_evm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *cmd_rx_sensitivity.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *comm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *comm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *common_list.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *common_utils.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *common.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ctrl_iface.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dbg_mwsgen.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dbg_swdiag.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dbg_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dbg.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dd.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dhcp-server-main.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dhcp-server.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dhcp.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dma.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *dns.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *drv_model.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ecc_p256.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *eloop.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *etharp.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *fake_clock.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *flash.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gapc_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gapc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gapm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gapm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gattc_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gattc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gattm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gattm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *gpio.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *h4tl.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *hal_dma.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *hal_machw.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *hci_fc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *hci_tl.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *hci.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *heap_4.marm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *hostapd*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ieee802_11_demo.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *igmp.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *intc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ip4_addr.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ip4.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *irda*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ke_env.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *kernel_event.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *kernel_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *kernel.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *l2cc_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *l2cc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *l2cm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *llc_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *llc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *lld_adv.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *lld_con.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *lld_init.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *lld_per_adv.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *lld_test.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *lld.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *llm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *llm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *mac_phy_bypass.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *main_none.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *main_supplicant.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *manual_cal_bk7231U.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *me_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *me.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *mem_arch.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *mm_bcn.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *mm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *mm_timer.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *mm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *net.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *netif.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *param_config.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *phy_trident*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ping.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *power_save*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *prf_utils.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *prf.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *ps.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *pwm_bk7231n.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *raw.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rf_xvr.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *role_launch.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *RomCallFlash.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rtos_pub*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rw_ieee80211.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rw_msg_rx.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rwble.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rwip_driver.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rwip.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rwip.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rwnx_intf*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rwnx.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rx_sensitivity.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rx_swdesc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rxl_cntrl.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rxl_hwdesc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *rxu_cntrl.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sa_ap.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sa_station.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *saradc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *scan_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *scan.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *scanu_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *scanu.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sch_alarm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sch_arb.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sch_plan.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sch_prog.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sch_slice.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sdp_common.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sdp_service_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sdp_service.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sm_task.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sockets.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *spi*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sta_mgmt.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *start_type.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sys_arch.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *sys_ctrl.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *tasks.marm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *tcp_in.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *tcp.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *tcpip.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *td.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *temp_detect.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *timeouts.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *timers.marm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *tx_evm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *tx_swdesc.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *txl_buffer.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *txl_cfm.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *txl_cntrl.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *uart_ble.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *uart.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *vif_mgmt.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wdt.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wlan_cli*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wlan_ui*.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wpa_debug.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wpa_psk_cache.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wpa_psk_cache.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + *wpa_supplicant.o(.bss .bss.* .scommon .sbss .dynbss COMMON) + + /* *memp.o(.bss .bss.* .scommon .sbss .dynbss COMMON) */ + /* *mem.o(.bss .bss.* .scommon .sbss .dynbss COMMON) */ + } >tcm AT>flash + _tcmbss_start = ADDR(.tcm); + _tcmbss_end = _tcmbss_start + SIZEOF(.tcm); + + . = ORIGIN(ram); + /* globals.for example: int ram_data[3]={4,5,6}; */ + /* VMA in RAM, but keep LMA in flash */ + _begin_data = .; + .data : + { + *(.data .data.*) + *(.sdata) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } >ram AT>flash + _end_data = .; + + /* Loader will copy data from _flash_begin to _ram_begin..ram_end */ + _data_flash_begin = LOADADDR(.data); + _data_ram_begin = ADDR(.data); + _data_ram_end = .; + + /* uninitialized data section - global int i; */ + .bss ALIGN(8): + { + _bss_start = .; + *boot_handlers.O(.bss .bss.* .scommon .sbss .dynbss COMMON) + *(.bss .bss.*) + *(.scommon) + *(.sbss) + *(.dynbss) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + _bss_end = .; + } > ram /* in RAM */ + + . = ALIGN (8); + _empty_ram = .; + + /* This symbol defines end of code/data sections. Heap starts here. */ + PROVIDE(end = .); +} + +GROUP( + libgcc.a + libg.a + libc.a + libm.a + libnosys.a +)