User Tools

Site Tools

Translations of this page:


BananaPi R3


  • MT7986(Filogic 830) quad core ARM A53 SoC
  • MT7531A Ethernet-switch
  • 2G DDR RAM
  • 8G eMMC flash, SPI-NAND (128 MiB), SPI-NOR (32 MiB)
  • dual-band wifi:
    • 2.4G use MT7975N
    • 5G (wifi 6/5.8GHz,not 6E) use MT7975P frontend
  • 2 SFP 2.5GbE and 5 GbE RJ45 ports
  • mPCIe slot with only USB 2.0 connected for 4G modem
  • M.2 slot key-M with only PCIe x2 interface (no sata/usb) for nvme (key B+M) or wifi-card for 6E (maybe adapter needed)




3v3 TTL

Usb2serial adapters supported: ch340 (no G),cp2104,FT4232

With Profilic, cp2102, ch340G wifi firmware does not start issue-report


115200 8n1 (8databits,1 startbit), no flow control


  • SD / eMMC sharing 1 mmc-controller in SoC
    • SD 4bit bus, eMMC 8bit
    • switched first 4 data-lanes by sw6/D (bottom on v1.0)
  • SPI NAND/NOR sharing SPI0-Bus
    • CS switched by sw5/C

sw2/B on top of board near debug-uart chooses between SPI and MMC

see bootmedium_selection for boot selection table

Network connections

gmac1 (eth0) ---- (p6)mt7531(P0) ---- WAN
                            (P1-4) -- LANx4
                            (p5/lan4) ---- right SFP slot (sfp2)
gmac2 (eth1) ---- left SFP slot (sfp1)


We have both sfp slots recognized and working

mount -t debugfs none /sys/kernel/debug/
ethtool -m eth1
cat /sys/kernel/debug/sfp*/state

Some sfp are still not recognized (e.g. gpon).maybe quirks are needed.

After some phylink-conversion there are some issues with 2g5 sfp on left sfp/eth1. A workaround is disabling autoneg on the interface

ethtool -s eth1 autoneg off

Left sfp does not support vlan in linux 6.1 because tag is stripped.

Power: “All SFP power supplies are connected to the system VDD33” which is 3v3/8A source Dts patch from Daniel I sent 3W patch to ML…

  • class: Fibre MM/SM, Copper RJ45, ONT
  • bandwidth: 1G/2G5 (only)
class vendor / short part no supported bandwidth state Link comment
Fibre MM H!Fibre for cisco ASF85-24-X2-D 1000baseX only working Amazon vendor hifibre_glc-sx-mmd.txt

2g5 sfp currently detected only if autoneg is turned off.

ethtool -s eth1 autoneg off
ethtool -s lan4 autoneg off

Eric works on phy driver which looks very good now for 6.6 (6.5-next),but now yet posted upstream.




Antenna mounting

Antenna order by band (5g in corners):

WED (wireless dispatch - hw offloading):

You need to edit /etc/modules.conf to enable WED. Add a line as follow:
options mt7915e wed_enable=Y
zgrep 'WED' /proc/config.gz
cat /sys/module/mt7915e/parameters/wed_enable
cat /sys/kernel/debug/mtk_ppe/bind


The USB3.0 socket of R3 can only provide a maximum current of 1400mA. source

mPCIe slot is usb-only with SIM connector (bottom of board). PCIe is mapped to m.2 key-m slot for nvme SSD

Sata possible via M.2 KEY-M 2lane interface on bottom side of board (needs PCIe-2-Sata controller!)

I tested mpcie slot with an em7455 LTE module (+key b adapter)

for m.2-slot there is a patch if nvme is not recognized:



cat /sys/class/thermal/thermal_zone0/temp

Thermalpad size:

Change pwm of fan from 5v to 12v (R317/R318): Shematic location on board


cat /sys/class/ieee80211/phy*/hwmon*/temp1_input

2g4/5g difference:

FAN-Connector: JST PH 2mm pin-spacing

5V pwm fan:

trigger pwm-fan:

  echo 1 > /sys/class/thermal/cooling_device0/cur_state


available via sysfs:

  • green: power
  • blue: status

additional with function

  • wf2g
  • wf5g
  • ssd: blinks on write access on m2-slot (nvme)
  • lte: reported to work by daniel

Wifi-leds are fixed in my 6.1 tree and in mt76 master.



partition layout

blocks á 512 byte

gpt - 0-33
bl2 34 - 8191 in boot0
u-boot-env 8192 - 9215
factory 9216 - 13311
fip 13312 - 17407
kernel 17408 - 222207 (100MB)
rootfs 222208 - 12805120 (6144 MB)

bytes (start,size in hex)

