天天看點

Linux 下藍牙驅動移植

藍牙驅動移植

轉自:http://blog.sina.com.cn/s/blog_7834f3e90100r57c.html

作者藍牙裝置是:USB藍牙,晶片制造商: CSR,  晶片型号: 41B14。晶片上貼的是AS6320QA。可見是水貨。但在windows下測試可以使用。

[A]   核心配置  

Linux 2.6版本之後的核心一般都有藍牙子產品的配置,是以不用再打更新檔了。一般在配置核心的時候選擇如下選項:

[*] Networking support  --->                

<*>   Bluetooth subsystem support  --->  //藍牙子系統必須選擇

<*>   L2CAP protocol suppor       //邏輯鍊路控制和适配協定。

<*>   SCO links support            //藍牙語音和耳機支援

<*>   RFCOMM protocol suppor       //面向流的傳輸協定,支援撥号網絡等

[*]   RFCOMM TTY support          

<*>   BNEP protocol support        //藍牙網絡封裝協定,自組網支援

[*]   Multicast filter support     //藍牙多點傳播,支援支援BNEP

[*]   Protocol filter support //藍牙多點傳播,支援支援支援BNEP

<*>   HIDP protocol support        //基本支援協定

Bluetooth device drivers  --->

<*> HCI USB driver               //USB藍牙子產品支援

<M>HCI UART driver               //基于序列槽,CF卡或PCMCIA的藍牙

<*> HCI BlueFRITZ! USB driver

<*> HCI VHCI (Virtual HCI device) driver

其餘的選項,根據自己的藍牙裝置進行調整。

[B]     藍牙協定棧移植

a)       需要的軟體包

可以在http://sourcearchive.com/下載下傳多用到的所有軟體包

 (1) D-Bus library 提供簡單的應用程式互相通訊

下載下傳位址:http://www.freedesktop.org/wiki/Software/dbus#Download

 (2) GLib library    GLib是GTK+和GNOME工程的基礎底層核心程式庫,是一個綜合用途的實用的輕量級的C程式庫,它提供C語言的常用的資料結構的定義、相關的處理函數,有趣而實用的宏,可移植的封裝和一些運作時機能,如事件循環、線程、動态調用、對象系統等的API。它能夠在類UNIX的作業系統平台(如LINUX, HP-UNIX等),WINDOWS,OS2和BeOS等作業系統台上運作。

下載下傳位址:http://ftp.gnome.org/pub/gnome/sources/glib/2.26/

(3) USB library (optional) 是一個用C語言開發的跨平台的USB裝置通路接口庫。

下載下傳位址:http://www.libusb.org/

(4) Lexical Analyzer (flex或 lex)          詞法分析器

下載下傳位址:http://linux.softpedia.com/get/Programming/Interpreters/Flex-23296.shtml

(5)YACC (yacc, bison, byacc)           Unix/Linux上一個用來生成編譯器的編譯器(編譯器代碼生成器)

下載下傳位址:http://invisible-island.net/byacc/byacc.html

(6) alsa-libALSA 應用

下載下傳位址:http://www.alsa-project.org/

b)        解壓編譯

在編譯之前,首先将下載下傳的所有包都放在 bluetooth 檔案夾下。并在該檔案夾下建立 bluetooth-build 檔案夾,并将其輸出到環境變量。

#cd  Bluetooth

#mkdir  bluetooth-build

#blue=$PWD/bluetooth-build

#export blue

#export          //檢查是否包含blue環境變量

(1)     編譯 alsa-lib 庫

#tar  -jxvf alsa-lib-1.0.24.1.tar.bz2

#cd alsa-lib-1.0.24.1

#./configure --prefix=$blue CC=arm-linux-gcc --host=arm-linux --disable-python

#make

#make install

(2)     編譯 expat

#tar –zxvf expat-2.0.1.tar.gz

#cd expat-2.0.1

