環境:
OS:Ubuntu 10.10
DMA-6410XP及DMA-6410L
Bluetooth USB Dongle
Kernel:linux-2.6.29
Android 2.1
編輯Kernel及Android原始碼部分本文不進行詳細敘述,細節請參照開發版所附書籍。
(本文使用的是隨手取得的無牌的香菇造型藍牙傳輸器價格大約在NT$200左右,
應該是Bluetooth V2.0+EDR規格其他並沒有測試過!!建議不要使用太新以避免Kernel內附驅動不支援)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6e_wXmZozPapDw3MkWwzlDaLmolDhob2u45D3Mi6myunZbmnNO4qyA03oGKm3gY8eLTpMlct-P-6BRplpKuBhFfkSbn3HxjOlLh1UwZbQz82g-hygDZcA2u68HeiZuvdKyjnPH1do5-Vx/s320/BT.jpg)
步驟一,Kernel選擇藍牙驅動
在Kernel目錄下執行 make menuconfig
Networking support --->
將 Bluetooth subsystem support 項打星號 " * "
將 RF switch subsystem support 項打星號 " * "
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyhXqm6YcPvQWtIC0ZX9KrREyJBocTX5wbOCCqh3btzhpZEiMcRjklXaX7TYT8oxELsxFgv3LXRhmJFYRptw3Su_QWVaAYEkoAZBfskcmH4xM2vDlfeB4woTHfNr3B52oBlcPDbJyay7SC/s320/001.jpg)
選擇 Bluetooth subsystem support --->
將全部選項打星號 " * "
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYQ1zgkj6SYcBDYRDJ7luB0kdHuDS8Oj3MU9XAwFdrkks5IgS0xTR35qDKkXfavWt-SGAsW4LhVPXD4VishCorzmZO8oXTUtsqTvY2XFNrJ-thKupzJwdKjH9BqZKayTy00vhpJPRPzE5G/s320/002.jpg)
然後選擇 :
Bluetooth device drivers --->
將下列選項打星號 " * "
HCI USB driver
HCI UART driver
UART (H4) protocol support
HCILL protocol support
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN1AGOy3XCjM2pPbDqO8XhZ0fsbEutq1dDSxu9PNNeZekK1xeYP12MpHdenSnxkYAGP0gxNkt9srKJgThZkcLcEBuouACFlzTy9w5bYsXEVB732_F95GAQNbchoYGXggxDTJSIJz2s8nOZ/s320/003.jpg)
退回到Networking support
選擇 RF switch subsystem support --->
將裡面兩項目都打星號 " * "
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHP070zZmurZSuQ2MFdL0fq7te32I3vuTJ_uzMsBD1mXT-x8RE7YGfOkF-mD_ADydHb2U79ma2nLe7l97uW7k89pp3AzafHic_24n876tTBH9_x_i66nWyW4EurIyNrDng4_xMeWL67SWZ/s320/004.jpg)
退出並存檔後接著開始編輯hci_core.h及hci_core.c
步驟二,編輯hci_core.h及hci_core.c
1.編輯hci_core.h
include/net/bluetooth/hci_core.h
在138行找到:
struct device dev;
struct module *owner;
中間插入:
struct rfkill *rfkill;
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJJ5SO06Q7lALkKgKWKkGuiPUjE0qE4mS7awpQGjTreincPOP0g25hjqWZIvnUlfBYLwVBzqlu1406eFe2IA16vfAZm4A-ygNj-v_fOXZ-folBV_kG9Z_5I4XedBP0TqgVaSv9NBWFly0v/s320/005.jpg)
存檔完成hci_core.h檔案編輯。
2.編輯hci_core.c
net/bluetooth/hci_core.c
在41行找到:
#include <linux/notifier.h>
#include <net/sock.h>
中間插入:
#include <linux/rfkill.h>
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0pYZfyyOE2mRNtkK4Wgi-jltH1jK8LtyH5kWmvEWr0J0mx8e6nkCJvKTW3Iyec3GYHalBuqkNWV_ro17FDY7IaqNkw1CmZ7zl4YTRWMKJtbZaW9TvEzZNlpoG_YkobCzwIVMs2X9HPqrd/s320/006.jpg)
在478行找到:
hci_req_lock(hdev);
if (test_bit(HCI_UP, &hdev->flags)) {
......
中間插入:
if (hdev->rfkill && hdev->rfkill->state == RFKILL_STATE_HARD_BLOCKED) {
ret = -EBUSY;
goto done;
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZPgGHAf_jZD4Z98UiySf2Ez7flrDgzdKNBnOXOQt7Khrn94pN_tNsGRCPLN39XUMB44GgMOLwA8gTuDG3cgA8gF4hf3iZl0awYZE8UGO70bGXNqtIF9Aoo0xaWAR52RrdmRN-dYggs65t/s320/007.jpg)
在820行找到:
/* ---- Interface to HCI drivers ---- */
/* Alloc HCI device */
中間插入:
static int hci_rfkill_set_block(void *data, enum rfkill_state state)
{
struct hci_dev *hdev = data;
bool blocked = !(state == RFKILL_STATE_UNBLOCKED);
BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
if (!blocked)
return 0;
hci_dev_do_close(hdev);
return 0;
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWgF-Z-PHoyFdGQIV09UfcDJWzMHEm8MfmgrFu2REa74XvbWNi3z59_GTuVQNJJ8bJEcBiCaPau9GcW7sfYo2unFaeH6sNlhYxj2fxdYt9JgCiaaoVH-1NF7Xll2RzOiCQZF6JNIi7QatE/s320/008.jpg)
在923行找到:
hci_register_sysfs(hdev);
hci_notify(hdev, HCI_DEV_REG);
中間插入:
hdev->rfkill = rfkill_allocate(&hdev->dev, RFKILL_TYPE_BLUETOOTH);
if (hdev->rfkill) {
hdev->rfkill->name = hdev->name;
hdev->rfkill->toggle_radio = hci_rfkill_set_block;
hdev->rfkill->data = hdev;
if (rfkill_register(hdev->rfkill) < 0) {
rfkill_free(hdev->rfkill);
hdev->rfkill = NULL;
}
}
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTDuFtWZ_YIC5S8PI_Piq8pjXWBKGwch0vIwgohZ-zR_HIsycaXjPTs8pEjqmoMGMNthfXmaRoDSxaOuoBeFSdjn1Xnyc5Bpx2HWq_NZ2F5HPR-X6XcM4mUVyKel38vwNBx1H6uzRz7tcD/s320/009.jpg)
存檔完成hci_core.c檔案編輯。
步驟三,重新編譯Kernel
執行make clean及make開始編譯。
步驟四,編譯Android原始碼
1.參考: Bluetooth FAQ
https://sites.google.com/a/android.com/opensource/projects/bluetooth-faq
Q. How do I compile Android with Bluetooth support enabled?
A. Add this to your BoardConfig.mk:
BOARD_HAVE_BLUETOOTH := true
2.編輯init.rc加入 /sys/class/rfkill/rfkill0/state 可讀寫權限:
(android_source/system/core/rootdir/init.rc)
#bluetooth power up/down interface
chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state
chmod 0660 /sys/class/rfkill/rfkill0/state
3.重新編譯Android原始碼後上載到開發平台上,測試看看在setting --> Wireless & network setting 將Bluetooth項目打勾就可以使用藍牙通訊了。
如果Bluetooth項目打勾沒有反應的話,在console下執行logcat確認是否/sys/class/rfkill/rfkill0/state檔案權限問題,如果為檔案權限問題ctrl-c離開logcat執行chmod 666 /sys/class/rfkill/rfkill0/state再進設定去將藍牙選項打勾應該就可以了。
上述步驟完成後,目前測試了藍牙GPS是可以接收到訊號,有時間再測試其他試試看。
參考:
Bluetooth FAQ
https://sites.google.com/a/android.com/opensource/projects/bluetooth-faq
請問您這target platform?
回覆刪除是Android?版本
bluez又是版本?
現在我新增build/target/board/generic/BoardConfig.mk,
BOARD_HAVE_BLUETOOTH := true
重新編譯Android原始碼
就出錯
target platform:mini6410
android sdk:2.3.4
bluez:4.6.9
我想請問一下,我現在的usb bluetooth 還是有權限上的問題
回覆刪除需要進入adb 下chmod 666 /sys/class/rfkill/rfkill0/state
的指令
但是每次重開機 就得使用同樣的方式 下指令
想請問 有沒有方法可以 讓他自動開啟 不需要每次都下指令才能啟動
2.編輯init.rc加入 /sys/class/rfkill/rfkill0/state 可讀寫權限:
回覆刪除(android_source/system/core/rootdir/init.rc)
#bluetooth power up/down interface
chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state
chmod 0660 /sys/class/rfkill/rfkill0/state
不好意思 想問一下
回覆刪除我的板子上就已經有藍芽的功能
只是android沒辦法把它開起來
不知道這篇的方法能不能套用在有藍芽的板子
還是要再做些修改
最近在研究 很多不懂
希望能多請教