零. 前言
由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统性的介绍,尽可能的涵盖所有内容。
-------------------------------------------------------------------------------------------------------------------------
蓝牙视频教程(跟韦东山老师合作), 其中专题22就是专门针对Bluez做的系统介绍
https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.20.5aeb41f98e267j&id=693788592796
--------------------------------------------------------------------------------------------------------------------------
一. RK3399开发板介绍
1. 开发板介绍
我们整个用的开发板环境是Firefly的RK3399 PC pro开发板,当然中间也会有一些bt dongle的穿插,也不需要开发板,但是对于kernel space的层面的内容,还是继续要依赖于开发板的。
资料连接如下:
Firefly | 让科技更简单,让生活更智能
发货清单(仅供参考) — Firefly Wiki
当然我们这一系列Bluez的教程,你也可以用其他开发板
整个开发板的参数如下:
2. 蓝牙模组介绍
整个开发板默认的板载BT/Wi-Fi模组是正基的AP6256,
- AP6256是正基科技推出的一款低成本,低功耗的双模模块。是一款SDIO接口单通道802.11ac双频支持BT5.0 蓝牙WiFi二合一模块。
- Model:AP6256:SDIO WIFI + UART BT
- Chip:BCM43456
- WiFi: 2.4G&5G
- BT:5.0
pin的定义如下:
3. 主控跟蓝牙模组接线介绍
二. 软件环境
1. image镜像
我这边是用的ubuntu 2004的镜像,下载链接如下:
Firefly | 让科技更简单,让生活更智能
我是用的 Ubuntu 20.04\Public\ROC-RK3399-PC-PLUS_Ubuntu20.04-r240_v2.5.1d_230330 这个版本
2. 烧录介绍
烧写image的链接为:2. 使用USB线缆升级固件 — Firefly Wiki
NOTED: firefly这块资料更新的不好,或者他们资料太多,忘记更新,所以很多地方工具的更新跟文档并不能及时同步,所以导致给人很乱的感觉,所以你就按照我的说法来做就行了,我已经淌过坑。
我使用的是windows的下载方式,方式如下:
a. 安装RK USB驱动
下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动,请先选择驱动卸载,然后再选择驱动安装。
b. 安装AndroidTool
AndroidTools为旧版本叫法,新版本改名为RKDevTool 提取码:1234
下载链接如下:Firefly | 让科技更简单,让生活更智能
如果你用AndridTool就要严格按照版本要求,我是直接使用的事RKDevTool来烧录的
我们烧录的是ubuntu 2004
c. 进入升级模式
通常我们升级固件的模式有两种,分别是Loader模式和MaskRom模式。烧写固件前,我们需要连接好设备,并让板子进入到可升级模式。我们就默认用Loader模式了
Loader模式
硬件方式进入Loader模式
连接设备并通过RECOVERY按键进入Loader升级模式步骤如下:
- 先断开电源适配器连接
- Type-C data cable连接好设备和主机。
- 按住设备上的 RECOVERY (恢复)键并保持。
- 插上电源
- 大约两秒钟后,松开 RECOVERY 键。
查看Loader模式
如何确定板子是否进入Loader模式,我们可以通过工具去查看
Windows操作系统
通过AndroidTool工具可以看到下方提示Found One LOADER Device
如果有进行“进入Loader模式”的操作,仍旧没有看到烧写工具提示LOADER,此时可以看一下Windows主机是否有提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,可返回上一步重新安装驱动。
d. 下载
通过Firmware选择固件生成路径
通过Upgrade下载
3. 验证
a. debug设置
对于接线我们不一定非要采用firefly的串口小板,你也可以自己选择usb转串口模块。线如下:
ROC-RK3399-PC Pro 使用以下串口参数:
- 波特率:1500000
- 数据位:8
- 停止位:1
- 奇偶校验:无
- 流控:无
b. 查看ubuntu版本
cat /etc/os-release
c. 查看内核版本
uname -a
可以看到内核版本是4.4.194
如果你想编辑内核,那么内核的代码为:
Firefly | 让科技更简单,让生活更智能
d. 查看蓝牙Bluez版本
bluetoothd -v
可以看到bluez的版本是5.53
三. 蓝牙enable验证
整个蓝牙使用rfkill来控制,不知道的rfkill的可以去网上查看对应的资料
1. 查看rfkill list
rfkill list
可以看到rfkill一共有三个,0代表bt, 1代表phy, 2代表wifi
2. 查看rfkill的状态
rfkill list
3. 解锁rfkill bluetooth
rfkill unblock 0
4. hciconfig -a
然后就发现蓝牙enable成功了
hciconfig -a
5. 验证搜索
bluetoothctl scan on
先不用关注具体的命令行事什么,后面我们慢慢研究
四. 重新整个编译代码
1. 代码路径
Firefly | 让科技更简单,让生活更智能
md5值
$ md5sum rk3399_linux_release_v2.5.1_20210301_split_dir/*firefly_split*
2cf71e64d35eb8083a4a0fc30c256484 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file0
f0e9292b3816a8f1ce0eb1eeb483ad56 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file1
c6aaa5d761d0e7917bea1cb78a0e7229 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file2
16022cc729d06a28fec30ac52885d91c rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file3
565426354c01d56c7d48479dd7f3c35b rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file4
313d311f1705fbfb7bfc45b7937ecf24 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file5
解压:
cat rk3399_linux_release_v2.5.1_20210301_split_dir/*firefly_split* | tar -xzv
#本SDK文件夹内包含一个 .repo 目录,解压之后,在当前目录下执行以下操作
cd rk3399_linux_release_v2.5.1_20210301
ls -al
.repo/repo/repo sync -l
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all
更新Linux sdk
.repo/repo/repo sync -c --no-tags
目录
$ tree -L 1
.
├── app
├── buildroot # Buildroot 根文件系统编译目录
├── build.sh -> device/rockchip/common/build.sh # 编译脚本
├── device # 编译相关配置文件
├── docs # 文档
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh # 链接脚本
├── prebuilts # 交叉编译工具链
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh # 烧写脚本
├── tools # 工具目录
├── u-boot
└── yocto
下载rootfs
Firefly | 让科技更简单,让生活更智能
把ubuntu rootfs修改为rk3399_ubuntu_rootfs.img
#解压
7z x rk3399_ubuntu18.04.img.7z
#sdk根目录下
mkdir ubuntu_rootfs
mv rk3399_ubuntu18.04.img ubuntu_rootfs/
#修改roc-rk3399-pc-plus-ubuntu.mk文件
vim device/rockchip/rk3399/roc-rk3399-pc-plus-ubuntu.mk
#把RK_ROOTFS_IMG属性改成ubuntu文件系统镜像得路径(也就是rk3399_ubuntu18.04.img)
RK_ROOTFS_IMG=ubuntu_rootfs/rk3399_ubuntu_rootfs.img
2. 编译
./build.sh roc-rk3399-pc-plus-ubuntu.mk
./build.sh
生成的整个image在rockdev/pack/ROC-RK3399-PC-PLUS_Rk3399_v2.5.1b_240806.img