ramonvanraaij/dell-venue-8-pro

GitHub: ramonvanraaij/dell-venue-8-pro

Dell Venue 8 Pro 5830 平板上 Arch Linux(Plasma Mobile)的完整配置仓库,系统性地解决 Wi-Fi 断连、蓝牙 bring-up、C-state 冻结、电池读数等硬件兼容性问题。

Stars: 1 | Forks: 0

# Dell Venue 8 Pro 5830 - Arch Linux 配置与修复 在 Dell Venue 8 Pro 5830(型号 TD01001,Bay Trail-T / Atom Z3740D,2 GB RAM)上运行 Arch Linux(Plasma Mobile, Wayland)的可用配置和修复方案。 网络地址和硬件标识符显示为占位符(例如 ``, ``);请替换为您自己的信息。 实际的配置文件都存放在本仓库对应的真实系统路径下,因此可以直接复制到位: ``` etc/modprobe.d/ath6kl.conf -> /etc/modprobe.d/ath6kl.conf etc/modprobe.d/cfg80211-regdom.conf -> /etc/modprobe.d/cfg80211-regdom.conf etc/sysctl.d/99-venue-power.conf -> /etc/sysctl.d/99-venue-power.conf etc/sysctl.d/99-zram-tablet.conf -> /etc/sysctl.d/99-zram-tablet.conf etc/systemd/zram-generator.conf -> /etc/systemd/zram-generator.conf etc/systemd/coredump.conf.d/disable-storage.conf -> /etc/systemd/coredump.conf.d/disable-storage.conf etc/systemd/system/ath6kl-tune.service -> /etc/systemd/system/ath6kl-tune.service etc/NetworkManager/conf.d/30-no-mac-rand.conf -> /etc/NetworkManager/conf.d/30-no-mac-rand.conf usr/local/sbin/ath6kl-tune.sh -> /usr/local/sbin/ath6kl-tune.sh usr/local/sbin/arch-launcher-icon.sh -> /usr/local/sbin/arch-launcher-icon.sh etc/pacman.d/hooks/zz-arch-launcher-icon.hook -> /etc/pacman.d/hooks/zz-arch-launcher-icon.hook etc/udev/rules.d/99-emmc-fixed-disk.rules -> /etc/udev/rules.d/99-emmc-fixed-disk.rules home/.local/share/plasma-systemmonitor/overview.page -> ~/.local/share/plasma-systemmonitor/overview.page src/bthci.c -> build (gcc -O2 -o bthci src/bthci.c), install to /usr/local/sbin/bthci acpi/bt0off.dsl -> build to /boot/acpi_override.img (see the file header) etc/systemd/system/bt-venue.service -> /etc/systemd/system/bt-venue.service usr/local/src/venue-batfix/{batfix.c,Makefile} -> /usr/local/src/venue-batfix/ (kernel module source) usr/local/sbin/venue-batfix-build.sh -> /usr/local/sbin/venue-batfix-build.sh etc/pacman.d/hooks/venue-batfix.hook -> /etc/pacman.d/hooks/venue-batfix.hook etc/modules-load.d/venue-batfix.conf -> /etc/modules-load.d/venue-batfix.conf ``` ## 安装说明 要一次性应用所有配置,请在仓库根目录下运行安装脚本: ``` sudo ./install.sh ``` 该脚本是幂等的(可安全重复运行),它会执行下文各修复章节所描述的操作:安装软件包,将每个配置文件复制到相应位置,构建并安装 `bthci` 和 `batfix` 内核模块,构建 `bt0off` ACPI override 并将其添加到 systemd-boot 引导条目中(事先备份每个条目),应用运行时设置,以及启用相关服务。之后请重启系统,以使 ACPI override(`/dev/ttyS4` + 蓝牙)、5 GHz 监管域、`batfix` 模块以及引导稳定性相关内核选项生效。 下面的分项修复章节解释了每项更改及其手动操作步骤,供参考或选择性应用。 ## 硬件 - SoC:Intel Atom Z3740D (Bay Trail-T),4 核心 - RAM:2 GB;eMMC 存储(btrfs 根目录,子卷 `@`) - PMIC:Intel Crystal Cove (`INT33FD`) - Wi-Fi:Atheros AR6004 hw3.0,SDIO,`ath6kl` 驱动,固件 `fw-5.bin` (3.5.0.349-1) - 蓝牙:Atheros AR3002 (ACPI `DLAC3002`),Bay Trail HSUART (`ttyS4`) 上的 HCI-UART;可用(见下文 - ROM 运行在 3686400 波特率) - 桌面:Wayland 上的 Plasma Mobile,SDDM 自动登录 ## 修复 ### Wi-Fi:约 37 分钟断开(关键修复) 症状:连接在约 35-40 分钟后中断并变为“不可达”,通常需要重启。journal 日志显示来自站点端的固件自发取消认证(`CTRL-EVENT-DISCONNECTED reason=3 locally_generated=1`);此后每次重新连接扫描都会失败 `ret=-16/EBUSY`,因为卡住的固件从未发送 `scan_complete`。 根本原因:`ath6kl` debugfs 的 `disconnect_timeout`(固件的自发断开容忍时间)默认为 **10**,这太短了。 修复方案:`usr/local/sbin/ath6kl-tune.sh` + `etc/systemd/system/ath6kl-tune.service` 会在每次引导时设置 `disconnect_timeout=60` 并禁用固件后台扫描(它会等待 debugfs 节点出现,然后再写入配置参数)。经过约 50 分钟的清洁浸泡测试验证,与之前每次开机都会断线的情况形成鲜明对比。当手动读取该节点时,请使用显式的 `phy0` 路径 - 因为在你非 root shell 环境中,`phy*` 通配符会在 `sudo` 执行前展开并返回空结果(debugfs 仅限 root 访问);而服务以 root 身份运行,因此其自身的 `phy*` 通配符可以正常工作。 ``` sudo cp usr/local/sbin/ath6kl-tune.sh /usr/local/sbin/ && sudo chmod +x /usr/local/sbin/ath6kl-tune.sh sudo cp etc/systemd/system/ath6kl-tune.service /etc/systemd/system/ sudo systemctl enable --now ath6kl-tune.service ``` ### Wi-Fi:5 GHz 接入 未安装 `wireless-regdb`,因此缺失 `/lib/firmware/regulatory.db`,导致监管域停留在 `00`(世界),这禁止了所有 5 GHz 频道 - `iw reg set` 成了静默的无效操作。 修复方案:安装 regdb 并在 NetworkManager 关联之前尽早设置监管域: ``` sudo pacman -S wireless-regdb sudo cp etc/modprobe.d/cfg80211-regdom.conf /etc/modprobe.d/ # options cfg80211 ieee80211_regdom=NL sudo reboot ``` 注意:5 GHz 在这里运行良好 - 主路由器在 DFS 频道 100(5500 MHz,约 -44 dBm)上有一个强信号的 5 GHz BSS,平板可以连接到它。因为 DFS 频道仅在进行较慢的被动扫描时才会出现,NetworkManager 在连接时可能会短暂停留在 2.4 GHz BSS 上,并在被动扫描完成后漫游到 5 GHz(对同一 SSID 的全新扫描甚至可能完全错过 DFS 5 GHz BSS)。保持在 5 GHz 也是避开 Wi-Fi/蓝牙共存的干净方法:内置蓝牙仅支持 2.4 GHz,因此当 Wi-Fi 处于 5 GHz 时,两者不再共享频段,从而停止相互干扰。 ### Wi-Fi:固件自愈 `etc/modprobe.d/ath6kl.conf` 启用了 `recovery_enable=1 heart_beat_poll=2000`,以便驱动程序在其固件断言或挂起时重置/恢复 AR6004。(双保险措施;上面提到的 `disconnect_timeout` 修复才是真正防止约 37 分钟断线的关键。) ### 关闭 MAC 随机化 `etc/NetworkManager/conf.d/30-no-mac-rand.conf` 禁用了扫描 MAC 随机化 - ath6kl 不支持此功能(`set-hw-addr ... failure 95 Operation not supported`),这会大量产生日志垃圾并干扰重新关联。 ### 电源管理 现代化的技术栈已经就位并受到青睐:`power-profiles-daemon` + `intel_pstate` (passive) + `schedutil`。在此基础上添加了非冲突的配置: ``` sudo pacman -S powertop acpi thermald sudo systemctl enable --now thermald # thermal management for the fanless tablet sudo cp etc/sysctl.d/99-venue-power.conf /etc/sysctl.d/ && sudo sysctl --system ``` `99-venue-power.conf` 设置了 `kernel.nmi_watchdog=0` 和 `vm.dirty_writeback_centisecs=1500`。 那些过时的手动 studioteabag 脚本(强制 `no_turbo`、固定 governor、核心下线)被有意跳过 - 因为它们会与 power-profiles-daemon 发生冲突。 ### zram (2 GB RAM) `zram-generator` 包提供基于 RAM 的压缩 swap;大小设为与物理内存等大并使用 zstd,外加倾向于使用它的 sysctl 调优。 ``` sudo pacman -S zram-generator sudo cp etc/systemd/zram-generator.conf /etc/systemd/ sudo cp etc/sysctl.d/99-zram-tablet.conf /etc/sysctl.d/ && sudo sysctl --system sudo systemctl daemon-reload && sudo systemctl start dev-zram0.swap # or reboot ``` `zram-generator.conf`:`zram-size = ram`,`compression-algorithm = zstd`,`swap-priority = 100`。`99-zram-tablet.conf`:`vm.swappiness=150`,`vm.page-cluster=0`。 内核 cmdline 还设置了 `zswap.enabled=0`(改用 zram)。 ### 引导至桌面的稳定性(Bay Trail 冻结) Bay Trail Atom 会在深层空闲 C-states 中挂起/冻结 - 在这台平板上,这表现为引导期间在 SDDM 启动画面上发生的间歇性冻结。解决方法在于内核命令行(systemd-boot 引导条目,即 `options` 行): ``` intel_idle.max_cstate=1 # the key fix - cap idle at C1, avoids the deep-C-state hangs panic=10 # auto-reboot 10s after a kernel panic zswap.enabled=0 # zram is used for swap instead ``` 如果偶尔仍发生启动画面冻结,会话通常实际上已经在后台启动了;`sudo systemctl restart sddm`(或者杀掉僵死的 `kwin_wayland`/`plasmashell` 并重启 SDDM)可以在不重启的情况下恢复。 ### 禁用 Coredump(慢速 eMMC) `etc/systemd/coredump.conf.d/disable-storage.conf` 设置了 `Storage=none` / `ProcessSizeMax=0`。eMMC 处理 core dump 实在太慢了;否则,崩溃循环会将 coredump 处理变成占满磁盘的卡死。 ### 启动器主屏幕按钮:Arch Logo Plasma Mobile 导航面板中央的主屏幕按钮显示的是 Plasma 的“腰果”图标(`start-here-kde`)。为了与设备的 Arch 品牌相匹配,将其替换为 Arch logo。 任务面板通过 Qt 的 QIconLoader 渲染该图标,QIconLoader 会直接读取 `breeze-icons` 主题文件 - 用户的 `~/.local/share/icons//` 覆盖设置无法对其生效(KDE 自带的 `kiconfinder6` 可以解析到覆盖图标,但面板依然会渲染自带的打包文件)。因此,`usr/local/sbin/arch-launcher-icon.sh` 会直接使用 `/usr/share/pixmaps/archlinux-logo.svg` 覆盖 breeze / breeze-dark 的 `start-here-kde*` SVG 文件。因为 `breeze-icons` 升级时会还原这些文件,`etc/pacman.d/hooks/zz-arch-launcher-icon.hook` 会在每次 `breeze-icons` 事务之后重新运行该脚本。 ``` sudo cp usr/local/sbin/arch-launcher-icon.sh /usr/local/sbin/ && sudo chmod +x /usr/local/sbin/arch-launcher-icon.sh sudo cp etc/pacman.d/hooks/zz-arch-launcher-icon.hook /etc/pacman.d/hooks/ sudo /usr/local/sbin/arch-launcher-icon.sh # apply now; reboot (or restart plasmashell) to see it ``` 原始文件会在首次替换之前备份到 `/var/backups/arch-launcher-icon/`(脚本通过 pacman hook 以 root 身份运行)。如果要还原,请恢复它们并移除该 hook。 ### 系统监视器:磁盘小部件(eMMC 显示为“没有常规磁盘”) Plasma 系统监视器的“磁盘”小部件(概览页面)是空的。内置 eMMC(`mmcblk1`)被 udev 报告为闪存介质(`ID_DRIVE_FLASH_MMC=1`),因此 KDE Solid/UDisks2 将其分类为 `driveType=SdMmc`。ksystemstats 的磁盘插件会跳过 SD/MMC 驱动器,因此它不会为 eMMC 创建磁盘传感器,剩下的只有空的 `disk/all` 汇总值(`used=0`)- 小部件因此什么也渲染不出来。 修复方案:`etc/udev/rules.d/99-emmc-fixed-disk.rules` 清除了 `mmcblk1` 上的闪存 MMC udev 标志,因此 Solid 会报告其为 `driveType=HardDisk`;随后 ksystemstats 会枚举出 eMMC(`disk/mmcblk1`、`disk/`,以及包含真实 `used`/`total` 值的 `disk/all`)。 ``` sudo cp etc/udev/rules.d/99-emmc-fixed-disk.rules /etc/udev/rules.d/ sudo udevadm control --reload && sudo udevadm trigger --name-match=mmcblk1 sudo systemctl restart udisks2 # then re-login or reboot so ksystemstats re-enumerates ``` `home/.local/share/plasma-systemmonitor/overview.page` 额外地将“磁盘”面板切换为了 `disk/all/used` 的饼图(与 CPU/内存面板相匹配);有了这条 udev 规则,原装小部件也能正常工作了。 ### 蓝牙:内置 AR3002(可用 - ROM 运行在 3686400 波特率) 内置蓝牙(AR3002 / `DLAC3002`,Bay Trail HS-UART 上的 HCI-UART)可以正常工作。在漫长的调查过程中,唯一让它看起来像“死掉”的原因是**波特率**:AR3002 引导 ROM 以 **3686400 波特率**进行通信,而不是其 Windows INF 文件中列为 `DefaultBaudRate` 的 115200。之前所有的尝试都使用了 115200(或者最高止步于 `ttyS4` `base_baud` 即 2764800 的波特率扫描),因此从未尝试过 3.6864 Mbaud。在 3686400 波特率下,ROM 会立即响应 `GET_VERSION`(ROM 版本为 `0x01020201`),并且完全具备 HCI 能力 - 拥有有效的 `BD_ADDR`、完整的功能集、经典蓝牙 + LE(低功耗蓝牙)扫描与配对。不需要下载固件;仅凭 ROM 就足够了。(`hciattach`/`btattach` 无法驱动它,因为 3686400 不是 POSIX termios 波特率常量 - 只有 `termios2` / `BOTHER` 才能设置它,这就是为什么原装工具会超时。) 有三个部分使其能够工作并在重启后持续生效: 1. **`bt0off` SSDT override**(`acpi/bt0off.dsl`)- 为 `\_SB.URT1.BTH0` 提供了一个返回 0 的 `_STA`,以便 HS-UART 枚举为普通的 `/dev/ttyS4`,而不是 ACPI serdev 子设备。内置到 `/boot/acpi_override.img` 中并作为早期 initrd 加载(在 systemd-boot 条目中的主 initramfs 行*之前*添加 `initrd /acpi_override.img`;构建/安装步骤在文件头中)。可以通过移除该 initrd 行来还原。 2. **`bthci`**(`src/bthci.c`)- 一个小巧且独立的工具,它通过 gpio 字符设备(`gpiochip0` = `INT33FC:00` = `\_SB.GPO0`,52 号线 = 电源/启用,53 号线 = 唤醒)为芯片供电,通过 `termios2`/`BOTHER` 将 `ttyS4` 设置为 3686400 波特率 + 硬件流控制,并附加 `N_HCI` 线路规程(`HCI_UART_H4`),以便内核对外暴露 `hci0`。它仅使用稳定的内核 ABI(gpio chardev + 线路规程),因此不需要自定义内核模块,并且能够在内核升级后继续使用。构建:`gcc -O2 -o bthci src/bthci.c`,安装到 `/usr/local/sbin/bthci`。 3. **`bt-venue.service`** - 在开机时运行 `bthci`(在加载 `hci_uart` 并等待 `/dev/ttyS4` 出现之后); `bluetoothd` 会自动启用适配器。运行 `systemctl enable --now bt-venue.service`。 `BLUETOOTH.md` 讲述了完整的经过(为什么它看起来死了那么久,所有被排除的理论,以及最终令人扫兴的波特率真相)。 ### 电池:交流电切换时虚假的 0% 警告 在每次插拔交流电源时,平板的 ACPI 固件都会返回约 1.5 秒的全零 `_BST`(电压 / 充电量 / 容量全为 0,状态为“未充电”)。UPower 会将这一瞬间的读数报告为 0%,因此 Plasma 会在每个插拔周期中触发两次虚假的“电池严重低电量”警告。这只是表面问题(不会触发挂起,因为设置了 `AllowRiskyCriticalPowerAction=false`),但很烦人,而且没有任何 UPower 策略可以抑制它(无论何种策略,一个处于放电状态且电量为 0 的电池也就是 0%)。 修复方案:一个小型内核模块(`batfix`)在导出的 `power_supply_get_property()` 上放置了一个 kretprobe,对于 `BATC` 电池,每当经过处理的属性(电压、充电量、能量、容量)返回会导致物理上不可能发生瞬间下降的瞬态 0 时,它就会用上一次的有效值替换它。真正耗尽的电池是逐渐下降的,因此真正的低电量警告仍然有效;只有不可能的 71% -> 0% 的跳跃被屏蔽了。它不使用固定的结构体偏移量(布局来自内核头文件),因此可以干净地重新编译,但它是树外模块,必须在内核升级后重新构建 - `etc/pacman.d/hooks/venue-batfix.hook` 会通过 `venue-batfix-build.sh` 自动完成此操作。 ``` sudo pacman -S --needed linux-headers # required to build the module sudo mkdir -p /usr/local/src/venue-batfix sudo cp usr/local/src/venue-batfix/{batfix.c,Makefile} /usr/local/src/venue-batfix/ sudo cp usr/local/sbin/venue-batfix-build.sh /usr/local/sbin/ && sudo chmod +x /usr/local/sbin/venue-batfix-build.sh sudo cp etc/pacman.d/hooks/venue-batfix.hook /etc/pacman.d/hooks/ sudo cp etc/modules-load.d/venue-batfix.conf /etc/modules-load.d/ sudo /usr/local/sbin/venue-batfix-build.sh # build + install into the kernel tree sudo modprobe batfix # load now (also loads at boot) ``` 该模块是 GPL-2.0 协议(kprobe 模块必须是);本仓库中的所有其他内容均为 BSD 3-Clause 协议。详见 `LICENSE.md`。
标签:Arch Linux, Cutter, Plasma Mobile, 硬件适配, 系统配置, 驱动修复