Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
aea5247
confd: unlock USB ports before setting up interfaces
troglobit Oct 18, 2026
1f39582
confd: lock a USB port when its component is removed
troglobit Oct 18, 2026
33bb41e
confd: allow more characters in DHCP client option values
troglobit Oct 18, 2026
fdfaa70
confd: allow any character but control characters in syslog patterns
troglobit Oct 18, 2026
dea3d77
confd: allow any character but control characters in DHCP client-id
troglobit Oct 18, 2026
a99f29e
confd: migrate ietf-netconf-server also in 1.10 configurations
troglobit Oct 18, 2026
59c3f2b
patches/linux: keep the MT7988 PCIe port clocks enabled
troglobit Oct 18, 2026
915ef1f
board/aarch64: bpi-r4: fix the build instructions
troglobit Oct 18, 2026
0506067
board: add USB2 component to bpi-r4 factory-config
troglobit Apr 26, 2026
9fc2461
board: some sim card help on the bpi-r4
troglobit Jun 7, 2026
abf02b9
confd: fix debug mode regression
troglobit Jun 7, 2026
20f45a5
Add cellular modem support via modemd daemon
troglobit Apr 26, 2026
9dbced1
statd: fix dns-resolver and user operational data
troglobit Sep 26, 2026
3357d63
test: skip defconfig backup files at find time, not mid-loop
troglobit May 11, 2026
22b4308
modem: migrate from infix-modem to ietf-hardware/ietf-interfaces
troglobit Sep 30, 2026
ce1c42b
modemd: package Python scripts for compiled deployment
troglobit May 10, 2026
b6f27b5
modemd: add SIGHUP handler for config reload
troglobit May 10, 2026
b0f2aa0
modem: expose location and last-change in operational state
troglobit Sep 26, 2026
da4d864
modem: route NMEA from cellular modems to gpsd
troglobit May 10, 2026
992d530
modemd: stop retrying mmcli --reset when the modem rejects it
troglobit Jun 7, 2026
551f64a
modemd: handle preferred-mode set without allowed-mode
troglobit Jun 7, 2026
5f4ba6e
modem: anchor hardware components to USB ports
troglobit Jul 29, 2026
71e7fd1
modemd: don't let location setup block the data connection
troglobit Sep 26, 2026
d4ee545
modemd: bring up bearers that use PPP or DHCP
troglobit Oct 12, 2026
5d2e019
modemd: don't refresh modem status twice per check
troglobit Oct 17, 2026
b205650
patches/modem-manager: backport single-AT port probing fix
troglobit Oct 12, 2026
7b33aea
board: enable cellular modem support in the x86_64 image
troglobit Oct 11, 2026
2d405b5
modem: add a virtual modem for testing
troglobit Oct 12, 2026
a8eb65b
test/infamy: get_iface() returns None for a missing interface
troglobit Oct 11, 2026
7cd869e
test: verify cellular modem basic configuration
troglobit Oct 11, 2026
4136db4
test: verify a modem data connection
troglobit Oct 12, 2026
85466b7
configs: make cellular modem support opt-in
troglobit Oct 17, 2026
a416d98
.github: test the weekly build, then build and test with all snippets
troglobit Oct 17, 2026
e04134a
patches/linux: add a force_dbdc option for MT7615D WiFi cards
troglobit Oct 18, 2026
c85a372
utils: add a script to fix up MT7615 EEPROM images
troglobit Oct 18, 2026
716372d
board/aarch64: bpi-r4: load a WiFi card EEPROM from the aux partition
troglobit Oct 18, 2026
0852e0f
board/aarch64: bpi-r4: permanent MAC addresses from a VPD on aux
troglobit Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ on:
type: string
default: ''
description: 'Optional script to run after checkout (for spin customization)'
config:
required: false
type: string
default: ''
description: 'Extra make goals after the defconfig, e.g. dev-config or apply-modem'
secrets:
CHECKOUT_TOKEN:
required: false
Expand Down Expand Up @@ -129,7 +134,7 @@ jobs:

- name: Configure ${{ env.TARGET }}
run: |
make ${{ env.TARGET }}_defconfig apply-mirror
make ${{ env.TARGET }}_defconfig apply-mirror ${{ inputs.config }}

- name: Cleanup stale containers and ports
run: |
Expand Down Expand Up @@ -184,4 +189,4 @@ jobs:
- uses: actions/upload-artifact@v7
with:
path: output/${{ steps.vars.outputs.tgz }}
name: artifact-${{ env.TARGET }}
name: artifact-${{ env.NAME == 'infix' && env.TARGET || format('{0}-{1}', env.NAME, env.TARGET) }}
15 changes: 10 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ on:
type: string
default: ''
description: 'Release version (e.g. v26.04.0), sets INFIX_RELEASE so make test finds versioned artifacts'
config:
required: false
type: string
default: ''
description: 'Extra make goals after the defconfig, e.g. dev-config or apply-modem'
secrets:
CHECKOUT_TOKEN:
required: false
Expand Down Expand Up @@ -96,12 +101,12 @@ jobs:

- name: Configure ${{ env.TARGET }}
run: |
make ${{ env.TARGET }}_defconfig
make ${{ env.TARGET }}_defconfig ${{ inputs.config }}

# Same name as the build.yml upload, only the image tarball is needed
- uses: actions/download-artifact@v8
with:
pattern: "artifact-*"
merge-multiple: true
name: artifact-${{ (inputs.name || 'infix') == 'infix' && env.TARGET || format('{0}-{1}', inputs.name, env.TARGET) }}

- name: Restore ${{ env.TARGET }} output/
run: |
Expand Down Expand Up @@ -141,7 +146,7 @@ jobs:
- name: Upload Test Report as Artifact
uses: actions/upload-artifact@v7
with:
name: test-report
name: ${{ inputs.name && inputs.name != 'infix' && format('test-report-{0}', inputs.name) || 'test-report' }}
path: output/images/test-report.pdf

- name: Generate XPath Coverage Report for ${{ env.TARGET }}
Expand All @@ -153,5 +158,5 @@ jobs:
if: always()
uses: actions/upload-artifact@v7
with:
name: xpath-coverage-report
name: ${{ inputs.name && inputs.name != 'infix' && format('xpath-coverage-report-{0}', inputs.name) || 'xpath-coverage-report' }}
path: output/images/xpath-coverage-report.pdf
39 changes: 39 additions & 0 deletions .github/workflows/weekly.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Weekly release build to catch flaky tests and verify clean builds.
# Runs without caches (ccache) to ensure reproducibility. See issue #1003.
#
# After the release build is tested and published, a build with all
# configuration snippets applied, like 'make dev', covers the opt-in
# features that are not in the defconfigs. It waits for the release
# build and its tests, the two must not run at the same time.
name: Weekly Build

on:
Expand All @@ -15,6 +20,14 @@ jobs:
version: "latest"
use_cache: false

test:
needs: build
uses: ./.github/workflows/test.yml
with:
name: "infix"
target: "x86_64"
release: "latest"

publish:
name: Publish Weekly Build
needs: build
Expand Down Expand Up @@ -55,3 +68,29 @@ jobs:

