Tracking known issues and solutions with the BPi A311D upgrade

I’ll keep this short, kind of TL;DR list of things I’ve learned in the last few days. Feel free to comment additional solutions, I’ll try to keep this message updated.

First, an important note:
/dev/mmcblk1 and /dev/mmcblk0 are the other way around on A311D from how they are on imx8, meaning that on A311D:
/dev/mmcblk0 = SD card
/dev/mmcblk1 = EMMC

For the time being, do not attempt to flash EMMC (/dev/mmcblk1). The only verified way to boot is from the SD card. For now, flashing EMMC on the BPi is untested and may render your BPi SoM unbootable (soft brick).

  • Issue: LUKS disk decryption password prompt never appears on boot
  • Solution: Replace misconfigured /boot/boot.scr with one from here
    (Though this issue is likely already resolved by the time you read this)

  • Issue: Battery meter values are incorrect
  • Diagnosis: watch -n 1 /sys/class/power_supply/8xlifepo4/device/status, values can be seen jumping around randomly

→ Solution: Flash LPC to version R20230703 or newer.

  • Issue: WiFi and Bluetooth are not working
  • Diagnosis: sudo dmesg | grep bluetooth shows:
[   37.997989] bluetooth hci0: firmware: failed to load rtl_bt/rtl8822cs_fw.bin (-2)                  |
[   38.005390] bluetooth hci0: firmware: failed to load rtl_bt/rtl8822cs_fw.bin (-2)                  |
[   38.012817] bluetooth hci0: Direct firmware load for rtl_bt/rtl8822cs_fw.bin failed with error -2

→ Solution: Enable non-free-firmware in /etc/apt/sources.list and install the firwmware package firmware-realtek, then reboot.

  • Issue: Left internal speaker much quieter than right one
  • Diagnosis: Observe left speaker being much quieter when playing audio

→ Solution: Hardware issue on my unit - Soldered speaker wire back on, resolved.

  • Issue: mpv segfaults when trying to play video
  • Diagnosis: Try to play video, observe segfault:
vkoskiv@reform:~$ mpv
 (+) Video --vid=1 (*) (vp9 1920x1080 59.940fps)
 (+) Audio --aid=1 --alang=eng (*) (opus 2ch 48000Hz)
File tags:
 Uploader: Adrian's Digital Basement ][
Cannot load
[ffmpeg] AVHWDeviceContext: Cannot load
[ffmpeg] AVHWDeviceContext: Could not dynamically load CUDA
Failed to open VDPAU backend cannot open shared object file: No such file or directory
Cannot load
[ffmpeg] AVHWDeviceContext: Cannot load
[ffmpeg] AVHWDeviceContext: Could not dynamically load CUDA
Segmentation fault

→ Solution: #Comment out hwdec=auto from ~/.config/mpv/mpv.conf

  • Issue: WiFi is slow (~30Mbit/s) despite good signal strength
  • Diagnosis: Run a speed test

→ Solution: TBD - Apparently it’s a known driver issue

  • Issue: The following occasionally appears in dmesg:
[ 6350.739799] rtw_8822cs mmc2:0001:1: failed to send h2c command
[ 6352.847914] rtw_8822cs mmc2:0001:1: firmware failed to leave lps state

→ Solution: TBD - Unknown if this is causing any problems

Edit: Added on 22.10.2023:

  • Issue: 100% packet loss on WiFi after a while, but linux still thinks the connection is fine
  • Diagnosis: pinging router yields Destination Host Unreachable.

→ Solution: TBD - May be relayed to dmesg errors above, no solution yet, reconnecting fixes the issue temporarily.

  • Issue: Can’t enable HDMI and eDP at the same time
  • Diagnosis: The following commands work to switch displays, but omitting first command to disable eDP-1 makes the following HDMI enable commands not work.

To switch to external HDMI in sway, run:

swaymsg output eDP-1 disable
swaymsg output HDMI-A-1 enable
swaymsg output HDMI-A-1 modeline 148.50 1920 2448 2492 2640 1080 1084 1089 1125 +hsync +vsync

Note: EDID support (which is how monitors tell Linux the different modes they support) apparently doesn’t work at the moment, which is why we specify the modeline manually. In the example above, 1920x1080@50Hz
To switch back to internal screen, run the following two commands twice

swaymsg output eDP-1 enable
swaymsg output HDMI-A-1 disable

I was also unable to set a different modeline, I tried this following one to set HDMI to 2560x1440@~59Hz:

swaymsg output HDMI-A-1 modeline 241.5 2560 2608 2640 2720 1440 1443 1448 1481 +hsync +vsync

I didn’t get any errors or anything the setting just didn’t take. My HDMI cable is cheap, could be that.

→ Solution: TBD - There are other hardware projects, such as the Khadas VIM3 that use the same A311D chipset that advertise multiple display support, so it seems likely that this is a software limitation that can be fixed.


I have been using these bindings for a while now to switch between monitors and they work very reliable. The key for me is to disable the active monitor first before enable the “new” one.

# Switch monitors
bindsym $mod+m output eDP-1 disable ; output HDMI-A-1 enable
bindsym $mod+Shift+m output HDMI-A-1 disable ; output eDP-1 enable

As I was typing out that edit, it did kind of hit me why that needed to be run twice. On the first run, it fails to enable eDP and disables HDMI, and on the second run it enables eDP and does nothing to HDMI.