0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程

RTThread物联网操作系统 来源:未知 2023-09-27 18:40 次阅读

RTT zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程


“开源之夏”“蓝牙HOST协议栈zephyr_polling完善” 项目个人记录

菜鸡参与项目的个人记录

项目软件包地址:RTT_PACKAGE_zephyr_polling

前面已经完成了 SPI 接口的实现,要让 zephyr_polling 在 Bluenrg2 上运行起来,下一步是实现其特殊的芯片启动流程。

蓝牙芯片启动流程


在用标准的 HCI 指令控制设备进行蓝牙操作之前,需要提前通过 VS Command 对设备进行配置,只有正确配置好的设备才能正常使用。

芯片产商只出售芯片,并不关注外围电路和具体的产品形态,这些是具体的ODM厂商来实现的。也就是芯片产商提供带HCI蓝牙功能的芯片,ODM设计电路并设计产品,之后通过HCI和芯片进行交互。实际各家ODM产商的需求各不相同,芯片产商为了满足不同客户的需要,并且为了减少和客户的对接,就必然在同一套代码的基础上,需要提供一系列的配置参数来满足不同 ODM 厂商的需要。

配置可以包括:固件烧录(部分没有带 FLASH 的蓝牙芯片每次上电都需要重新烧录最新的固件)、蓝牙地址配置、硬件接口配置(如RF接口,晶振类型等,部分蓝牙芯片需要)、波特率配置(HCI 一般是UART接口,默认是115200)以及芯片需要的由厂商要求的其他参数配置。

此外,对于一些有Flash的芯片,完全可以将配置参数等预烧录到了 Flash 中,使用时完全不需要配置任何参数,直接通过HCI接口操作使用即可。

zephyr_polling 协议栈提供了 Boot 流程接口和 Prepare 流程接口,可以根据实际芯片的需求实现启动配置。

wKgZomUs71-AO8kfAACeCOW2wd0839.png

Boot流程:

完成厂商的初始化流程,如固件下载,蓝牙地址配置等。在 chipset 注册好接口后,协议栈启动时会通过boot_start()回调启动 chipset(指协议栈 chipset 目录下的启动流程代码,下同) 的 Boot 流程,由于操作接口是 HCI,所以一般都是下发一个VS Command,然后根据 VS Event 来进行后续动作,协议栈会通过event_process()回调接口将收到的 event 上报给 chipset,当 chipset 认为操作结束时,通过调用bt_hci_set_boot_ready()接口通知协议栈boot流程结束。

Prepare流程:

部分厂商的参数要求在 HCI_Reset Command 之后进行(意思是它们的 HCI_Reset Command 会清空配置的参数)。为了兼容这类参数形态,HCI_Reset Command 之后还加入了 Prepare 流程。协议栈收到 HCI_Reset 的 Command Complete Event 后会通过prepare_start()回调启动 chipset 的 Prepare 流程,和 Boot 流程一样,协议栈会通过event_process()回调接口将收到的 event 上报给 chipset ,当chipset 认为操作结束时,通过调用bt_hci_set_prepare_ready()接口通知协议栈prepare流程结束。

BlueNRG-2 启动流程


查阅 ST 官方提供的手册和例程资料,可以了解到 BlueNRG-2 的启动配置需求。

对于 BlueNRG-2:

Boot 流程:无事务。

Prepare 流程:关闭Host功能;蓝牙地址配置;设置 TX power;GATT配置;GAP配置。

BlueNRG-2 启动流程实现


Boot 流程

BlueNRG-2 的 HCI_Reset Command 会清空配置的参数,所以实际的配置放在协议栈的 Prepare 流程中。Boot 流程的回调函数直接调用bt_hci_set_boot_ready()结束流程。


		

