iTOP-4412開發板-Android4.4-Bluetooth移植文檔

目錄
目錄........................................................................................................................................... 1
1.1 概述.................................................................................................................................. 1
1.2 硬件相關部分 .................................................................................................................. 2
1.3 Kernel ............................................................................................................................... 4
1.3.1 概述......................................................................................................................... 4
1.3.2 代碼修改 ................................................................................................................. 5
1.4 用戶態空間 ...................................................................................................................... 8
1.5 HAL 層移植 ...................................................................................................................... 9
1.5.1 Bluedroid ............................................................................................................. 10
1.5.2 init.connectivity.rc 文件 ..................................................................................... 12
1.5 總結 ................................................................................................................................. 12
1.1 概述
近期需要把 Bluetooth 移植到 iTOP-4412 開發平臺,查閱了相關資料,經過一段時間
的研究、調試,終於成功的將藍牙功能移植到了開發板上面,這裏筆者記錄移植過程及注意
事項,方便以後工作需要。
iTOP-4412 開發板的 Bletooth 模塊與板卡之間的連接採用 UART 接口,Bletooth 硬件模塊
使用的是MTK的MT6620芯片,MTK提供了Android4.0及Android4.4的driver, Porting Guid,
有了這些就爲我們的移植工作做了總體性的指導。
但是僅僅有 MTK 提供的文檔還是遠遠不夠的,畢竟硬件接口定義不同,kernel 版本也
不同,Android層與MTK提供的代碼也有差異,這就需要我們在MTK文檔的指導下, Step byStep 進行 Porting 工作.
 
移植環境:
1 iTOP-4412 精英版 + MT6620 Bletooth 模塊
2 kernel 3.0.15 version
3 Android4.4.
Ubuntu12.04 64BIt 開發環境
 
1.2 硬件相關部分
由於 MT6620 芯片集成了 Bluetooth,WiFi, FM,GPS 功能,所以 Bluetooth 的原理圖可查看
MT6620 WiFi 原理圖部分,下圖爲 Bletooth 模塊與開發板連接的引腳定義,通過該接口可以
知道 Bluetooth 模塊與 CPU 的交互接口.

 

1.2 硬件相關部分
由於 MT6620 芯片集成了 Bluetooth,WiFi, FM,GPS 功能,所以 Bluetooth 的原理圖可查看
MT6620 WiFi 原理圖部分,下圖爲 Bletooth 模塊與開發板連接的引腳定義,通過該接口可以
知道 Bluetooth 模塊與 CPU 的交互接口.

 