Built from commit: \`${{ github.sha }}\`
EOF

build-dev-x86_64:
needs: [test, publish]
if: ${{ !cancelled() && github.repository == 'kernelkit/infix' }}
uses: ./.github/workflows/build.yml
with:
name: "infix-dev"
target: "x86_64"
config: "dev-config"

build-dev-aarch64:
needs: [test, publish]
if: ${{ !cancelled() && github.repository == 'kernelkit/infix' }}
uses: ./.github/workflows/build.yml
with:
name: "infix-dev"
target: "aarch64"
config: "dev-config"

test-dev:
needs: build-dev-x86_64
uses: ./.github/workflows/test.yml
with:
name: "infix-dev"
target: "x86_64"
config: "dev-config"
8 changes: 5 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,15 @@ list-snippets:
@echo "Available snippets (use 'make apply-<name>'):"
@ls $(SNIPPETS_DIR)/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf$$||; s|^| |'

dev: | $(config)
dev: dev-config
@+$(call bmake,all)

dev-config: | $(config)
@for s in $(SNIPPETS_DIR)/*.conf; do \
KCONFIG_CONFIG=$(config) $(MERGE_CONFIG) -m $(config) $$s; \
echo "Applied snippet: $$s"; \
done
@+$(call bmake,olddefconfig)
@+$(call bmake,all)

migrate-configs:
@$(CURDIR)/utils/migrate-configs.sh $(subst :, ,$(BR2_EXTERNAL))
Expand All @@ -70,4 +72,4 @@ test:
buildroot/Makefile:
@git submodule update --init

.PHONY: all check coverity dep test cyclonedx list-snippets dev migrate-configs
.PHONY: all check coverity dep test cyclonedx list-snippets dev dev-config migrate-configs
133 changes: 128 additions & 5 deletions board/aarch64/bananapi-bpi-r4/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,87 @@ Infix ships with the following factory defaults.
> are bridged into the LAN as access points. WiFi is not included with the board
> and is not part of the factory default configuration.

### WiFi Cards Without an EEPROM

Some mPCIe WiFi cards, e.g., the BPI-MT7615, ship with an unprogrammed
EEPROM. The card then comes up with a random MAC address and, for an
MT7615D, with one radio instead of one per band:

```
mt7615e 0001:01:00.0: Invalid MAC address, using random address 06:0e:56:91:b5:19
```

Such a card can be given an EEPROM image as `/mnt/aux/wifi-eeprom.bin`,
which the boot loader hands to the WiFi driver. This requires:

- The card in mPCIe slot CN14, the slot next to SIM3
- A boot loader from v26.10.0 or later
- An image of at most 20 KiB

For an MT7615 card, start from the EEPROM the driver uses today:

```
admin@bpi:~$ sudo cat /sys/kernel/debug/ieee80211/radio0/mt76/eeprom > wifi-eeprom.bin
```

On a PC, set a MAC address and, for an MT7615D, both bands with the
`utils/mt7615-eeprom.sh` script from the source tree:

```
$ utils/mt7615-eeprom.sh -b dbdc -m 02:00:00:76:15:00 wifi-eeprom.bin
chip-id : 0x7615
mac : 02:00:00:76:15:00
band : dbdc
```

Copy the image back to the board as `/mnt/aux/wifi-eeprom.bin` and
reboot. Removing the file returns the card to its own EEPROM at the
next boot. The image holds no more calibration data than the card
has without it, so range and throughput can be lower than with a
factory programmed EEPROM.

On other boards, an MT7615D gets both radios with the `force_dbdc`
option of the `mt7615_common` kernel module.

## SIM Card Installation

The BPI-R4 has three SIM holders, one per PCIe slot:

| Slot | PCIe socket | Typical use |
|----------|-------------|--------------------------|
| **SIM1** | M.2 Key-B | 4G/5G WWAN modem |
| **SIM2** | mPCIe #1 | Cellular or other modem |
| **SIM3** | mPCIe #2 | Cellular or other modem |

All three take **nano-SIM (4FF)** cards.

> [!NOTE]
> The official Banana Pi pages show an older board revision with a sliding
> "sled" holder. Newer boards ship with a fixed friction-fit holder instead:
> there is no lid to lift and no spring eject. The [closest matching photo on
> bananapi.org][15] shows the current mechanism.

### Inserting a SIM

1. Orient the card with the gold contacts facing the PCB (printed
side up) and the cut corner pointing toward the M.2/mPCIe socket,
which on this board is also toward the outer edge. The silkscreen
next to each holder shows the same outline.
2. Push the SIM straight in until it is fully seated. There is no
click and the holder is not spring-loaded, so press firmly until
the contacts engage and the rear edge of the card sits flush with
the holder.
3. A SIM that still protrudes is not fully inserted; push again.

### Removing a SIM

The friction grip on these holders is tight. Gently pry the card out
with a fingernail or a thin plastic spudger. Avoid metal tweezers
near the contacts. Removing the front panel of the metal case is
absolutely necessary to access the SIM holder.

For software configuration once the modem is recognised, see the
[Cellular Modem User's Guide][16].

## Getting Started

Expand Down Expand Up @@ -217,6 +298,43 @@ mmc partconf 0 1 1 0

Your BPI-R4 should now boot Infix from internal eMMC storage.

## Giving the Board a Permanent MAC Address

The BPI-R4 has no EEPROM with a factory-programmed MAC address. Out of
the box every Ethernet port therefore gets a random address on each
boot, and the hostname, which is derived from the base address, changes
with it.

Store a product record as `/mnt/aux/vpd.bin`, from the shell, and the
board keeps that identity across reboots and upgrades. This requires a
boot loader from v26.10.0 or later:

```
echo '{"mac-address":"02:00:00:ba:04:00","serial-number":"banana4","vendor":"SinoVoip Co., Ltd.","product-name":"BPI-R4"}' \
| onieprom -e > /mnt/aux/vpd.bin
```

Give each board its own base address and serial number, then reboot.
The base address becomes the hostname suffix, each wired port gets a
fixed offset from the base, and the WiFi interfaces get addresses
derived from it. With the record above the board is named
`bpi-ba-04-00`, `lan1` is `02:00:00:ba:04:03`, `sfp1` is
`02:00:00:ba:04:07` and `wifi0` is `06:00:00:ba:04:00`.

| Offset | BPI-R4 | BPI-R4-2g5 and BPI-R4P |
|--------|------------------|------------------------|
| +1 | CPU switch port | CPU switch port |
| +2 | `wan` | `lan0` |
| +3..+5 | `lan1`..`lan3` | `lan1`..`lan3` |
| +6 | `sfp2` | `wan` |
| +7 | `sfp1` | `sfp1` |

A locally administered address like `02:xx:xx:xx:xx:xx` is fine for a
lab. For boards that will share a network with other equipment, use a
range you own. Remove the file to return to random addresses. See
[Vital Product Data](../../../doc/vpd.md#vpd-file-on-the-aux-partition)
for the record format and what else it can carry.

## Troubleshooting

### Board won't boot
Expand Down Expand Up @@ -332,19 +450,22 @@ matching device tree:

```bash
# Build bootloaders for SD and eMMC
make x-bpi-r4-sd-boot
make x-bpi-r4-emmc-boot
make O=x-bpi-r4-sd-boot bpi_r4_sd_boot_defconfig && make O=x-bpi-r4-sd-boot
make O=x-bpi-r4-emmc-boot bpi_r4_emmc_boot_defconfig && make O=x-bpi-r4-emmc-boot

