Skip to content

Contributed by Xiao He, organized by Ai-Thinker

AI-WB2 OTA Upgrade Tutorial

Taking Bouffalo Lab's demo_ota project as an example, copy customer_app/system/ota/demo_ota from Bouffalo Lab's original SDK into the application directory of the WB2 module SDK,

  • In demo_ota/proj_config.mk, add: CONFIG_LINK_ROM=1
  • #compiler flag config domain

    #CONFIG_TOOLPREFIX := #CONFIG_OPTIMIZATION_LEVEL_RELEASE := 1 #CONFIG_M4_SOFTFP := 1

    #board config domain

    CONFIG_BOARD_FLASH_SIZE := 4

    #firmware config domain

    #set CONFIG_ENABLE_ACP to 1 to enable ACP, set to 0 or comment this line to disable #CONFIG_ENABLE_ACP:=1 CONFIG_BL_IOT_FW_AP:=1 CONFIG_BL_IOT_FW_AMPDU:=0 CONFIG_BL_IOT_FW_AMSDU:=0 CONFIG_BL_IOT_FW_P2P:=0 CONFIG_ENABLE_PSM_RAM:=1 #CONFIG_ENABLE_CAMERA:=1 #CONFIG_ENABLE_BLSYNC:=1 #CONFIG_ENABLE_VFS_SPI:=1 CONFIG_ENABLE_VFS_ROMFS:=1 CONFIG_EASYFLASH_ENABLE:=1        #0 -> 1 CONFIG_SYS_APP_TASK_STACK_SIZE:=4096        #+ CONFIG_SYS_APP_TASK_PRIORITY:=15        #+

    CONFIG_FREERTOS_TICKLESS_MODE:=0        #1 -> 0

    #CONFIG_SYS_APP_TASK_STACK_SIZE:=4096        #- #CONFIG_SYS_APP_TASK_PRIORITY:=15        #-

    CONFIG_SYS_VFS_ENABLE:=1 CONFIG_SYS_VFS_UART_ENABLE:=1 CONFIG_SYS_AOS_CLI_ENABLE:=1 CONFIG_SYS_AOS_LOOP_ENABLE:=1 CONFIG_SYS_BLOG_ENABLE:=1 CONFIG_SYS_DMA_ENABLE:=0        #1 -> 0 CONFIG_SYS_USER_VFS_ROMFS_ENABLE:=0        #1 -> 0

    CONFIG_BT:=0

    CONFIG_BT_CENTRAL:=1        #+ CONFIG_BT_OBSERVER:=1        #+ CONFIG_BT_PERIPHERAL:=1        #+ CONFIG_BT_STACK_CLI:=1        #+ CONFIG_BT_MESH := 0        #+ ifeq ($(CONFIG_BT_MESH),1)        #+ CONFIG_BT_MESH_PB_ADV := 1        #+ CONFIG_BT_MESH_PB_GATT := 1        #+ CONFIG_BT_MESH_FRIEND := 1        #+ CONFIG_BT_MESH_LOW_POWER := 1        #+ CONFIG_BT_MESH_PROXY := 1        #+ CONFIG_BT_MESH_GATT_PROXY := 1        #+ endif

    CONF_ENABLE_COREDUMP:=1        #+

    #CONFIG_USE_XTAL32K:=0        #- #CONFIG_ENABLE_STACK_OVERFLOW_CHECK:=0        #-

    #blog enable components format :=blog_testc cli vfs helper LOG_ENABLED_COMPONENTS:=blog_testc hosal loopset looprt bloop blestack LivingRoomCock http_client_tcp ifeq ($(CONFIG_BT_MESH_SYNC),1) LOG_ENABLED_COMPONENTS += blsync_ble endif

    CONFIG_BL602_USE_ROM_DRIVER:=1 #CONFIG_BT_STACK_PTS:=0        #-

    CONFIG_LINK_ROM=1        #+

[color=rgba(0, 0, 0, 0.75)]Actually, the genromap [color=rgba(0, 0, 0, 0.75)]CONFIG_LINK_ROM=1 is already in the file, so there is no need to add it to demo_ota/proj_config.mk; an easier way is to run make directly

#!/bin/sh make CONFIG_CHIP_NAME=BL602 CONFIG_LINK_ROM=1 -j make flash-build exit $?

demo_ota.bin and OTA firmware generation****Running make or ./genromap generates demo_ota.bin and the OTA firmware. View the Make File in the project

This is a project Makefile. It is assumed the directory this Makefile resides in is a

project subdirectory.

PROJECT_NAME := LivingRoomCock PROJECT_PATH := $(abspath .) PROJECT_BOARD := evb export PROJECT_PATH PROJECT_BOARD #CONFIG_TOOLPREFIX :=

-include ./proj_config.mk

ifeq ($(origin BL60X_SDK_PATH), undefined) BL60X_SDK_PATH_GUESS ?= $(shell pwd) BL60X_SDK_PATH ?= (BL60XSDKPATHGUESS)/../../../..(info ****** Please SET BL60X_SDK_PATH ******) (infoTryingSDKPATH[(BL60X_SDK_PATH)]) endif

COMPONENTS_NETWORK := sntp dns_server COMPONENTS_BLSYS   := bltime blfdt blmtd blota bloop loopadc looprt loopset COMPONENTS_VFS     := romfs cjson

INCLUDE_COMPONENTS += freertos_riscv_ram bl602 bl602_std newlibc wifi wifi_manager wpa_supplicant bl602_os_adapter wifi_hosal hosal mbedtls_lts lwip lwip_dhcpd vfs yloop utils cli aws-iot httpc httpd dns_server netutils blog blog_testc INCLUDE_COMPONENTS += easyflash4 coredump lwip_altcp_tls_mbedtls  blcrypto_suite bl_os_adapter rfparam_adapter_tmp spiffs

INCLUDE_COMPONENTS += $(COMPONENTS_NETWORK) INCLUDE_COMPONENTS += $(COMPONENTS_BLSYS) INCLUDE_COMPONENTS += $(COMPONENTS_VFS) INCLUDE_COMPONENTS += $(PROJECT_NAME)

include $(BL60X_SDK_PATH)/make_scripts_riscv/project.mk

It ultimately calls make_scripts_riscv/project.mk

Main Project Makefile

This Makefile is included directly from the user project Makefile in order to call the bouffalo.mk

makefiles of all components (in a separate make process) to build all the libraries, then links them

