1. 程式人生 > >藍芽之十九-HFPclient

藍芽之十九-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特點,修改如下:
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;

 }
到這裡應該有藍芽提示音出現了。也就是藍芽的呼叫事件能夠正常響應了,但是呼叫響應是通過UART走的是AT command協議,提示音是hfp client自帶的。
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的第一本系統的書&lt;Getting Started with LLVM Core Libraries&gt;

關於 日本 簡單的 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中常用控制元件主要包括:靜態文字框、編輯框、單選按鈕、複選框、分組框、列表框、組合框、圖片控制元件、列表控制元件、樹形控制元件和進度條控制元件等等。本節先來講解靜態文字框的使用。        控制元件的通知訊息