藍芽之十九-HFPclient
在高通平臺和三星平臺上調過這個功能,基於安卓6.0,該功能是將手機上的藍芽功能用成和藍芽耳機一樣的功能。藍芽電話和藍芽音樂它們之間的差異較大,藍芽電話要求實時性比較高,其和A2DP使用的物理通路並不一致,藍芽電話走pcm物理通路,而藍芽音樂走uart通路。
關鍵詞
Hfpclient BT SCO ATA command
在除錯該功能時,最好能先測試一下,如下訊號指標是否符合要求,以免帶來卡頓和斷連等不可靠因素。
此外,還要測試頻偏,其晶振以及外圍的電容等器件也會影響,一般在正負10之內,否則也可能會導致卡頓或斷連等現象。
開啟HFP client支援
首先將hfp client角色功能開啟。
packages/apps/Bluetooth/res/values/config.xml
<bool name="profile_supported_hs_hfp">false</bool>
<bool name="profile_supported_hfpclient">true</bool>
首先將hfp client角色功能開啟。
修改後以支援電話功能,但是手機連線後會斷開,並有如下錯誤資訊:
截圖如下:01-12 17:51:58.850 3319 3572 E bt_rfcomm: PORT_DataInd, p_port:0xe2ece48c, p_data_co_callback is null 01-12 17:51:58.850 3319 3572 E bt_btif : HFPClient: Failed to create SLC due to AT error, disconnecting (2)
出錯資訊提示是
HFPClient: Failed to create SLC due to AT error, disconnecting (2)這是提示AT命令錯誤,藍芽電話使用AT命令子集。這是因為不支援codec negotiate特點,修改如下:
到這裡應該有藍芽提示音出現了。也就是藍芽的呼叫事件能夠正常響應了,但是呼叫響應是通過UART走的是AT command協議,提示音是hfp client自帶的。system/bt/bta/hf_client/bta_hf_client_at.c static void bta_hf_client_handle_brsf(UINT32 value) { APPL_TRACE_DEBUG("%s 0x%x", __FUNCTION__, value); - bta_hf_client_cb.scb.peer_features = value; + bta_hf_client_cb.scb.peer_features = value & ~0x200; }
codec negotiate是為了支援寬頻語音訊號,支援16KHz的語音訊號,在支援這一feature時,hfpclient和裝置之間會進行協商,以期望使用wbs方式資料。
HeadsetClientStateMachine.java
如果想更改藍芽提示音,修改如下檔案;
@@ -126,7 +126,7 @@ final class HeadsetClientStateMachine extends StateMachine {
private int mIndicatorCallHeld;
private boolean mVgsFromStack = false;
private boolean mVgmFromStack = false;
- private Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
+ private Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
有+++號的是除錯資訊,Enter AudioOn是進入藍芽電話的語音了,可以看到語音的取樣率是8KHz。
藍芽語音的物理通路
正如開篇提到的,語音資料不走UART,而是走PCM或者IIS,這一資訊在:
hardware/broadcom/libbt/src/hardware.c
當然高通平臺未使用博通的晶片時,不會有這個問題,而且目錄和程式碼的差異性也非常大,基本上高通將底層細節都遮蔽了,走高通adsp通路時,開發者甚至都不需要關係語音走的底層物理通路。
#define HCI_VSC_WRITE_PCM_DATA_FORMAT_PARAM 0xFC1E #define HCI_VSC_WRITE_I2SPCM_INTERFACE_PARAM 0xFC6D #define HCI_VSC_ENABLE_WBS 0xFC7E這是三星平臺使用博通晶片定義的資料格式,這在使用btsnoop工具抓資料時,可以看到這類的命令。btsnoop抓到的資料可以使用comprobe工具進行解析檢視。
#define HCI_VSC_WRITE_SCO_PCM_INT_PARAM 0xFC1C
/* do we need this VSC for I2S??? */
UINT16_TO_STREAM(p, HCI_VSC_WRITE_SCO_PCM_INT_PARAM);
*p++ = SCO_PCM_PARAM_SIZE;
memcpy(p, &bt_sco_param, SCO_PCM_PARAM_SIZE);
ALOGI("SCO PCM configure {0x%x, 0x%x, 0x%x, 0x%x, 0x%x}",
bt_sco_param[0], bt_sco_param[1], bt_sco_param[2], bt_sco_param[3],
bt_sco_param[4]);
if ((ret = bt_vendor_cbacks->xmit_cb(HCI_VSC_WRITE_SCO_PCM_INT_PARAM, p_buf,
hw_sco_i2spcm_cfg_cback)) == FALSE)
{
bt_vendor_cbacks->dealloc(p_buf);
}
else
return;
如果是基於手機方案的,基本以上設定基本就可以了。手機方案的圖如下(略去了基帶)
但是如果BT的PCM沒有和codec直接連線,而是像UART一樣和AP直接相連線,這樣就要涉及到驅動的改動了。首先ap側需要編寫驅動程式以將codec實現的功能由ap完成,並且,codec和headset裝置的連線也變成了ap和headset裝置的連線,這樣就存在對audiopolicy的部分了,畢竟最基本的是audio engin對audio device的選擇,由於是通話場景,需要使用low latency buffer,或之類似的,AOSP中就有這一類。gao 高通的ADSP也有從硬體到軟體的架構支援。
核心的修改涉及的是alsa驅動的編寫,主要包括裝置樹,pcm驅動,machine驅動以及bt虛擬出來的codec驅動,因為bt的硬體配置等在安卓6.0時放在了藍芽協議棧中,所以這裡使用虛擬codec實現是一個好的解決方案。
BT的配置如下:
1)hardware/broadcom/libbt/include/vnd_avl8890.txt ? SCO_I2SPCM_IF_ROLE = 1 SCO_PCM_IF_CLOCK_MODE = 1 SCO_PCM_IF_SYNC_MODE = 1 1改成0 --》0是slave,1是master 2)上面txt裡的flag最終影響bt_vendor_brcm.h,需要檢查裡面的bt設定跟AP側PCM設定是否一樣 如: /* PCM_DATA_FMT_SHIFT_MODE 0 : MSB first 1 : LSB first */ #ifndef PCM_DATA_FMT_SHIFT_MODE #define PCM_DATA_FMT_SHIFT_MODE 0 #endif相關的驅動是和ap相關的,這裡就略過了,apk層除錯用例見下一篇文章
相關推薦
藍芽之十九-HFPclient
在高通平臺和三星平臺上調過這個功能,基於安卓6.0,該功能是將手機上的藍芽功能用成和藍芽耳機一樣的功能。藍芽電話和藍芽音樂它們之間的差異較大,藍芽電話要求實時性比較高,其和A2DP使用的物理通路並不一致,藍芽電話走pcm物理通路,而藍芽音樂走uart通路。 關鍵詞 Hfpc
藍芽之十一 AVRCP協議
Profile簡介 AVRCP子協議的作用是支援CT控制TG,具體來說如果手機和一個藍芽音箱裝置連線上了,那麼音箱可以控制手機播放/暫停/切歌以及獲得手機上播放歌曲的資訊,如專輯,歌名,歌手,時長等資訊。iphone對資訊獲取支援較為完善,安卓手機差異性比較大,且支援的沒有
藍芽之十六-測試認證
藍芽測試認證 這裡使用的ROHDE&SCHWARZ的藍芽測試儀器。 bt 信令測試, 使用brcmbt輸入hci命令控制DUT藍芽,在儀器上檢查波形是否符合標準。 brcmbt --script /data/bt_tx # tx test file conten
轉:【Java並發編程】之十九:並發新特性—Executor框架與線程池(含代碼)
接口類 容易 20px 了解 大小 執行c 生命周期 schedule p s Executor框架簡介 在Java 5之後,並發編程引入了一堆新的啟動、調度和管理線程的API。Executor框架便是Java 5中引入的,其內部使用了線程池機制,它在java.
Java經典編程題50道之十九
pub main isp ring args int string class for 打印出如下圖案(菱形) * *** ****** ******** ****** *** * public class E
[Python爬蟲] 之十九:Selenium +phantomjs 利用 pyquery抓取超級TV網數據
images 判斷 nco dex onf etc lac lin 利用 一、介紹 本例子用Selenium +phantomjs爬取超級TV(http://www.chaojitv.com/news/index.html)的資訊信息,輸入給定關鍵字抓取
LLVM每日談之十九 LLVM的第一本系統的書<Getting Started with LLVM Core Libraries>
關於 日本 簡單的 lvm 作者 普通 lan 最好 裏的 作者:史寧寧(snsn1984)LLVM最終有了一本系統的書了——《Getting Started with LLVM Core Libraries》。這本書號稱是LLVM的第一本書,可是據說日本早就有兩本日文的
ElasticStack系列之十九 & bulk時 index 和 create 的區別
忽略 使用 sea amp tro creat 嘗試 ron 機制 區別: 兩篇文章 id 都一樣的情況下,index 是將第二篇文章覆蓋第一篇;create 是在第二篇插入的時候拋出一個已經存在的異常 解釋: 在批量請求的時候最好使用 create 方式進行導入。
C#設計模式之十九策略模式(Stragety Pattern)【行為型】
多條件 第一次 必須 this 數據傳遞 名稱 面向 div 想要 原文:C#設計模式之十九策略模式(Stragety Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第七個模式,該模式是【策略模式】,英文名稱是:Stragety Pattern。
skyfans之每天一個Liunx命令系列之十九:usermod
今天我們繼續來學習USER INFORMATION AND MANAGEMENT(使用者資訊和管理),今天學習的是什麼命令呢,那就是usermod(修改使用者帳號) Ready Go!!! usermod --help -c, --comment COMMENT 修改使用者賬
[BLE]低功耗藍芽之GAP、GATT
轉載自: https://blog.csdn.net/qq_21842557/article/details/50771077 一、開篇 本篇主要介紹一下關於BLE開發過程中必須瞭解的兩個協議:GAP(通用訪問協議)、GATT(通用屬性協議
自動生成材質Material(Unity3D開發之十九)
專案中,有時候匯入一些資源時候,需要對應建立材質球,如果每次自己動手建立,還是挺麻煩的,下面是如何匯入資源時候自動建立材質球。 using UnityEngine; using System.Co
常見設計模式的解析和實現(C++)之十九-Memento模式
作用:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態.這樣以後就可將該物件恢復到原先儲存的狀態.UML結構圖:解析:Memento模式中封裝的是需要儲存的狀態,當需要恢復的時候才取出來進行恢復.原理很簡單,實現的時候需要注意一個地方:窄介面和寬介面.所謂的寬介面就是一般意義
Java併發程式設計系列之十九:原子操作類
原子操作類簡介 當更新一個變數的時候,多出現資料爭用的時候可能出現所意想不到的情況。這時的一般策略是使用synchronized解決,因為synchronized能夠保證多個執行緒不會同時更新該變數。然而,從jdk 5之後,提供了粒度更細、量級更輕,並且在多核
Packet Tracer 思科模擬器入門教程 之十九 交換機埠安全
實驗目的 掌握交換機的埠安全功能,控制使用者的安全接入。 背景描述 你是一個公司的網路管理員,公司要求對網路進行嚴格控制。為了防止公司內部使用者的 IP 地址衝突,防止
[藍芽]低功耗藍芽之 GAP、GATT
低功耗藍芽之 GAP、GATT 低功耗藍芽之 GAP、GATT 基礎介紹 BLE GAP GAP 協議 GAP 裝置角色 GAP 廣播資料 GAP 廣播流程
[藍芽]藍芽之 SPP、HFP
藍芽之 SPP、HFP 藍芽之 SPP、HFP SPP HFP 藍芽之 SPP、HFP SPP 藍芽串列埠是基於 SPP 協議(Serial Port Profile),能在藍芽裝置之間建立串列埠進行資料傳輸
[藍芽]藍芽之 A2DP、AVRCP
藍芽之 A2DP、AVRCP 藍芽之 A2DP、AVRCP A2DP AVRCP 藍芽之 A2DP、AVRCP A2DP A2DP全名是Advenced Audio Distribution Profile
藍芽之資料傳輸問題
藍芽資料傳輸問題 對於藍芽來說google已經封裝好了很多api所以使用起來並不會很難,但是實際開發中藍芽開發最頭疼的問題不是如何去呼叫api,而是資料的互動方面,如長連線,資料續傳,硬體接受速率等問題. 開啟藍芽有幾種方式? 首先我們先了解下幾種常用的開啟方式. 第一種方法相對簡單,直接呼叫系統對
VS2013/MFC程式設計入門之十九(常用控制元件:靜態文字框)
從本節開始講解各種常用控制元件的用法。MFC中常用控制元件主要包括:靜態文字框、編輯框、單選按鈕、複選框、分組框、列表框、組合框、圖片控制元件、列表控制元件、樹形控制元件和進度條控制元件等等。本節先來講解靜態文字框的使用。 控制元件的通知訊息