重要更新:
我向CoreELEC团队报告了这台设备的兼容性问题和WiFi的解决方法。WiFi问题在19.2-rc3版本中WiFi问题已经修复,所以不用看下去了!!
不过蓝牙似乎还是有问题,因此保留此篇文章,希望能为有兴趣解决蓝牙的developer提供一点点微小的帮助!
太长不看版
-
修改好的SYSTEM文件下载地址
- 下载该文件就代表您同意版权和免责声明
- 下载SYSTEM文件和对应的checksum,确认无损坏后覆盖掉CoreELEC启动介质(U盘,tf卡)里的SYSTEM文件(如果你用的是Windows,
SYSTEM
和SYSTEM.md5
文件就在你唯一能看见的那个分区里,不会错的)
-
背景故事(
图便宜买了台号称支持CoreELEC的X96 Max Plus(X96_MAX_PlUS2_T),自带2.4/5G wifi,蓝牙,千兆网口,结果一跑CoreELEC,发现没有wifi??
以为用错dts,就去问了卖家,答:“现在不支持wifi,但以后会支持的”——我信你个大头鬼,我翻了一圈CoreElec的commit history都没看到相关讨论,你怎么知道CE以后会支持?
简单搜索了一圈,大家都说CE缺少wifi芯片的驱动; 拆开机器一看,的确有一片申必的AM7256——连生产厂商都找不到,难道这就是传说中的国产闭源芯片,没救了?
考虑到4pda制作的atv_pie和CE使用同一个内核版本,而atv可以正常使用wifi,那CE也许也有救?……
废话说完了,下面开始研究记录和最终解决方案
折腾记录
1. dmesg
按照CoreELEC论坛针对wifi问题的通用解,先运行了 udevadm info /sys/bus/sdio/devices/sdio*
, 得到输出:
......
E: DRIVER=bcmsdh_sdmmc
E: SDIO_CLASS=00
E: SDIO_ID=02D0:4354
E: MODALIAS=sdio:c00v02D0d4354
E: SUBSYSTEM=sdio
E: USEC_INITIALIZED=8604971
E: SYSTEMD_WANTS=brcmfmac_sdio-firmware-aml.service
......
看起来CoreELEC把它识别成了Broadcom家的BCM4354 再看了一眼dmesg
[ [email protected]] Final fw_path=/usr/lib/firmware/brcm/fw_bcm4354a1_ag.bin
[ [email protected]] Final nv_path=/usr/lib/firmware/brcm/
[ [email protected]] Final clm_path=/usr/lib/firmware/brcm/clm_bcmdhd.blob
[ [email protected]] Final conf_path=/usr/lib/firmware/brcm/config.txt
[ [email protected]] dhd_set_bus_params: set use_rxchain 0
[ [email protected]] dhd_set_bus_params: set txinrx_thres 128
[ [email protected]] dhd_set_bus_params: set txglomsize 36
[ [email protected]] dhdsdio_download_code_file: Open firmware file failed /usr/lib/firmware/brcm/fw_bcm4354a1_ag.bin
[ [email protected]] _dhdsdio_download_firmware: dongle image file download failed
的确是识别成了BCM4354, rev=0x01的芯片
那么这个识别对吗?
2. 原厂系统
重启至原厂系统,adb shell以root权限运行dmesg,过滤后发现:
[ 22.784634] dhd_os_open_image1: /vendor/etc/wifi/buildin/config.txt (102 bytes) open success
[ 22.809816] [dhd] dhd_conf_set_path_params : Final fw_path=/vendor/etc/wifi/buildin/fw_bcm4354a1_ag.bin
[ 22.819346] [dhd] dhd_conf_set_path_params : Final nv_path=/vendor/etc/wifi/buildin/nvram_ap6354.txt
[ 22.828602] [dhd] dhd_conf_set_path_params : Final clm_path=/vendor/etc/wifi/buildin/clm_bcm4354a1_ag.blob
[ 22.838406] [dhd] dhd_conf_set_path_params : Final conf_path=/vendor/etc/wifi/buildin/config.txt
[ 22.848151] dhd_os_open_image1: /vendor/etc/wifi/buildin/fw_bcm4354a1_ag.bin (654038 bytes) open success
[ 23.005351] dhd_os_open_image1: /vendor/etc/wifi/buildin/nvram_ap6354.txt (3043 bytes) open success
[ 23.097239] dhd_apply_default_clm: Ignore clm file /vendor/etc/wifi/buildin/clm_bcm4354a1_ag.blob
看来这个AM7256的确就是BCM4354——至少是兼容bcm4354的驱动
3. 注入驱动
接下来就是如何把原厂驱动添加到CoreELEC的问题了 从上面的dmesg可知,CoreELEC从/usr/lib/firmware/brcm/
文件夹读取驱动文件,而这个目录是由fat32分区的squashfs文件(SYSTEM)挂载而来;squashfs没法直接编辑,只能解包再打包
拉出一台Linux主机,解包;从原厂固件的TWRP备份(vendor.ext4.win: /etc/wifi/buildin/
)提取出fw_bcm4354a1_ag.bin
, nvram_ap6354.txt
和config.txt
,复制到/usr/lib/kernel-overlays/base/lib/firmware/
,再重新打包得到新的SYSTEM
文件,覆盖掉tf卡的目录下的文件
4. dhd_config
然而并没有成功, dmesg显示成功加载了fw_bcm4354a1_ag.bin
,但是nv_path
依旧设置成了/usr/lib/firmware/brcm
,Open nvram file failed
——尝试把文件夹当成nvram来读,肯定会失败的嘛 对比原厂的dhd模块启动参数,并没有太大的区别;也许是CoreELEC用的dhd模块出了问题? 这个猜想没有办法验证, 因为原厂是32位系统,CE是64位,模块不通用;没有原厂代码就只能去读CE使用的代码了
读完CE设定nv_path
, fw_path
, conf_path
相关的代码,明白了dhd如何从config.txt中读取相关配置来设定这些变量(原厂固件大概直接写死了nv_path
,毕竟他只要支持特定硬件) 那么就打开config.txt
,在最后一行xxxxx.txt
后面打一个空格和一个反斜杠(\
),并添加一行
17236 1 nvram_ap6354.txt
加完效果大概是
nv_by_chip=15 \
43362 0 nvram_ap6181.txt \
43362 1 nvram_ap6210.txt \
...
43752 2 nvram_ap6275s.txt \
17236 1 nvram_ap6354.txt
其中17326是芯片的chipID 0x4354的十进制表示(Broadcom偷懒x1),1是这块4354芯片的Rev号
同时把nv_by_chip=15
替换成nv_by_chip=16
(因为添加了一行配置)(Broadcom偷懒x2:指定读多少个而不用自己parse配置在哪里结束真省事……但你们这么做不怕哪天一不小心就留下一个缓冲区溢出的exploit吗??)
5. 完成
保存config.txt,重新打包SYSTEM,成功连上了wifi!
自己动手改文件的步骤
-
从原厂系统提取
/vendor/etc/wifi/buildin/fw_bcm4354a1_ag.bin
/vendor/etc/wifi/buildin/nvram_ap6354.txt
-
如果你能通过网线连接到X96,那么
ssh
进CoreELEC系统,执行
-p /storage/.config/firmware/brcm/ /usr/lib/firmware/brcm/config.txt /storage/.config/firmware/brcm/
-
使用你喜欢的编辑器,打开
squashfs_root/usr/lib/kernel-overlays/base/lib/firmware/brcm/config.txt
,在最后一条xxx.txt记录后加空格和反斜杠(),并在紧接着的下一行添加17236 1 nvram_ap6354.txt
-
退出ssh session,使用
scp
指令把第一步获得的驱动文件上传到/storage/.config/firmware/brcm/
-
重启即可
-
如果你不能通过网线连接到X96……
- i. 使用Linux系统,在ext分区上解压CoreELEC的SYSTEM文件
unsquashfs /mnt/SYSTEM
-
ii. 把提取出的
fw_bcm4354a1_ag.bin
和nvram_ap6354.txt
复制到squashfs_root/usr/lib/kernel-overlays/base/lib/firmware/brcm/
文件夹 -
iii. 打开
squashfs_root/usr/lib/kernel-overlays/base/lib/firmware/brcm/config.txt
,在最后一条xxx.txt
记录后加空格和反斜杠(\
),并在紧接着的下一行添加17236 1 nvram_ap6354.txt
-
iv. 重新打包SYSTEM
mksquashfs squashfs-root/ SYSTEM -noappend -comp gzip
-
v. 把新的SYSTEM复制回CoreELEC的安装介质
-
vi. 从修改过的安装介质启动
免责&版权声明
本文提供的固件修改基于CoreELEC(GPLv2协议),其中使用的的Broadcom驱动由X96 MAX Plus生产厂商“提供”,与CoreELEC项目没有任何关系;本文作者与CoreELEC项目没有任何关系,仅为终端用户的方便,发布的预先添加好专有驱动的CoreELEC固件。
发布的修改版固件仅使用本人拥有的设备测试,不保证在不同的机型上能产生效果,也不能保证不对软硬件造成任何形式的损坏。请优先考虑使用官方固件,并在充分考虑风险后使用本修改!(当然,官方固件是GPLv2,哪怕你用官方CoreELEC烧坏了机器,他们也是不担责任的23333)
CoreELEC以GPLv2协议发布,故按协议,本文所述的修改固件的方法也以GPLv2协议发布。请随意使用,转载,但在