together into the final file. If so, PWD is the project dir (we assume).

This makefile requires the environment variable BL60X_SDK_PATH to be set to the top-level bl60x_sdk directory

where this file is located.

.PHONY: all build clean all_binaries list-components

MAKECMDGOALS ?= all all: all_binaries

FLASH_TOOL_TYPE:= ./bflb_iot_tool-ubuntu

see below for recipe of 'all' target

# other components will add dependencies to 'all_binaries'. The

reason all_binaries is used instead of 'all' is so that the flash

target can build everything without triggering the per-component "to

flash..." output targets.)

help:         @echo "Welcome to Ai-WB2 SDK build system. make targets:"         @echo ""         @echo "\033[33m"make all"\033[0m - Build app, components"         @echo "\033[33m"make clean"\033[0m - Remove all app components output"         @echo "\033[33m"make flash"\033[0m - Build and download firmware "         @echo "\033[33m"make flash-only"\033[0m - Only download firmware"         @echo "\033[33m"make eflash"\033[0m - Use the flash after erasing it"         @echo "\033[33m"make erase_flash"\033[0m - Erase all internal contents of flash"         @echo "\033[33m"make list-components"\033[0m - List all components in the project"         @echo "\033[33m"make [component name]"\033[0m - build a component as a library"

Non-interactive targets. Mostly, those for which you do not need to build a binary

NON_INTERACTIVE_TARGET += defconfig clean% %clean help list-components print_flash_cmd

dependency checks

ifndef MAKE_RESTARTS ifeq ("(filter4.(MAKE_VERSION))","") $(warning bl60x_sdk build system only supports GNU Make versions 3.81 or newer. You may see unexpected results with other Makes.) endif

endif  # MAKE_RESTARTS

can't run 'clean' along with any non-clean targets

