XCray 发表于 2022-8-7 19:05:20

M401A/311-1a盒子Armbian系统中蓝牙基本完美,reboot/音乐问题搞定

本帖最后由 XCray 于 2022-10-29 11:37 编辑

这是之前的玩法,这种方式(在用户空间运行rtk_hciattach)据说比较陈旧。现代化的方法是内核直接驱动(serdev),详见:https://bbs.hassbian.com/thread-18366-1-1.html
---------------------
之前帖子的内容随着认识的深入不断变化,导致可读性比较差,重新梳理一下启用串口蓝牙电路的要点:

[*]认识自己的硬件,蓝牙芯片、接口,安卓系统是一个比较可靠的地方,其次是网文;
[*]换用启用了串口uart_A的dtb,网上找或自己编译;原来的dtb默认都是禁用了这个串口。换dtb后ls /dev/tty*确认串口已出现在系统里。比如ttyAML1;
[*]蓝牙芯片型号对应的固件,比如rtl8761btv的固件有两个文件:rtl8761b_fw和rtl_8761b_config,都保存至/lib/firmware/rtlbt目录下。固件有很多版本,自己试出最好用的来。其中config对应不同速率,比较坑,需谨慎选择,有的会不能用、有的不太稳定;用于ha获取传感器数据的,推荐115200或230400速率的,有音乐播放需求的,推荐2m速率的。
[*]每次系统启动,都需要用hciattach完成初始化(包括固件下载至蓝牙芯片),rtl串口蓝牙只能用自家的rtk_hciattach完成(我编译好的已多处上传,有源码自己编译也行),其它品牌的串口蓝牙使用bluez自带的hciattach基本都没问题。
命令:
rtk_hciattatch -n -s 115200 ttyAML1 rtk_h5 &
[*]gpiod软件包,用apt安装即可。其中的gpioset用来重置蓝牙电路,否则不断电重启后必须重置才能继续使用。标题里两种盒子gpio编号都是0 82,置0关闭1秒后置1打开,完成重置。
关闭和打开的命令分别为:
gpioset -s 1 -m time 0 82=0
gpioset 0 82=1
[*]把gpioset命令和rtk_hciattach命令添加到/etc/rc.local,自动执行。更好的方式应该是通过rf_kill自动完成,但好像涉及到驱动和内核的编译,我能力不够不会弄。
大部分使用串口蓝牙芯片的盒子尤其是realtek芯片的,都可以参考。
我用的rtk_hciattach源码来自radxa,比较坑的是这个repo包含的固件config文件是1.5m速率的,我的两个盒子都用不了。
更详细的内容慢慢看吧:
--------------------
我相信论坛里一定有真正懂的大神,只是好像都比较小气,轻易不爱发表指导意见。

我已经让这两个盒子可以使用蓝牙了,但是有两个问题实在不好搞,不过最终也都搞定了:

1. 系统不断电reboot后蓝牙无法操作,根据文档,应该在reboot过程中“拉低 BT_RST pin,1s 后,BT controller 才能真正进入 power down 模式”,这样系统重启后才可以继续操控蓝牙。

可是我不知道怎么去“拉低”这个引脚(根据安卓dts判断好像是gpiochip0的83号)。 gpiod装了,试过gpioset,不行(原来没用过这个)。

经过苦苦思索和搜索,搜索和思索,外加尝试,终于搞定了。具体方法见65楼。这样直接reboot重启蓝牙也可以继续工作了。

2. 蓝牙初始化后无法变更波特率(所以现在必须删掉固件的config才能完成初始化),怀疑是串口没弄对,可是翻遍安卓dts也没找到更有帮助的信息。

这个是imzlh搞定的!61楼imzlh朋友上传了一个可以正常下载并切换到2m波特率的config文件,用这个config播放音乐就毫无问题了。感谢imzlh!
值得强调的是这里有一个隐患:如果同时使用HA的蓝牙集成收集传感器信息的话,2m波特率可能会导致蓝牙吊死,表现就是所有蓝牙传感器都停止状态更新。

怀疑和时钟精度不够有关系。如果没有音乐播放需求的话,还是用原来的方法:删掉config文件、使用115200的波特率,长时间观察没有这个问题。

删掉config文件的方法比较粗暴,并且损失了硬件流控,我把2m波特率的config文件改了改,波特率分别为115200和230400,其它不变(硬件流控保持开启,还有啥我也不知道),下载到蓝牙芯片毫无问题,有兴趣的可以选择测试。

原来下载到蓝牙芯片会导致失败的那个config文件是1.5m的,估计这个波特率不行(460800我试过也不行),把波特率改为230400、4m下载都没问题,文件大小25字节(2m那个大小为81字节,也不知道多出来的内容都是啥)。只是4m的必要性、稳定性可能都是个问号。
不过更推荐81字节的版本,似乎更稳定:

包内有3个版本,115200、230400、2m,按需选用,别忘了改名
~~~~~~~~~~~~~
先是在CoreELEC里已经验证没问题。
然后搞定dtb文件,在系统里把连接蓝牙电路的串口搞出来。
自己编译了rtk_hciattach工具,可以和蓝牙芯片通信,碰到了最后的固件下载失败的问题。
怀疑是串口参数没弄对,一番折腾无果。后来终于找到一个真正能参考解决这个问题的帖子:Realtek Bluetooth ERROR: patch timerout, retry · Issue #31 · lwfinger/rtl8723bs_bt (github.com)

解决的办法也很颠覆三观:删掉固件里的那个config文件!(后来明白了点,不删改改也行)

