RTL8723DU蓝牙驱动及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 蓝牙相关固件库

移植步骤如下:

  1. 将Realtek Bluetooth USB driver包中bluetooth_usb_driver文件夹下所有.c和.h文件拷贝至Linux内核的kernel/driver/bluetooth目录中;

  2. 修改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).
  1. 通过make menuconfig或者修改kernel的配置文件,确认Realtek Bluetooth HCI USB driver有支持,未支持的请选择M进行模块编译。
    make menuconfig
    [Networking support > Bluetooth subsystem support > Bluetooth device drivers]

  2. 编译内核,在kernel/driver/bluetooth目录下会生成btusb.ko和rtk_btusb,ko,将其移到开发板中。

  3. 将软件包中rtkbt-firmware\lib\firmware目录下的固件拷贝到开发板系统的lib/firmware目录下

  4. 确保USB host驱动正常加载后,先后分别加载btusb.ko和rtk_btusb,ko

  5. 插上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查看或者搜索下

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值