#./configure --prefix=$blue CC="arm-linux-gcc -I$blue/include -L$blue/lib " --host=arm-linux

#make

#make install

(3)     D-Bus

#tar  dbus-1.4.1.tar.gz

#cd  dbus-1.4.1

配置configure:

#echo ac_cv_have_abstract_sockets=yes>arm-linux.cache

#./configure --prefix=$blue CC="arm-linux-gcc -I$blue/include -L$blue/lib " --host=arm-linux--cache-file=arm-linux.cache --with-x=no

(4)     編譯 glib 庫

#vi arm-linux.cache

在其中輸入如下内容:

glib_cv_long_long_format=ll

glib_cv_stack_grows=no

glib_cv_working_bcopy=no

glib_cv_sane_realloc=yes

glib_cv_have_strlcpy=no

glib_cv_va_val_copy=yes

glib_cv_rtldglobal_broken=no

glib_cv_uscore=no

ac_cv_func_posix_getpwuid_r=yes

ac_cv_func_nonposix_getpwuid_r=no

ac_cv_func_posix_getgrgid_r=no

glib_cv_use_pid_surrogate=no

ac_cv_func_printf_unix98=no

ac_cv_func_vsnprintf_c99=no

ac_cv_path_GLIB_COMPILE_SCHEMAS=yes

或者不建立arm-linux.chach檔案,直接輸入如下指令也可以:

echo glib_cv_long_long_format=ll>arm-linux.cache

echo glib_cv_stack_grows=no>>arm-linux.cache

echo glib_cv_working_bcopy=no>>arm-linux.cache

echo glib_cv_sane_realloc=yes>>arm-linux.cache

echo glib_cv_have_strlcpy=no>>arm-linux.cache

echo glib_cv_va_val_copy=yes>>arm-linux.cache

echo glib_cv_rtldglobal_broken=no>>arm-linux.cache

echo glib_cv_uscore=no>>arm-linux.cache

echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache

echo ac_cv_func_nonposix_getpwuid_r=no>>arm-linux.cache

echo ac_cv_func_posix_getgrgid_r=no>>arm-linux.cache

echo glib_cv_use_pid_surrogate=no>>arm-linux.cache

echo ac_cv_func_printf_unix98=no>>arm-linux.cache

echo ac_cv_func_vsnprintf_c99=no>>arm-linux.cache

echo ac_cv_path_GLIB_COMPILE_SCHEMAS=yes>>arm-linux.cache

然後儲存退出。如果不建立該檔案,編譯總出現…can’t run test program …錯誤

#./configure --prefix=$blue CC="arm-linux-gcc -I$blue/include -L$blue/lib " --host=arm-linux --cache-file=arm-linux.cache

如果繼續出錯,記錄下提示error錯誤行的上一行,如:

checking abstract socket namespace...

configure: error: cannot run test program while cross compiling

注意到abstract socket namespace在configure中查找abstract socket可以看到類似這樣的結構

echo "$as_me:$LINENO: checking abstract socket namespace" >&5

echo $ECHO_N "checking abstract socket namespace... $ECHO_C" >&6

if test "${ac_cv_have_abstract_sockets+set}" = set; then

echo $ECHO_N "(cached) $ECHO_C" >&6

其中ac_cv_have_abstract_sockets是我們要查找的變量。然後在目前目錄下的arm-linux.cache中加入:echo ac_cv_have_abstract_sockets=yes

#make

出現如下錯誤:

(process:18811): GLib-Genmarshal-WARNING **: unknown type: VARIANT

make[2]: *** [stamp-gmarshal.h] 錯誤 1

make[2]: Leaving directory `/root/mywork/mini2440/bluetooth/glib-2.26.0/gobject'

make[1]: *** [all-recursive] 錯誤 1

make[1]: Leaving directory `/root/mywork/mini2440/bluetooth/glib-2.26.0'

make: *** [all] 錯誤 2

