国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 984|回復: 0
打印 上一主題 下一主題

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

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2020-6-11 10:31:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
目錄
目錄........................................................................................................................................... 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 硬件模塊
使用的是MTKMT6620芯片,MTK提供了Android4.0Android4.4driver, Porting Guid,
有了這些就為我們的移植工作做了總體性的指導。
但是僅僅有 MTK 提供的文檔還是遠遠不夠的,畢竟硬件接口定義不同,kernel 版本也
不同,Android層與MTK提供的代碼也有差異,這就需要我們在MTK文檔的指導下, Step byStep 進行 Porting 工作.

移植環境:
1 iTOP-4412 精英版 + MT6620 Bletooth 模塊
2 kernel 3.0.15 version
3 Android4.4.
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 的,如果您有興趣或者需求,可以移
植藍牙其他更豐富的功能與應用。

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠操.com | 久久久久久久久免费视频 | 久久国产成人精品麻豆 | 私色综合网 | 国产一区日韩二区欧美三 | 四虎影院紧急入口 | 九九免费精品视频在这里 | 色网站在线视频 | 麻豆蜜桃传媒在线观看 | 操操操网 | 色国产精品| 国产日韩欧美在线观看不卡 | www.4虎| 日产国产欧美视频一区精品 | 99国产精品国产精品 | 免费的黄视频 | 国产一级一片免费播放刺激 | 91视频社区| 欧美精品一区二区三区四区 | 四虎永久在线精品视频免费观看 | 91啪国产在线 | 国产一级一国产一级毛片 | 国产日本一区二区三区 | 青草网在线观看 | 四虎国产欧美成人影院 | 国产女18片毛片水真多 | 日产精品卡二卡三卡四卡乱码视频 | 四色6677最新永久网站 | 亚洲一区 欧美 | 爽爽日本在线视频免费 | 69国产成人综合久久精 | 韩国精品一区二区 | 2021国内精品久久久久久影院 | 黄网站在线播放视频免费观看 | 欧美3p在线观看一区二区三区 | 日韩欧美国产高清在线观看 | 亚洲网视频| 男人扒开你的下面狂躁的视频 | 日本在线视频免费看 | 免费久久精品国产片香蕉 | 久热这里都是精品 |