移植 usb 蓝牙适配器到 arm 板
(2014-09-14 23:44:45) 标签: linuxarm蓝牙移植 | 分类: linux_develop |
操作环境
win7 vmware fedora 10 usb 蓝牙适配器
tq2440
内核 2.6.30
交叉编译器 4.3.3
配置内核
make menuconfig
[*] 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 蓝牙模块支持
HCI UART driver
//基于串口,CF 卡或 PCMCIA 的蓝牙
<*> HCI BlueFRITZ! USB driver
<*> HCI VHCI (Virtual HCI device) driver
编译内核烧入开发板中
启动,插入蓝牙适配器
usb 1-1.2: new full speed USB device using s3c2410-ohci and address 3
usb 1-1.2: New USB device found, idVendor=0a12, idProduct=0001
usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
usb 1-1.2: configuration #1 chosen from 1 choice
移植蓝牙协议栈
库文件
bluez-libs-3.36.tar.gz
dbus-1.5.12.tar.gz
expat-2.0.1.tar.gz
glib-2.26.1.tar.gz
bluez-utils-3.36.tar.gz
libusb-0.1.12.tar.gz
编译安装
bluez-libs-3.36.tar.gz
没有什么依赖,直接解压,配置,编译安装
#tar -zxvf /mnt/hgfs/Linux/bluez/bluez-lib-3.36.tar.gz –C ./
#./configure --prefix=/opt/EmbedSky/bluez/libs --host=arm-linux --target=arm-linux CC=arm-linux-gcc
在/opt/EmbedSky/bluez/目录下新建一个 libs 用来保存蓝牙的库文件、头文件和其他文件。
#make
#make install
expat-2.0.1.tar.gz
这个库是后面的 dbus 依赖的
#tar -zxvf /mnt/hgfs/Linux/bluez/ expat-2.0.1.tar.gz –C ./
#./configure --prefix=/opt/EmbedSky/bluez/libs --host=arm-linux --target=arm-linux
CC=arm-linux-gcc
#make
#make install
dbus-1.5.12.tar.gz
#tar -zxvf /mnt/hgfs/Linux/bluez/
dbus-1.5.12.tar.gz –C ./
#echo ac_cv_have_abstract_sockets=yes>arm-linux.cache
#./configure --prefix=/opt/EmbedSky/bluez/libs --host=arm-linux --target=arm-linux
CC="arm-linux-gcc -I/opt/EmbedSky/
bluez/libs/include -L/opt/EmbedSky/bluez/libs/lib" --cache-file=arm-linux.cache --with-x=no
#make
#make install
glib-2.26.1.tar.gz(这个的安装会遇到相当多的问题,下面有解决的方法)
#tar -zxvf /mnt/hgfs/Linux/bluez/glib-2.26.1.tar.gz –C ./
#echo ac_cv_type_long_long=yes>arm-linux.cache
#echo glib_cv_stack_grows=no>>arm-linux.cache
#echo glib_cv_uscore=no>>arm-linux.cache
#echo c_cv_func_posix_getpwuid_r=yes>>arm-linux.cache
#echo ac_cv_func_posix_getgrgid_r=yes>> arm-linux.cache
注意:">"和">>"的区别
#./configure --profix=/opt/EmbedSky/bluez/libs --host=arm-linux --target=arm-linux CC="arm-linux-gcc -I/opt/EmbedSky/bl
uez/libs /include -L/opt/EmbedSky/bluez/libs/lib" --cache-file=arm-linux.cache
#make
#make install
错误
checking for posix getpwuid_r... configure: error: in `/opt/EmbedSky/bluez/glib-2.26.1
':configure: error: cannot run test program while cross compiling
See `config.log' for more details.
解决方法:
# echo ac_cv_func_posix_getpwuid_r=yes>> arm-linux.cache
configure: error: Could not find a glib-genmarshal in your PATH
解决方法:
yum install libglib2.0-devel,这样在/usr/bin/目录下就有一个 glib-genmarshal 的应用程序。
checking for posix getgrgid_r... configure: error: in `/opt/EmbedSky/bluez/glib-2.26.1
':configure: error: cannot run test program while cross compiling
See `config.log' for more details.
解决方法:
# echo ac_cv_func_posix_ getgrgid_r _r=yes>> arm-linux.cache
configure: error: Could not find a glib-compile-schemas in your PATH
这个问题确实要把我搞吐血了,我差不多找用遍百度、谷歌、搜狗和 360 搜索,英文的资料都找遍了,问题是有人问,但没一个人有解决的方案。有人说这个 glib-compile-schemas 是安装 glib-2.26.1.tar.gz 才有的,但是我现在是安装这个就要啊。
在/usr/bin/目录下,有一个名为 glib-genmarshal 的应用程序,但就是没有 glib-compile-schemas 的应用程序。想了很久,也郁闷了好久,最后无意看到 ChangeLog 文件,心里好像悟到点什么。先用 gcc 编译出应用程序来,再用交叉编译器来编译行不行呢?哈哈
解决方法:
#./configure --prefix=/opt/EmbedSky/bluez/libs
CC=" gcc -I/opt/EmbedSky/bluez/libs/include -L/opt/libs/lib"
#make
#make install
编译安装后,在/opt/EmbedSky/bluez/libs/bin/目录下就生成了 glib-compile-schemas 的应用程序,把它复制到/usr/bin/目录下,然后再用交叉编译器来编译。
这个问题的解决也是有点灵感来的。
解 决 方 法 : 前 面 说 到 在 /usr/bin/ 目 录 下 本 来 就 有 一 个 glib-genmarshal
, 当 我 们 用 gcc 编 译 的 时 候 , 在/opt/EmbedSky/bluez/libs/bin/目录下同样生成一个 glib-genmarshal 应用程序,在 make 的时候,调用的估计是原来的/usr/bin/目录下的。由于版本不同或者其他什么的,出错了。我们在/usr/bin/目录下的 glib-genmarshal 删掉,把/opt/EmbedSky/bluez/libs/bin/目录下的 glib-genmarshal 应用程序复制到/usr/bin/目录下即可。
libusb-0.1.12.tar.gz
#tar -zxvf /mnt/hgfs/Linux/bluez/libusb-0.1.12.tar.gz –C ./
#./configure --profix=/opt/EmbedSky/bluez/libs --host=arm-linux --target=arm-linux CC="arm-linux-gcc -I/opt/EmbedSky/bl
uez/libs /include -L/opt/EmbedSky/bluez/libs/lib"
#make
#make install
bluez-utils-3.36.tar.gz
#tar -zxvf /mnt/hgfs/Linux/bluez/bluez-utils-3.36.tar.gz –C ./
#./configure --profix=/opt/EmbedSky/bluez/libs --host=arm-linux --target=arm-linux CC="arm-linux-gcc -I/opt/EmbedSky/bl
uez/libs /include -L/opt/EmbedSky/bluez/libs/lib" --disable-audio
可能出现的错误:
checking for BLUEZ... configure: error: Bluetooth library is required
这个问题也搞了我好长时间,同样在网上几乎找不到可行的答案。网上有说解决方法为 sudo apt-get install
libbluetooth-dev。但是在 fedora 上输入 yum install libbluetooth-dev,你会发现根本找不到这样的安装包的。 甚至你输入 yum install libbluetooth*都没有安装包。网上也有说是输入 yum install pkg-config,但是根据提示,这里已经说是 yes 了:
所以应该也不是这个原因。另外还有说路径不对的,但我这里我已经很明确指定了路径了,所以也应该不是这个原因。根据英文意思,是少了依赖的库,yum install 没有下载,那可不可以考虑去百度或者谷歌下载一个呢?于是。。。
解决方法:
去网上下载一个 libbluetooth-dev_4.66-3_i386.deb 的软件包,用好压工具解压,里面有两个文件 control.tar.gz 和
data.tar.gz,可以看到 data.tar.gz 里面包含有我们需要的头文件和库文件。通过共享目录放在虚拟机上去。
#tar -zxvf /mnt/hgfs/Linux/bluez/data.tar.gz –C ./
你会发现无论你解压到哪个目录,软件包都会固定安装在/usr/include、/usr/lib 和/usr/share 目录下的,这是因为里
面指定了安装目录
这样再次配置的时候就不会出现上面的错误了。
通过上面的操作,库文件和蓝牙工具都已经安装好了(安装在/opt/EmbedSky/bluez/libs 目录下)。下面就把这些东
西放到根文件。
Copy /opt/EmbedSky/bluez/libs/lib 目录下的库文件到根文件的 lib 目录下,包括
libbluetooth.so.2.11.2
libbluetooth.so
libbluetooth.so.2
libgmodule-2.0.so
libgmodule-2.0.so.0
libgmodule-2.0.so.0.2600.1
Copy/opt/EmbedSky/bluez/sbin 目录下的所有文件到根文件的 sbin 目录下
Copy/opt/EmbedSky/bluez/etc/bluetooth 目录下的所有文件到根文件的 etc 目录下
Copy/opt/EmbedSky/bluez/bin 目录下的 hcitool,rfcomm,sdptool 文件到根文件的 bin 目录下
重新烧写根文件
[root@EmbedSky /]# hciconfig hci0
hci0:
Type: USB
[root@EmbedSky /]# hciconfig hci0 up
启用蓝牙设备
[root@EmbedSky /]# hciconfig hci0 iscan
设置开发板的蓝牙属性为可查找
[root@EmbedSky /]# hcitool scan
扫描蓝牙设备
Scanning ...
总结:
移植蓝牙的库确实比较无聊,依赖的库特别多。整个过程遇到不少问题,当我们遇到问题的时候,除了通过互联网找资料外,我们也要自己多动脑去分析一下。出路总是有的!另外,我们也学会是看一些英文资料,因为英文资料很多都比较简洁直接,而不像中文资料那样你抄我我抄你的!!