硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2912|回复: 12
收起左侧

[技术讨论] bl602初体验——不尽人意

[复制链接]

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
发表于 2024-10-22 10:51:23 | 显示全部楼层 |阅读模式
本帖最后由 会飞的猪_2020 于 2024-10-22 11:00 编辑

BL602_BL604_DS_1.6_en.pdf (843.98 KB, 下载次数: 2)
BL602_BL604_RM_1.2_en.pdf (2.44 MB, 下载次数: 3)
BL602_ISP_protocol.pdf (583.63 KB, 下载次数: 0)
Introduction of OpenOCD and GDB.pdf (378.18 KB, 下载次数: 1)
Pine64 BL602 EVB Schematic ver 1.1.pdf (24.56 KB, 下载次数: 0)
sifive_E21_rtl_full_20G1.03.00_manual.pdf (1015.25 KB, 下载次数: 0)



bl602是一款wifi/ble的物联网芯片,当时也是看Lup Yuen的书BL602 Book对它有了一定的了解。
(书写的很不错,我以为芯片也会很不错)
当时看到书里说支持NuttX和Zephyr就决定试试看。
Supported by Apache NuttX OS and FreeRTOS
Zephyr is being ported to BL602 (See this)

但是结果不尽人意。
Zephyr上到现在为止也没有支持这款芯片。
在2020年之后,就没有更新过Nuttx上的代码(看这里
目前nuttx的版本,没有对它的蓝牙做支持(看这里)
论坛里基本上没啥人,活跃度很差。




貌似现在就是安信可对它的推广力度最大,他们的TG-12F以及AI-WB2模组用的都是这个芯片。
TG-12F用的是一款阿里的芯片TG7100C,而TG7100C这颗芯片里面实际上就是BL602。
微信图片_20241022105408.png




使用下来我个人还是更加喜欢esp系列的芯片,无论是从sdk的完善性还是从社区的活跃度来看。

回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-22 14:14:43 | 显示全部楼层
发现了一个幽默上位机。。。


TG7100C的上位机自己会把字符串"bl602"转换成"TG7100C"...
Snipaste_2024-10-22_14-12-17.png
下面是我用SSCOM接收的数据:
Snipaste_2024-10-22_14-13-13.png
回复

使用道具 举报

2

主题

33

回帖

39

积分

新手上路

积分
39
发表于 2024-10-23 08:21:53 | 显示全部楼层
wb2我用过,看过相应的资料,片上资源和性能是非常丰富的,但是io口实在是太少了,只能连接非常少的外设。对于论坛支持确实是这样的,博流的一些资料太少了
回复

使用道具 举报

0

主题

71

回帖

71

积分

初级会员

积分
71
发表于 2024-10-23 09:10:32 | 显示全部楼层
这段时间在用 esp32,确实它的 sdk 做得不错。 我用 idf,都不用 ide 了。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-23 11:01:15 | 显示全部楼层
本帖最后由 会飞的猪_2020 于 2024-10-23 11:13 编辑
浅末哈哈 发表于 2024-10-23 08:21
wb2我用过,看过相应的资料,片上资源和性能是非常丰富的,但是io口实在是太少了,只能连接非常少的外设。 ...

我现在想需要知道,它的flash分区表的具体含义是什么。
想要用公司内部的协议,进行OTA升级。。


它不是烧录的时候需要一个partition table吗?(如下图所示)
不清楚这部分到底是什么意思,目前也只零星找到了一点资料。
Snipaste_2024-10-23_10-48-26.png

[C] 纯文本查看 复制代码
[pt_table]
#partition table is 4K in size
address0 = 0xE000
address1 = 0xF000

[[pt_entry]]
type = 0
name = "FW"
device = 0
address0 = 0x10000
size0 = 0x111000
address1 = 0x121000
size1 = 0xA0000
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 2
name = "factory"
device = 0
address0 = 0x1C1000
size0 = 0x4000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 3
name = "media"
device = 0
address0 = 0x1C5000
size0 = 0x2000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 4
name = "chipdef"
device = 0
address0 = 0x1C7000
size0 = 0x2000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 5
name = "mfg"
device = 0
address0 = 0x121000
size0 = 0xA0000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 6
name = "othdef"
device = 0
address0 = 0x1C9000
size0 = 0x32000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 7
name = "PARAM1"
device = 0
address0 = 0x1FB000
size0 = 0x1000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 8
name = "PARAM2"
device = 0
address0 = 0x1FC000
size0 = 0x2000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 9
name = "PARAM3"
device = 0
address0 = 0x1FE000
size0 = 0x1000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0

[[pt_entry]]
type = 10
name = "PARAM4"
device = 0
address0 = 0x1FF000
size0 = 0x1000
address1 = 0
size1 = 0
# compressed image must set len,normal image can left it to 0
len = 0




回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-23 11:12:21 | 显示全部楼层

bl602的链接脚本,关于链接脚本的语法请看这里


[C] 纯文本查看 复制代码
OUTPUT_ARCH( "riscv" )

ENTRY( bl602_start )

__EM_SIZE = DEFINED(ble_controller_init) ? 8K : 0K;
__RFTLV_SIZE_OFFSET = 1K;
__RFTLV_SIZE_HOLE = 2K;
__RFTLV_HEAD1_H = (0x46524C42); /* BLRF */
__RFTLV_HEAD1_L = (0x41524150); /* PAPA */

MEMORY
{
  rom       (rxai!w) : ORIGIN = 0x21015000, LENGTH = 44K
  flash     (rxai!w) : ORIGIN = 0x23000000, LENGTH = 4M
  ram_tcm   (wxa)    : ORIGIN = 0x4200C000, LENGTH = (16K + 16K + 48K + 64K + 64K + 8K - __EM_SIZE) /*put itcm with dtam and also OCRAM*/
  ram_wifi  (wxa)    : ORIGIN = 0x42042000 - __EM_SIZE, LENGTH = (8K + 104K - 64K - 8K) /*leave 8K left for BLE*/
  bugkill   (rxai!w) : ORIGIN = 0xD0000000, LENGTH = 16M
}

SECTIONS
{
  __stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
  BOOT2_PT_ADDR = 0x42049C00;
  BOOT2_FLASHCFG_ADDR = 0x42049c18;

  .init           :
  {
    KEEP (*(SORT_NONE(.init)))
  } > flash

  /* value for rftlv */

  .rftlv.tool :
  {
      . = ORIGIN(flash) + __RFTLV_SIZE_OFFSET;
      PROVIDE( _ld_symbol_rftlv_address = . );
      LONG(__RFTLV_HEAD1_H);
      LONG(__RFTLV_HEAD1_L);
      . = ORIGIN(flash) + __RFTLV_SIZE_OFFSET + __RFTLV_SIZE_HOLE;
  } > flash

  .bugkiller_command :
  {
    PROVIDE( __bugkiller_command_start = ADDR(.bugkiller_command) );
    PROVIDE( __bugkiller_command_end = ADDR(.bugkiller_command) + SIZEOF(.bugkiller_command) );
    KEEP (*(.static_bugkiller_command))
  } > bugkill
  .bugkiller  :
  {
    KEEP (*(.bugkiller_code))
    KEEP (*bugkiller*.o(.rodata* .text* .data* .sdata* .sbss*))
  } > bugkill

  .text           :
  {
    *(.text.unlikely .text.unlikely.*)
    *(.text.startup .text.startup.*)
    *(.text .text.*)
    *(.gnu.linkonce.t.*)
  } > flash

  .rodata         :
  {
    *(.rdata)
    *(.rodata .rodata.*)
    *(.sdata2.*)

    /* static cli cmds */
    . = ALIGN(4);
    _bl_static_cli_cmds_start = .;
    KEEP(*(.static_cli_cmds))
    *(.static_cli_cmds)
    _bl_static_cli_cmds_end = .;

    /* CI cmds */
    . = ALIGN(4);
    KEEP(*(.ctest))

    /* static fw attribute entry */
    . = ALIGN(4);
    _bl_static_fw_cfg_entry_start = .;
    KEEP(*(.wifi.cfg.entry))
    _bl_static_fw_cfg_entry_end = .;

    /* static blog code1 */
    . = ALIGN(4);
    _bl_static_blogcomponent_code_start = .;
    KEEP(SORT(*)(.static_blogcomponent_code*))
    *(.static_blogcomponent_code*)
    _bl_static_blogcomponent_code_end = .;

    /* static blog code2 */
    . = ALIGN(4);
    _bl_static_blogfile_code_start = .;
    KEEP(SORT(*)(.static_blogfile_code*))
    *(.static_blogfile_code*)
    _bl_static_blogfile_code_end = .;

    /* static blog code3 */
    . = ALIGN(4);
    _bl_static_blogpri_code_start = .;
    KEEP(SORT(*)(.static_blogpri_code*))
    *(.static_blogpri_code*)
    _bl_static_blogpri_code_end = .;

    *(.gnu.linkonce.r.*)

    /*Framework table section, use ALIGN here to avoid fill section*/
    . = ALIGN(4);
    _rom_framework_audio_device_start = .;
    KEEP(*(.framework.audio_device))
    _rom_framework_audio_device_end = .;
  } > flash

  .preinit_array :
  {
    . = ALIGN(4);
    __preinit_array_start = .;
    KEEP (*(.preinit_array))
    __preinit_array_end = .;
  } > flash

  .init_array :
  {
    . = ALIGN(4);
    __init_array_start = .;
    KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
    KEEP (*(.init_array))
    __init_array_end = .;
  } > flash

  /*put wifibss in the first place*/
  .wifibss         (NOLOAD) :
  {
    PROVIDE( __wifi_bss_start = ADDR(.wifibss) );
    PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) );
    *ipc_shared.o(COMMON)
    *sdu_shared.o(COMMON)
    *hal_desc.o(COMMON)
    *txl_buffer_shared.o(COMMON)
    *txl_frame_shared.o(COMMON)
    *scan_shared.o(COMMON)
    *scanu_shared.o(COMMON)
    *mfp_bip.o(COMMON)
    *me_mic.o(COMMON)
    *bl_sta_mgmt_others.o(COMMON)
    *bl_pmk_mgmt.o(COMMON)
    *bl_pmk_mgmt_internal.o(COMMON)
    *libwifi_drv.a:bl_utils.o(COMMON)
    *libwifi_drv.a:bl_utils.o(.bss*)
    *(.wifi_ram*)
    . = ALIGN(16);
  } > ram_wifi

  PROVIDE( _heap_wifi_start = . );
  PROVIDE( _heap_wifi_size = ORIGIN(ram_wifi) + LENGTH(ram_wifi) - _heap_wifi_start );

  .romdata       :
  {
    /*always put freetos under global_pointer with the following order. No change!*/
    PROVIDE( __global_pointer_head$ =  . );
    PROVIDE( __global_pointer$ = . + 0x7F0 );
    . = . + 0x498;
  } > ram_tcm AT > flash

  .data          :
  {
    PROVIDE( _data_load = LOADADDR(.data) );
    PROVIDE( _data_run = ADDR(.data) );
    PROVIDE( _data_run_end = ADDR(.data) + SIZEOF(.data));

    *(.tcm_code*)
    *(.tcm_const*)
    *(.sclock_rlt_code*)
    *(.sclock_rlt_const*)
    *(.data .data.*)
    *(.gnu.linkonce.d.*)

    *(.sdata .sdata.*)
    *(.gnu.linkonce.s.*)

    . = ALIGN(8);
    *(.srodata.cst16)
    *(.srodata.cst8)
    *(.srodata.cst4)
    *(.srodata.cst2)
    *(.srodata .srodata.*)

    . = ALIGN(8);
    *(._k_queue.static.*)
    *(._k_sem.static.*)
    *(._k_mutex.static.*)
    _bt_gatt_service_static_list_start = .;
    KEEP(*(SORT_BY_NAME("._bt_gatt_service_static.static.*")))
    _bt_gatt_service_static_list_end = .;
    _bt_l2cap_fixed_chan_list_start = .;
    KEEP(*(SORT_BY_NAME("._bt_l2cap_fixed_chan.static.*")))
    _bt_l2cap_fixed_chan_list_end = .;

    /* For BFLB Coredump */
    _coredump_binary_id_start = . - ADDR(.data) + LOADADDR(.data);
    KEEP(*(.coredump_binary_id))

  } > ram_tcm AT > flash

  .boot2 (NOLOAD) :
  {
      PROVIDE ( __boot2_pt_addr_start = . );
      *(.bss.boot2_partition_table)
      PROVIDE ( __boot2_pt_addr_end   = . );

      PROVIDE ( __boot2_flashCfg_start = . );
      *(.bss.boot2_flashCfg)
      PROVIDE ( __boot2_flashCfg_end = . );

  } > ram_tcm

  .bss (NOLOAD)   :
  {
    PROVIDE( __bss_start = ADDR(.bss) );
    PROVIDE( __bss_end = ADDR(.bss) + SIZEOF(.bss) );

    *(.sbss*)
    *(.gnu.linkonce.sb.*)
    *(.bss .bss.*)
    *(.gnu.linkonce.b.*)
    *(COMMON)
  } > ram_tcm

  .stack (NOLOAD)   :
  {
    PROVIDE ( _sp_base = . );
    . = ALIGN(16);
    . = . + __stack_size;
    PROVIDE( _sp_main = . );
    __freertos_irq_stack_top = .;
  }

  PROVIDE( _heap_start = . );
  PROVIDE( _heap_size = ORIGIN(ram_tcm) + LENGTH(ram_tcm) - _heap_start );

  /*SYMOBOL used in code*/
  PROVIDE( _ld_bl_static_cli_cmds_start = _bl_static_cli_cmds_start );
  PROVIDE( _ld_bl_static_cli_cmds_end   = _bl_static_cli_cmds_end );

  /*CFG FW used in code*/
  PROVIDE( _ld_bl_static_cfg_entry_start = _bl_static_fw_cfg_entry_start );
  PROVIDE( _ld_bl_static_cfg_entry_end   = _bl_static_fw_cfg_entry_end );

  /* blog */
  PROVIDE( _ld_bl_static_blogcomponent_code_start = _bl_static_blogcomponent_code_start );
  PROVIDE( _ld_bl_static_blogcomponent_code_end   = _bl_static_blogcomponent_code_end );
  PROVIDE( _ld_bl_static_blogfile_code_start = _bl_static_blogfile_code_start );
  PROVIDE( _ld_bl_static_blogfile_code_end   = _bl_static_blogfile_code_end );
  PROVIDE( _ld_bl_static_blogpri_code_start = _bl_static_blogpri_code_start );
  PROVIDE( _ld_bl_static_blogpri_code_end   = _bl_static_blogpri_code_end );

  PROVIDE( _ld_ram_size0 = LENGTH(flash) );
  PROVIDE( _ld_ram_addr0 = ORIGIN(flash) );
  PROVIDE( _ld_ram_size1 = LENGTH(ram_tcm) );
  PROVIDE( _ld_ram_addr1 = ORIGIN(ram_tcm) );
  PROVIDE( _ld_ram_size2 = LENGTH(ram_wifi) );
  PROVIDE( _ld_ram_addr2 = ORIGIN(ram_wifi) );


  /*BOOT2 sections*/
  PROVIDE ( __boot2_pt_addr_src = BOOT2_PT_ADDR );
  PROVIDE ( __boot2_flashCfg_src = BOOT2_FLASHCFG_ADDR );

  PROVIDE(xTaskGetTickCount = 0x0000000021017694);
  PROVIDE(xTaskGetTickCountFromISR = 0x00000000210176aa);
  PROVIDE(pvPortMalloc = 0x0000000021019662);
  PROVIDE(vPortFree = 0x000000002101973a);
  PROVIDE(vTaskNotifyGiveFromISR = 0x00000000210188e8);
  PROVIDE(vTaskSwitchContext = 0x0000000021017a04);
  PROVIDE(ulTaskNotifyTake = 0x0000000021018548);
  PROVIDE(vTaskExitCritical = 0x00000000210183f4);
  PROVIDE(vTaskEnterCritical = 0x00000000210183e4);
  PROVIDE(xTaskGetCurrentTaskHandle = 0x0000000021018152);
  PROVIDE(xQueueSemaphoreTake = 0x0000000021015ce8);
  PROVIDE(xQueueGenericSend = 0x0000000021015834);
  PROVIDE(xQueueGenericSendFromISR = 0x0000000021015a4c);
  PROVIDE(xTaskCreateStatic = 0x00000000210170a2);
  PROVIDE(xTaskCreate = 0x000000002101713a);
  PROVIDE(xQueueCreateMutex = 0x0000000021015a1c);
  PROVIDE(xQueueCreateMutexStatic = 0x0000000021015994);
  PROVIDE(vQueueDelete = 0x00000000210161d8);
  PROVIDE(xQueueGenericCreateStatic = 0x00000000210156c2);
  PROVIDE(xQueueGenericCreate = 0x0000000021015744);
  PROVIDE(xQueueReceive = 0x0000000021015b8a);
  PROVIDE(uxQueueMessagesWaiting = 0x0000000021016168);
  PROVIDE(vTaskDelay = 0x00000000210179c6);
  PROVIDE(vTaskDelayUntil = 0x0000000021017952);
  PROVIDE(xPortGetFreeHeapSize = 0x00000000210197ce);
  PROVIDE(vTaskList = 0x0000000021018408);
  PROVIDE(xTimerGenericCommand = 0x0000000021018bec);
  PROVIDE(xTimerCreateTimerTask = 0x0000000021018a9e);
  PROVIDE(xTimerCreate = 0x0000000021018af6);
  PROVIDE(xTimerCreateStatic = 0x0000000021018b66);
  PROVIDE(xQueueCreateCountingSemaphoreStatic = 0x00000000210157c2);
  PROVIDE(xQueueCreateCountingSemaphore = 0x0000000021015800);
  PROVIDE(pTrapNetCounter = __global_pointer_head$);
  PROVIDE(TrapNetCounter = __global_pointer_head$ + 0x58);
  PROVIDE(vEventGroupDelete = 0x00000000210153be);
  PROVIDE(xEventGroupWaitBits = 0x0000000021015086);
  PROVIDE(xEventGroupCreateStatic = 0x0000000021015000);
  PROVIDE(xEventGroupSetBits = 0x00000000210151e0);
  PROVIDE(xStreamBufferGenericCreateStatic = 0x00000000210165c0);
  PROVIDE(xStreamBufferReceive = 0x00000000210169ae);
  PROVIDE(xStreamBufferSend = 0x00000000210167a8);
  PROVIDE(pvTimerGetTimerID = 0x0000000021018fd4);
  PROVIDE(xTaskGenericNotify = 0x00000000210186be);
  PROVIDE(xTaskGenericNotifyFromISR = 0x00000000210187de);
  PROVIDE(xQueueGiveMutexRecursive = 0x00000000210159c8);
  PROVIDE(xQueueTakeMutexRecursive = 0x0000000021015e70);
  PROVIDE(xTaskGetTickCount2 = 0x000000002101769a);
  PROVIDE(xQueueGiveFromISR = 0x0000000021015b0e);
  PROVIDE(vTaskDelete = 0x00000000210171b6);
  PROVIDE(uxTaskGetStackHighWaterMark = 0x0000000021018110);
  PROVIDE(pcTaskGetName = 0x00000000210176b6);
  PROVIDE(vTaskStartScheduler = 0x0000000021017610);
  PROVIDE(vPortDefineHeapRegions = 0x00000000210197da);
  PROVIDE(__LD_CONFIG_EM_SEL = __EM_SIZE);

  PROVIDE( _ld_symbol_rom_framework_audio_device_start = _rom_framework_audio_device_start);
  PROVIDE( _ld_symbol_rom_framework_audio_device_end = _rom_framework_audio_device_end);

}

