system debugging
Armino platform BK7258 system debugging commands
The log of BK7258 CPU0 is output through the serial port DL_UART0 (default baud rate is 115200)
BK7258 CPU1 log is forwarded to CPU0 serial port DL_UART0 output through mailbox (default baud rate is 115200)
The log of BK7258 CPU2 is output through the serial port UART2 (default baud rate is 115200)
By macro CONFIG_SYS_PRINT_DEV_MAILBOX=n,CONFIG_SYS_PRINT_DEV_UART=y,CONFIG_UART_PRINT_PORT=0 you can change the output mode of the log of CPU1 (the above setting is that the log of CPU1 is output through UART0) note CPU0 is the main core, and there is no MailBox channel between CPU0 and CPU2, so only CPU1 is supported
CPU1 log has cpu1 label (except exception log)
Due to memory buffer limitations, the number of bytes of each log data must be less than 128 bytes. Logs exceeding this size will be discarded by the shell module and a message !!some LOGs discarded!! will be output. If there are too many logs and there is no time to output them, causing log accumulation and the buffer is used up, this prompt string will also be output.
Enter the log command through the serial port to view the current log configuration
Enter the help command through the serial port to view the currently supported debugging commands:
# #log log: echo 1, level 3, sync 0. # #help ====Build-in Commands==== help log: log [echo(0,1)] [level(0~5)] [sync(0,1)] [Whitelist(0,1)] debug: debug cmd [param] (ex:debug help) cpu1: cpu1 cmd (ex:cpu1 help) loginfo: log statistics. modlog: modlog tag_name on/off ====User Commands==== 2bd_master_test: 2bd_master_test {start|stop} 2bd_slave_test: 2bd_slave_test {start|stop} AT: AT AT+ATVERSION: AT+ATVERSION AT+BLE: AT+TYPE_CMD=CMD_name,param1,...,paramn AT+MAC: mac <mac>, get/set mac. e.g. mac c89346000001 AT+RST: AT+RST AT+VERSION: AT+VERSION AT+WIFI: AT+TYPE_CMD=CMD_name,param1,...,paramn, refer to the at guide. aon_rtc_auto_test: {id} {start|stop} aon_rtc_clock_src: aon_rtc_clock_src {26m|rosc} aon_rtc_driver: aon_rtc_driver {init|deinit} aon_rtc_dump: {id} aon_rtc_get_time: aon_rtc_get_time {id} aon_rtc_register: aon_rtc_register {id} {name} {period_tick} {period_cnt}, {callback} aon_rtc_rosc_cal: aon_rtc_rosc_cal interval aon_rtc_rosc_test: aon_rtc_rosc_test aon_rtc_time_of_day: aon_rtc_time_of_day {get|set} {sec|usec} aon_rtc_unregister: aon_rtc_unregister {id} {name} ap: ap ssid [password] [channel[1:14]] assert: asset and dump system information aud_adc_dma_test: aud_adc_dma_test {start|stop sample_rate} aud_adc_loop_test: aud_adc_loop_test {start|stop sample_rate} aud_adc_mcp_test: aud_adc_mcp_test {start|stop sample_rate} aud_dac_dma_test: aud_dac_dma_test {start|stop 8000|16000|44100|48000} aud_dac_eq_test: aud_dac_eq_test {start|stop} aud_dac_mcp_test: aud_dac_mcp_test {8000|16000|44100|48000} aud_dmic_dma_test: aud_adc_dma_test {start|stop sample_rate} aud_dmic_loop_test: aud_adc_loop_test {start|stop sample_rate} aud_dmic_mcp_test: aud_adc_mcp_test {start|stop sample_rate} aud_dtmf_loop_test: aud_dtmf_loop_test {start|stop} aud_dtmf_mcp_test: aud_dtmf_mcp_test {start|stop} backtrace: show task backtrace bcn_loss_intv: bcn_loss_intv interval repeat_num} blacklist: Set ssid blacklist ble: ble arg1 arg2 bootcore: bootcore [core id] [mode: 1:start,0:stop] cali: cali auto_test capa: wifi capability config cca: cca open\close\show channel: channel {1~13} - set monitor channel ckmn: ckmn ckeck32k {32|other} ckmn_driver: ckmn_driver {init|deinit} ckmn_show_reg: ckmn show_reg ckmnautosw: ckmnautosw {26m|32k} ckmncorr: ckmncorr {26m|32k} {0|1|2|3} cpuload: show task cpu load cputest: cputest [count] dhcpc: dhcpc dma: dma {id} {init|deinit|start|stop|set_tran_len|get_remain_len} dma_chnl: dma_chnl alloc dma_chnl_free: dma_chnl_free {id} dma_chnl_test: {start|stop} {uart1|uart2|uart3} {wait_ms} dma_config: dma_config {mode|priority|pasue|src|dst}{mode value/priority value/dev,width,increase_en,loop_en,start_addr,end_addr}\0dma_copy: copy {src} {dst} {len} dma_driver: dma_driver {init|deinit} dma_int: dma_int {id} {reg|enable_hf_fini|disable_hf_fini|enable_fini|disable_fini|pause} dma_memcopy_test: copy {count|in_number1|in_number2|out_number1|out_number2} dtm_master_test: dtm_master_test {start|stop} dtm_slave_test: dtm_slave_test {start|stop} dvfs: dvfs [cksel_core] [ckdiv_core] [ckdiv_bus] [ckdiv_cpu0] [ckdiv_cpu1] dvfs_auto_test: dvfs_auto_test [period] efuse: efuse [-r addr] [-w addr data] efuse_driver: efuse_driver {init|deinit} efuse_test: efuse_test {write|read} efusemac: efusemac [-r] [-w] [mac] event: event {reg|unreg|post} {mod_id} {event_id} exception: {undefine|dabort|illegal|irq|fiq} fatfs_idle_test: fatfs_idle_test {start|stop|clean} fatfstest: fatfstest <cmd> filter: filter <bits> - bit0/d, 1/preq, 2/prsp, 3/b, 4/a flash: flash {erase|read|write} [start_addr] [len] flash_erase_test: cli_flash_erase_test with ble connecting flash_partition: flash_partition {show} flash_test: flash_test <cmd(R/W/E/N)> fmap_test: flash_test memory map get: get wifi status gpio: gpio [set_mode/output_low/output_high/input/spi_mode] [id] [mode] gpio_driver: gpio_driver [init/deinit]} gpio_int: gpio_int [index] [inttype/start/stop] [low/high_level/rising/falling edge] gpio_kpsta: gpio_kpsta [register/unregister][index][io_mode][pull_mode][func_mode] gpio_low_power: gpio_low_power [simulate][param] gpio_map: gpio_map [sdio_map/spi_map] gpio_wake: gpio_wake [index][low/high_level/rising/falling edge][enable/disable wakeup] http_ota: http_ota url httplog: httplog [1|0]. i2c: i2c {init|write|read} i2c_driver: i2c_driver {init|deinit} i2s_master_test: i2s_master_test {start|stop} i2s_slave_test: i2s_slave_test {start|stop} id int: retarget {int_group0} {int_group1} ip: ip [sta|ap][{ip}{mask}{gate}{dns}] ipconfig: ipconfig [sta|ap][{ip}{mask}{gate}{dns}] ipdbg: ipdbg [function][value] iperf: iperf help iplog: iplog [modle][type] la: la rf_adc_40M/rf_adc[_80M]/fe_adc/rf_dac/fe_dac lwip_mem: print lwip memory information lwip_pbuf: print lwip pbuf information lwip_stats: print lwip protocal statistics mac: mac <mac>, get/set mac. e.g. mac c89346000001 mem_apply: mem_apply [module][value] memdump: <addr> <length> memleak: [show memleak memset: <addr> <value 1> [<value 2> ... <value n>] memshow: show free heap memstack: show stack memory usage memtest: <addr> <length> memtest_r: <src> <dest> <size> memtest_wr: <addr> <count> memtime: <addr> <count> <0:write,1:read> micodebug: micodebug on/off monitor: monitor {1~13|15|99} mpucfg: <rnr> <rbar> <rlar> mpuclr: <rnr> mpudump: dump mpu config mqttali: ali mqtt test mqttsend: mqttsend [topic] [msg] net: net {sta/ap} ... - wifi net config osinfo: show os runtime information otp_test: otp_test {read} pcm_master_test: pcm_master_test {start|stop} pcm_slave_test: pcm_slave_test {start|stop} per_packet_info: per_packet_info [per_packet_info_output_bitmap(base 16)] ping: ping <ip> pkt_dbg: packet debug config pm: pm [sleep_mode] [wake_source] [vote1] [vote2] [vote3] [param1] [param2] [param3] pm_ana: pm_ana [1/0] pm_auto_vote: pm_auto_vote [auto_vote_value] pm_boot_cp1: pm_boot_cp1 [module_name] [ctrl_state:0x0:bootup; 0x1:shutdowm] pm_boot_cp2: pm_boot_cp2 [module_name] [ctrl_state:0x0:bootup; 0x1:shutdowm] pm_clk: pm_clk [module_name][clk_state] pm_cp1_ctrl: pm_cp1_ctrl [cp1_auto_pw_ctrl] pm_ctrl: pm_ctrl [ctrl_value] pm_debug: pm_debug [debug_en_value] pm_freq: pm_freq [module_name][ frequency] pm_gpio: pm_gpio [1/0] pm_ldo: pm_ldo[module_name][gpio id][gpio_output_state:0x0->low voltage, 0x1->high voltage] pm_lpo: pm_lpo [lpo_type] pm_power: pm_power [module_name][ power state] pm_psram: pm_psram[module_name][ctrl_state:0x0:power&clk on; 0x1:power&clk off] pm_pwr_state: pm_pwr_state [pwr_state] pm_rosc: pm_rosc [rosc_accuracy_count_interval] pm_rosc_cali: pm_rosc_cali [cali_mode][cal_intval] pm_rosc_pin: pm_rosc_pin [lpo_clk:0:ana;1:dig] pm_rosc_ppm: pm_rosc_ppm [interval] [count] pm_vcore: pm_vcore [value] pm_vol: pm_vol [vol_value] pm_vote: pm_vote [pm_sleep_mode] [pm_vote] [pm_vote_value] [pm_sleep_time] pm_wakeup_source: pm_wakeup_source [pm_sleep_mode] ps: ps enable and debug info config psram_cache: psram_cache <addr> <size> psram_free: psram_free <addr> psram_malloc: psram_malloc <length> psram_state: psram_state psram_task_create: create task on psram psram_task_delete: delete task on psram psram_test: start|stop psram_test_ext: init|byte|word|rewirte|deinit puf: puf {version|enrollment|read_uid} qspi: qspi {init|write|read} qspi_driver: qspi_driver {init|deinit} qspi_flash: qspi_flash {write|read} rc: wifi rate control config reboot: reboot system regdump: regdump {module} regshow: regshow -w/r addr [value] rfcali_cfg_mode: 1:manual, 0:auto rfcali_cfg_rate_dist: b g n40 ble (0-31) rfcali_cfg_tssi_b: 0-255 rfcali_cfg_tssi_g: 0-255 rfcali_show_data: rfconfig: rfconfig bt_polar|bt_btpll|bt_wifipll|wifi_btpll|wifi_wifipll rxsens: rxsens [-m] [-d] [-c] [-l] scan: scan [ssid] sd_card: sd_card {init|deinit|read|write|erase|cmp|} sdio: sdio {init|deinit|send_cmd|config_data} sdio_host_driver: sdio_host_driver {init|deinit} sdmadc: sdmadc_test sdtest: sdtest <cmd> set_interval: set listen interval} setclock: set clock freq, 0: PM_LPO_SRC_DIVD, 1: PM_LPO_SRC_X32K setcpufreq: setcpufreq [ckdiv_core] [ckdiv_bus] [ckdiv_cpu0] [ckdiv_cpu1] setjtagmode: set jtag mode {cpu0|cpu1|cpu2} {group1|group2} setprintport: set log/shell uart port 0/1/2 spi: spi {init|write|read} spi_config: spi_config {id} {mode|baud_rate} [...] spi_data_test: spi_data_test {id} {master|slave} {baud_rate|send}[...] spi_driver: spi_driver {init|deinit} spi_flash: spi_flash {id} {readid|read|write|erase} {addr} {len}[...] spi_int: spi_int {id} {reg} {tx|rx} sta: sta ssid [password][bssid][channel] stackguard: stackguard <override_len> start_hidden_softap: start_hidden_softap ssid [password] [channel[1:14]] starttype: show start reason type state: state - show STA/AP state stop: stop {sta|ap} tasklist: list tasks tempd: tempd [init|deinit|stop|start|update] time: system time timer: timer {chan} {start|stop|read} [...] touch_multi_channel_cyclic_calib_test: touch_multi_channel_cyclic_calib_test {start|stop} {0|1|2|3} touch_multi_channel_scan_mode_test: touch_multi_channel_scan_mode_test {start|stop} {0|1|2|3} touch_single_channel_calib_mode_test: touch_single_channel_calib_mode_test {0|1|...|15} {0|1|2|3} touch_single_channel_manul_mode_test: touch_single_channel_manul_mode_test {0|1|...|15} {calibration_value} touch_single_channel_multi_calib_test: touch_single_channel_multi_calib_test {0|1|...|15} {0|1|2|3} trace: test trace information trng: trng {start|stop|get} trng_driver: {init|deinit} txevm: txevm [-m] [-c] [-l] [-r] [-w] uart: uart {id} {init|deinit|write|read|write_string|dump_statis} [...] uart_config: uart_config {id} {baud_rate|data_bits} [...] uart_driver: {init|deinit} uart_int: uart_int {id} {enable|disable|reg} {tx|rx} version wdt: wdt {start|stop|feed} [...] wdt_driver: {init|deinit} $wifi_diag: Wi-Fi HW diagnostics config
You can manually start cpu1 through the bootcore 1 1 command:
#bootcore 1 1 (102144):reset_cpu1_core at: 021b0000, start=1 (102152):cpu0 receive the cpu1 boot success event [1] cli:I(102152):boot_cpu_core end. $wakeup
cpu2 can be started manually through the bootcore 2 1 command
You can enter the debugging command of cpu1 through the command format of cpu1 help:
#cpu1 version $cpu1:cli:I(18046):get_version cpu1:cli:I(18046):firmware version : Jan 10 2024 17:18:44 cpu1:cli:I(18046):chip id: 72360101 cpu1:cli:I(18046):soc: bk7258_cp1 #
Armino platform BK7258 system jtag debugging
JLink environment integrates JLink gdb server + gdb tool through Eclipse
Jlink and BK7258 connection:
1# VTref ---- VREF 7# SWDIO ---- SWDIO 9# SWCLK ---- SWCLK 20# GND ---- GNDJLink software version https://www.segger.com/downloads/jlink/JLink_Windows_V768_x86_64.exe
Arm toolchain version https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.exe
Eclipse version eclipse-embedcpp-2020-12-R-win32-x86_64.zip
Eclipse project configuration
![]()
![]()
![]()
The default jtag is connected to cpu0, and BK7258 has two Jtag ports (grou1/group2)
You can set jtag connection cpu0 through the setjtagmode cpu0 group1 command
You can set jtag to connect cpu1 through setjtagmode cpu1 group1
You can view the current jtag status through the jtagmode command
Armino platform BK7258 abnormal dump one-click recovery on-site tool
Please refer to the usage documentation in the publishing tool: https://dl.bekencorp.com/tools/Debug_tool/BK7258-debug.zip
BK7258 dump tool FAQ:
The dump function of Release version is turned off by default and can be turned on through CONFIG_DUMP_ENABLE configuration
BK7258 has CPU0、CPU1 and CPU2, and the dump function can be turned on by modifying the config files of the three CPUs.
The principle of the Dump tool to restore the scene is that the script analyzes the log, parses out the contents of regs, itcm, dtcm, and sram, and then restores these contents to the qemu virtual machine through gdb
Log file suffix supports txt, log, DAT
Log file encoding currently only supports utf-8, other encoding formats can be manually converted to utf-8 encoding format through notepad++
If there are multiple Logs in the tool directory, or there are multiple Dumps in the Log, the tool will analyze the last Dump. You need to ensure that there is only one Log in the tool directory, and there is only one dump in the Log.
The Dump tool can automatically remove regular timestamps in the log: [2024-02-03 14:35:13.375193]. If you encounter irregular timestamps, you need to remove them manually.
If two exceptions occur during the dump process, a common example is when detecting memory out of bounds and encountering Assert, the register will be printed one more time. The second register printing needs to be deleted during parsing.
BK7258 Any CPU Dump will dump all the registers of the current CPU, itcm, dtcm, and 640k sram.
By default, the Log and Dump of BK7258 cpu0 are output through UART0
By default, the Log and Dump of cpu1 are sent to cpu0 through MAILBOX and then output through UART0
By default cpu2’s Log and Dump are output through UART2
If you encounter two CPUs dumping at the same time during the Dump process, you need to split the Log into two dump files, and use the elf of cpu0 and cpu1 to restore the scene.
Each CPU needs the registers of the current CPU, itcm, dtcm, sram plus elf to restore the scene
Register format:
CPU1 Current regs: =========> CPU1 indicates that the current register is the register where cpu1 has an exception. 0 r0 x 0x0 1 r1 x 0x28061ca0 2 r2 x 0x0 3 r3 x 0x8061ca0 4 r4 x 0x28061d74 5 r5 x 0x28061d70 6 r6 x 0x28085a90 7 r7 x 0x28061de4 8 r8 x 0x8080808 9 r9 x 0x9090909 10 r10 x 0x10101010 11 r11 x 0x11111111 12 r12 x 0x1 14 sp x 0x20000928 15lr x 0x21ec909 16 pc x 0x21ec8fa 17 xpsr x 0x61000000 18 msp x 0x2808ff48 19 psp x 0x20000908 20 primask x 0x0 21baseprix0x0 22 faultmask x 0x0 23fpscrx0x0 30 CPU1 xPSR x 0x4 31LR x 0xffffffffd 32 control x 0xc 40 MMFAR x 0x8061ca0 41 BFAR x 0x8061ca0 42CFSR x 0x82 43 HFSR x 0x0 MemFault =========> The initial exception reason is memory access exceptiondtcm format:
>>>>stack mem dump begin, stack_top=20000000, stack end=20004000 <<<<stack mem dump end. stack_top=20000000, stack end=20004000itcm format:
>>>>stack mem dump begin, stack_top=00000020, stack end=00004000 <<<<stack mem dump end. stack_top=00000020, stack end=00004000sram format:
>>>>stack mem dump begin, stack_top=28040000, stack end=28060000 <<<<stack mem dump end. stack_top=28040000, stack end=28060000 >>>>stack mem dump begin, stack_top=28060000, stack end=280a0000 <<<<stack mem dump end. stack_top=28060000, stack end=280a0000 >>>>stack mem dump begin, stack_top=28000000, stack end=28010000 <<<<stack mem dump end. stack_top=28000000, stack end=28010000 >>>>stack mem dump begin, stack_top=28010000, stack end=28020000 <<<<stack mem dump end. stack_top=28010000, stack end=28020000 >>>>stack mem dump begin, stack_top=28020000, stack end=28040000 <<<<stack mem dump end. stack_top=28020000, stack end=28040000When the system turns on CONFIG_MEM_DEBUG, the Dump process will print out all the Heap memory currently used by the system and check whether there is any memory out of bounds:
tick addr size line func task -------- ---------- ---- ----- ----------------------- -------------------------- 6976 0x28064b68 80 425 xQueueGenericCreate media_ui_task 6976 0x28064be0 80 425 xQueueGenericCreate media_ui_task 6976 0x28064c58 160 425 xQueueGenericCreate media_ui_task 6976 0x28064d20 1024 863 xTaskCreate_ex media_ui_task 6976 0x28065148 104 868 xTaskCreate_ex media_ui_task 6976 0x2807d098 80 425 xQueueGenericCreate transfer_major_task 6976 0x2807d110 80 425 xQueueGenericCreate transfer_major_taskUnder normal circumstances, task-related information will also be dumped to the log for reference during problem analysis.