ophub / amlogic-s9xxx-armbian

Support for Armbian in Amlogic, Rockchip and Allwinner boxes. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568, rk3399, rk3328, h6, etc.
GNU General Public License v2.0
6.14k stars 1.97k forks source link

M401A(u200.dtb)和CM311-1a 盒子(e900v22c.dtb)的蓝牙功能已完美,RTL8761BTV芯片,UART界面,其它串口蓝牙芯片的盒子也可以参考 #471

Closed xcray closed 2 years ago

xcray commented 2 years ago

https://bbs.hassbian.com/thread-17392-1-1.html 简单总结一下启用串口蓝牙电路的要点:

  1. 认识自己的硬件,蓝牙芯片、接口,安卓系统是一个比较可靠的地方,其次是网文;

  2. 换用启用了串口uart_A的dtb,网上找或自己编译;原来的dtb默认都是禁用了这个串口。换dtb后ls /dev/tty*确认串口已出现在系统里。比如ttyAML1;

  3. 蓝牙芯片型号对应的固件,比如rtl8761btv的固件有两个文件:rtl8761b_fw和rtl_8761b_config,都保存至/lib/firmware/rtlbt目录下。固件有很多版本,自己试出最好用的来。其中config对应不同速率,比较坑,需谨慎选择,有的会不能用、有的不太稳定;用于ha获取传感器数据的,推荐115200或230400速率的,有音乐播放需求的,推荐2m速率的。

  4. 每次系统启动,都需要用hciattach完成初始化(包括固件下载至蓝牙芯片),rtl串口蓝牙只能用自家的rtk_hciattach完成(我编译好的已多处上传,有源码自己编译也行),其它品牌的串口蓝牙使用bluez自带的hciattach基本都没问题。 命令: rtk_hciattatch -n -s 115200 ttyAML1 rtk_h5 &

以上为必须、以下为可选:

  1. gpiod软件包,用apt安装即可。其中的gpioset用来重置蓝牙电路,否则不断电重启后无法继续使用(rtk_hciattach初始化失败)。标题里两种盒子gpio编号都是0 82,置0关闭1秒后置1打开,完成重置。 关闭和打开的命令分别为: gpioset -s 1 -m time 0 82=0 gpioset 0 82=1

  2. 把gpioset命令和rtk_hciattach命令添加到/etc/rc.local,自动执行。更好的方式应该是通过rf_kill自动完成,但好像涉及到驱动和内核的编译,我能力不够不会弄。

大部分使用串口蓝牙芯片的盒子尤其是realtek芯片的,都可以参考。 我用的rtk_hciattach源码来自radxa,比较坑的是这个repo包含的固件config文件是1.5m速率的,我的两个盒子都用不了。

ophub commented 2 years ago

上传分享一下你的dts,贴一下添加的代码部分。

蓝牙开启后,无线可以使用吗?

xcray commented 2 years ago

好的,大部分内容我上一个issue里都有了,这次的改动如下:

rtk_hciattach源码来自:https://github.com/radxa/rtkbt (其中的驱动编译失败不会排错)

这是dts/dtb和rtk_hciattach文件: meson-g12a-u201.dtbdts.zip rtk_hciattach.zip

ophub commented 2 years ago

你的dtb是反编译的吧

https://github.com/unifreq/linux-5.15.y/blob/main/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts

这个是dts的源文件,你在标准文件上修改,可以随内核编译使用。

xcray commented 2 years ago

你的dtb是反编译的吧

https://github.com/unifreq/linux-5.15.y/blob/main/arch/arm64/boot/dts/amlogic/meson-g12a-u200.dts

这个是dts的源文件,你在标准文件上修改,可以随内核编译使用。

是的,反编译在本地只需要操作一个文件,简单能理解。 好像也可以直接兼容多个版本的内核。

直接在github上修改源码还不会。。。 好像还有个更好的办法是弄成overlay,也没整明白呢。

ophub commented 2 years ago

你反编译是改了一个什么值?

xcray commented 2 years ago

aliases里添加了一行: aliases { serial1 = "/soc/bus@ffd00000/serial@24000"; }; serial@24000里: status = “okay”; pinctrl-0 = <0x55 0x56>; #指向uart-a-pins和uart-a-cts-rts-pins uart-has-rtscts; pinctrl-names = "default";。 aliases好像不是必须,其它3行似乎不可缺少,我没有试所有组合。

其它受芯片config下载失败问题误导试了几版,应该都没啥关系。

对了,我看过unifreq仓库里的源码,uart_A的定义是在g12-common.dtsi里,但status的值是“disabled”,要改的话这里才是关键吧。而且每个版本内核源码里都有(不知道有没有什么不同),是不是都得改?

我fork了5.18.y、尝试修改g12-common.dtsi并进行了内核编译,可行。 不过改这个文件会影响很多设备(引用这个文件的dts貌似有很多),估计上游大佬不会接受吧?其实很多盒子都是用这个串口接蓝牙,默认禁用似乎有点不近人情哈。

另一个方法是模仿e900v22c,在u200基础上另建一个dts; 更好的方法应该是弄成overlay的形式,需要的就加载。

xcray commented 2 years ago

今天帮一个网友成功启用了311-1a yst (yss) (使用e900v22c.dtb)的蓝牙,方法一样,也是反编译dtb编辑dts打开串口再编译回去。因为他的盒子蓝牙同样是uart接口的,也是同一个串口,serial@ffd24000。我估计所有蓝牙采用串口的盒子都可以用这个方法把蓝牙用起来。

ophub commented 2 years ago

https://github.com/ophub/linux-5.15.y/commit/8559e5b949e84553f3208fafedf0c90dd4f171d6

https://github.com/ophub/amlogic-s9xxx-armbian/issues/476

像这个明确就很好添加蓝牙,你这个的原始代码是什么呢?有同型号的其他dtb可以参照下吗?

xcray commented 2 years ago

我上面几个comment已经交待了,您可能事多给忘了,再返回去看看?关键就是uaert_A默认是disabled(在那个g12-common里),修改dts把它打开就行了。也看过其它几个dts文件,realtek芯片需要自己的rtk_hciattach程序attach一下,其它芯片好像直接在dts里加上就行。