回复

使用道具 举报

2

主题

33

回帖

39

积分

新手上路

积分
39
发表于 2024-10-23 14:43:25 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-23 11:01
我现在想需要知道,它的flash分区表的具体含义是什么。
想要用公司内部的协议,进行OTA升级。。

这一部分我倒是没仔细看,找一下原厂吧
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-23 17:02:52 | 显示全部楼层
看了一下bl_iot_sdk的源代码,里面的蓝牙协议栈用的是zephyr的那套代码。
这套api的话,参考例程还是蛮多的。因为Nordic也用的一样的api。

然后nuttx用的貌似是nimble这个协议栈。
不知道博流未来会不会为nuttx支持一下蓝牙。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-24 15:57:10 | 显示全部楼层
看不懂它的构建过程(build system)。官方给的资料有点少。。
我不想用默认的ld脚本,想改成自己的ld脚本。

看了一个上午的makefile文件,知道了最后是在components/platform/soc/bl602/bl602/evb/evb.mk这个地方更改。

[C] 纯文本查看 复制代码
ifneq ($(CONFIG_LINK_CUSTOMER),1)

ifeq ($(CONFIG_LINK_RAM),1)
LINKER_SCRIPTS := ram.ld
CPPFLAGS += -DRUN_IN_RAM
else

