如何用Ubuntu qemu跑zephyr_polling的蓝牙?

rtthread_uart
rtthread平台下通用uart接口实现。
ubuntu平台下利用qemu实现蓝牙功能
搭建 rt-thread qemu 环境
目前我们使用qemu-vexpress-a9的bsp环境。
配置 zephyr_polling 软件包
1、在 qemu-vexpress-a9 bsp 根目录输入:
scons --menuconfig
2、进入 rt-thread online packages → iot - internet of things 目录即可看到 zephyr_polling软件包,勾选软件包。
3、配置 zephyr_polling项目的参数,如下述配置chipset选common,example选beacon,platform选rtthread_uart。
4、选择hci接口参数
这里 the uart for hci transport 默认输入 “uart1” 就好
保存后退出。
下载软件包
使用 scons —menuconfig 命令后会安装及初始化 env 工具,并在 home 目录下面生成 “.env” 文件夹,此文件夹为隐藏文件夹,切换到 home 目录,使用 ls 命令可查看所有目录和文件。
$ ls ~/.env
env.sh local_pkgs packages tools
运行 env.sh 会配置好环境变量,让我们可以使用 pkgs 命令来更新软件包,执行
$ source ~/.env/env.sh
使用 pkgs —update 命令下载 nimble 软件包到 bsp 目录下的 packages 文件夹里。
$ pkgs --update
btproxy方式
如果你手头有一个usb蓝牙dongle。只要ubuntu能识别的都可以使用。
环境介绍
本次搭建环境所使用的资源和版本为:
ubuntu 18.04
bluez - v5.55
ell - v0.35
qemu - v2.11.1
rt-thread - v5.0.0
一个蓝牙适配器
环境搭建
环境搭建主要分为两部分,
bluez 的编译
ubuntu里 rt-thread qemu 环境的搭建
首先需要更新源:
sudo apt update
sudo apt upgrade
安装所需要的依赖:
sudo apt install git automake libtool libelf-dev elfutils libdw-dev libjson-c-dev libical-dev libreadline-dev libglib2.0-dev libdbus-1-dev libudev-dev libncurses5-dev python3 python3-pip qemu
bluez 编译安装
bluez 里有许多实用的工具,例如 btproxy,但是 ubuntu 自带的 bluez 并未将这些工具都编译出来,因此需要我们重新编译 bluez。
在相同目录下克隆获取 0.35 版本的 ell,5.55 版本的 bluez 。
最终 ell 和 bluez 应该在同一个目录级别下,目录结构为:
.
|--- ell
| |--- ell
| |--- unit
|--- bluez
| |--- src
| |--- tools
然后输入下述命令编译 bluez:
cd bluez
./bootstrap-configure --disable-android --disable-midi --disable-mesh
make
注意,这个时候会报错,但是不用管,tools目录下已经有所需的btproxy。
qemu 运行 ble
qemu 运行 ble 时,本质上还是在和物理机的蓝牙设备通信,下面介绍如何在 qemu 环境中使用蓝牙设备。
首先输入 hciconfig 查看本机的蓝牙设备,
我这里是 hci0 蓝牙设备,需要保证上述红框框住的部分为 down,也就是该蓝牙设备未打开,否则需要输入下述命令关闭该蓝牙设备:
sudo hciconfig hci0 down
然后进入 bluez 的 tools 目录,输入命令为该蓝牙设备创建一个代理(proxy)。
sudo ./btproxy -u -i 0
其中 -u 代表使用 unix server,默认路径为 /tmp/bt-server-bredr,-i 0 指使用 hci0 蓝牙设备,如果是 hci1 蓝牙设备,则需更改为 -i 1 。运行成功后会有下述显示:
然后在 rt-thread 的 bsp/qemu-vexpress-a9 目录下编译运行:
scons
qemu-system-arm -m vexpress-a9 -kernel rtthread.bin -nographic -serial mon:stdio -serial unix:/tmp/bt-server-bredr
即可成功在 qemu 环境里与蓝牙卡片交互,下面稍微介绍下原理和注意事项。
qemu 命令参数里与串口相关的有 -serial mon:stdio -serial unix:/tmp/bt-server-bredr,-serial 参数的介绍为:
-serial dev redirect the serial port to char device ‘dev’
这个参数将 qemu 程序的串口重定向到物理机的设备文件,
第一个 -serial mon:stdio 将 qemu 里的 uart0 重定向到了物理机的 stdio 设备文件,而且在 qemu 程序里 uart0 用作 msh 命令行工具,类似 stdio,因此我们可以在物理机上看到 qemu 程序的打印数据,也可以输入命令。
第二个 -serial unix:/tmp/bt-server-bredr 是将 qemu 里的 uart1 重定向到物理机的 /tmp/bt-server-bredr 文件,而这个文件又是 hci0 设备的代理,因此从 qemu 程序的角度来看,就是使用 h4 协议,通过 uart1 去访问蓝牙设备。uart1 的波特率使用 115200 即可(未找到说明,但一般都是这样使用)。
注意:上述两个 -serial 的顺序不能颠倒,否则 qemu 程序无法正常运行。
若成功运行,则在 btproxy 界面会有如下显示:
若蓝牙设备未关闭,则会显示设备或资源忙:
建议每次运行前都关闭一次蓝牙设备:sudo hciconfig hci0 down 。
测试运行
而后输入zephyr_polling_init既可以运行demo工程了。可以看到蓝牙地址是11:22:33:44:55:66。
用nordic的app搜索,就可以看到发送的beacon数据包了。
串口方式
如果你手头就是一个uart设备,系统中还没驱动的情况下。
环境介绍
本次搭建环境所使用的资源和版本为:
ubuntu 18.04
qemu - v2.11.1
rt-thread - v5.0.0
一个蓝牙uart模组
环境搭建
连接蓝牙 control 芯片(使用 pts_dongle 进行演示,将其直接连接电脑)。
需要注意,下面的/dev/ttyacm0需要根据具体情况调整,看你实际的串口是哪个。linux串口是默认普通用户没有读写权限的,每次开机后对串口读写都要附加权限。
sudo chmod 666 /dev/ttyacm0
qemu-system-arm -m vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin -serial mon:stdio -serial /dev/ttyacm0
测试运行
而后输入zephyr_polling_init既可以运行demo工程了。可以看到蓝牙地址是c007e8e12d:e8。
用nordic的app搜索,就可以看到发送的beacon数据包了。

西部数据立足HDD革新,助力企业制胜可持续数字化未来
政府机构的变革性IT战略
诺基亚能否凭Windows Phone重振雄风?
区域短报文和全球短报文服务的区别在哪里
5G难当大任,运营4G仍然是运营商的主要工作
如何用Ubuntu qemu跑zephyr_polling的蓝牙?
Littelfuse新推尺寸最小的PPTC保护便携设备,可避免因过电流、过热条件而损坏
人工智能时代,新科技将如何影响我们生存?
MOSFET结构和符号及教程摘要
高通收购恩智浦的交易或面临中国和美国双重障碍
linux的常用命令
关于智能本的ESD保护和防雷击保护设计指引
欧盟基于通信技术发展和产业需求,推动实现行业数字化转型
给水泵发生汽蚀的原因及处理方法
Intersil推出两款新型高速隔离式RS485差分总线收发器:ISL32741E和ISL32740E
便携式单一有毒气体检测仪的功能特点
美图转型,将目标锁定以‘小鲜肉’为代表的时尚男性消费人群
Asciinema:终端日志记录神器
基于AD538的反正切近似计算电路图
USB Type-C/PD常见问题全面答疑(附参考设计)