1voidboot_start(void){ 2state=STATE_POLLING_BOOTING; 3//nothingtodo 4bt_hci_set_boot_ready();//finishboot 5}

Prepare 流程 - 关闭 Host 功能

开发使用的蓝牙模块 X-NUCLEO-BNRG2A1 中的 BLE 本身是一个 SOC,里面集成了 host 的协议栈。厂商 ST 提供了一套 ACI 指令来控制芯片行为,包括 host 的接口。也就是说默认的情况下,这个芯片的 ACL 交互都被接管了,所以需要通过 ACI 命令,关闭 host 行为。需要通过aci_hal_write_config_data里的CONFIG_DATA_LL_WITHOUT_HOST关闭 host。

Prepare 流程第一步,关闭 host:


		

1voidprepare_start(void){ 2state=STATE_POLLING_PREPARING; 3step=1; 4//step1closehost 5bluenrg2_config_without_host();//Itcanbewrittenonlyifaci_hal_write_config_data()isthefirstcommandafterreset. 6}

关闭 host 的指令的 ogf 为0x3f,ocf 为0x00c,参数为2c11。其中,0x2C是关闭 Host 在 CONFIG_DATA 中的 offset。


		

1#defineCONFIG_DATA_LL_WITHOUT_HOST(0x2C)/**< Switch on/off Link Layer only mode. Set to 1 to disable Host. */ 2#defineCONFIG_DATA_LL_WITHOUT_HOST_LEN(1) 3staticintbluenrg2_config_without_host() 4{ 5uint8_tcmd_buffer[CONFIG_DATA_LL_WITHOUT_HOST_LEN+2]; 6structnet_buf*buf; 7cmd_buffer[0]=CONFIG_DATA_LL_WITHOUT_HOST;//offset 8cmd_buffer[1]=CONFIG_DATA_LL_WITHOUT_HOST_LEN;//configlen 9cmd_buffer[2]=1;//Setto1todisableHost 10uint16_togf=0x3f,ocf=0x00c; 11uint16_topcode=(uint16_t)((ocf&0x03ff)|(ogf<< 10)); 12buf=bt_hci_cmd_create(opcode,sizeof(cmd_buffer)); 13if(!buf) 14{ 15return-ENOBUFS; 16} 17net_buf_add_mem(buf,cmd_buffer,sizeof(cmd_buffer)); 18returnbt_hci_cmd_send(opcode,buf); 19}

Prepare 流程 - 蓝牙地址设置

需要通过aci_hal_write_config_data里的CONFIG_DATA_PUBADDR_OFFSET配置蓝牙地址。

配置蓝牙地址的指令的 ogf0x3f,ocf 为0x00c。配置蓝牙地址指令在 CONFIG_DATA 中的 offset 为 0x00,后面跟上地址长度和设置的蓝牙地址。


		

1#defineBLE_MAC_ADDR 2{ 3{ 40xf5,0x00,0x00,0xE1,0x80,0x02 5} 6} 7#defineCONFIG_DATA_PUBADDR_OFFSET(0x00)/**< Bluetooth public address */ 8#defineCONFIG_DATA_PUBADDR_LEN(6) 9staticintbluenrg2_config_set_public_addr() 10{ 11uint8_tcmd_buffer[CONFIG_DATA_PUBADDR_LEN+2]; 12structnet_buf*buf; 13bt_addr_taddr=BLE_MAC_ADDR; 14cmd_buffer[0]=CONFIG_DATA_PUBADDR_OFFSET;//offset 15cmd_buffer[1]=CONFIG_DATA_PUBADDR_LEN;//configlen 16memcpy(cmd_buffer+2,addr.val,CONFIG_DATA_PUBADDR_LEN);//addr 17uint16_togf=0x3f,ocf=0x00c; 18uint16_topcode=(uint16_t)((ocf&0x03ff)|(ogf<< 10)); 19buf=bt_hci_cmd_create(opcode,sizeof(cmd_buffer)); 20if(!buf) 21{ 22return-ENOBUFS; 23} 24net_buf_add_mem(buf,cmd_buffer,sizeof(cmd_buffer)); 25returnbt_hci_cmd_send(opcode,buf); 26}

Prepare 流程 - 设置发射功率

配置发射功率的指令的 ogf 为0x3f,ocf 为0x00f。命令参数为是否启用高功率模式(0x00启用普通功率,0x01启用高功率)和功率放大器输出电平(允许的PA电平取决于设备)。

PA_Level值对应功率

0:-14dBm(HighPower)

1:-11dBm(HighPower)

2:-8dBm(HighPower)

3:-5dBm(HighPower)

4:-2dBm(HighPower)

5:2dBm(HighPower)

6:4dBm(HighPower)

7:8dBm(HighPower)


		1staticintbluenrg2_set_tx_power_level(uint8_tEn_High_Power,uint8_tPA_Level)  2{  3uint8_tcmd_buffer[2];  4structnet_buf*buf;  5cmd_buffer[0]=En_High_Power;//En_High_Power  6cmd_buffer[1]=PA_Level;//configPA_Level  7uint16_togf=0x3f,ocf=0x00f;  8uint16_topcode=(uint16_t)((ocf&0x03ff)|(ogf<< 10));  9buf=bt_hci_cmd_create(opcode,sizeof(cmd_buffer)); 10if(!buf) 11{ 12return-ENOBUFS; 13} 14net_buf_add_mem(buf,cmd_buffer,sizeof(cmd_buffer)); 15returnbt_hci_cmd_send(opcode,buf); 16} Prepare 流程 - GATT 配置

GATT 初始化的指令的 ogf 为0x3f,ocf 为0x101,没有其它参数。


		

1staticintbluenrg2_gatt_init(void) 2{ 3uint16_togf=0x3f,ocf=0x101; 4uint16_topcode=(uint16_t)((ocf&0x03ff)|(ogf<< 10)); 5returnbt_hci_cmd_send(opcode,NULL); 6}

Prepare 流程 - GAP 配置

初始化 GAP 层。注册GAP服务,并设置标准 GAP 服务特性:设备名称、Appearance、外围设备首选连接参数(仅限外围设备)。

GAP 配置的指令的 ogf 为0x3f,ocf 为0x08a。配置为外围设备,如果需要用做其他角色,需要修改此处;不启用隐私策略(为保护地址不被窃取,进行地址加密/解密,并周期更新);设置设备名字长度。

privacy:

0x00:Privacydisabled

0x01:Privacyhostenabled

0x02:Privacycontrollerenabled


			

1#defineGAP_PERIPHERAL_ROLE(0x01) 2#defineGAP_BROADCASTER_ROLE(0x02) 3#defineGAP_CENTRAL_ROLE(0x04) 4#defineGAP_OBSERVER_ROLE(0x08) 5#defineprivacy_enabled(0x00) 6#definedevice_name_char_len(0x08) 7staticintbluenrg2_gap_init() 8{ 9uint8_tcmd_buffer[3]; 10structnet_buf*buf; 11cmd_buffer[0]=GAP_PERIPHERAL_ROLE;//role 12cmd_buffer[1]=privacy_enabled;//privacy 13cmd_buffer[2]=device_name_char_len;//device_name_char_len 14uint16_togf=0x3f,ocf=0x08a; 15uint16_topcode=(uint16_t)((ocf&0x03ff)|(ogf<< 10)); 16buf=bt_hci_cmd_create(opcode,sizeof(cmd_buffer)); 17if(!buf) 18{ 19return-ENOBUFS; 20} 21net_buf_add_mem(buf,cmd_buffer,sizeof(cmd_buffer)); 22returnbt_hci_cmd_send(opcode,buf); 23}

启动事件处理

对于启动流程的返回响应,需要由event_process()回调进行判断和推进。这里为了方便,只对CMD_COMPLETE事件进行判断处理,推进 Prepare 流程进行。

GAP 设置完成后调用bt_hci_set_prepare_ready()结束流程。


			

1voidevent_process(uint8_tevent,structnet_buf*buf) 2{ 3if(state==STATE_POLLING_PREPARING)//bootdonothing 4{ 5if(event==BT_HCI_EVT_CMD_COMPLETE)//onlycomplete 6{ 7printk("prepare_event_process,step:%d ",step); 8switch(step) 9{ 10case1://closehostjustnow 11bluenrg2_config_set_public_addr();//step2set_public_addr 12step=2; 13break; 14case2: 15bluenrg2_set_tx_power_level(1,4);//step3set_public_addr 16step=3; 17break; 18case3: 19bluenrg2_gatt_init();//step4gatt_ini 20step=4; 21break; 22case4: 23bluenrg2_gap_init();//step5gap_ini 24step=5; 25break; 26case5: 27bt_hci_set_prepare_ready();//finishprepare 28step=0; 29break; 30} 31} 32} 33}

启动流程注册

将上述实现的启动流程的函数指针打包到bt_hci_chipset_driver结构体中,供协议栈调用注册。


			

1staticconststructbt_hci_chipset_driverchipset_drv={ 2init_work,boot_start,prepare_start,event_process, 3}; 4//publicdrvAPI 5conststructbt_hci_chipset_driver*bt_hci_chipset_impl_local_instance(void) 6{ 7return&chipset_drv; 8}

验证


完成 HCI 接口的时候虽然成功运行了 Beacon 例程,但 Beacon 例程是不需要进行 chipset 启动配置流程的(运行时启用的是common空白回调)。运行外设的心率例程验证 Bluenrg2 蓝牙芯片启动流程。


			

1|/ 2-RT-ThreadOperatingSystem 3/|5.0.1buildSep20202322:16:27 42006-2022CopyrightbyRT-Threadteam 5docomponentsinitialization. 6initializerti_board_end:0done 7initializestm32l4_hw_lptim_init:0done 8initializefinsh_system_init:0done 9msh>zephyr 10zephyr_polling_init 11bt_init_hci_driver 12SPI_init_processdevice_name:spi10,spi_name:spi1,rate:1000000,databits:8,LSB_MSB:1,Master_Slave:0,CPOL:0,CPHA:1 13SPI_init_processcs_pin_num:1,irq_pin_num:0 14hci_driver_open,SPI_config_finish 15I:(bt_hci_core)hci_init():3230:workstart. 16msh>prepare_event_process,step:1 17prepare_event_process,step:2 18prepare_event_process,step:3 19prepare_event_process,step:4 20prepare_event_process,step:5 21I:(bt_hci_core)hci_init_end():3205:workend. 22E:(bt_smp)smp_self_test():5695:smp_self_teststart 23I:(bt_hci_core)bt_dev_show_info():3008:Identity:02:8000:00:f5(public) 24I:(bt_hci_core)bt_dev_show_info():3042:HCI:version5.2(0x0b)revision0x1222,manufacturer0x0030 25I:(bt_hci_core)bt_dev_show_info():3044:LMP:version5.2(0x0b)subver0x0015 26Bluetoothinitialized 27Advertisingsuccessfullystarted 28Connected 29BASNotificationsenabled 30HRSnotificationsenabled


		


		

prepare_event_process 步骤的日志输出正常,设备连接、电池服务、心率服务正常。


		

wKgZomUs72CAIdYIAAK4rMmKRDw317.jpg


		


		

———————End——————

wKgZomUs72GANZZYAHiX-BnG6Ho137.gif

点击阅读原文进入官网


原文标题:RT-Thread平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38900

原文标题:RT-Thread平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread Studio添加软件包报错怎么解决?

    RT-Thread Studio添加软件包报错ImportError: No module named psutil
    发表于 03-01 08:41

    基于CubeMX的RT-thread Nano可以添加microros这样的软件包吗?

    最近使用rt-thread配置一个ROS2,但是是用CubeMX联合Clion做的,CubeMX使用的是RT-thread nano, 请问这个环境可以添加像microros这样的
    发表于 03-01 06:00

    RTT平台zephyr_polling软件包SPI Bluenrg2丢包问题排查

    在对协议栈在 Bluenrg2 芯片上采用 SPI 作为 HCI 的数据传输进行测试的时候,发现存在丢包问题。
    的头像 发表于 10-23 15:41 237次阅读
    RTT<b class='flag-5'>平台</b><b class='flag-5'>zephyr_polling</b><b class='flag-5'>软件包</b>SPI <b class='flag-5'>Bluenrg2</b>丢包问题排查

    RT-Thread中mymqtt软件包的使用方法

    在上一篇文章 RT-Thread中Lan8720和lwip协议栈的使用的工程基础上添加mymqtt软件包。 使能mqtt example和mqtt test,保存,等待下载更新软件包
    的头像 发表于 10-13 10:44 524次阅读
    <b class='flag-5'>RT-Thread</b>中mymqtt<b class='flag-5'>软件包</b>的使用方法

    RT-Thread中Agile Modbus软件包的使用方法

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,Agile Modbus软件包版本为v1.1.2。工程使用上一篇 RT-Thread中RS485驱
    的头像 发表于 10-11 15:37 656次阅读
    <b class='flag-5'>RT-Thread</b>中Agile Modbus<b class='flag-5'>软件包</b>的使用方法

    RT-Thread使用cjson软件包发送64位长整型数据

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,rt-thread版本为4.1.1,cjson软件包使用的版本是latest。
    的头像 发表于 10-11 15:09 406次阅读
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>软件包</b>发送64位长整型数据

    如何用Ubuntu qemu跑zephyr_polling蓝牙

    进入 RT-Thread online packages → IoT - internet of things 目录即可看到 zephyr_polling软件包,勾选软件包
    的头像 发表于 09-28 11:24 1370次阅读
    如何用Ubuntu qemu跑<b class='flag-5'>zephyr_polling</b>的<b class='flag-5'>蓝牙</b>?

    RTT zephyr_polling软件包 Bluenrg2蓝牙芯片启动流程

    在用标准的 HCI 指令控制设备进行蓝牙操作之前,需要提前通过 VS Command 对设备进行配置,只有正确配置好的设备才能正常使用。
    的头像 发表于 09-27 11:19 757次阅读
    RTT <b class='flag-5'>zephyr_polling</b><b class='flag-5'>软件包</b> <b class='flag-5'>Bluenrg2</b><b class='flag-5'>蓝牙</b><b class='flag-5'>芯片</b><b class='flag-5'>启动</b><b class='flag-5'>流程</b>

    UIoT RT-Thread软件包介绍

    UIoT RT-Thread 软件包实现了 IoT 设备与 UCloud UIoT Core 物联网通信云平台连接,包含设备注册、MQTT、设备影子、物模型、OTA、文件上传等功能,开发者进行灵活裁剪。
    发表于 09-26 07:22

    RTT平台zephyr_polling软件包SPI Bluenrg2芯片宕机问题与修复

    项目的代码测试完成之后,准备收尾时,出现了问题。清除掉开发过程中用来调试的print打印之后,zephyr_polling 的 HCI 突然不能正常工作了,之前测试可用的 zephyr_polling 中的各个例程都不再能运行。
    的头像 发表于 09-25 17:08 786次阅读
    RTT<b class='flag-5'>平台</b><b class='flag-5'>zephyr_polling</b><b class='flag-5'>软件包</b>SPI <b class='flag-5'>Bluenrg2</b><b class='flag-5'>芯片</b>宕机问题与修复

    RTT zephyr_polling SPI Bluenrg2数据传输测试

    RTT 那边的 Kconfig 配置完成,项目的基本开发内容就完成了。然后再对协议栈在 Bluenrg2 芯片上采用 SPI 作为 HCI 的数据传输进行测试。
    的头像 发表于 09-25 16:25 561次阅读
    RTT <b class='flag-5'>zephyr_polling</b> SPI <b class='flag-5'>Bluenrg2</b>数据传输测试

    RTT_Zephyr_Polling BlueNRG2 SPI使用说明

    RT-Thread平台下,利用 BlueNRG2 蓝牙芯片运行 RTT_Zephyr_Polling
    的头像 发表于 09-21 14:54 732次阅读
    RTT_<b class='flag-5'>Zephyr_Polling</b> <b class='flag-5'>BlueNRG2</b> SPI使用说明

    RT-Thread Settings中开启libhydrogen软件包开关,更新后为什么提示找不到该文件?

    我早做测试时发现,在RT-Thread Settings中开启libhydrogen软件包开关,更新后发现开发环境左侧packages目录下并没找到该软件包,请问是怎么回事?
    发表于 08-20 17:20

    RT-Thread在线软件包改为本地软件包的方法

    RT-Thread软件包,使用时需要手动通过 ENV 工具 更新到 本地的 packages 目录,并且 packages 目录默认不参与 Git 工程管理,软件包多了,偶尔需要更改软件包
    的头像 发表于 08-11 15:02 759次阅读
    <b class='flag-5'>RT-Thread</b>在线<b class='flag-5'>软件包</b>改为本地<b class='flag-5'>软件包</b>的方法

    RT-Thread操作系统有哪些优势?

    软件包和SDK,扩展系统功能 开发者说,RT-Thread是最简洁,优雅的开源操作系统之一,简单易用。 RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统
    发表于 06-28 08:16