ifeq ($(CONFIG_LINK_ROM),1)
LINKER_SCRIPTS := flash_rom.ld
else
LINKER_SCRIPTS := flash.ld
endif

endif

##
COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/evb/ld \
                         $(addprefix -T ,$(LINKER_SCRIPTS))
##                        
COMPONENT_ADD_LINKER_DEPS := $(addprefix evb/ld/,$(LINKER_SCRIPTS))
endif

ifeq ($(CONFIG_DISABLE_PRINT),1)
CPPFLAGS += -DDISABLE_PRINT
endif

ifeq ($(CONFIG_DISABLE_PRINT_FLOAT),1)
CPPFLAGS += -DDISABLE_PRINT_FLOAT
endif


但是改成了CONFIG_LINK_CUSTOMER之后。
尝试自己定义LINKER_SCRIPTS,COMPONENT_ADD_LDFLAGS ,COMPONENT_ADD_LINKER_DEPS 。

最后在$(CXX) -o $@ $(LDFLAGS) -Wl,-Map=$(APP_MAP),把这个命令的LDFLAGS打印出来,没有用我定义的ld脚本。

不知道是为什么。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-26 11:05:44 | 显示全部楼层
把博流的makefile都看完了,还好现在有chatgpt。

现在我对它的项目的构建过程有了一个基本了解了。

