目录
1 说明
前段时间写了几篇文章介绍了在hi3518ev300上移植rtl8723DS的功能(Wi-Fi和蓝牙),wifi模块和开发包购买自深圳市必联电子有限公司,本文在此基础之上说明移植蓝牙到rk3399时遇到的问题及解决办法,同时也是对之前经验的回顾。rk3399开发板购买自广州眺望电子科技有限公司。依旧使用blueZ 5.18。
2 过程
注意:在编译rk3399时需要将编译链路径添加到环境变量PATH的最后,比如:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/lijun/rk3399-linux/buildroot/output/rockchip_rk3399/host/bin/
如果添加在PATH的最前面可能会导致编译时Makefile变量的路径有问题。
2.1 libiconv
在hi3518ev300移植时没有移植此包,但是在rk3399时需要依赖此包。否则在接收文件时出现obexd[665]: disconnected: Unicode conversion failed: Conversion from character set 'UTF-16BE' to 'UTF-8' is not supported
解决此问题花了不少时间,最终在一个论坛里面找到一个能解决问题的提示,大致意思是obexd使用glib,glib使用iconv,所以需要iconv相关的库文件,总共涉及到的库文件有glib、dbus、blueZ、iconv。
该讨论的链接:https://github.com/blueman-project/blueman/issues/275
有网友说需要在buildroot(rk3399使用buildroot制作文件系统) -> Toolchain中选中Copy gconv libraries并指定内容为”IBM850 ISO8859-15 UNICODE”,但是我没有选中Copy gconv libraries也能正常收发文件。
2.2 glib
glib依赖iconv,而且在配置时需要显示指定iconv,即在configure命令的最后添加--with-libiconv=gnu,变成:
CC=aarch64-buildroot-linux-gnu-gcc ./configure --host=aarch64-buildroot-linux-gnu LIBFFI_CFLAGS="-I/tmp/lib/libffi-3.0.13/include" LIBFFI_LIBS="-lffi -L/tmp/lib" ZLIB_CFLAGS="-I/tmp/include" ZLIB_LIBS="-lz -L/tmp/lib" --prefix=/tmp PKG_CONFIG_PATH=/tmp/lib/pkgconfig glib_cv_stack_grows=no glib_cv_uscore=yes ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes CFLAGS="-I/tmp/include" CPPFLAGS="-I/tmp/include" LDFLAGS="-L/tmp/lib" PKG_CONFIG_PATH=/tmp/lib/pkgconfig --with-libiconv=gnu
2.3 dbus
在./test/Makefile中的GLIB_LIBS值追加 -liconv,消除问题:
/home/lijun/rk3399-linux/buildroot/output/rockchip_rk3399/host/lib/gcc/aarch64-buildroot-linux-gnu/6.5.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: warning: libiconv.so.2, needed by /tmp/lib/libgio-2.0.so, not found (try using -rpath or -rpath-link)
/tmp/lib/libglib-2.0.so: undefined reference to `libiconv'
/tmp/lib/libglib-2.0.so: undefined reference to `libiconv_close'
/tmp/lib/libglib-2.0.so: undefined reference to `libiconv_open'
2.4 ncurses
除了执行export CPPFLAGS="-P",还要执行export CFLAGS=" -fPIC",在编译完成之后执行export CFLAGS=
遇到的问题:
checking build system type... Invalid configuration `aarch64-buildroot-linux-gnu': machine `aarch64-buildroot' not recognized
configure: error: /bin/bash conftools/config.sub aarch64-buildroot-linux-gnu failed
解决办法:wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD',wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD',用这两个文件替换掉文件夹下面的两个。
2.5 bluez
在./Makefile中将-lglib-2.0替换成-lglib-2.0 -liconv,消除/home/lijun/rk3399-linux/buildroot/output/rockchip_rk3399/host/lib/gcc/aarch64-buildroot-linux-gnu/6.5.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: warning: libiconv.so.2, needed by /tmp/lib/libglib-2.0.so, not found (try using -rpath or -rpath-link)
/tmp/lib/libglib-2.0.so: undefined reference to `libiconv'
/tmp/lib/libglib-2.0.so: undefined reference to `libiconv_open'
/tmp/lib/libglib-2.0.so: undefined reference to `libiconv_close'
2.6 编译收尾
其他操作同hi3518ev300。编译rk3399时没有libintl.so.8.1.7,可不处理。将libiconv.so.2.6.1拷贝到板端并创建链接,
ln -s libiconv.so.2.6.1 libiconv.so.2
ln -s libiconv.so.2.6.1 libiconv.so
2.7 修改蓝牙设备名字
在编译blueZ时可以通过--sysconfdir=DIR参数指定下文中的main.conf存放的路径,如果没有指定则放在默认路径PREFIX/etc下。有可能把main.conf放到指定的路径之后设备的名字还是默认名字“BlueZ 5.18”,这应该是放置的路径不对引起的,通过strings命令查看bluetoothd中的main.conf字串,再把main.conf放到该字串中可以解决该问题。比如下面这张图,要把main.conf放到/tmp/etc/bluetooth,
下面这张图,要把main.conf放到/etc/bluetooth,
也可以在bluetoothd等业务程序启动之后,使用./hciconfig hci0 name查看当前的设备名字,使用./hciconfig hci0 name "aaaabbbb",将名字改为"aaaabbbb",但在手机端看到的依旧是更改之前的名字,还需要在板端执行./hciconfig hci0 down、./hciconfig hci0 up,刷新手机显示列表可以看到名字已经更改过来。
2.8 执行rtk_hciattach
要根据串口名称执行命令,比如我的板端串口名称是ttyS0,则执行./rtk_hciattach -n -s 115200 ttyS0 rtk_h5 &