▆ UART 串口: Bluetooth 與 CPU 之間的通信接口,命令和數據的傳輸都是經過串口交
換的。另外 MT6620 固件補丁的下載也是通過串口進行的,所以說串口是必不可少的硬件接
口。上圖中 Pin8,Pin10 爲串口部分,與 CPU 的串口 0 連接.
▆ MT6620 芯片使能引腳: Pin16 PMU_EN  , 使能引腳,默認低電平狀態,高電平有效,
啓用藍牙功能之前需要先使能該引腳,這樣 MT6620 纔開始工作。
▆  中斷引腳:Pin 14 BGF_INT , Blutooh, GPS,FM 共用的中斷引腳,用於告知 CPU 有數
據來了,或者說有請求到了.
▆ 復位引腳: Pin15 WiFi_RESET ,該引腳與 MT6620 的 SYSRST_B 連接,用於芯片的復位
操作.
▆ 芯片工作電壓:Pin12 提供 1.8V 的電壓輸入,Pin19 提供 3.3V,Pin20 提供 5V 電壓輸入.
下圖爲 MT6620 模塊原理圖部分:
MT6620 的 引 腳 定 義 如 下 :
以上是進行 Porting 前的準備工作,當然需要萬用表示波器工具進行輔助的檢測,查看
Bluetooth 模塊的工作電壓是否正常,GPIO 的當前狀態,串口的數據波形.
另外需要強調的是,MT6620 Bluetootch 支持藍牙 4.0 規範,藍牙 4.0 規範包括常規藍牙,
高速藍牙,還有很重要的低功耗藍牙,即 BLE 的支持,下面是 MT6620 藍牙特性:
▆ 支 持 Bluetooth V2.1 +EDR
▆ 支 持 Bluetooth 3.0+HS compliance
▆ 支 持 Bluetooth V4.0 Low Energy (LE)
▆  使用 UART / PCM 接口
▆  模組包含 PA with 13 dBm (class 1) transmit power
▆  Better WiFi/BT coexistence performance
▆  Low power scan function to reduce the power consumption in scan modes
關於 MT6620 的更多硬件特性,請參考 MTK 官方發佈的 MT6620 硬件使用指導相關文檔.
1.3 Kernel
1.3.1  概述
iTOP4412 開發板採用的內核是 Linux 3.0.15 版本,MTK 官方給的移植 Porting 沒有說明
針對具體的 kernel 版本,由於是 Android4.4,所以 kernel 應該是 3.0 以後的版本或者更高支
持;
首先按照 PoringGuid 的指導說明,把 New 和 Modify 文件夾下面關於 kernel 部分的修改
放到我們的 kernel 代碼裏面, 把 MT6620 的驅動放在 driver/misc/目錄下面,文件夾名稱
mediatek,裏面存放的是 WMT,既 wireless manage tools, 裏面提供了與 MT6620 download
firmware patch ,enable /disable MT6620 芯片,power on, power off 操作的相關驅動部分, 及
SDIO 總線設備接口驅動 Host Interface drivers. 藍牙驅動 mtk_stp_bt.ko 的源碼也在這個目錄
下面,我們以驅動庫 .ko 的形式編譯驅動模塊.
driver/misc/mediatek/ 庫文件列表如下::
mtk_hif_sdio.ko ----mmc 總線相關接口,mmc 總線發現 SDIO 設備,分配總線地址後,會與該
驅動進行適配.適配成功後該驅動會調用 WiFi 網絡驅動,另外 Bluetooth 也使用了該驅動庫文
件提供的相應接口;
mtk_stp_uart.ko-----串口相關驅動,通過串口下載固件補丁,設置芯片參數;
mtk_stp_wmt.ko-----core 部分,提供 Bluetooth 上電,斷電,PSM 省電管理操作等
mtk_stp_bt.ko ----字符設備驅動,創建 Bluetooth 設備節點用於與用戶空間交互;
另外這裏附一張 Blutooth Kernel 層驅動層次圖:
上圖紅色部分 BlueZ, Hci_stp.ko 爲 Android4.0 Bluetooth 使用的藍牙協議棧與 Kernel 庫文
件。藍色部分 Bluedroid, mtk_stp.bt.ko 爲 Android4.4 版本使用的藍牙協議棧與 kernel 庫文
件。Android4.0 與 Android4.4 關於 Bluetooth 部分變化比較大,請大家移植過程中注意這一
點,他們之間的具體差異這裏不再講解。
從上圖可以看到 bluetooth 驅動調用關係:
mtk_stp_bt.ko -> mtk_stp_wmt.ko -> mtk_stp_uart.ko -> uart driver
最後最底層的串口驅動負責藍牙命令,數據的發送與接收.
1.3.2  代碼修改
1 根據硬件連接情況配置必要的平臺資源
修改文件: kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c
關鍵函數: 該函數配置 MT6620 相關的 GPIO 引腳爲初始化輸出狀態,或者配置爲中斷狀態,
Bluetooth 驅動會改變這些引腳的狀態,這裏僅僅是初始化.
static void __init mtk_combo_init(void)
{
//MT66XX PMUEN
if(gpio_request(EXYNOS4_GPC1(0), "GPC1_0"))
{
printk(KERN_ERR "failed to request GPC1_0 for MT6620 PMUEN
control\n");
}
//MT66XX SYSRST
if(gpio_request(EXYNOS4_GPC1(1), "GPC1_1"))
{
printk(KERN_ERR "failed to request GPC1_1 for MT6620 SYSRST control\n");
}
s3c_gpio_cfgpin(EXYNOS4_GPC1(0), S3C_GPIO_OUTPUT);
s3c_gpio_cfgpin(EXYNOS4_GPC1(1), S3C_GPIO_OUTPUT);
gpio_direction_output(EXYNOS4_GPC1(0), 0);
gpio_direction_output(EXYNOS4_GPC1(1), 0);
gpio_free(EXYNOS4_GPC1(0));
gpio_free(EXYNOS4_GPC1(1));
mdelay(5);
//need config eint models for Wifi & BGA Interupt
if (gpio_request(EXYNOS4_GPX2(5), "WiFi INT"))
printk(KERN_WARNING "MT6620 WiFi INT(GPX2.5) Port request error!!!\n");
else {
s3c_gpio_setpull(EXYNOS4_GPX2(5), S3C_GPIO_PULL_NONE);
s3c_gpio_cfgpin(EXYNOS4_GPX2(5), S3C_GPIO_SFN(0xF));
gpio_free(EXYNOS4_GPX2(5));
}
if (gpio_request(EXYNOS4_GPX2(4), "BGF INT"))
printk(KERN_WARNING "MT6620 BGA INT(GPX2.4) Port request error!!!\n");
else {
s3c_gpio_setpull(EXYNOS4_GPX2(4), S3C_GPIO_PULL_NONE);
s3c_gpio_cfgpin(EXYNOS4_GPX2(4), S3C_GPIO_SFN(0xF));
gpio_free(EXYNOS4_GPX2(4));
}
//normal it is high level
if (gpio_request(EXYNOS4_GPX3(2), "6260_GPIO2")!=0) {
printk("[mt6620] ERROR:Cannot request 6260_GPIO2\n");
} else {
gpio_direction_output(EXYNOS4_GPX3(2), 1);/* WLAN_CHIP_PWD */
gpio_set_value(EXYNOS4_GPX3(2), 1);
mdelay(100);
gpio_free(EXYNOS4_GPX3(2));
}
return; }
關鍵結構體: 該結構體告訴 MT6620 驅動相關部分使用了平臺的哪些 GPIO 資源.
結構體所屬文件: kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c
static struct mtk_wmt_platform_data mtk_wmt_pdata = {
.pmu  =EXYNOS4_GPC1(0),  //RK30SDK_WIFI_GPIO_POWER_N,//RK30_PIN0_PB5,
//MUST set to pin num in target system
.rst = EXYNOS4_GPC1(1),//RK30SDK_WIFI_GPIO_RESET_N,//RK30_PIN3_PD0, //MUST
set to pin num in target system
.bgf_int=EXYNOS4_GPX2(4),
//IRQ_EINT(20),//RK30SDK_WIFI_GPIO_BGF_INT_B,//RK30_PIN0_PA5,//MUST set to pin num in
target system if use UART interface.
.urt_cts = -EINVAL, // set it to the correct GPIO num if use common SDIO, otherwise set
it to -EINVAL.
.rtc = -EINVAL, //Optipnal. refer to HW design.
.gps_sync = -EINVAL, //Optional. refer to HW design.
.gps_lna = -EINVAL, //Optional. refer to HW design.
};
static struct mtk_sdio_eint_platform_data mtk_sdio_eint_pdata = {
.sdio_eint  =
EXYNOS4_GPX2(5),//IRQ_EINT(21) ,//RK30SDK_WIFI_GPIO_WIFI_INT_B,//53, //MUST set pin
num in target system.
};
static struct platform_device mtk_wmt_dev = {
.name = "mtk_wmt",
.id = 1,
.dev = {
.platform_data = &mtk_wmt_pdata,
},
};
static struct platform_device mtk_sdio_eint_dev = {
.name = "mtk_sdio_eint",
.id = 1,
.dev = {
.platform_data = &mtk_sdio_eint_pdata,
},
};
MTK 官方移植文檔中會告訴我們需要在原始內核代碼裏面增加哪些文件,如何在 make
menuconfig 中配置相關部分,這裏就不再詳細描述.
注意:藍牙驅動雖然沒有使用到 mmc  總線,但是 mtp_hif_sdio.ko  驅動導出了接口函數,
mtk_stp_wmt.ko  核心驅動庫 會調用導出函數以 ,所以 mtp_hif_sdio.ko  需要加載到內核空間,
有 如果您的產品中不含有 WiFi ,  僅僅需要 Bluetooth  功能,那麼完全可以不用配置 MMC  總
線部分,不影響藍牙的使用 ,但是務必加載 mtp_hif_sdio.ko  文件。
另外 MT6620 具備功耗控制功能,默認情況下如果 MT6620 處於 idle 空閒狀態,空閒時
間大於 60 秒後,會自動進入 sleep 狀態,有中斷觸發時會喚醒,繼續工作,您可以使用 "echo
0 0 > /proc/driver/wmt_dbg "命令關閉功耗控制,這樣MT6620會始終不會進入sleep狀態。
另外也可以修改 MT6620 mtk_stp_wmt.ko 驅動中的參數,更改 ide to sleep 的時間.
MTK 官方提供的驅動代碼中芯片默認 idle 5 秒後會進入 sleep 狀態,使用藍牙接
收文件時,如果用戶響應時間超過了 5 秒(用戶沒有單擊接收或者拒絕按鈕),MT6620 會
休眠,驅動會導致 MT6620 會進入 RESET 狀態,從而 Bluetooth 服務會出現問題,Bluetooth
功能不可使用,爲了避免這樣的問題發生,我們把休眠時間由默認的 5 秒調整到了 60 秒,
給用戶足夠多的響應時間,用戶在 60 秒內 接收或者拒絕藍牙手機發給板卡的文件,另外文
件接收完成後,需要單擊狀態欄中的文件接收完成提示,儘量在 Android4.4 狀態欄中不含
有關於藍牙消息的提醒。
u
1.4 用戶態空間
下面我們描述一下采用 Linux 系統和 Android 系統的用戶都需要注意的地方:
驅動層移植完成後, MTK 的 Porting Guid 會告訴你需要在用戶態運行 wmt_launcher 工
具,作爲後臺的一個服務程序運行,該服務會配置串口的工作參數,下載固件補丁到 MT6620
中,他的源代碼相對比較簡單,只有一個.c 文件:
原始文件位於 MTK 發佈包:
APEX_Android_4.4_MP_SW_package_V2.0/APEX_Android_4.4_MP_001_panda_combo_mt66xx
_Package_Common/New/hardware/mediatek/wmt/stp_uart_launcher.c
修改後的文件位於 iTOP-4412 Android4.4 發佈包:
iTop4412_KK4.4/hardware/mediatek/wmt/stp_uart_launcher.c
修改點主要在串口參數配置上,由於內核版本不同,串口設置參數也略有不同.
具體修改可以使用代碼比對工具進行比較。
另外需要說明的是運行 wmt_launcher 的運行參數 跟 MTK 給的移植文檔有點不同,
Porting Guid 裏面推薦串口波特率使用 921600, 而在 iTOP-4412 的板子上面採用該值會工作不
正常,導致固件補丁無法下載,開始懷疑板卡不支持該波特率,後使用串口測試工具專門針對這
個串口進行 921600 測試,也沒發現問題,後沒有繼續查找,而是運行 wmt_launcher 時採用 115200
波特率:
wmt_launcher -b 115200 -d /dev/ttySAC0 -p /system/etc/firmware &
注意: 如果您的操作系統使用的是 Linux 而不是 Android,需要修改 stp_uart_launcher.c
原始代碼裏面有 Android 特有的屬性相關部分,Linux 系統不具有這個特性,我們提供了修改好
的 文 件 : stp_uart_launcher-linux-ok.c , 用 戶 可 以 作 爲 參 考 , 該 文 件 與 原 始 文 件
stp_uart_launcher-ori.c,及正常工作的文件 stp_uart_launcher.c 位於相同目錄下面.
無論是 Linux 系統還是 Android 系統,掛載根文件系統以後需要運行 wmt_launcher 服務,該
服務在後臺運行,打開 /dev/ttySAC0 串口,監控着串口上報的事件,對事件進行響應,比如內
核上報 "下載固件補丁" 事件,那麼 wmt_launcher 會打開 /system/etc/firmware 下面的固件補
丁,然後下載到 MT6620 模塊中,該服務不可以被用戶終止運行.
1.5 HAL  層移植
Bluetooth 的 HAL 層主要有 Bluedroid 協議棧與 MT6620 vendor 提供底層庫文件組成。
需要我們重點關注的有 bluetooth.default.so 該動態庫文件提供了 Framework 層調用 HAL
層的 API 接口,同時向下調用 libbt-hci.so 。
bluetooth.default.so 包含兩個靜態庫:libbt-brm_stack.a libbt-brm_bta.a . libbt-brm_stack.a 提
供 Bluetooth 各種 profiles 的支持, 比如 a2dp,hid,pan 等等, libbt-brm_bta.a 用於與
framdwork 層進行通信.
libbt-hci.so 該動態庫提供 bluetooth.default.so 的底層支持,另外他會調用 libbt-vendor.so 接口,
通過串口發送,接收命令,數據的操作也是通過該動態庫實現的。他位於 bluedroid 源碼目錄
hci 文件夾下。
libbt-vendor.so 廠 商 庫 文 件 , 用 於 實 現 廠 商 提 供 的 藍 牙 模 塊 特 性 支 持 , 庫 文 件 位 於
android4.4/iTop4412_KK4.4/hardware/mediatek/bt/combo_mt66 目錄下。
1.5.1 Bluedroid
從 Android 4.2 開始,Bluetooth stack 發生了重大改變:從 Bluez 換成了由 Google 和 Broadcom
聯合開發的 Bluedroid(當然,核心的部分還是 Broadcom 的,Google 主要是做了和上層 Framework
相關的部分)。
Bluedroid 和 Bluez 相比,有如下優點:
■ 層次結構清晰。各個 profile 對上層接口統一,便於增加新的 profile;
■ 增加了 HAL 層,便於移植。
■ 去掉了 DBus,Framework 的 Java 代碼直接調用到 Bluedroid 的 Native 代碼。
但是 Android 4.2 中的 Bluedroid 與 Android 4.0 中的 Bluez 相比,功能要少,例如不支持 AVRCP
1.3, Bug較多,例如某些藍牙耳機不能重撥最後一個電話。最重要的是4.2的Bluedroid不支持BLE。
不過在剛剛發佈的 Android 4.3 中已經有了很多改進,AVRCP 1.3 和 BLE 都得到了支持。
目前有一些Android 4.1或4.2的設備是支持BLE的,但是都是採用的Vendor自己的解決方案,
比如 Bluetooth stack 採用 Bluez 5.x,再提供 Vendor BLE Android SDK. 現在 Android 4.4 已經發布,
從未來發展趨勢來看,如果有人要學習 Bluetooth in Android,建議不要再研究 Bluez,最好轉向
Bluedroid。
以下是 Android 4.4 中 Bluetooth 相關代碼之分佈:
筆者在進行 Bluetooth 的調試過程中,使用 Logcat 命令輸出 Android 的調試信息,在 Android
的Setting界面開啓藍牙功能,根據打印信息的輸出,發現Enable Bluetooth的過程中出現了問題,
最後查找原因是因爲 MT6620 芯片工作前需要需要下載固件補丁,這個過程需要花費一定的時間,
然後 bluetooth.default.so 庫文件代碼中對開啓 Bluetooth 有一定的時間限制,默認情況下是 3000
毫秒的超時時間,超時後會 disable 藍牙,後經筆者修改爲 20 000 毫秒,這樣即可 enable 藍牙
芯片,從而進入工作狀態.
修改文件: iTop4412_KK4.4/external/bluetooth/bluedroid/Android.mk
1.5.2 init.connectivity.rc  文件
init.connectivity.rc 文件路徑:
iTop4412_KK4.4/hardware/mediatek/config/combo_mt66xx/ init.combo_mt66xx.rc
原始文件名稱爲 init.combo_mt66xx.rc,拷貝到 ramdisk 的 root 目錄下面名稱變更爲
init.connectivity.rc 文件 。
我們在該文件增加了加載驅動模塊庫操作,運行 wmt_lanucher 服務操作,另外需要注意
文件原有的創建 bluetooth 相關目錄操作,及修改權限,變更擁有者,這些 command 非常
的重要,比如:
# Load Blue module
insmod /system/lib/modules/mtk_stp_bt.ko
chmod 0660 /dev/stpbt
chown bluetooth system /dev/stpbt
mkdir /data/bluetooth 0711 bluetooth bluetooth
mkdir /data/misc/bluedroid 0771 bluetooth bluetooth
1.5  總結
用戶在移植 HAL 層之前可以先使用 MTK 提供的藍牙測試工具 autobt 進行測試,該測試
工具脫落複雜的 HAL 層,直接調用 libbt-vendor.so 也就是廠商自己的庫文件,在 Android 的
命令行中執行即可,可以使用該命令查詢其他的藍牙設備,發送,接收文件等等。是判斷藍
牙硬件是否正常工作的有力工具,使用autobt測試通過後,再調試Android HAL及上層部分。
autobt 工具的源碼位於:
iTop4412_KK4.4/hardware/mediatek/utility/hw_test_tool/bluetooth/src/tool
另外 MTK 官方提供了 Bluetooth 的多個補丁,路徑:
APEX_Android_4.4_MP_SW_package_V2.0/Document/BT_patch_description(must read)
這些補丁是比較重要的,有關於藍牙基礎連接方面的,也有關於藍牙文件發送接收,藍
牙鼠標,藍牙耳機方面的,需要根據您的產品需求打對應的補丁,我們發佈的 Android4.4
代碼中已經打上了藍牙基礎連接,和文件發送接收方面的補丁,其他的補丁未處理.

 

HAL 層修改完成後在 Android4.4 的 Setting 裏面打開 Bluetooth,就可以掃描到其他藍牙
設備,然後進行配對,配對完成後就可以進行文件的傳輸操作了,筆者僅測試了藍牙的文件
發送與接收功能,其他的藍牙功能比如藍牙耳機,藍牙鼠標的使用均未進行測試,不過有了
文件發送接收的測試基本說明了藍牙的 Porting 是 OK 的,如果您有興趣或者需求,可以移
植藍牙其他更豐富的功能與應用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章