让我写我肯定写不出来,感慨GPT的强大。
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-28 15:37:23 | 显示全部楼层
会飞的猪_2020 发表于 2024-10-23 17:02
看了一下bl_iot_sdk的源代码,里面的蓝牙协议栈用的是zephyr的那套代码。
这套api的话,参考例程还是蛮多 ...

我估计应该是不会支持了。。
https://github.com/bouffalolab/bl_iot_sdk/issues/1

看这个帖子里从2020开始就说要开放一部分射频的底层api。结果一拖再拖,从2021年拖到2022,然后就再也没有消息了。

令人悲伤.
回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-10-29 20:10:39 | 显示全部楼层
本帖最后由 会飞的猪_2020 于 2024-10-29 20:12 编辑

bl_iot_sdk的蓝牙协议栈用的zephyr。

Snipaste_2024-10-29_20-08-40.png



然后nordic有一个6期的蓝牙教程:https://academy.nordicsemi.com/courses/bluetooth-low-energy-fundamentals/lessons/lesson-1-bluetooth-low-energy-introduction/topic/blefund-lesson-1-exercise-1/

我看了它例程仓库里的代码应该也是用NCS(nordic connect sdk)写的,zephry的蓝牙协议栈就是nordic提供的。应该可以参考这部分内容,去在bl602上试一下相关的功能。
https://github.com/NordicDeveloperAcademy/bt-fund/tree/main


