为CoreELEC安装AM7256 WiFi驱动(X96 Max+ T)

重要更新:

我向CoreELEC团队报告了这台设备的兼容性问题和WiFi的解决方法。WiFi问题在19.2-rc3版本中WiFi问题已经修复,所以不用看下去了!!

不过蓝牙似乎还是有问题,因此保留此篇文章,希望能为有兴趣解决蓝牙的developer提供一点点微小的帮助!

太长不看版

  • 修改好的SYSTEM文件下载地址

    • 下载该文件就代表您同意版权和免责声明
    • 下载SYSTEM文件和对应的checksum,确认无损坏后覆盖掉CoreELEC启动介质(U盘,tf卡)里的SYSTEM文件(如果你用的是Windows,SYSTEMSYSTEM.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.txtconfig.txt,复制到/usr/lib/kernel-overlays/base/lib/firmware/,再重新打包得到新的SYSTEM文件,覆盖掉tf卡的目录下的文件

4. dhd_config

然而并没有成功, dmesg显示成功加载了fw_bcm4354a1_ag.bin,但是nv_path依旧设置成了/usr/lib/firmware/brcmOpen 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!

自己动手改文件的步骤

  1. 从原厂系统提取/vendor/etc/wifi/buildin/fw_bcm4354a1_ag.bin/vendor/etc/wifi/buildin/nvram_ap6354.txt

  2. 如果你能通过网线连接到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/

    • 重启即可

  3. 如果你不能通过网线连接到X96……

    • i. 使用Linux系统,在ext分区上解压CoreELEC的SYSTEM文件
    unsquashfs /mnt/SYSTEM
    • ii. 把提取出的fw_bcm4354a1_ag.binnvram_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. 从修改过的安装介质启动

免责&版权声明

本文提供的固件修改基于CoreELECGPLv2协议),其中使用的的Broadcom驱动由X96 MAX Plus生产厂商“提供”,与CoreELEC项目没有任何关系;本文作者与CoreELEC项目没有任何关系,仅为终端用户的方便,发布的预先添加好专有驱动的CoreELEC固件。

发布的修改版固件仅使用本人拥有的设备测试,不保证在不同的机型上能产生效果,也不能保证不对软硬件造成任何形式的损坏。请优先考虑使用官方固件,并在充分考虑风险后使用本修改!(当然,官方固件是GPLv2,哪怕你用官方CoreELEC烧坏了机器,他们也是不担责任的23333)

CoreELEC以GPLv2协议发布,故按协议,本文所述的修改固件的方法也以GPLv2协议发布。请随意使用,转载,但在

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.