原文链接地址:http://source.android.com/porting/bluetooth.html#androidBluetoothPorting
本文涵盖以下方面
· 移植
· 编译
· 疑难解答
· 工具
· 支持特性
Android 的蓝牙协议栈使用BlueZ实现来对GAP, SDP以及RFCOMM等应用规范的支持,并获得了SIG认证。由于Bluez使用GPL授权, 所以Android 框架通过D-BUS IPC来与bluez的用户空间代码交互以避免使用未经授权的代码。
Android 在应用框架framework中实现HSP和HFP(v1.5)规范,并且与电话应用(Phone App)配合紧密。
下图展示了蓝牙软件栈面向库的视图,在它下面是面向进程的视图。
图1 面向库的视图
图中使用实线的块是在android中实现的,而虚线的部分则由合作伙伴具体定制。
图2 面向进程的视图(基于1.0版本)
移植
BlueZ兼容bluetooth 2.1, 支持任意基于蓝牙2.1的芯片组, 并且后向兼容早期的版本。移植中有两个与芯片的结合点:
· UART 驱动
· 蓝牙电源开关
UART 驱动
BlueZ内核子系统通过守护进程hciattach 与特定硬件的UART驱动进行绑定。
以MSM7201A为例,参考drivers/serial/msm_serial.c。你可能还需要编辑init.rc 中hciattach 的命令行选项。
蓝牙电源开关
Android V1.0与之前的版本采用不同的方式控制蓝牙芯片的电源开关。
1.0: Android 框架向/sys/modules/board_[PLATFORM]/parameters/bluetooth_power_on 写0或1.
Post 1.0: Android 框架使用 linux中 rfkill 的API。
可以参考 arch/arm/mach-msm/board-trout-rfkill.c。
编译
为了使能Android的蓝牙功能,在编译时需要在 BoardConfig.mk中加入
BOARD_HAVE_BLUETOOTH := true
疑难解答
调试
在开始时,可以通过读log (adb logcat)并寻找蓝牙相关的 ERRROR 和 WARNING 信息来调试你的蓝牙实现, Bluez中也包含了一些十分有用的调试工具。下面按照推荐顺序提供了一些例子。
hciconfig -a # print BT chipset address and features. Useful to check if you can communicate with your BT chipset.
hcidump -XVt # print live HCI UART traffic.
hcitool scan # scan for local devices. Useful to check if RX/TX works.
l2ping ADDRESS # ping another BT device. Useful to check if RX/TX works.
sdptool records ADDRESS # request the SDP records of another BT device.
后台进程的Log
后台进程hcid (STDOUT) 和 hciattach (STDERR)的log默认输出到/dev/null。可以编辑 init.rc 和 init.PLATFORM.rc 来使这些进程在 logwrapper下运行,从而将输出重定向到logcat.
hciconfig -a 和 hcitool
当使用你自己编译的system.img时, 如果 hciconfig -a 可以正常工作但hcitool 却不能正确扫描, 可以尝试为蓝牙芯片组安装固件。目前的开源代码库中并不提供该固件, 但是你可以通过使用 adb pull 然后 adb push从早期的T-Mobile G1中获取 (位于 /etc/firmware/brf6300.bin).
工具
BlueZ 提供了一套丰富的基于命令行的工具用于调试与并与蓝牙子系统进行交互,其中包括:
· hciconfig
· hcitool
· hcidump
· sdptool
· dbus-send
· dbus-monitor