bl2 0x0, 0x80000 0x0, 0x40000
u-boot-env - 0x40000, 0x40000
reserved - 0x80000, 0x80000
factory 0x80000, 0x300000 -
fip 0x380000, 0x200000 0x100000, 0x80000
recovery - 0x180000, 0xa80000
fit - 0xc00000, 0x1400000
ubi 0x580000, 0x7a80000 -

GPT binaries

32MB kernel/256MB root: gpt_sd-20220216.bin

create own partition table: (currently i tried to port to python3,but get crc error, so only python2-support):

(cd tools/mediatek/gpt_editor/;python --i example/mt7986-sd.json --o GPT_SD)

Created a gpt with 100mb kernel+6GB root partition with an python2 venv

Gpt img file may cause errors when using parted (main and backup gpt corrupt) or gpt errors in uboot on reboot. This can be also caused by backup-gpt not overridden by image (end of disk).


Error: Both the primary and backup GPT tables are corrupt.  Try making a fresh table, and using Parted's rescue feature to recover partitions.

Uboot (sw reboot):

*** ERROR: Can't read GPT Entries ***
find_valid_gpt: *** ERROR: Invalid GPT ***

This can be fixed with sgdisk by exporting and re-importing the gpt

sudo sgdisk --backup=bpi-r3_sgdisk.gpt /dev/sdb
sudo sgdisk --load-backup=bpi-r3_sgdisk.gpt /dev/sdb

manual GPT creation

script for creating gpt with sgdisk/losetup bl2-partition needs legacy-boot flag!

Emmc partition creation

Todo…currently only via linux initrd from nor/usb

It is possible to create gpt in uboot. Example for rk3568:

This creates a env var with the partition definition for rk3568 (not bpi-r3):

"uuid_disk=${uuid_gpt_disk};" \
"name=loader1,start=32K,size=4000K,uuid=${uuid_gpt_loader1};" \
"name=loader2,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};" \
"name=trust,size=4M,uuid=${uuid_gpt_atf};" \
"name=boot,size=112M,bootable,uuid=${uuid_gpt_boot};" \

Which can be used like this:

mmc dev 0
gpt write mmc 0 $partitions

defined table this way (blocks only):

setenv partitions "uuid_disk=${uuid_gpt_disk};name=gpt,start=0,size=34,uuid=${uuid_gpt_table};name=u-boot-env,start=8192,size=1024,uuid=${uuid_gpt_env};name=factory,start=9216,size=4096,uuid=${uuid_gpt_factory};name=fip,start=13312,size=4096,uuid=${uuid_gpt_fip};name=kernel,size=100M,uuid=${uuid_gpt_kernel};name=rootfs,size=0,uuid=${uuid_gpt_rootfs}"

but i got error on write…maybe because a gpt already exists

MT7986> printenv partitions
MT7986> mmc dev 0
switch to partitions #0, OK
mmc0(part 0) is current device
MT7986> gpt write mmc 0 $partitions
Writing GPT: error!

atf / u-boot


Own repo:

./ importconfig
./ #build kernel

Then copy bpi-r3.itb to card and start from u-boot



create image with createimg from my uboot-repo (atf-r3 branch after building uboot+atf) and add rootfs+kernel

generated GPT from mtk-script has some problems with parted (partprobe reports main gpt is damaged), but it can be mounted with losetup -P

sudo losetup -P $LDEV $IMGDIR/$IMGNAME.img

writing image to sdcard (image not ready yet):

gunzip -c bpi-r3_sdmmc_bullseye.img.gz | sudo dd bs=1M status=progress conv=notrunc,fsync of=/dev/sdX


deb bullseye main contrib non-free
deb-src bullseye main contrib non-free
deb bullseye-updates main contrib non-free
deb-src bullseye-updates main contrib non-free
deb bullseye-security main contrib non-free
deb-src bullseye-security main contrib non-free
root@bpi-r3:~# date -s "2022-09-18 18:02:00+0200"
root@bpi-r3:~# ip link set lan4 up
root@bpi-r3:~# ip addr add dev lan4       
root@bpi-r3:~# ip route add default via     
root@bpi-r3:~# apt update
root@bpi-r3:~# apt install pciutils usbutils traceroute iperf3 net-tools psmisc wget curl

dnsmasq vs. systemd-resolved: “Another process is already listening on TCP socket”



  • reset switch low/pressed when card in m2 slot (link)


  • wifi firmware cannot be started when debug-uart connected (link)
  • reset-bug still there
    • is reported to be fixed (removed R171 and R173) in newer v1.1
    • tested in uboot with my v1.1 r3 in uboot and plugged m.2 nvme:
      • MT7986> gpio input 9
        gpio: pin 9 (gpio 9) value is 1 //initial value
        MT7986> gpio input 9
        gpio: pin 9 (gpio 9) value is 0 //pressed
  • dual-nor (no nand) reported by 1 user link
  • wifi temperature issue (2g4 seems wrong):
en/bpi-r3/start.txt · Last modified: 2023/09/01 18:59 by frank