出現如上錯誤好像是檔案格式錯誤引起的。解決辦法如下:

第一次出錯:将其中唯一的一行注釋掉!

#vi gobject/stamp-gmarshal.h

第二次出錯:将如下檔案的開頭空行删除。

#vi gobject/gmarshal.c

這時候,繼續編譯就通過了。!

#vi tests/gobject/stamp-testmarshal.h

什麼也不輸入,儲存退出即可。

(5)     編譯 bluez

#tar  -zxvf  bluez-4.87.tar.gz

#cd  bluez-4.87

# ./configure --prefix=$blue CC="arm-linux-gcc -I$blue/include -L$blue/lib " --host=arm-linux

#make

#make  install

編譯順利,沒初現錯誤。

(6)     編譯YACC

#tar  -zxvf  byacc.tar.gz

#cd  byacc-20101127

# ./configure --prefix=$blue CC="arm-linux-gcc -I$blue/include -L$blue/lib " --host=arm-linux

#make

#make  install

(7)     編譯USB library

#tar  -zxvf  libusb-1.0.8.tar.bz2

#cd  libusb-1.0.8

# ./configure --prefix=$blue CC="arm-linux-gcc -I$blue/include -L$blue/lib " --host=arm-linux

#make

#make  install

至此,所有的軟體包都編譯完成!

(8)     複制生成的軟體到開發闆

1)      将bluetooth-build/sbin下的檔案複制到開發闆的/sbin下

#cp  bluetooth-build/sbin/*    ROOTFS/sbin               //ROOTFS自己指定

#cp  bluetooth-build/bin/hcitool         ROOTFS/bin/

#cp  bluetooth-build/bin/rfcomm              ROOTFS/bin/

#cp  bluetooth-build/bin/sdptool              ROOTFS/bin/

2)      複制相關的庫到開發闆的/lib下

#cp  Bluetooth-build/lib/libbluetooth*    ROOTFS/lib         //ROOTFS自己指定

3)      複制配置檔案到開發闆的/etc目錄下

#cp  -arf bluetooth-build/etc/bluetooth/    ROOTFS/etc/          //ROOTFS自己指定

[C]     藍牙測試

1.檢查是否有藍牙裝置

在插入藍牙到到USB口前後,用 lsusb 指令可以發現輸出内容不一樣。即插入藍牙裝置後 lsusb 輸出多了一行。然後,運作 hciconfig 可以看到:

#hciconfig

hci0:       Type: BR/EDR  Bus: USB

       BD Address: 00:00:00:00:00:00  ACL MTU: 0:0  SCO MTU: 0:0

       DOWN

       RX bytes:0 acl:0 sco:0 events:0 errors:0

       TX bytes:0 acl:0 sco:0 commands:0 errors:0

上面的資訊說明檢測到了藍牙裝置hci0。

2.激活藍牙裝置

#hciconfig hci0 up

可以激活借口(這一步不做,hcitool scan無法運作) 。這時候如果再次執行hciconfg指令,可以發現藍牙以及激活(UP RUNNING):

hci0:       Type: BR/EDR  Bus: USB

       BD Address: 00:1F:81:00:02:DD  ACL MTU: 1021:4  SCO MTU: 180:1

       UP RUNNING

       RX bytes:342 acl:0 sco:0 events:10 errors:0

       TX bytes:33 acl:0 sco:0 commands:11 errors:1

3.掃描裝置

#hcitool scan

可以得到:

Scanning ...

       00:23:7A:F3:66:8D     BlackBerry 9000                這就是搜尋到的裝置(提前打開哦)

4.修改配置檔案:

修改/etc/bluetooth/rfcomm.conf

将裡面的:device 11:22:33:44:55:66;

修改成hcitool scan的結果,也就是:

device 00:23:7A:F3:66:8D

儲存退出。

rfcomm_create_dev。

5.建立藍牙裝置

運作:

#rfcomm_create_dev。

繼續閱讀