回复

使用道具 举报

102

主题

573

回帖

894

积分

金牌会员

积分
894
QQ
 楼主| 发表于 2024-11-13 17:23:03 | 显示全部楼层
对着安信可的代码,和原厂的sdk。大概算是猜出来它是怎么ota的了..

首先是下载的时候有一个分区表:
Snipaste_2024-11-13_17-10-26.png

这部分代码的格式如下所示:
[C] 纯文本查看 复制代码
[[pt_entry]]
type = 0
name = "FW"
device = 0
address0 = 0x10000
size0 = 0x111000
address1 = 0x121000
size1 = 0xA0000
# compressed image must set len,normal image can left it to 0
len = 0


然后参考https_ota的代码:https://github.com/bouffalolab/bl_iot_sdk/blob/master/customer_app/system/ota/demo_ota/demo_ota/bl_http_ota.c
[C] 纯文本查看 复制代码
#define BL_MTD_PARTITION_NAME_FW_DEFAULT        "FW"
int ret = bl_mtd_open(BL_MTD_PARTITION_NAME_FW_DEFAULT, &otaHandle, BL_MTD_OPEN_FLAG_BACKUP);
bl_mtd_write(otaHandle, flashOffset, otaOffset, otaBuffer);
bl_mtd_close(otaHandle);


这里的bl_mtd_开头的api就是把固件写入对应分区的。



但是程序也放在“FW”分区呀,它为什么可以同时在运行的时候写入呢?
这部分没有文档,我看了API的命名,猜测出是因为每个分区有add0和add1两个地址。

然后利用hal_boot2_get_active_entries这个api去获取当前可用的addr入口
[C] 纯文本查看 复制代码
hal_boot2_get_active_entries(BOOT2_PARTITION_TYPE_FW, &otaEntry)

然后在调用
[C] 纯文本查看 复制代码
hal_boot2_update_ptable(&otaEntry);
去更新程序。

因为我看例程里面最后程序要reboot一下。所以我猜测,这里应该是切换了启动的时候的addr。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 02:47 , Processed in 0.052323 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表