在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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)/** 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)/** 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

    文章

    1356

    瀏覽量

    41412

原文標題:RT-Thread平臺 zephyr_polling軟件包 Bluenrg2 藍牙芯片啟動流程

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    中新社:RT-Thread攜“睿擎平臺”亮相工博會 | 媒體視角

    4月23日,成都國際工業博覽會拉開帷幕。中國新聞網專訪RT-Thread睿賽德,以“國產操作系統再亮劍,睿擎平臺開啟工業新時代”為題,報道了“睿擎工業開發平臺”在工博會上首發亮相。中國新聞網專訪
    的頭像 發表于 04-24 11:16 ?217次閱讀
    中新社:<b class='flag-5'>RT-Thread</b>攜“睿擎<b class='flag-5'>平臺</b>”亮相工博會 | 媒體視角

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內容比較簡單但稍有瑣碎,希望對有需要的小伙伴有所幫助。
    的頭像 發表于 02-13 10:37 ?1613次閱讀
    如何將<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    全志科技亮相2024 RT-Thread開發者大會

    近日,操作系統廠商睿賽德科技在上海舉辦“2024 RT-Thread開發者大會”。全志科技作為芯片設計廠商受邀參展并進行了主題分享。會上,全志科技系統軟件中心資深架構師進行了名為《擁抱生態,和而共贏
    的頭像 發表于 12-31 16:47 ?974次閱讀

    從開源中來到開源中去-RT-Thread北京社區篇

    RT-Thread今年全域推行不同區域社區網,通過建立區域社區網,構建更加緊密聯系的開源社區,實現更廣泛的開源資源共享,讓更多的RT-Thread開發者受益。今年8月份RT-Thread正式
    的頭像 發表于 11-29 01:05 ?356次閱讀
    從開源中來到開源中去-<b class='flag-5'>RT-Thread</b>北京社區篇

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動
    的頭像 發表于 11-13 01:03 ?1799次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動

    親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發者大會)正式啟動報名!2024
    的頭像 發表于 10-29 08:06 ?808次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024開發者大會報名<b class='flag-5'>啟動</b>!

    課程上線 - RT-Thread應用開發實踐課程上線慕課平臺啦!

    我們非常高興地告訴大家,由廣東機電職業技術學院的老師們制作的,使用《RT-Thread應用開發實踐》作為教材的課程——嵌入式操作系統應用,正式上線慕課平臺啦!歡迎各位想要系統學習RT-Thread
    的頭像 發表于 09-14 08:07 ?537次閱讀
    課程上線 - <b class='flag-5'>RT-Thread</b>應用開發實踐課程上線慕課<b class='flag-5'>平臺</b>啦!

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入式開發的絕佳機會。
    的頭像 發表于 08-07 08:35 ?2160次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越
    的頭像 發表于 08-01 08:35 ?1065次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備驅動開發指南

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://github.com
    的頭像 發表于 07-04 08:35 ?657次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    基于 RT-Thread專業版的EtherCAT主站方案

    (一)方案介紹本方案基于RT-Thread專業版,在RT-Thread端集成EtherCAT主站協議,通過EtherCAT對伺服電機或遠程IO進行實時控制,具備傳輸速度快,實時性高,擴展設備靈活等
    的頭像 發表于 06-19 08:35 ?1567次閱讀
    基于 <b class='flag-5'>RT-Thread</b>專業版的EtherCAT主站方案

    先楫半導體所有開發板已上RT-Thread主線啦

    型號:HPM6750EVKMINIHPM6750EVKHPM6750EVK2HPM6300EVKHPM6200EVKHPM5300EVKHPM5301EVKLITEHPM6800EVK生態共贏基于RT-Thread強大的社區生態和豐富的
    的頭像 發表于 06-05 08:17 ?815次閱讀
    先楫半導體所有開發板已上<b class='flag-5'>RT-Thread</b>主線啦

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    嵌入式軟件工程師郭占鑫老師為您講解有關技術知識和實踐經驗。通過本次workshop能深入理解RT-Thread專業版與混合部署的潛力,在RK3568平臺上提升系統實時
    的頭像 發表于 05-28 08:35 ?593次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread西安社區舉辦首次例會,誠邀每一位開發者參與!

    RT-Thread開發者受益。首發:我們優先啟動RT-Thread西安社區,作為RT-Thread全球區域網絡的首個節點!(公眾號回復“西安社區”,加入西安社區
    的頭像 發表于 05-17 15:07 ?459次閱讀
    <b class='flag-5'>RT-Thread</b>西安社區舉辦首次例會,誠邀每一位開發者參與!

    2024 RT-Thread 全球技術大會演講議程發布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術大會)致力于圍繞RT-Thread基礎
    的頭像 發表于 05-16 08:34 ?803次閱讀
    2024 <b class='flag-5'>RT-Thread</b> 全球技術大會演講議程發布!
    主站蜘蛛池模板: 黄免费网站| 激情玖玖 | 色中色综合网 | 在线观看免费视频资源 | 在线天堂bt种子 | 国产精品影视 | 看黄网站免费 | 特黄特级毛片免费视 | 中文字幕天堂 | 一区不卡在线观看 | 1314亚洲人成网站在线观看 | 夜夜bb| 国产精品美女久久久久网站 | 高清色| 九九九色 | 欧美三级一级片 | 窝窝午夜看片成人精品 | 色婷婷激婷婷深爱五月小说 | 深爱婷婷网 | 激情六月婷婷开心丁香开心 | 黄视频网站免费观看 | 天天操天天爽天天射 | 成人人免费夜夜视频观看 | 国产综合在线视频 | 手机看片午夜 | 亚洲网站一区 | 国模视频一区 | 天天躁夜夜躁狠狠躁2021西西 | 大色综合色综合网站 | 欧美在线视频免费 | 亚洲人成电影在线小说网色 | 色香蕉在线观看 | 免费午夜视频 | 成年黄网站免费大全毛片 | 亚洲另类电击调教在线观看 | 午夜性福 | 色男人在线 | 经典三级四虎在线观看 | 亚洲伊人精品综合在合线 | 国产视频三区 | 久久骚|