转载来自:https://blog.csdn.net/weixin_44006670/article/details/136544552
@[TOC](
前言
移植蓝牙驱动
交叉编译Bluez
编译glib
编译libffi
编译zlib
编译libiconv
编译gettext
编译glib
编译dbus
编译expat,dbus依赖
编译dbus
编译libical,需要用cmake编译
编译ncurses,readline也需要
编译readline
编译bluez-4.101
使用bluez)
前言
一般来说,当你想使用购买的WIFI或者蓝牙芯片时,直接问厂商要服务即可。但是这里我只是想简单玩玩学习一下,就在淘宝随便买了一个USB WIFI+蓝牙适配器,驱动这些只能自己搞搞。
RTL8723DU是一个 WIFI+蓝牙 二合一芯片。WIFI部分的相关移植和使用大家用的比较多,资料也很丰富,自行搜索即可,这里只针对蓝牙部分做一下记录。
我所使用的是arm开发板,Linux操作系统,交叉编译工具链为arm-[vender]-linux-uclibcgnueabihf。
相关资料都放在了:https://download.csdn.net/download/weixin_44006670/88938191 不需要积分
移植蓝牙驱动
RTL8723DU相关的驱动可以去瑞昱官网下载,也可以从提供资料中获取:
RTL8723DU_WiFi_linux_v5.13.4-18-gda9ee5bf0_COEX20200103-3535.20210615.tar(45380)(1).gz
厂商提供的蓝牙驱动在BT目录下,我们用到的主要是里面的:
usb\bluetooth_usb_driver USB-蓝牙相关驱动
rtkbt-firmware\lib\firmware 蓝牙相关固件库
移植步骤如下:
将Realtek Bluetooth USB driver包中bluetooth_usb_driver文件夹下所有.c和.h文件拷贝至Linux内核的kernel/driver/bluetooth目录中;
修改Linux内核kernel/driver/bluetooth目录下Kconfig和Makefile,增加对Realtek Bluetooth HCI USB driver的支持
Kconfig和 Makefile增加如下:
config BT_HCIBTUSB_RTLBTUSB
tristate "Realtek HCI USB driver support"
depends on USB
help
Realtek Bluetooth HCI USB driver.
his driver is required if you want to use Realtek Bluetooth
device with USB interface.
Say Y here to compile support for Bluetooth USB devices into the
ernel or say M to compile it as module (rtk_btusb).
config BT_HCIBTUSB_RTLBTUSB
tristate "Realtek HCI USB driver support"
depends on USB
help
Realtek Bluetooth HCI USB driver.
his driver is required if you want to use Realtek Bluetooth
device with USB interface.
Say Y here to compile support for Bluetooth USB devices into the
ernel or say M to compile it as module (rtk_btusb).
通过make menuconfig或者修改kernel的配置文件,确认Realtek Bluetooth HCI USB driver有支持,未支持的请选择M进行模块编译。
make menuconfig
[Networking support > Bluetooth subsystem support > Bluetooth device drivers]
编译内核,在kernel/driver/bluetooth目录下会生成btusb.ko和rtk_btusb,ko,将其移到开发板中。
将软件包中rtkbt-firmware\lib\firmware目录下的固件拷贝到开发板系统的lib/firmware目录下
确保USB host驱动正常加载后,先后分别加载btusb.ko和rtk_btusb,ko
插上USB适配器应该就能看到生成相应的USB节点了
到这里,驱动相关的移植就算好了,但是我们还没法使用蓝牙,我们只是有了内核的驱动和相关的一些蓝牙协议支持,并没有用户态的蓝牙协议和工具让我使用(我这3.10.103的内核没有,其他的不清楚)。所以,接下来我们还需要移植下Bluez了。
交叉编译Bluez
Bluez是当前最基础成熟的开源蓝牙协议栈,提供了Linux操作系统上的蓝牙支持,还提供了一些工具和库方便我们使用。但是,它依赖的库实在是太多了,很多嵌入式产品应该不会用这个的,学习的话就无所谓。
交叉编译Bluez,大体是学习参考嵌入式arm交叉编译移植bluez5.0最新教程这篇文章的,但是里面还是有很多不同。
总的来说,不同的内核版本,不同的交叉编译工具链,不同的bluez版本,遇到的问题会各不相同。我这里使用的是linux-3.10.103,交叉编译工具链使用的是uclic的,这就会比glibc的兼容性差一些,所以最终我被迫降低了Bluez的版本,使用了4.101的。
Bluez所依赖的下面这些库(glib、expat、dbus、libical、ncurses、readline)在交叉编译的时候没什么难的问题,大部分就是会报一些格式字符串的问题,可以根据实际情况改成%lld之类的,或者直接暴力加上-Wno-format编译选项。而Bluez会有其他的小问题,遇到什么搜什么,也很简单。
编译glib
编译libffi
./configure --prefix=$PWD/../__install/libffi_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc
make -j16
make install
编译zlib
export CC=arm-[vender]-linux-uclibcgnueabihf-gcc ./configure --prefix=$PWD/../__install/zlib_install
make CC=arm-[vender]-linux-uclibcgnueabihf-gcc -j16
make install
编译libiconv
./configure --prefix=$PWD/../__install/libiconv_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc CFLAGS="-fPIC"
make -j16
make install
编译gettext
./configure --prefix=$PWD/../__install/gettext_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc CFLAGS="-fPIC" --with-libiconv=gnu CPPFLAGS="-I$PWD/../__install/libiconv_install/include" LDFLAGS="-L$PWD/../__install/libiconv_install/lib"
make -j16
make install
编译glib
auto.sh
#!/bin/sh
./configure --prefix=$PWD/../__install/glib_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc LIBFFI_CFLAGS="-I$PWD/../__install/libffi_install/lib/libffi-3.0.9/include" LIBFFI_LIBS="-lffi -L$PWD/../__install/libbfi_install/lib" ZLIB_CFLAGS="-I$PWD/../__install/zlib_install/include" ZLIB_LIBS="-lz -L$PWD/../__install/zlib_install/lib" --cache-file=glib.cache --disable-selinux --disable-xattr --disable-libelf --with-libiconv=gnu CPPFLAGS="-I$PWD/../__install/libiconv_install/include -I$$PWD/../__install/gettext_install/include" LDFLAGS="-L$PWD/../__install/libiconv_install/lib -L$PWD/../__install/gettext_install/lib" CFLAGS="-Wall -Wextra -Wno-format"
glib_cache
glib_cv_long_long_format=ll
glib_cv_stack_grows=no
glib_cv_have_strlcpy=no
glib_cv_have_qsort_r=yes
glib_cv_va_val_copy=yes
glib_cv_uscore=no
glib_cv_rtldglobal_broken=no
ac_cv_func_posix_getpwuid_r=yes
ac_cv_func_posix_getgrgid_r=ye
编译dbus
编译expat,dbus依赖
./configure --prefix=$PWD/../__install/expat_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc
make -j16
make install
编译dbus
./configure --prefix=$PWD/../__install/dbus_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc CXX=arm-[vender]-linux-uclibcgnueabihf-g++ --with-xml=expat EXPAT_CFLAGS="-I$PWD/../__install/expat_install/include" EXPAT_LIBS="-lexpat -L$PWD/../__install/expat_install/lib" --enable_selinux="no" --disable-tests
make -j16
make install
编译libical,需要用cmake编译
mkdir build
cd build
export CC=arm-[vender]-linux-uclibcgnueabihf-gcc
export CXX=arm-[vender]-linux-uclibcgnueabihf-g++
cmake -DCMAKE_INSTALL_PREFIX=$PWD/../../__install/libical_install -DCMAKE_BUILD_TYPE=Release ..
make -j16
make install
编译ncurses,readline也需要
./configure --prefix=$PWD/../__install/ncurses_install --host=arm-linux --with-shared
make -j16
make install
注意,此时报错strip process terminated abnormally可不管,我们只需要动态库就行
编译readline
./configure --prefix=$PWD/../__install/readline_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc SHLIB_CFLAGS="-I$PWD/../__install/ncurses_install/include" SHLIB_LIBS="-lncurses -L$PWD/../__install/ncurses_install/lib"
make -j16
make install
编译bluez-4.101
./configure --prefix=$PWD/../__install/bluez_install --host=arm-linux CC=arm-[vender]-linux-uclibcgnueabihf-gcc --with-systemdunitdir=$PWD/temp_path/lib/systemd/system --disable-audio --enable-tools --enable-network --enable-service --enable-health --enable-cups --enable-input --enable-test LDFLAGS="-L$PWD/../__install/readline_install/lib -L$PWD/../__install/ncurses_install/lib" CFLAGS="-I$PWD/../__install/readline_install/include -I$PWD/../__install/ncurses_install/include"
make -j16
make install
至此交叉编译完成,生成的所有东西在__install/bluez_install中
使用bluez
__install/bluez_install的bin和sbin中有什么就能用什么,不懂就help查看或者搜索下