ifneq ("(filterclean(MAKECMDGOALS))" ,"") ifneq ("(filteroutclean(MAKECMDGOALS))", "") $(error bl60x_sdk build system doesn't support running 'clean' targets along with any others. Run 'make clean' and then run other targets separately.) endif

OS ?=

make BL60X_SDK_PATH a "real" absolute path

* works around the case where a shell character is embedded in the environment variable value.

* changes Windows-style C:/blah/ paths to MSYS style /c/blah

ifeq ("$(OS)","Windows_NT")

On Windows MSYS2, make wildcard function returns empty string for paths of form /xyz

where /xyz is a directory inside the MSYS root - so we don't use it.

SANITISED_BL60X_SDK_PATH:=$(realpath (BL60XSDKPATH))FLASHTOOLTYPE:=./bflbiottool.exeelseSANITISEDBL60XSDKPATH:=(realpath $(wildcard $(BL60X_SDK_PATH))) endif

export BL60X_SDK_PATH := $(SANITISED_BL60X_SDK_PATH)

ifndef BL60X_SDK_PATH $(error BL60X_SDK_PATH variable is not set to a valid directory.) endif

ifneq ("(BL60XSDKPATH)","(SANITISED_BL60X_SDK_PATH)") $(error If BL60X_SDK_PATH is overriden on command line, it must be an absolute path with no embedded shell special characters) endif

ifneq ("(BL60XSDKPATH)","(subst :,,(BL60XSDKPATH))")(error BL60X_SDK_PATH cannot contain colons. If overriding BL60X_SDK_PATH on Windows, use MSYS Unix-style /c/dir instead of C:/dir) endif

disable built-in make rules, makes debugging saner

MAKEFLAGS_OLD := $(MAKEFLAGS) MAKEFLAGS +=-rR

Default path to the project: we assume the Makefile including this file

is in the project directory

ifndef PROJECT_PATH PROJECT_PATH := $(abspath $(dir $(firstword $(MAKEFILE_LIST)))) export PROJECT_PATH endif

A list of the "common" makefiles, to use as a target dependency

COMMON_MAKEFILES := $(abspath $(BL60X_SDK_PATH)/make_scripts_riscv/project.mk $(BL60X_SDK_PATH)/make_scripts_riscv/common.mk $(BL60X_SDK_PATH)/make_scripts_riscv/component_wrapper.mk $(firstword $(MAKEFILE_LIST))) export COMMON_MAKEFILES

The directory where we put all objects/libraries/binaries. The project Makefile can

configure this if needed.

ifndef BUILD_DIR_BASE BUILD_DIR_BASE := $(PROJECT_PATH)/build_out endif export BUILD_DIR_BASE

Component directories. These directories are searched for components (either the directory is a component,

or the directory contains subdirectories which are components.)

The project Makefile can override these component dirs, or add extras via EXTRA_COMPONENT_DIRS

ifndef COMPONENT_DIRS EXTRA_COMPONENT_DIRS ?= COMPONENT_DIRS := $(PROJECT_PATH)/components $(EXTRA_COMPONENT_DIRS) $(BL60X_SDK_PATH)/components $(BL60X_SDK_PATH)/customer_components (PROJECTPATH)/(PROJECT_NAME) $(PROJECT_COMPONENT) endif export COMPONENT_DIRS

The project Makefile can define a list of components, but if it does not do this we just take all available components

in the component dirs. A component is COMPONENT_DIRS directory, or immediate subdirectory,

which contains a bouffalo.mk file.

Use the "make list-components" target to debug this step.

#ifndef COMPONENTS

Find all component names. The component names are the same as the

directories they're in, so /bla/components/mycomponent/bouffalo.mk -> mycomponent.

using by [https://stackoverflow.com/questi ... ry-tree-for-c-files](https://stackoverflow.com/questions/3774568/makefile-issue-smart-way-to-scan-directory-tree-for-c-files)

ifeq ("$(wildcard ${BL60X_SDK_PATH}/components.mk)","") rwildcard = $(wildcard $1$2) (foreachd,(wildcard 1),(call rwildcard,$d/,2))COMPONENTSRALPATH:=(dir (foreachcd,(COMPONENT_DIRS),                       
                                                (callrwildcard,(cd)/,bouffalo.mk)                                                
                                )) COMPONENTS := $(sort (foreachcomp,(COMPONENTS_RAL_PATH),$(lastword (subst/,,(comp))))) COMPONENTS_REAL_PATH := (patsubst(COMPONENTS_RAL_PATH)) else COMPONENTS := $(notdir $(PROJECT_PATH)) COMPONENTS_REAL_PATH := (PROJECTPATH)/(notdir $(PROJECT_PATH)) include (BL60XSDKPATH)/components.mk(info use existing components.mk file) endif #endif

After a full manifest of component names is determined, subtract the ones explicitly omitted by the project Makefile.

ifdef INCLUDE_COMPONENTS

match exclude comps with EXCLUDE_COMPONENTS variable

define include_comps_add include_path += (filter(1), (COMPONENTSREALPATH))endef(foreach comp,(INCLUDECOMPONENTS),(eval (callincludecompsadd,(comp)))) INCLUDE_COMPONENTS_REAL_PATH := $(include_path)

include components

COMPONENTS := $(filter $(INCLUDE_COMPONENTS), $(COMPONENTS)) COMPONENTS_REAL_PATH := $(filter $(INCLUDE_COMPONENTS_REAL_PATH), $(COMPONENTS_REAL_PATH)) endif export COMPONENTS

Resolve all of COMPONENTS into absolute paths in COMPONENT_PATHS.

If a component name exists in multiple COMPONENT_DIRS, we take the first match.

NOTE: These paths must be generated WITHOUT a trailing / so we

can use $(notdir x) to get the component name.

TODO remove multiple name in components

#COMPONENT_PATHS := (foreachcomp,(COMPONENTS),$(firstword (foreachcd,(COMPONENT_DIRS),$(wildcard $(dir (cd))(comp) (cd)/(comp))))) #COMPONENT_PATHS := (patsubst(COMPONENTS_RAL_PATH)) COMPONENT_PATHS := $(COMPONENTS_REAL_PATH) export COMPONENT_PATHS

Initialise project-wide variables which can be added to by

each component.

These variables are built up via the component_project_vars.mk

generated makefiles (one per component).

See docs/build-system.rst for more details.

COMPONENT_INCLUDES := COMPONENT_LDFLAGS := COMPONENT_SUBMODULES := COMPONENT_LIBRARIES :=

COMPONENT_PROJECT_VARS is the list of component_project_vars.mk generated makefiles

for each component.

Including $(COMPONENT_PROJECT_VARS) builds the COMPONENT_INCLUDES,

COMPONENT_LDFLAGS variables and also targets for any inter-component

dependencies.

See the component_project_vars.mk target in component_wrapper.mk

COMPONENT_PROJECT_VARS := (addsuffix/componentprojectvars.mk,(notdir $(COMPONENT_PATHS) )) COMPONENT_PROJECT_VARS := $(sort $(COMPONENT_PROJECT_VARS)) COMPONENT_PROJECT_VARS := $(addprefix (BUILDDIRBASE)/,(COMPONENT_PROJECT_VARS))

this line is -include instead of include to prevent a spurious error message on make 3.81

-include $(COMPONENT_PROJECT_VARS)

Also add top-level project include path, for top-level includes

COMPONENT_INCLUDES += $(abspath $(BUILD_DIR_BASE)/include/)

export COMPONENT_INCLUDES

Set variables common to both project & component

include $(BL60X_SDK_PATH)/make_scripts_riscv/common.mk include $(BL60X_SDK_PATH)/make_scripts_riscv/toolchain.mk

all: ifeq ("(OS)","WindowsNT")elseifeq("(CONFIG_CHIP_NAME)", "BL602") endif         @echo "Building Finish. To flash build output. run 'make flash' or:"         @echo "c $(OS) ..."         @echo "cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=$(APP_BIN) (FLASHTOOLTYPE)chipname=BL602baudrate=921600port=/dev/ttyUSB0pt=(PROJECT_PATH)/img_conf/partition_cfg_4M.toml --dts=(PROJECTPATH)/imgconf/blfactoryparamsIoTKitA40M.dtsfirmware=(APP_BIN)"

bins: all         @cd $(BL60X_SDK_PATH)/image_conf; python3 flash_build.py $(PROJECT_NAME) $(CONFIG_CHIP_NAME) info: all         @cd (BL60XSDKPATH)/imageconf;envSDKAPPBIN=(APP_BIN) SDK_APP_MAP=$(APP_MAP) python3 codesize.py

If we have version.mk then prefer that for extracting BL60x_SP_SDK version

ifeq ("$(wildcard ${BL60X_SDK_PATH}/version.mk)","") BL_SDK_VER := $(shell cd {BL60X_SDK_PATH} && git describe --always --tags --dirty) EXTRA_CPPFLAGS ?= EXTRA_CPPFLAGS += -D BL_SDK_VER=\"(BL_SDK_VER)" $(info use git describe to generate Version Define) else include (BL60XSDKPATH)/version.mkifeq("(CONFIG_CHIP_NAME)", "BL602") $(info Your configuration chipname is Ai-Thinker Ai-WB2 Wi-Fi&BLE Module) endif BL_CHIP_NAME := $

Set default LDFLAGS

-nostdlib

--specs=nosys.specs

EXTRA_LDFLAGS ?= -Wl,--cref -nostartfiles

ifeq ("(CONFIGCHIPNAME)","VIRTEX7")LDFLAGS?= march=rv32imcmabi=ilp32 g3nostartfilesWl,noinhibitexec,gcsections,relaxWl,cref Wl,startgroup (COMPONENT_LDFLAGS)
        -Wl,--end-group \

else E21_CPU_LDFLAGS := -march=rv32imfc
                   -mabi=ilp32f

LDFLAGS ?=  (E21CPULDFLAGS) (EXTRA_LDFLAGS)
        -Wl,--gc-sections        
        -Wl,-static        
        -Wl,--start-group        
        $(COMPONENT_LDFLAGS)
        -Wl,--end-group
        -Wl,-EL
        -lm endif

Set default CPPFLAGS, CFLAGS, CXXFLAGS

These are exported so that components can use them when compiling.

If you need your component to add CFLAGS/etc for it's own source compilation only, set CFLAGS += in your component's Makefile.

If you need your component to add CFLAGS/etc globally for all source

#  files, set CFLAGS += in your component's Makefile.projbuild

If you need to set CFLAGS/CPPFLAGS/CXXFLAGS at project level, set them in application Makefile

#  before including project.mk. Default flags will be added before the ones provided in application Makefile.

CPPFLAGS used by C preprocessor

If any flags are defined in application Makefile, add them at the end.

CPPFLAGS ?=

Enable GNU extensions

CPPFLAGS += -D _GNU_SOURCE ifeq ((CONFIGENABLEACP),1)CPPFLAGS+=DCONFUSERENABLEACPendififeq((CONFIG_ENABLE_CAMERA),1) CPPFLAGS += -DCONF_USER_ENABLE_CAMERA endif ifeq ((CONFIGENABLEPSMRAM),1)CPPFLAGS+=DCONFUSERENABLEPSRAMendifEXTRACPPFLAGS?=CPPFLAGS+=DBLCHIPNAME=\"(BL_CHIP_NAME)" -MMD -MP $(EXTRA_CPPFLAGS) CPPFLAGS += -DARCH_RISCV

Warnings-related flags relevant both for C and C++

COMMON_WARNING_FLAGS = -Wall -Werror=all
        -Wno-error=unused-function
        -Wno-error=unused-but-set-variable
        -Wno-error=unused-variable
        -Wno-error=deprecated-declarations
        -Wextra
        -Wno-unused-parameter -Wno-sign-compare

ifdef CONFIG_WARN_WRITE_STRINGS COMMON_WARNING_FLAGS += -Wwrite-strings endif #CONFIG_WARN_WRITE_STRINGS

ifdef CONFIG_ENABLE_PSM_RAM COMMON_WARNING_FLAGS += -DCONF_USER_ENABLE_PSRAM endif

Flags which control code generation and dependency generation, both for C and C++

-nostdlib

-fno-common

-funwind-tables

COMMON_FLAGS =
        -ffunction-sections -fdata-sections
        -fstrict-volatile-bitfields
        -fcommon \

Add -fshort-enums temporarily for bl702

ifeq ("$(CONFIG_CHIP_NAME)", "BL702") COMMON_FLAGS += -fshort-enums endif

COMMON_FLAGS_M4_EXT :=         
        -ffreestanding
        -fno-strict-aliasing

COMMON_FLAGS += $(COMMON_FLAGS_M4_EXT)

ifdef CONFIG_STACK_CHECK_NORM COMMON_FLAGS += -fstack-protector endif ifdef CONFIG_STACK_CHECK_STRONG COMMON_FLAGS += -fstack-protector-strong endif ifdef CONFIG_STACK_CHECK_ALL COMMON_FLAGS += -fstack-protector-all endif ifeq ((CONFIGENABLEFP),1)COMMONFLAGS+=fnoomitframepointerDCONFENABLEFRAMEPTRendififeq((CONF_ENABLE_FUNC_BACKTRACE),1) PROJ_ELF:=(PROJECTNAME).elfCOMMONFLAGS+=fnoomitframepointerDCONFENABLEFUNCBACKTRACEELF=(PROJ_ELF) -DCONF_BUILD_PATH=(BUILDDIRBASE)/(PROJ_ELF) endif

ifeq ($(CONFIG_ENABLE_STACK_OVERFLOW_CHECK),1) COMMON_FLAGS += -finstrument-functions -DCONF_ENABLE_STACK_OVERFLOW_CHECK endif

ifeq ("$(CONFIG_CHIP_NAME)", "VIRTEX7") OPTIMIZATION_FLAGS = -O2 else ifdef CONFIG_OPTIMIZATION_LEVEL_RELEASE OPTIMIZATION_FLAGS = -Os else OPTIMIZATION_FLAGS = -Os endif

ifdef CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED CPPFLAGS += -DNDEBUG endif

Enable generation of debugging symbols

(we generate even in Release mode, as this has no impact on final binary size.)

DEBUG_FLAGS ?= -gdwarf

List of flags to pass to C compiler

If any flags are defined in application Makefile, add them at the end.

EXTRA_CFLAGS ?=

ifeq ("$(CONFIG_CHIP_NAME)", "VIRTEX7") E21_CPU_CFLAGS := -march=rv32imc -mabi=ilp32

ASMFLAGS := $(E21_CPU_CFLAGS) CFLAGS := $(strip
        -march=rv32imc -mabi=ilp32
        -O2 -Wall -Wchar-subscripts -Wformat -Wuninitialized -Winit-self -Wignored-qualifiers -Wswitch-default -Wunused -Wundef -Werror -Wno-switch-default -Wno-unused -fdata-sections -ffunction-sections -g3
        -fmessage-length=0 -std=gnu99
        -save-temps=obj
        )

CXXFLAGS := $(strip
        -march=rv32imc -mabi=ilp32
        -O2 -Wall -Wchar-subscripts -Wformat -Wuninitialized -Winit-self -Wignored-qualifiers -Wswitch-default -Wunused -Wundef -Werror -Wno-switch-default -Wno-unused -fdata-sections -ffunction-sections -g3
        -fmessage-length=0 -std=gnu99
        -save-temps=obj
        ) else E21_CPU_CFLAGS := -march=rv32imfc
                   -mabi=ilp32f

ASMFLAGS := $(E21_CPU_CFLAGS)

CFLAGS := (strip std=gnu99 (OPTIMIZATION_FLAGS) (DEBUGFLAGS) (COMMON_FLAGS)
        (COMMONWARNINGFLAGS)Wnooldstyledeclaration (CFLAGS)
        (E21CPUCFLAGS) (EXTRA_CFLAGS))
        -save-temps=obj

CXXFLAGS := (strip std=c++11 (OPTIMIZATION_FLAGS) (DEBUGFLAGS) (COMMON_FLAGS)
        (COMMONWARNINGFLAGS) (CXXFLAGS)
        $(E21_CPU_CFLAGS)
        -nostdlib
        -g3
        -fms-extensions
        -ffunction-sections
        -fdata-sections
        -Wall
        -Wchar-subscripts
        -Wformat
        -Winit-self
        -Wignored-qualifiers
        -Wswitch-default
        -Wunused
        -Wundef
        -fno-rtti -fno-exceptions
        -save-temps=obj
        -fno-use-cxa-atexit
        )

endif export CFLAGS CPPFLAGS CXXFLAGS ASMFLAGS

Set default values that were not previously defined

CC ?= gcc LD ?= ld AR ?= ar OBJCOPY ?= objcopy SIZE ?= size STRIP ?= strip

Set host compiler and binutils

HOSTCC := $(CC) HOSTLD := $(LD) HOSTAR := $(AR) HOSTOBJCOPY := $(OBJCOPY) HOSTSIZE := $(SIZE) export HOSTCC HOSTLD HOSTAR HOSTOBJCOPY SIZE

ifndef CONFIG_TOOLPREFIX $(error Please Configure CONFIG_TOOLPREFIX at toolchain.mk) endif

Set target compiler. Defaults to whatever the user has

configured as prefix + ye olde gcc commands

CC := (calldequote,(CONFIG_TOOLPREFIX))gcc CXX := (calldequote,(CONFIG_TOOLPREFIX))g++ LD := (calldequote,(CONFIG_TOOLPREFIX))ld AR := (calldequote,(CONFIG_TOOLPREFIX))ar OBJCOPY := (calldequote,(CONFIG_TOOLPREFIX))objcopy SIZE := (calldequote,(CONFIG_TOOLPREFIX))size STRIP := (calldequote,(CONFIG_TOOLPREFIX))strip export CC CXX LD AR OBJCOPY SIZE

PYTHON=(calldequote,(CONFIG_PYTHON))

the app is the main executable built by the project

APP_ELF:=(BUILDDIRBASE)/(PROJECT_NAME).elf APP_MAP:=(APPELF:.elf=.map)APPBIN:=(APP_ELF:.elf=.bin)

Include any Makefile.projbuild file letting components add

configuration at the project level

define includeProjBuildMakefile $(if (V),$(info including $(1)/Makefile.projbuild...)) COMPONENT_PATH := $(1) include (1)/Makefile.projbuildendef(foreach componentpath,(COMPONENTPATHS), (if $(wildcard $(componentpath)/Makefile.projbuild),
                $(eval (callincludeProjBuildMakefile,(componentpath)))))

ELF depends on the library archive files for COMPONENT_LIBRARIES

the rules to build these are emitted as part of GenerateComponentTarget below

also depends on additional dependencies (linker scripts & binary libraries)

stored in COMPONENT_LINKER_DEPS, built via bouffalo.mk files' COMPONENT_ADD_LINKER_DEPS variable

COMPONENT_LINKER_DEPS ?= $(APP_ELF): (foreachlibcomp,(COMPONENT_LIBRARIES),(BUILDDIRBASE)/(libcomp)/lib$(libcomp).a) $(COMPONENT_LINKER_DEPS) (COMPONENTPROJECTVARS)(summary) LD $(patsubst (PWD)/@) ifeq ((CONFIGZIGBEE),1)(CXX) -o $@ (LDFLAGS)Wl,Map=(APP_MAP) else ifeq ((CONFIGCPPENABLE),1)(CXX) -o $@ (LDFLAGS)Wl,Map=(APP_MAP) else         $(CC) $(LDFLAGS) -o @Wl,Map=(APP_MAP) $(shell find build_out/ -name bugkiller_*.o) endif

all_binaries: $(APP_BIN)

TODO move to bl60x_elftool component

$(APP_BIN): $(APP_ELF)         @echo "Generating BIN File to @"ifeq("(CONFIG_CHIP_NAME)", "VIRTEX7")         $(OBJCOPY) -O ihex $< (@:.bin=.hex)elseifeq((CONFIG_ENABLE_ACP),1)         $(OBJCOPY) -S -O binary -R .rom.cpu1 -R .bugkiller_command -R .bugkiller $< (@:.bin=.cpu0.bin)(OBJCOPY) -S -O binary -j .rom.cpu1 $< $(@:.bin=.cpu1.bin)         cp $(@:.bin=.cpu0.bin) (@:.bin=.acp.bin)ddif=(@:.bin=.cpu1.bin) of=$(@:.bin=.acp.bin) bs=512 seek=2 conv=notrunc         cp $(@:.bin=.acp.bin) @elseifeq((CONFIG_LINK_ROM),1)         $(OBJCOPY) -S -O binary -R .romdata -R .rom -R .bugkiller_command -R .bugkiller $< @(OBJCOPY) -S -O binary -j .rom $< (@:.bin=.rom.bin)(OBJCOPY) -S -O binary -j .romdata $< (@:.bin=.romdata.bin)(OBJCOPY) -S -O binary -R .romdata -R .rom -R .bugkiller_command -R .bugkiller $< (@:.bin=.flash.bin)elseifeq((CONFIG_GEN_ROM),1)         $(OBJCOPY) -S -O binary -R .bleromro -R .bleromrw -R .rtosromro -R .rtosromrw -R .bugkiller_command -R .bugkiller $< @(OBJCOPY) -S -O binary -j .bleromro $< (@:.bin=.bleromro.bin)(OBJCOPY) -S -O binary -j .bleromrw $< (@:.bin=.bleromrw.bin)(OBJCOPY) -S -O binary -j .rtosromro $< (@:.bin=.rtosromro.bin)(OBJCOPY) -S -O binary -j .rtosromrw $< (@:.bin=.rtosromrw.bin)(OBJCOPY) -S -O binary -R .bleromro -R .bleromrw -R .rtosromro -R .rtosromrw -R .bugkiller_command -R .bugkiller $< (@:.bin=.flash.bin)else(OBJCOPY) -S -O binary -R .bugkiller_command -R .bugkiller $< $@ endif

$(BUILD_DIR_BASE):         mkdir -p $(BUILD_DIR_BASE)

Macro for the recursive sub-make for each component

$(1) - component directory

$(2) - component name only

Is recursively expanded by the GenerateComponentTargets macro

define ComponentMake +$(MAKE) -C (BUILDDIRBASE)/(2) -f (BL60XSDKPATH)/makescriptsriscv/componentwrapper.mkCOMPONENTMAKEFILE=(1)/bouffalo.mk COMPONENT_NAME=$(2) endef

Generate top-level component-specific targets for each component

$(1) - path to component dir

$(2) - name of component

define GenerateComponentTargets .PHONY: component-(2)buildcomponent(2)-clean

component-$(2)-build: (callprereqifexplicit,component(2)-clean) | (BUILDDIRBASE)/(2)         (callComponentMake,(1),$(2)) build

component-$(2)-clean: | (BUILDDIRBASE)/(2) (BUILDDIRBASE)/(2)/component_project_vars.mk         (callComponentMake,(1),$(2)) clean

(BUILDDIRBASE)/(2):         @mkdir -p (BUILDDIRBASE)/(2)

tell make it can build any component's library by invoking the -build target

(this target exists for all components even ones which don't build libraries, but it's

only invoked for the targets whose libraries appear in COMPONENT_LIBRARIES and hence the

APP_ELF dependencies.)

(BUILDDIRBASE)/(2)/lib(2).a:component(2)-build         (details)"Target^' responsible for '$@'" # echo which build target built this file

add a target to generate the component_project_vars.mk files that

are used to inject variables into project make pass (see matching

component_project_vars.mk target in component_wrapper.mk).

If any component_project_vars.mk file is out of date, the make

process will call this target to rebuild it and then restart.

(BUILDDIRBASE)/(2)/component_project_vars.mk: $(1)/bouffalo.mk $(COMMON_MAKEFILES) $(SDKCONFIG_MAKEFILE) | (BUILDDIRBASE)/(2)         (callComponentMake,(1),$(2)) component_project_vars.mk endef

define GenerateComponentNameTargets (1)![](/img/bbsdiy/aiwb2/8a4b886c60b5256f.gif)(BUILDDIRBASE)/(1)/lib(1).a(details) "Target '$$^' responsible for '$$@'" endef

(foreachcomponent,(COMPONENT_PATHS),$(eval (callGenerateComponentTargets,(component),$(notdir (component)))))(foreach component,(COMPONENTPATHS),(eval (callGenerateComponentNameTargets,(notdir $(component)))))

app-clean: (addprefixcomponent,(addsuffix -clean,$(notdir (COMPONENTPATHS))))(summary) RM $(APP_ELF)         rm -f $(APP_ELF) $(APP_BIN) $(APP_MAP)

#flash: all #        cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=(APPBIN)./bflbiottoolchipname=BL602baudrate=2000000port=/dev/ttyS13pt=(PROJECT_PATH)/img_conf/partition_cfg_4M.toml --dts=(PROJECTPATH)/imgconf/blfactoryparamsIoTKitA40M.dtsfirmware=(APP_BIN)

#burn code to bl602 board, now only support BL602 IOT-DVK-3s platform, if you want to support older bl602 board you need change parameter port to /dev/ttyUSB0 flash: all         cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=$(APP_BIN) (FLASHTOOLTYPE)chipname=BL602baudrate=(SERIAL_BAUDRATE) --port=(SERIALPORT)pt=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/partition/partition_cfg_4M.toml --dts=(BL60XSDKPATH)/tools/flashtool/chips/bl602/devicetree/04blfactoryparamsIoTKitA40M20220625.dtsboot2=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/builtin_imgs/boot2_isp_bl602_v6.5.1/boot2_iap_release.bin --firmware=$(APP_BIN) #cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=(APPBIN)./bflbiottoolchipname=BL602baudrate=(SERIAL_BAUDRATE) --port=(SERIALPORT)pt=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/partition/partition_cfg_4M.toml --dts=(BL60XSDKPATH)/tools/flashtool/chips/bl602/devicetree/blfactoryparamsIoTKitA40M.dtsfirmware=(APP_BIN) flash-only:         cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=$(APP_BIN) (FLASHTOOLTYPE)chipname=BL602baudrate=(SERIAL_BAUDRATE) --port=(SERIALPORT)pt=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/partition/partition_cfg_4M.toml --dts=(BL60XSDKPATH)/tools/flashtool/chips/bl602/devicetree/04blfactoryparamsIoTKitA40M20220625.dtsboot2=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/builtin_imgs/boot2_isp_bl602_v6.5.1/boot2_iap_release.bin --firmware=$(APP_BIN) flash-build:         cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=$(APP_BIN) (FLASHTOOLTYPE)chipname=BL602pt=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/partition/partition_cfg_4M.toml --dts=(BL60XSDKPATH)/tools/flashtool/chips/bl602/devicetree/04blfactoryparamsIoTKitA40M20220625.dtsboot2=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/builtin_imgs/boot2_isp_bl602_v6.5.1/boot2_iap_release.bin --firmware=$(APP_BIN) --build eflash:         cd (BL60X_SDK_PATH)/tools/flash_tool/blflash_tools && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=$(APP_BIN) (FLASHTOOLTYPE)chipname=BL602baudrate=(SERIAL_BAUDRATE) --port=(SERIALPORT)pt=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/partition/partition_cfg_4M.toml --dts=(BL60XSDKPATH)/tools/flashtool/chips/bl602/devicetree/04blfactoryparamsIoTKitA40M20220625.dtsboot2=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/builtin_imgs/boot2_isp_bl602_v6.5.1/boot2_iap_release.bin --firmware=$(APP_BIN)

clean: app-clean

erase_flash:         cd (BL60X_SDK_PATH)/tools/flash_tool && env SDK_APP_BIN=(APP_BIN) SDK_BOARD=(PROJECTBOARD)SDKNAME=(PROJECT_NAME) SDK_MEDIA_BIN=(APPMEDIABIN)SDKROMFSDIR=(APP_ROMFS_DIR) SDK_DTS=(PROJECTDTS)SDKXTAL=(PROJECT_BOARD_XTAL) BL_FLASH_TOOL_INPUT_PATH_cfg2_bin_input=$(APP_BIN) (FLASHTOOLTYPE)chipname=BL602baudrate=(SERIAL_BAUDRATE) --port=(SERIALPORT)firmware=(BL60X_SDK_PATH)/tools/flash_tool/chips/bl602/eflash_loader/eflash_loader_40m.bin --erase

PHONY target to list components in the build and their paths

list-components:         $(info (calldequote,(SEPARATOR)))         (infoCOMPONENTDIRS(componentssearchedforhere))(foreach cd,(COMPONENTDIRS),(info (cd)))(info (calldequote,(SEPARATOR)))         (infoCOMPONENTS(listofcomponentnames))(info (COMPONENTS))(info (calldequote,(SEPARATOR)))         (infoEXCLUDECOMPONENTS(listofexcludednames))(info $(if (EXCLUDECOMPONENTS),(EXCLUDE_COMPONENTS),(none provided)))         $(info (calldequote,(SEPARATOR)))         (infoCOMPONENTPATHS(pathstoallcomponents)![](/img/bbsdiy/aiwb2/547e559ee01cedfc.gif)(foreach cp,(COMPONENTPATHS),(info $(cp)))

local-ci-test:         ../../tools/ci/scripts/local-ci-test.sh

Finally, the OTA files are generated in the ota directory: [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin.xz is the OTA file needed [color=rgba(0, 0, 0, 0.75)]Six types of OTA firmware are generated in the tools/flash_tool/chips/bl602/ota directory: [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin: appends a 4K-byte Boot2 Head to the beginning of the compiled bin [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin.hash: appends the computed 32-byte Hash value (sha256) to the end of FW_OTA.bin [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin.ota: appends a 512-byte OTA Head to the beginning of FW_OTA.bin [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin.xz: FW_OTA.bin compressed with xz [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin.xz.hash: appends the computed 32-byte Hash value (sha256) to the end of FW_OTA.bin.xz [color=rgba(0, 0, 0, 0.75)]FW_OTA.bin.xz.ota: appends a 512-byte OTA Hea to the beginning of FW_OTA.bin.xz

Set Up an HTTP Server During an OTA upgrade, the firmware downloads the OTA firmware from an HTTP server to upgrade itself, so you first need to set up an HTTP server on your machine for the module to download the firmware from.

Setting up an HTTP server is very simple: just install Python 3, then run the following command under tools/flash_tool/chips/bl602/ota: python3 -m http.server 9090

For the first time, flash it once via UART to burn in the partition table and Boot2. Flash the firmware: make flash

Check the host IP address.

With the AI-WB2 next to the router, a single command in the serial port software does the trick

ota_http_cmd 192.168.88.115 ota host=192.168.88.115 [HTTPC] hdr_len is 204, content_len is 384976 [MTD] >>>>>> Hanlde info Dump >>>>>>       name FW       id 0       offset 0x000e8000(950272)       size 0x00088000(544Kbytes)       xip_addr 0x00000000 [MTD] <<<<<< Hanlde info End <<<<<< otaTotalLength : 384976, bin_size : 557056 [HTTPC] Received 688 Bytes otaoffset : 688 [OTA] [HEADER] ota header is BL60X_OTA_Ver1.0 [OTA] [HEADER] file type is XZ   [OTA] [HEADER] file length (exclude ota header) is 384464 [OTA] [HEADER] ver_hardware is BFL_Module_v1.1 [OTA] [HEADER] ver_software is EVENT_V1.1.1 [OTA] [HEADER] sha256 is C306AFD98DDBBC7C10C849E30791AA323BBF9E4501840BF3535233F73B3A30DC [HTTPC] Received 688 Bytes otaoffset : 864 Write 864[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 1552[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 2240[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 2928[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 3616[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 4304[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 4992[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 5680[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 6368[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 7056[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 7744[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 8432[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 9120[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 9808[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 10496[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 11184[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 11872[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 12560[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 13248[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 13936[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 14624[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 15312[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 16000[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 16688[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 17376[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 18064[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 18752[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 19440[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 20128[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 20816[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 21504[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 22192[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 22880[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 23568[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 24256[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 24944[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 25632[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 26320[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 27008[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 27696[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 28384[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 29072[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 29760[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 30448[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 31136[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 31824[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 32512[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 33200[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 33888[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 34576[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 35264[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 35952[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 36640[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 37328[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 38016[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 38704[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 39392[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 40080[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 40768[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 41456[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 42144[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 42832[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 43520[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 44208[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 44896[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 45584[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 46272[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 46960[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 47648[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 48336[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 49024[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 49712[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 50400[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 51088[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 51776[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 52464[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 53152[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 53840[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 54528[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 55216[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 55904[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 56592[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 57280[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 57968[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 58656[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 59344[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 60032[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 60720[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 61408[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 62096[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 62784[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 63472[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 64160[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 64848[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 65536[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 66224[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 66912[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 67600[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 68288[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 68976[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 69664[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 70352[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 71040[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 71728[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 72416[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 73104[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 73792[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 74480[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 75168[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 75856[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 76544[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 77232[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 77920[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 78608[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 79296[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 79984[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 80672[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 81360[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 82048[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 82736[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 83424[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 84112[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 84800[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 85488[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 86176[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 86864[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 87552[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 88240[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 88928[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 89616[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 90304[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 90992[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 91680[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 92368[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 93056[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 93744[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 94432[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 95120[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 95808[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 96496[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 97184[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 97872[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 98560[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 99248[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 99936[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 100624[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 101312[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 102000[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 102688[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 103376[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 104064[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 104752[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 105440[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 106128[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 106816[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 107504[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 108192[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 108880[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 109568[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 110256[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 110944[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 111632[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 112320[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 113008[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 113696[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 114384[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 115072[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 115760[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 116448[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 117136[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 117824[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 118512[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 119200[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 119888[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 120576[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 121264[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 121952[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 122640[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 123328[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 124016[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 124704[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 125392[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 126080[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 126768[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 127456[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 128144[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 128832[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 129520[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 130208[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 130896[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 131584[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 132272[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 132960[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 133648[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 134336[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 135024[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 135712[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 136400[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 137088[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 137776[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 138464[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 139152[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 139840[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 140528[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 141216[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 141904[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 142592[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 143968[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 144656[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 145344[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 146032[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 146720[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 147408[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 148096[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 148784[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 149472[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 150160[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 150848[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 151536[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 152224[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 152912[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 153600[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 154288[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 154976[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 156352[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 157040[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 157728[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 158416[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 159104[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 159792[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 160480[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 161168[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 161856[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 162544[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 163232[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 163920[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 164608[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 165296[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 165984[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 166672[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 167360[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 168048[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 168736[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 169424[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 170112[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 170800[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 171488[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 172176[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 172864[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 173552[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 174240[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 174928[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 175616[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 176304[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 176992[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 177680[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 178368[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 179056[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 179744[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 181120[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 181808[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 182496[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 183184[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 183872[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 184560[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 185248[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 185936[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 186624[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 187312[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 188000[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 188688[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 189376[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 190064[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 190752[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 191440[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 192128[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 192816[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 193504[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 194192[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 194880[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 195568[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 196256[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 196944[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 197632[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 198320[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 199008[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 199696[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 200384[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 201072[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 201760[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 202448[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 203136[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 203824[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 204512[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 205200[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 205888[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 206576[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 207264[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 207952[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 208640[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 209328[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 210704[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 211392[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 212080[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 212768[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 213456[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 214144[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 215520[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 216208[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 216896[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 217584[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 218272[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 218960[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 220336[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 221024[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 221712[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 222400[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 223088[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 223776[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 224464[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 225152[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 225840[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 226528[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 227216[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 227904[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 228592[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 229280[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 229968[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 231344[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 232032[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 232720[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 233408[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 234096[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 235472[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 236160[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 236848[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 237536[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 238224[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 238912[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 239600[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 240288[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 240976[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 241664[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 242352[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 243040[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 243728[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 244416[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 245104[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 245792[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 246480[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 247168[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 247856[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 248544[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 249232[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 249920[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 250608[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 251296[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 251984[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 252672[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 253360[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 254048[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 254736[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 255424[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 256112[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 256800[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 257488[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 258176[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 258864[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 259552[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 260240[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 260928[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 261616[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 262304[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 262992[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 263680[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 264368[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 265056[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 265744[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 266432[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 267120[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 267808[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 268496[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 269184[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 269872[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 270560[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 271248[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 271936[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 272624[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 273312[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 274000[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 274688[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 275376[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 276064[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 276752[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 277440[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 278128[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 278816[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 279504[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 280192[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 280880[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 281568[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 282256[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 282944[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 283632[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 284320[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 285008[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 286384[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 287072[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 287760[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 288448[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 289824[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 290512[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 291200[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 291888[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 292576[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 293264[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 293952[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 294640[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 295328[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 296016[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 296704[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 297392[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 298080[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 298768[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 299456[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 300144[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 300832[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 301520[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 302208[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 302896[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 303584[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 304272[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 304960[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 305648[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 306336[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 307024[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 307712[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 308400[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 309088[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 309776[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 310464[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 311152[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 311840[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 312528[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 313216[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 313904[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 314592[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 315280[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 315968[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 316656[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 317344[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 318032[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 318720[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 319408[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 320096[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 320784[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 321472[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 322160[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 322848[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 323536[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 324224[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 325600[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 326288[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 326976[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 327664[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 328352[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 329040[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 330416[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 331104[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 331792[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 332480[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 333168[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 333856[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 334544[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 335232[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 335920[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 336608[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 337984[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 338672[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 339360[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 340048[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 340736[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 341424[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 342112[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 342800[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 343488[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 344176[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 344864[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 345552[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 346240[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 346928[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 347616[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 348304[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 348992[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 349680[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 350368[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 351056[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 351744[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 352432[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 353120[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 353808[384976] [HTTPC] Received 1376 Bytes otaoffset : 1376 Write 355184[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 355872[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 356560[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 357248[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 357936[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 358624[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 359312[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 360000[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 360688[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 361376[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 362064[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 362752[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 363440[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 364128[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 364816[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 365504[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 366192[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 366880[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 367568[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 368256[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 368944[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 369632[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 370320[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 371008[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 371696[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 372384[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 373072[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 373760[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 374448[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 375136[384976] proc_hellow_entry: RISC-V rv32imafc [HTTPC] Received 688 Bytes otaoffset : 688 Write 375824[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 376512[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 377200[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 377888[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 378576[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 379264[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 379952[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 380640[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 381328[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 382016[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 382704[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 383392[384976] [HTTPC] Received 688 Bytes otaoffset : 688 Write 384080[384976] [HTTPC] Received 384 Bytes otaoffset : 384 Write 384464[384976]

Calculated SHA256 Checksum:C306AFD98DDBBC7C10C849E30791AA323BBF9E4501840BF3535233F73B3A30DC Header SET SHA256 Checksum:C306AFD98DDBBC7C10C849E30791AA323BBF9E4501840BF3535233F73B3A30DC [OTA] [TCP] prepare OTA partition info [OTA] [TCP] Update PARTIION, partition len is 384464

Uploaded attachments:

demo_ota ok.rar(104.27 KB, 15 downloads)

Refer to the official Bouffalo Lab documentation — the official docs contain some errors Over-the-Air Upgrade (OTA)

OTA 升级机制可以让设备在固件正常运行时根据接收数据(如通过 Wi-Fi )进行自我更新。

目前 OTA 采用A/B区pingpong设计,OTA文件有两种类型,压缩和非压缩,其中压缩算法采用xz压缩算法,压缩率约为50%-60%。OTA之前需要check一下分区表的 FW 分区的size0和size1是否满足OTA需求。

It is not an A/B-zone pingpong design.

[pt_table] #partition table is 4K in size address0 = 0xE000 address1 = 0xF000

[[pt_entry]]

Click to expand full code
c
type = 0
name = "FW"
device = 0
address0 = 0x10000
size0 = 0x100000
address1 = 0x110000
size1 = 0x100000

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 0
name = "spiffs"
device = 0
address0 = 0x210000
size0 = 0x28000
address1 = 0x238000
size1 = 0x8000

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 2
name = "mfg"
device = 0
address0 = 0x240000
size0 = 0x32000
address1 = 0
size1 = 0

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 3
name = "media"
device = 0
address0 = 0x272000
size0 = 0x1000
address1 = 0
size1 = 0

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 4
name = "![](/img/bbsdiy/ai_wb2/71f7e0c1f8b22060.gif)SM"
device = 0
address0 = 0x273000
size0 = 0x33000
address1 = 0
size1 = 0

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 5
name = "KEY"
device = 0
address0 = 0x2A6000
size0 = 0x2000
address1 = 0
size1 = 0

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 6
name = "DATA"
device = 0
address0 = 0x2A8000
size0 = 0x5000
address1 = 0
size1 = 0

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 7
name = "factory"
device = 0
address0 = 0x2AD000
size0 = 0x7000
address1 = 0
size1 = 0

compressed image must set len,normal image can left it to 0

len = 0

#if user want to put RF calibration data on flash, uncomment following pt entry #[[pt_entry]] #type = 8 #name = "rf_para" #device = 0 #address0 = 0x1FF000 #size0 = 0x1000 #address1 = 0 #size1 = 0

compressed image must set len,normal image can left it to 0

#len = 0

[[pt_entry]]

Click to expand full code
c
type = 0
name = "spiffs"
device = 0
address0 = 0x210000  ##给spiffs文件系统用,开始地址
size0 = 0x28000         ##给spiffs文件系统用,大小
address1 = 0x238000  ##给easyflash文件系统用,开始地址
size1 = 0x8000           ##给easyflash文件系统用,大小

compressed image must set len,normal image can left it to 0

len = 0

[[pt_entry]]

Click to expand full code
c
type = 0
name = "FW"
device = 0
address0 = 0x10000
size0 = 0x100000
address1 = 0x110000
size1 = 0x100000

compressed image must set len,normal image can left it to 0

len = 0 It is downloaded into the address1 = 0x110000 address space; after a reboot, it is decompressed and copied to address0 = 0x10000.

Released under the MIT License. Build Time 2026-09-11 14:52:23