然后就行了!(至少ha里可以正常使用了,无法用于播放音乐,因为波特率不能切换,115200不够)

坑太多了~~~

RTL8761BTV芯片,其它芯片的自行琢磨吧
最后来点儿真相:

~~~~~~~~~~~~~~
311-1a yst (yss) 是另一位坛友的,实现的方法完全相同:
【M401A】CoreELEC初步小试,毫无难度的安装和xue微折腾的蓝牙



YanceyChiew 发表于 2022-10-28 08:38:40

本帖最后由 YanceyChiew 于 2022-10-28 08:42 编辑

XCray 发表于 2022-10-27 21:24
没有“自动调整波特率”的说法。

config文件的最重要内容是指定波特率,在rtk_hciattach完成初始化后会 ...
好吧,之前看到说“已经有坛友找到了可以顺畅下载并且波特率会自动调整为2M的config”,原来是指自动从配置文件中应用2M的速率,我还以为是能够根据需求最高可以自动升到2M。
(打了个emoji,结果帖子就断这里了,幸好后退回去还能复制到编辑区的内容)


我试了下,如果删除配置文件,波特率应该是可以直接在命令中指定,不过硬件流控无法通过命令打开,会忽略参数始终disable,所以还是得靠配置文件,而用了配置文件就会忽略手动指定的波特率。。。另外,直接在终端中手动执行命令rtk_hciattach时不指定 -n 参数,就无需让它后台运行了,它会自动从终端detach,这样也避免处理SIGHUP这些问题。


因为只写了个service文件,我直接贴这里:

# /etc/systemd/system/rtk_bluez.service

Description=rtk uart bluetooth device init
StartLimitIntervalSec=10s
DefaultDependencies=no
After=systemd-udevd.service
Conflicts=shutdown.target
Before=shutdown.target


ExecStartPre=/usr/bin/env gpioset 0 82=1
ExecStart=/opt/tools/rtk_hciattach -n ttyAML1 rtk_h5
ExecStopPost=/usr/bin/env gpioset 0 82=0

Restart=on-failure
StartLimitBurst=3
RestartSec=2s
TimeoutSec=15s
KillMode=process


WantedBy=sysinit.target
虽然写了失败后重启,但是开机自启时一般不会失败,除非是在开机后有蓝牙设备已经连接时手动重启这个服务会有小概率失败。我开始担心直接重启时gpio置低时间不足一秒会有负面影响,试了几次后发现没问题,这样就不用在开机或关机时多sleep一秒了。

XCray 发表于 2022-8-7 20:08:18

本帖最后由 XCray 于 2022-9-2 07:18 编辑

这是我编译的dtb(只在u200基础上增加了连接蓝牙电路的串口)和rtk_hciattach工具(源码来自radxa)。欢迎同款蓝牙芯片的坛友们测试:lol
最后又照着x96-max-plus的dts改了一下串口,其实和之前的效果好像没啥区别。

最关键的还是config(已经有坛友找到了可以顺畅下载并且波特率会自动调整为2M的config,蓝牙音乐就没有问题了)

只测试了5.15和5.18内核,欢迎测试其它版本

还有一个坑:每次重启必须断电,直接reboot不行

ps。我重新整理了完整的安装步骤,还是回到之前的帖子吧:
https://bbs.hassbian.com/thread-17335-1-1.html

发现原来u200的dtb只配置了1G的内存,以前只是在其基础上增加了串口,没管内存的事儿(只是依靠overload uboot去检测)。

再上传一个2G内存的版本,需要的自取:

ghostist 发表于 2022-8-7 21:06:10

X大玩的越来越深奥 跟不上了

XCray 发表于 2022-8-7 21:10:20

ghostist 发表于 2022-8-7 21:06
X大玩的越来越深奥 跟不上了

别夸我,惭愧着呢:dizzy:

jck773656345 发表于 2022-8-7 23:15:57

期待X大

leonarddo 发表于 2022-8-8 00:27:48

:o好厉害,可惜同型号盒子都不一定通用。。。

shadowba 发表于 2022-8-8 08:53:46

XCray 发表于 2022-8-7 20:08
这是我编译的dtb(只在u200基础上增加了连接蓝牙电路的串口)和rtk_hciattach工具(源码来自radxa)。欢迎 ...

不错,现在还跑着HASSIO,等哪天闲了也弄弄

Ari 发表于 2022-8-8 08:57:56

给力啊,顶帖

隔壁的王叔叔 发表于 2022-8-8 09:42:25

本帖最后由 隔壁的王叔叔 于 2022-8-8 09:44 编辑

报错信息一模一样,删掉配置文件删了也没什么用,5.9sudo rm /lib/firmware/rtl_bt/rtlbt_config
内核。你重新安装驱动了嘛?这个重启必须断电,蛮讨厌的。盒子放在家里,就没办法了

XCray 发表于 2022-8-8 10:07:54

本帖最后由 XCray 于 2022-8-8 10:41 编辑

隔壁的王叔叔 发表于 2022-8-8 09:42
报错信息一模一样,删掉配置文件删了也没什么用,5.9
内核。你重新安装驱动了嘛?这个重启必须断电,蛮讨厌 ...不是rtl_bt,是rtlbt那个目录,不带下划线的。带下划线的是给sdio接口用的。
不用管驱动,系统自带的就行。并且任意版本自带的驱动都可以。

事实上曾经想换,但编译报错且没能力解决。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: M401A/311-1a盒子Armbian系统中蓝牙基本完美,reboot/音乐问题搞定