# Build main system
make aarch64
make O=x-aarch64 aarch64_defconfig && make O=x-aarch64

# Create SD card image
./utils/mkimage.sh -od bananapi-bpi-r4
./utils/mkimage.sh -b x-bpi-r4-sd-boot -r x-aarch64 bananapi-bpi-r4

# Create eMMC image
./utils/mkimage.sh -odt emmc bananapi-bpi-r4
./utils/mkimage.sh -b x-bpi-r4-emmc-boot -r x-aarch64 -t emmc bananapi-bpi-r4
```

With `-d` instead of `-b`, `mkimage.sh` downloads the bootloader from
the latest release.

[0]: https://www.kernelkit.org/posts/flashing-sdcard/
[1]: https://www.kernelkit.org/infix/latest/
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r4-sdcard.img
Expand All @@ -358,3 +479,5 @@ make aarch64
[12]: https://github.com/frank-w/u-boot/releases
[13]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2026-01-bpi-2026.01-2026-01-15_2013/bpi-r4_spim-nand_bl2.img
[14]: https://github.com/frank-w/u-boot/releases/download/CI-BUILD-2026-01-bpi-2026.01-2026-01-15_2013/bpi-r4_spim-nand_fip.bin
[15]: https://docs.banana-pi.org/bpi-r4/bpi-r4_4g5g_2.jpg
[16]: https://www.kernelkit.org/infix/latest/modem/
Loading
Loading