Table of Contents
BananaPi R3
Hardware
- 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)
V1.0:
V1.1:
debug-uart
3v3 TTL
Usb2serial adapters supported: ch340 (no G),cp2104,FT4232
With Profilic, cp2102, ch340G wifi firmware does not start issue-report
Gnd-gnd,rx-tx,tx-rx
115200 8n1 (8databits,1 startbit), no flow control
bootmedium
- 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)
SFP
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…
compatibility
- 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 upstreamed a phy driver which was upstreamed in 6.9-next
the oem sfp needs addditional patches:
0001-add-phy-detection-for-oem-2g5-sfp.patch0002-net-phylink-add-support-for-disabling-in-band-status.patch
WIFI
Firmware: https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/mediatek
Antenna mounting https://forum.banana-pi.org/t/how-to-mount-the-antenna-to-the-box/14429/4
Antenna order by band (5g in corners): https://forum.banana-pi.org/t/how-to-mount-the-antenna-to-the-box/14429/15
WED (wireless dispatch - hw offloading):
https://forum.banana-pi.org/t/wed-and-beamforming-on-bpi-r3/15099/16
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 lsmod cat /sys/module/mt7915e/parameters/wed_enable conntrack -L #should show HW_OFFLOAD when traffic is offloaded cat /sys/kernel/debug/ppe*/bind #should show BND (same for entries file)
Example configs: https://forum.banana-pi.org/t/hostapd-wifi-speed-not-reach-the-maximum-in-debian11/17642/14
USB / PCIe
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: https://forum.banana-pi.org/t/bpi-r3-nvme-connection-issue/14563/17
GPIO
thermal
cat /sys/class/thermal/thermal_zone0/temp
Thermalpad size: https://forum.banana-pi.org/t/banana-pi-r3-fan-with-pwm/14406/28
Change pwm of fan from 5v to 12v (R317/R318): Shematic location on board
Mt76:
cat /sys/class/ieee80211/phy*/hwmon*/temp1_input
2g4/5g difference: https://github.com/openwrt/mt76/issues/729
FAN-Connector: JST PH 2mm pin-spacing
5V pwm fan: https://de.aliexpress.com/item/1005003663915828.html
trigger pwm-fan:
echo 1 > /sys/class/thermal/cooling_device0/cur_state
leds
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.
case
https://forum.banana-pi.org/t/banana-bpi-r3-3d-printed-case/14246/
Case from finas: https://www.printables.com/model/335936-banana-pi-bpi-r3-modular-case
Higher version added here:
https://www.dropbox.com/s/tng2pi2ud6qd2vo/Banana%20PI%20RPI-3%20case.stl?dl=0
Software
partition layout
blocks á 512 byte
SD | eMMC | |
---|---|---|
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)
NAND | NOR | |
---|---|---|
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):
https://github.com/frank-w/BPI-R3-bsp/tree/r3-atf/tools/mediatek/gpt_editor
(cd tools/mediatek/gpt_editor/;python mtk_gpt.py --i example/mt7986-sd.json --o GPT_SD)
Created a gpt with 100mb kernel+6GB root partition with an python2 venv
https://github.com/frank-w/u-boot/blob/r3-atf/gpt_sdmmc_100m6g.img
https://github.com/frank-w/u-boot/blob/r3-atf/gpt_emmc_100m6g.img
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).
Parted:
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:
https://source.denx.de/u-boot/u-boot/-/blob/master/include/configs/rk3568_common.h#L29
https://elixir.bootlin.com/u-boot/latest/source/include/configs/rockchip-common.h#L85
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};" \ "name=rootfs,size=-,uuid="ROOT_UUID
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 partitions=uuid_disk=;name=gpt,start=0,size=34,uuid=;name=u-boot-env,start=8192,size=1024,uuid=;name=factory,start=9216,size=4096,uuid=;name=fip,start=13312,size=4096,uuid=;name=kernel,size=100M,uuid=;name=rootfs,size=0,uuid= 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
Daniels code: https://github.com/dangowrt/arm-trusted-firmware/tree/mtksoc-v2.6/
https://git.openwrt.org/?p=openwrt/staging/dangole.git;a=shortlog;h=refs/heads/r3-mt7986
linux
Own repo: https://github.com/frank-w/BPI-R2-4.14/commits/6.1-main
./build.sh importconfig ./build.sh #build kernel
Then copy bpi-r3.itb to card and start from u-boot
openwrt
configuration: openwrt
https://git.openwrt.org/openwrt/openwrt.git
Build instructions: https://forum.banana-pi.org/t/banana-pi-r3-bsp-source-code/14257/2
Or using firmware selector (currently only snapshot): https://firmware-selector.openwrt.org/ (adding luci-ssl)
changing to kernel 6.1: https://forum.banana-pi.org/t/wed-and-beamforming-on-bpi-r3/15099/37
Install: https://forum.banana-pi.org/t/install-openwrt-snapshot-on-bpi-r3/14231/7?u=frank-w
opkg update opkg install luci-ssl
Change network config without luci: https://forum.banana-pi.org/t/banana-pi-r3-cant-save-anything-in-luci/14658/15?u=frank-w
Add more space on storage: https://forum.banana-pi.org/t/bpi-r3-change-or-add-partion-to-overlay/14240/12 https://forum.banana-pi.org/t/cannot-resize-my-root-partition-on-bpi-r3/13937/5
Modifications from user va1der: https://forum.banana-pi.org/t/bpi-r3-openwrt-whats-the-best-way-to-use-the-rest-of-my-space-on-my-sd-card/15675/10
parted way from user ned14: https://forum.banana-pi.org/t/bpi-r3-openwrt-23-05-0-how-to-extend-production-partition/16572/4
debian
create image with build.sh createimg from my uboot-repo (atf-r3 branch after building uboot+atf) and add rootfs+kernel. details here: debian_ubuntu_image_building
there are also some images on my gdrive: https://drive.google.com/drive/folders/1A5S7_82Bg4EYxjzdQ5FKyBw9Qi2C3uK-?usp=drive_link
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
/etc/apt/sources.list:
deb http://ftp.de.debian.org/debian bullseye main contrib non-free deb-src http://ftp.de.debian.org/debian bullseye main contrib non-free deb http://ftp.de.debian.org/debian bullseye-updates main contrib non-free deb-src http://ftp.de.debian.org/debian bullseye-updates main contrib non-free deb https://security.debian.org/debian-security bullseye-security main contrib non-free deb-src http://security.debian.org/debian-security 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 192.168.0.19/24 dev lan4 root@bpi-r3:~# ip route add default via 192.168.0.10 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 127.0.0.53:53”
issues
V1.0:
- reset switch low/pressed when card in m2 slot (link)
V1.1:
- wifi firmware cannot be started when debug-uart connected (link)
- bpi reports only affects profilic adapters, ch340,cp2102,FT4232 are ok (link)
- I tested cp2102 (not working),cp2104 (working),ch340G (not working) and ft232rl (working)
- 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): https://github.com/openwrt/mt76/issues/729