Compare commits

..
Author SHA1 Message Date
copilot-swe-agent[bot] 3850c98c53 Initial plan 2026-01-29 20:01:17 +00:00
354 changed files with 1912 additions and 12783 deletions
+17 -7
View File
@@ -22,10 +22,7 @@ jobs:
- cn9130_crb_boot
- fireant_boot
- nanopi_r2s_boot
- rpi2_boot
- rpi64_boot
- sama7g54_ek_emmc_boot
- sama7g54_ek_sd_boot
env:
MAKEFLAGS: -j5
steps:
@@ -66,11 +63,24 @@ jobs:
echo "Building ${defconfig}_defconfig, version ${version}-${rev}, artifact ${archive} ..."
- uses: kernelkit/actions/cache-restore@v1
- name: Restore Cache of dl/
uses: actions/cache@v4
with:
target: ${{ matrix.defconfig }}
dl-prefix: dl-boot
ccache-prefix: ccache-boot
path: dl/
key: dl-boot-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-boot-
dl-
- name: Restore Cache of .ccache/
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-boot-${{ matrix.defconfig }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-boot-${{ matrix.defconfig }}-
ccache-boot-
ccache-
- name: Configure ${{ matrix.defconfig }}_defconfig
run: |
-13
View File
@@ -8,11 +8,9 @@ on:
type: choice
required: true
options:
- raspberrypi-rpi2
- raspberrypi-rpi64
- bananapi-bpi-r3
- friendlyarm-nanopi-r2s
- microchip-sama7g54-ek
default: 'raspberrypi-rpi64'
jobs:
@@ -51,11 +49,6 @@ jobs:
- name: Set bootloader and target based on board
run: |
case "${{ inputs.board }}" in
raspberrypi-rpi2)
echo "BOOTLOADER=rpi2-boot" >> $GITHUB_ENV
echo "ARCH=arm" >> $GITHUB_ENV
echo "BUILD_EMMC=false" >> $GITHUB_ENV
;;
raspberrypi-rpi64)
echo "BOOTLOADER=rpi64-boot" >> $GITHUB_ENV
echo "ARCH=aarch64" >> $GITHUB_ENV
@@ -72,12 +65,6 @@ jobs:
echo "ARCH=aarch64" >> $GITHUB_ENV
echo "BUILD_EMMC=false" >> $GITHUB_ENV
;;
microchip-sama7g54-ek)
echo "BOOTLOADER_SD=sama7g54-ek-sd-boot" >> $GITHUB_ENV
echo "BOOTLOADER_EMMC=sama7g54-ek-emmc-boot" >> $GITHUB_ENV
echo "ARCH=arm" >> $GITHUB_ENV
echo "BUILD_EMMC=true" >> $GITHUB_ENV
;;
*)
echo "Error: Unknown board ${{ inputs.board }}"
exit 1
+28 -6
View File
@@ -20,16 +20,24 @@ jobs:
runs-on: [self-hosted, release]
strategy:
matrix:
target: [aarch64, arm, x86_64]
target: [aarch64, x86_64]
fail-fast: false
steps:
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- uses: actions/checkout@v4
with:
clean: true
submodules: recursive
- uses: kernelkit/actions/podman-cleanup@v1
- name: Set Release Variables
id: vars
run: |
@@ -40,10 +48,24 @@ jobs:
echo "dir=infix-$target" >> $GITHUB_OUTPUT
echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
- uses: kernelkit/actions/cache-restore@v1
- name: Restore Cache of dl/
if: ${{ inputs.use_cache }}
uses: actions/cache@v4
with:
target: ${{ matrix.target }}
enabled: ${{ inputs.use_cache }}
path: dl/
key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-
- name: Restore Cache of .ccache/
if: ${{ inputs.use_cache }}
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-${{ matrix.target }}-
ccache-
- name: Configure & Build
env:
+28 -4
View File
@@ -78,6 +78,15 @@ jobs:
rm -rf ./* || true
rm -rf ./.??* || true
ls -la ./
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- name: Checkout infix repo
uses: actions/checkout@v4
@@ -89,8 +98,6 @@ jobs:
submodules: recursive
token: ${{ secrets.CHECKOUT_TOKEN || github.token }}
- uses: kernelkit/actions/podman-cleanup@v1
- name: Run pre-build script
if: ${{ inputs.pre_build_script != '' }}
run: |
@@ -120,9 +127,22 @@ jobs:
echo "tgz=${name}-${target}.tar.gz" >> $GITHUB_OUTPUT
echo "Building target ${target}_defconfig"
- uses: kernelkit/actions/cache-restore@v1
- name: Restore Cache of dl/
uses: actions/cache@v4
with:
target: ${{ env.TARGET }}
path: dl/
key: dl-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-
- name: Restore Cache of .ccache/
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-${{ env.TARGET }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-${{ env.TARGET }}-
ccache-
- name: Configure ${{ env.TARGET }}
run: |
@@ -133,6 +153,10 @@ jobs:
podman rm -af || true
pkill -9 -f rootlessport || true
- name: Unit Test ${{ env.TARGET }}
run: |
make test-unit
- name: Prepare parallel build
id: parallel
run: |
+15 -3
View File
@@ -45,10 +45,22 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kernelkit/actions/cache-restore@v1
- name: Restore Cache of dl/
uses: actions/cache@v4
with:
target: x86_64
dl-prefix: dl-netconf
path: dl/
key: dl-netconf-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
restore-keys: |
dl-netconf-
dl-
- name: Restore Cache of .ccache/
uses: actions/cache@v4
with:
path: .ccache/
key: ccache-x86_64-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
restore-keys: |
ccache-x86_64-
ccache-
- name: Disk inventory (2/2) ...
run: |
echo "df -h ========================================================================="
+10 -2
View File
@@ -48,12 +48,20 @@ jobs:
contents: write
discussions: write
steps:
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- uses: actions/checkout@v4
with:
submodules: 'true'
- uses: kernelkit/actions/podman-cleanup@v1
- name: Set Release Variables
id: rel
run: |
+10 -2
View File
@@ -60,6 +60,16 @@ jobs:
name: Regression Test ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
runs-on: [self-hosted, regression]
steps:
- name: Cleanup podman state
run: |
set -x
podman ps -a || true
podman stop -a || true
podman rm -a -f || true
podman volume prune -f || true
podman system prune -a -f || true
podman system migrate || true
- name: Checkout infix repo
uses: actions/checkout@v4
with:
@@ -70,8 +80,6 @@ jobs:
submodules: recursive
token: ${{ secrets.CHECKOUT_TOKEN || github.token }}
- uses: kernelkit/actions/podman-cleanup@v1
- name: Run pre-test script
if: ${{ inputs.pre_test_script != '' }}
run: |
+3 -19
View File
@@ -1,4 +1,4 @@
name: CI
name: Kernelkit Trigger
on:
pull_request:
@@ -28,7 +28,6 @@ jobs:
outputs:
x86_64_target: ${{ steps.set-targets.outputs.x86_64_target }}
aarch64_target: ${{ steps.set-targets.outputs.aarch64_target }}
arm_target: ${{ steps.set-targets.outputs.arm_target }}
steps:
- run: |
echo "Triggering build, logging meta data ..."
@@ -44,40 +43,25 @@ jobs:
| grep -q "ci:main"; then
echo "x86_64_target=x86_64_minimal" >> $GITHUB_OUTPUT
echo "aarch64_target=aarch64_minimal" >> $GITHUB_OUTPUT
echo "arm_target=arm_minimal" >> $GITHUB_OUTPUT
else
echo "x86_64_target=x86_64" >> $GITHUB_OUTPUT
echo "aarch64_target=aarch64" >> $GITHUB_OUTPUT
echo "arm_target=arm" >> $GITHUB_OUTPUT
fi
unit-test:
needs: check-trigger
uses: ./.github/workflows/unit-test.yml
with:
name: "infix"
target: ${{ needs.check-trigger.outputs.x86_64_target }}
build-x86_64:
needs: [check-trigger, unit-test]
needs: check-trigger
uses: ./.github/workflows/build.yml
with:
name: "infix"
target: ${{ needs.check-trigger.outputs.x86_64_target }}
build-aarch64:
needs: [check-trigger, unit-test]
needs: check-trigger
uses: ./.github/workflows/build.yml
with:
name: "infix"
target: ${{ needs.check-trigger.outputs.aarch64_target }}
build-arm:
needs: [check-trigger, unit-test]
uses: ./.github/workflows/build.yml
with:
name: "infix"
target: ${{ needs.check-trigger.outputs.arm_target }}
test-run-x86_64:
needs: [check-trigger, build-x86_64]
uses: ./.github/workflows/test.yml
-116
View File
@@ -1,116 +0,0 @@
name: unit-test
on:
workflow_dispatch:
inputs:
target:
description: "Build target (e.g. aarch64 or aarch64_minimal)"
default: "x86_64"
type: string
parallel:
description: 'Massive parallel build of each image'
default: true
type: boolean
name:
description: "Name (for spin overrides)"
default: "infix"
type: string
infix_repo:
description: 'Repo to checkout (for spin overrides)'
default: kernelkit/infix
type: string
infix_branch:
description: 'Branch/tag/commit to checkout (for spin overrides)'
default: ''
type: string
workflow_call:
inputs:
target:
required: true
type: string
name:
required: true
type: string
infix_repo:
required: false
type: string
default: kernelkit/infix
infix_branch:
required: false
type: string
default: ''
description: 'Branch/tag/commit to checkout (for spin overrides). Defaults to github.ref if not specified'
parallel:
required: false
type: boolean
default: true
pre_build_script:
required: false
type: string
default: ''
description: 'Optional script to run after checkout (for spin customization)'
secrets:
CHECKOUT_TOKEN:
required: false
description: 'Token for cross-repository access'
env:
NAME: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }}
TARGET: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
INFIX_REPO: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_repo || inputs.infix_repo }}
INFIX_BRANCH: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.infix_branch || inputs.infix_branch }}
jobs:
unit-tests:
name: Build ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.name || inputs.name }} ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.target || inputs.target }}
runs-on: [ self-hosted, latest ]
env:
PARALLEL: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.parallel == 'true' || github.event_name != 'workflow_dispatch' && inputs.parallel == true }}
strategy:
fail-fast: false
steps:
- name: Cleanup Build Folder
run: |
ls -la ./
rm -rf ./* || true
rm -rf ./.??* || true
ls -la ./
- name: Checkout infix repo
uses: actions/checkout@v4
with:
repository: ${{ env.INFIX_REPO }}
ref: ${{ env.INFIX_BRANCH != '' && env.INFIX_BRANCH || github.ref }}
clean: true
fetch-depth: 0
submodules: recursive
token: ${{ secrets.CHECKOUT_TOKEN || github.token }}
- uses: kernelkit/actions/podman-cleanup@v1
- name: Run pre-build script
if: ${{ inputs.pre_build_script != '' }}
run: |
cat > ./pre-build.sh << 'EOF'
${{ inputs.pre_build_script }}
EOF
chmod +x ./pre-build.sh
bash ./pre-build.sh
- uses: kernelkit/actions/cache-restore@v1
with:
target: ${{ env.TARGET }}
- name: Configure ${{ env.TARGET }}
run: |
make ${{ env.TARGET }}_defconfig
- name: Cleanup stale containers and ports
run: |
podman rm -af || true
pkill -9 -f rootlessport || true
- name: Unit Test ${{ env.TARGET }}
run: |
make test-unit
+1 -1
View File
@@ -2,7 +2,6 @@
.claude
.gdb_history
.claude
AGENTS.md
/.backup
/.ccache
/dl
@@ -12,3 +11,4 @@ AGENTS.md
/test/.log
/local.mk
/test/spec/Readme.adoc
+2 -2
View File
@@ -167,8 +167,8 @@ APIs.
[0]: https://www.kernel.org
[1]: https://buildroot.org/ "Buildroot Homepage"
[2]: https://www.sysrepo.org/ "Sysrepo Homepage"
[3]: https://www.kernelkit.org/infix/latest/cli/introduction/
[4]: https://www.kernelkit.org/infix/
[3]: https://kernelkit.org/infix/latest/cli/introduction/
[4]: https://kernelkit.org/infix/
[5]: https://github.com/kernelkit/infix/releases
[Latest Build]: https://github.com/kernelkit/infix/releases/tag/latest "Latest build"
[License]: https://en.wikipedia.org/wiki/GPL_license
+1 -1
View File
@@ -1,6 +1,6 @@
menu "Board Support"
source "$BR2_EXTERNAL_INFIX_PATH/board/arm/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch32/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch64/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/riscv64/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/x86_64/Config.in"
+5
View File
@@ -0,0 +1,5 @@
if BR2_arm
source "$BR2_EXTERNAL_INFIX_PATH/board/aarch32/raspberrypi-rpi2/Config.in"
endif
@@ -1,5 +1,5 @@
Arm 32-bit
==========
aarch32
=======
Board Specific Documentation
----------------------------
+1
View File
@@ -0,0 +1 @@
@@ -395,9 +395,6 @@ CONFIG_RASPBERRYPI_POWER=y
CONFIG_PWM=y
CONFIG_PWM_BCM2835=y
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_BTRFS_FS=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FANOTIFY=y
@@ -415,10 +412,8 @@ CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
CONFIG_9P_FS=y
CONFIG_NLS_DEFAULT="iso8859-15"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_UTF8=y
CONFIG_CRYPTO_CCM=y
CONFIG_CRYPTO_GCM=y
@@ -5,10 +5,11 @@ config BR2_PACKAGE_RASPBERRYPI_RPI2
select BR2_PACKAGE_FEATURE_WIFI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI
help
Support for the 32-bit ARMv7 Raspberry Pi 2B single-board computer
(SBC) with BCM2836 quad-core Cortex-A7 processor.
This was the only Raspberry Pi model with the BCM2836 and the rare
RPi 2B board revision v1.2 actually got an underclocked BCM2837,
which is the saem Cortex-A53 as the RPi3, but w/o wifi.
This was the only Raspberry Pi model with the BCM2836 and the 2B
actually got a BCM2837 (Cortex-A53) underclocked an w/o wifi in
the v1.2 board revision.
@@ -21,8 +21,9 @@ The board features:
How to Build
------------
Since there are no pre-built images for ARM 32-bit, you need to build both
Infix and the bootloader from source.
Since there are no pre-built images for ARM32, you need to build both Infix
and the bootloader from source.
1. Clone the repository
@@ -36,12 +37,12 @@ Infix and the bootloader from source.
3. Build Infix (in another tree)
make O=x-arm arm_defconfig
make O=x-arm
make O=x-arm32 aarch32_defconfig
make O=x-arm32
4. Create the SD card image
./utils/mkimage.sh -b x-boot -r x-arm raspberrypi-rpi2
./utils/mkimage.sh -b x-boot -r x-arm32 raspberrypi-rpi2
The resulting image can be found in `x-boot/images/infix-arm-sdcard.img`
@@ -91,5 +92,5 @@ Serial settings: 115200 8N1
> [!WARNING]
> Use only 3.3V serial adapters. 5V adapters will damage your Raspberry Pi!
[0]: https://www.kernelkit.org/posts/flashing-sdcard/
[0]: https://kernelkit.org/posts/flashing-sdcard/
[1]: https://www.raspberrypi.com/products/raspberry-pi-2-model-b/
-1
View File
@@ -1,6 +1,5 @@
config BR2_PACKAGE_ALDER_ALDER
bool "Alder"
depends on BR2_aarch64
select BR2_PACKAGE_LINUX_FIRMWARE_INSIDE_SECURE_MINIFW
help
Alder
-1
View File
@@ -5,7 +5,6 @@ config BR2_PACKAGE_BANANAPI_BPI_R3
select BR2_PACKAGE_LINUX_FIRMWARE
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK
select BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7986
select BR2_PACKAGE_LINUX_FIRMWARE_AIROHA_EN8811H
select SDCARD_AUX
help
Build Banana PI R3 support
+44 -88
View File
@@ -1,29 +1,20 @@
# Banana Pi BPI-R3 / BPI-R3 Mini
# Banana Pi BPI-R3
<img src="bananapi-bpi-r3.webp" alt="The board" width=800 padding=10>
## Overview
The Banana Pi BPI-R3 and BPI-R3 Mini are high-performance networking
boards with full Infix support for all enabled features including
Ethernet, WiFi, and SFP interfaces.
Both boards share the same SoC and most peripherals. The key
differences are:
| Feature | BPI-R3 | BPI-R3 Mini |
|-----------------|--------------------|-------------------------|
| Ethernet switch | Yes (4x LAN + WAN) | No (WAN/LAN ports only) |
| SD card slot | Yes | No |
The Banana Pi R3 is a high-performance networking board with full Infix
support for all enabled features including switched Ethernet ports, WiFi,
and SFP interfaces.
### Hardware Features
- MediaTek MT7986 ARM Cortex-A53 quad-core processor @ 2.0 GHz
- 2 GB DDR4 RAM
- 8 GB eMMC storage
- microSD card slot (BPI-R3 only)
- 5x Gigabit Ethernet ports with switch core (BPI-R3 only)
- 2x SFP cages for fiber connectivity (1G/2.5G) (BPI-R3 only)
- 8 GB eMMC storage + microSD card slot
- 5x Gigabit Ethernet ports (4x LAN, 1x WAN)
- 2x SFP cages for fiber connectivity (1G/2.5G)
- Dual-band WiFi (2.4 GHz + 5 GHz)
- USB 3.0 port
- Mini PCIe slot
@@ -32,20 +23,16 @@ differences are:
Infix comes preconfigured with:
- **LAN ports** (lan1-lan4): Bridged for internal networking (BPI-R3 only)
- **LAN ports** (lan1-lan4): Bridged for internal networking
- **WAN port**: DHCP client enabled for internet connectivity
- **SFP ports** (sfp1, sfp2): Available for configuration (BPI-R3 only)
- **SFP ports** (sfp1, sfp2): Available for configuration
- **WiFi interfaces** (wifi0, wifi1): Available for configuration
## Getting Started
### BPI-R3: Quick Start with SD Card
### Quick Start with SD Card
The easiest way to get started with the BPI-R3 is using an SD card:
> [!NOTE]
> SD card boot works but we have observed stability issues. For production
> use or long-term reliability, we recommend installing to eMMC (see below).
The easiest way to get started is using an SD card:
1. **Download the SD card image:** [infix-bpi-r3-sdcard.img][2]
2. **Flash the image to an SD card:** see [this guide][0]
@@ -58,12 +45,6 @@ The easiest way to get started with the BPI-R3 is using an SD card:
- Connect to LAN port or console (115200 8N1)
- Default login: `admin` / `admin`
### BPI-R3 Mini: Getting Started
The BPI-R3 Mini does not have an SD card slot, so you must install
directly to eMMC. See [Installing to eMMC — BPI-R3
Mini](#bpi-r3-mini) below.
### Boot Switch Reference
The BPI-R3 has a 4-position DIP switch that controls boot media:
@@ -72,49 +53,59 @@ The BPI-R3 has a 4-position DIP switch that controls boot media:
| Position | Mode | Description |
|----------|-------------|---------------------------------------|
| 0000 | SD card | Boot from microSD card |
| 0110 | eMMC | Boot from internal eMMC (recommended) |
| 0000 | SD card | Boot from microSD card (recommended) |
| 0110 | eMMC | Boot from internal eMMC storage |
| 1010 | SPI NAND | Boot from SPI NAND (advanced users) |
> [!NOTE]
> Switch position is read from left to right: "0" = OFF, "1" = ON.
> Switch position is read from left to right: "0" = OFF, "1" = ON.
> When the DIP switch is in the "UP" position it is OFF(0).
## Installing to eMMC
## Advanced: Installing to eMMC
For production deployments or better performance, you can install Infix
to the internal eMMC storage.
to the internal eMMC storage. This is more complex but provides faster
boot times and eliminates the external SD card.
> [!IMPORTANT]
> While Infix boots on both SD card and eMMC on the BPI-R3, we have
> observed stability issues with SD cards on this platform. **eMMC is
> recommended** for reliable operation.
### Why Use eMMC?
**Advantages:**
- Faster boot and better performance
- No external SD card to manage
- More robust for industrial/embedded deployments
**Disadvantages:**
- More complex installation process
- Requires intermediate NAND boot step
- Harder to recover from errors
### Prerequisites
- FTDI USB-to-serial cable (3.3V) for console access
- microSD card with Infix (for initial boot)
- USB flash drive (FAT32 formatted)
- microSD card with Infix, for initial boot (BPI-R3 only)
- Downloaded files (see below)
### Required Files
Download and place these files on a FAT32-formatted USB drive:
1. **Infix eMMC image:**
- [infix-bpi-r3-emmc.img][3] (Complete system image)
2. **eMMC bootloader** (extracted from):
- [bpi-r3-emmc-boot-2025.01-latest.tar.gz][4]
- Extract `bl2.img` from the tarball to your USB drive
3. **Intermediate NAND bootloader** (BPI-R3 only, from Frank-W's U-Boot):
1. **Intermediate NAND bootloader** (from Frank-W's U-Boot):
- [bpi-r3_spim-nand_bl2.img][5] (BL2 loader)
- [bpi-r3_spim-nand_fip.bin][6] (FIP image)
2. **Infix eMMC image:**
- [infix-bpi-r3-emmc.img][3] (Complete system image)
3. **eMMC bootloader** (extracted from):
- [bpi-r3-emmc-boot-2025.01-latest.tar.gz][4]
- Extract `bl2.img` from the tarball to your USB drive
> [!WARNING]
> The following process involves multiple boot mode changes. Take your
> time and verify each step carefully.
> time verify each step carefully.
### BPI-R3
### Installation Steps
#### Step 1: Boot from SD card
@@ -176,48 +167,13 @@ mmc partconf 0 1 1 0
Your BPI-R3 should now boot Infix from internal eMMC storage!
### BPI-R3 Mini
The BPI-R3 Mini does not have an SD card slot, so you have to go
through the factory-installed Linux (OpenWRT) to flash the Infix
bootloader and OS to eMMC.
#### Step 1: Boot from NAND (factory default)
<img src="r3mini_nandboot2.png" alt="BPI-R3 Mini NAND boot switch position" width=400>
1. Ensure boot switches are set to NAND mode (factory default)
2. Place `infix-bpi-r3-emmc.img` and `bl2.img` on a USB drive
3. Power on and boot into Linux
4. Mount the USB drive to `/mnt`
#### Step 2: Flash Infix to eMMC
From the Linux shell:
```
echo 0 > /proc/sys/kernel/printk
dd if=/mnt/infix-bpi-r3-emmc.img of=/dev/mmcblk0
echo 0 > /sys/block/mmcblk0boot0/force_ro
dd if=/mnt/bl2.img of=/dev/mmcblk0boot0
sync
```
#### Step 3: Boot from eMMC
<img src="r3mini_emmcboot.png" alt="BPI-R3 Mini eMMC boot switch position" width=400>
1. Power off the board
2. Set boot switches to eMMC mode (see image above)
3. Power on
## Troubleshooting
### Board won't boot
- Verify boot switch positions (check twice!)
- Ensure power supply provides adequate current (12V/2A recommended)
- Try booting from SD card with switches at **0000** (BPI-R3 only)
- Try booting from SD card with switches at **0000**
### Can't break into U-Boot
@@ -229,9 +185,9 @@ sync
- Boot from NAND (**1010**) and verify eMMC image was written
- Check USB drive contents - ensure all files are present
- Re-run the eMMC boot configuration step
- Re-run Step 5 (eMMC boot configuration)
### Reverting to SD card (BPI-R3 only)
### Reverting to SD card
Simply set boot switches back to **0000** and boot from SD card. The
eMMC installation does not affect SD card functionality.
@@ -262,8 +218,8 @@ make aarch64
./utils/mkimage.sh -odt emmc bananapi-bpi-r3
```
[0]: https://www.kernelkit.org/posts/flashing-sdcard/
[1]: https://www.kernelkit.org/infix/latest/
[0]: https://kernelkit.org/posts/flashing-sdcard/
[1]: https://kernelkit.org/infix/latest/
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-sdcard.img
[3]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-bpi-r3-emmc.img
[4]: https://github.com/kernelkit/infix/releases/download/latest-boot/bpi-r3-emmc-boot-2025.01-latest.tar.gz
@@ -9,7 +9,6 @@ define BANANAPI_BPI_R3_LINUX_CONFIG_FIXUPS
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_WATCHDOG)
$(call KCONFIG_ENABLE_OPT,CONFIG_MEDIATEK_GE_PHY)
$(call KCONFIG_ENABLE_OPT,CONFIG_REALTEK_PHY)
$(call KCONFIG_SET_OPT,CONFIG_AIR_EN8811H_PHY,m)
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_MEDIATEK)
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_MEDIATEK_SOC)
$(call KCONFIG_SET_OPT,CONFIG_NET_DSA_MT7530,m)
+1 -1
View File
@@ -1 +1 @@
dtb-y += mediatek/mt7986a-bananapi-bpi-r3-sd.dtb mediatek/mt7986a-bananapi-bpi-r3-emmc.dtb mediatek/mt7986a-bananapi-bpi-r3-mini.dtb
dtb-y += mediatek/mt7986a-bananapi-bpi-r3-sd.dtb mediatek/mt7986a-bananapi-bpi-r3-emmc.dtb
@@ -1,4 +1,2 @@
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3.dts>
#include "mt7986a-bananapi-bpi-r3.dtsi"
#include "mt7986a-bananapi-bpi-r3-emmc.dtsi"
@@ -1,12 +0,0 @@
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3-mini.dts>
#include "mt7986a-bananapi-bpi-r3.dtsi"
#include "mt7986a-bananapi-bpi-r3-emmc.dtsi"
&phy0 {
compatible = "ethernet-phy-id03a2.a411";
};
&phy1 {
compatible = "ethernet-phy-id03a2.a411";
};
@@ -1,2 +0,0 @@
#include "mt7986a-bananapi-bpi-r3.dtsi"
#include "mt7986a-bananapi-bpi-r3-emmc.dtsi"
@@ -1,4 +1,2 @@
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3.dts>
#include "mt7986a-bananapi-bpi-r3.dtsi"
#include "mt7986a-bananapi-bpi-r3-sd.dtsi"
@@ -1,3 +1,5 @@
#include <arm64/mediatek/mt7986a-bananapi-bpi-r3.dts>
/ {
chosen {
infix {
@@ -51,11 +51,6 @@ image #INFIX_ID##VERSION#-bpi-r3-#TARGET#.img {
size = 4096s
}
partition en8811h_fw {
size = 10M
image = "en8811h-fw.bin"
}
partition aux {
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
image = "aux.ext4"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

@@ -218,8 +218,8 @@
"symmetric-key": [
{
"name": "wifi",
"cleartext-symmetric-key": "aW5maXhpbmZpeA==",
"key-format": "infix-crypto-types:passphrase-key-format"
"infix-keystore:symmetric-key": "infixinfix",
"infix-keystore:key-format": "infix-crypto-types:wifi-preshared-key-format"
}
]
}
@@ -0,0 +1,3 @@
#!/bin/sh
udevadm control --reload-rules
udevadm trigger --subsystem-match=net --action=add
@@ -1,445 +0,0 @@
{
"ieee802-dot1ab-lldp:lldp": {
"infix-lldp:enabled": true
},
"ietf-hardware:hardware": {
"component": [
{
"name": "USB",
"class": "infix-hardware:usb",
"state": {
"admin-state": "unlocked"
}
},
{
"class": "infix-hardware:usb",
"name": "USB2",
"state": {
"admin-state": "unlocked"
}
},
{
"name": "radio0",
"class": "infix-hardware:wifi",
"infix-hardware:wifi-radio": {
"country-code": "DE",
"band": "2.4GHz",
"channel": "auto"
}
},
{
"name": "radio1",
"class": "infix-hardware:wifi",
"infix-hardware:wifi-radio": {
"country-code": "DE",
"band": "5GHz",
"channel": "auto"
}
}
]
},
"ietf-interfaces:interfaces": {
"interface": [
{
"name": "br0",
"type": "infix-if-type:bridge",
"ietf-ip:ipv4": {
"address": [
{
"ip": "192.168.0.1",
"prefix-length": 24
}
]
}
},
{
"name": "lan",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv6": {},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "lo",
"type": "infix-if-type:loopback",
"ietf-ip:ipv4": {
"address": [
{
"ip": "127.0.0.1",
"prefix-length": 8
}
]
},
"ietf-ip:ipv6": {
"address": [
{
"ip": "::1",
"prefix-length": 128
}
]
}
},
{
"name": "wan",
"type": "infix-if-type:ethernet",
"ietf-ip:ipv4": {
"infix-dhcp-client:dhcp": {
"option": [
{
"id": "ntp-server"
},
{
"id": "broadcast"
},
{
"id": "domain"
},
{
"id": "hostname"
},
{
"id": "dns-server"
},
{
"id": "router"
},
{
"id": "netmask"
},
{
"id": "vendor-class",
"value": "Banana Pi BPI-R3"
}
]
}
},
"ietf-ip:ipv6": {
"infix-dhcpv6-client:dhcp": {
"option": [
{
"id": "ntp-server"
},
{
"id": "client-fqdn"
},
{
"id": "domain-search"
},
{
"id": "dns-server"
}
]
}
}
},
{
"name": "wifi0-ap",
"type": "infix-if-type:wifi",
"infix-interfaces:wifi": {
"radio": "radio0",
"access-point": {
"ssid": "Infix",
"security": {
"secret": "wifi"
}
}
},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
},
{
"name": "wifi1-ap",
"type": "infix-if-type:wifi",
"infix-interfaces:wifi": {
"radio": "radio1",
"access-point": {
"ssid": "Infix5Ghz",
"security": {
"secret": "wifi"
}
}
},
"infix-interfaces:bridge-port": {
"bridge": "br0"
}
}
]
},
"ietf-keystore:keystore": {
"asymmetric-keys": {
"asymmetric-key": [
{
"name": "genkey",
"public-key-format": "infix-crypto-types:ssh-public-key-format",
"public-key": "",
"private-key-format": "infix-crypto-types:rsa-private-key-format",
"cleartext-private-key": "",
"certificates": {}
}
]
},
"symmetric-keys": {
"symmetric-key": [
{
"name": "wifi",
"cleartext-symmetric-key": "aW5maXhpbmZpeA==",
"key-format": "infix-crypto-types:passphrase-key-format"
}
]
}
},
"ietf-netconf-acm:nacm": {
"enable-nacm": true,
"read-default": "permit",
"write-default": "permit",
"exec-default": "permit",
"groups": {
"group": [
{
"name": "admin",
"user-name": [
"admin"
]
},
{
"name": "operator",
"user-name": []
},
{
"name": "guest",
"user-name": []
}
]
},
"rule-list": [
{
"name": "admin-acl",
"group": [
"admin"
],
"rule": [
{
"name": "permit-all",
"module-name": "*",
"access-operations": "*",
"action": "permit",
"comment": "Allow 'admin' group complete access to all operations and data."
}
]
},
{
"name": "operator-acl",
"group": [
"operator"
],
"rule": [
{
"name": "permit-system-rpcs",
"module-name": "ietf-system",
"rpc-name": "*",
"access-operations": "exec",
"action": "permit",
"comment": "Operators can reboot, shutdown, and set system time."
}
]
},
{
"name": "guest-acl",
"group": [
"guest"
],
"rule": [
{
"name": "deny-all-write+exec",
"module-name": "*",
"access-operations": "create update delete exec",
"action": "deny",
"comment": "Guests cannot change anything or exec rpcs."
}
]
},
{
"name": "default-deny-all",
"group": [
"*"
],
"rule": [
{
"name": "deny-password-access",
"path": "/ietf-system:system/authentication/user/password",
"access-operations": "*",
"action": "deny",
"comment": "No user except admins can access password hashes."
},
{
"name": "deny-keystore-access",
"module-name": "ietf-keystore",
"access-operations": "*",
"action": "deny",
"comment": "No user except admins can access cryptographic keys."
},
{
"name": "deny-truststore-access",
"module-name": "ietf-truststore",
"access-operations": "*",
"action": "deny",
"comment": "No user except admins can access trust store."
}
]
}
]
},
"ietf-netconf-server:netconf-server": {
"listen": {
"endpoints": {
"endpoint": [
{
"name": "default-ssh",
"ssh": {
"tcp-server-parameters": {
"local-bind": [
{
"local-address": "::"
}
]
},
"ssh-server-parameters": {
"server-identity": {
"host-key": [
{
"name": "default-key",
"public-key": {
"central-keystore-reference": "genkey"
}
}
]
}
}
}
}
]
}
}
},
"ietf-system:system": {
"hostname": "bpi-%m",
"ntp": {
"server": [
{
"name": "default",
"udp": {
"address": "pool.ntp.org"
}
}
]
},
"authentication": {
"user": [
{
"name": "admin",
"password": "$factory$",
"infix-system:shell": "bash"
}
]
},
"infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo="
},
"infix-dhcp-server:dhcp-server": {
"option": [
{
"id": "ntp-server",
"address": "auto"
},
{
"id": "dns-server",
"address": "auto"
},
{
"id": "router",
"address": "auto"
}
],
"subnet": [
{
"subnet": "192.168.0.0/24",
"pool": {
"start-address": "192.168.0.100",
"end-address": "192.168.0.250"
}
}
]
},
"infix-firewall:firewall": {
"default": "wan",
"zone": [
{
"name": "lan",
"action": "accept",
"interface": [
"br0"
]
},
{
"name": "wan",
"action": "drop",
"interface": [
"wan"
],
"service": [
"dhcpv6-client"
]
}
],
"policy": [
{
"name": "lan-to-wan",
"action": "accept",
"ingress": [
"lan"
],
"egress": [
"wan"
],
"masquerade": true
}
]
},
"infix-meta:meta": {
"version": "1.7"
},
"infix-services:mdns": {
"enabled": true
},
"infix-services:ssh": {
"enabled": true,
"hostkey": [
"genkey"
],
"listen": [
{
"name": "ipv4",
"address": "0.0.0.0",
"port": 22
},
{
"name": "ipv6",
"address": "::",
"port": 22
}
]
},
"infix-services:web": {
"enabled": true,
"console": {
"enabled": true
},
"netbrowse": {
"enabled": true
},
"restconf": {
"enabled": true
}
}
}
@@ -1,2 +0,0 @@
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth0", NAME="lan"
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/15100000.ethernet/net/eth1", NAME="wan"
@@ -3,9 +3,6 @@ CONFIG_BOOTDELAY=2
# CONFIG_MMC_PCI is not set
CONFIG_ENV_IS_NOWHERE=y
# CONFIG_ENV_IS_IN_MMC is not set
CONFIG_MULTI_DTB_FIT=y
CONFIG_OF_LIST="mt7986a-bpi-r3-sd mt7986a-bpi-r3-emmc mt7986a-bpi-r3-mini"
CONFIG_USB=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_MTK=y
@@ -29,17 +26,8 @@ CONFIG_MTD_SPI_NAND=y
CONFIG_MTK_SPIM=y
CONFIG_MTK_SNOR=y
CONFIG_DM_MDIO=y
CONFIG_DM_ETH_PHY=y
CONFIG_PHY_ETHERNET_ID=y
CONFIG_PHY_AIROHA=y
CONFIG_PHY_AIROHA_EN8811H=y
CONFIG_PHY_AIROHA_FW_IN_MMC=y
CONFIG_CMD_SF=y
CONFIG_CMD_USB=y
CONFIG_CMD_MTD=y
CONFIG_CMD_MDIO=y
CONFIG_CMD_MTDPARTS=y
CONFIG_CMD_DM=y
@@ -15,10 +15,6 @@
scriptaddr = "0x48000000";
ramdisk_addr_r = "0x4A000000";
en8811h_fw_part = "0#en8811h_fw";
en8811h_fw_dm_dir = "EthMD32.dm.bin";
en8811h_fw_dsp_dir = "EthMD32.DSP.bin";
/* This is a development platform, keep
* developer mode statically enabled.
*/
@@ -0,0 +1,3 @@
#!/bin/sh
udevadm control --reload-rules
udevadm trigger --subsystem-match=net --action=add
-4
View File
@@ -578,7 +578,6 @@ CONFIG_PHY_SAMSUNG_USB2=y
CONFIG_NVMEM_LAYOUT_ONIE_TLV=y
CONFIG_MUX_MMIO=y
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_BTRFS_FS=y
@@ -598,11 +597,8 @@ CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_ZSTD=y
CONFIG_9P_FS=y
CONFIG_NLS_DEFAULT="iso8859-15"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_UTF8=y
CONFIG_SECURITY=y
CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,bpf"
CONFIG_CRYPTO_CCM=m
@@ -1,6 +1,5 @@
config BR2_PACKAGE_MARVELL_CN9130_CRB
bool "Marvell CN9130-CRB"
depends on BR2_aarch64
select BR2_PACKAGE_LINUX_FIRMWARE_INSIDE_SECURE_MINIFW
help
Customer Reference Board for CN9130
@@ -1,6 +1,5 @@
config BR2_PACKAGE_MARVELL_ESPRESSOBIN
bool "Marvell ESPRESSObin"
depends on BR2_aarch64
select BR2_PACKAGE_LINUX_FIRMWARE_INSIDE_SECURE_MINIFW
help
Marvell ESPRESSObin
+1 -1
View File
@@ -5,7 +5,7 @@ config BR2_PACKAGE_RASPBERRYPI_RPI64
select BR2_PACKAGE_FEATURE_WIFI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI
select BR2_PACKAGE_BRCMFMAC_SDIO_FIRMWARE_RPI_WIFI
select BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169
help
Raspberry Pi 64-bit adds support for the Raspberry Pi family of
of single-board computers (SBC), RPi 3B and later, including the
+8 -10
View File
@@ -107,10 +107,8 @@ To configure WiFi as a client, first store your WiFi password in the keystore:
```
admin@infix:/> configure
admin@infix:/config/> edit keystore symmetric-key mywifi
admin@infix:/config/keystore/…/mywifi/> set key-format passphrase-key-format
admin@infix:/config/keystore/…/mywifi/> change cleartext-symmetric-key
Passphrase: ************
Retype passphrase: ************
admin@infix:/config/keystore/…/mywifi/> set key-format wifi-preshared-key-format
admin@infix:/config/keystore/…/mywifi/> set symmetric-key YourWiFiPassword
admin@infix:/config/keystore/…/mywifi/> leave
```
@@ -312,13 +310,13 @@ While capable of basic routing tasks, be aware of limitations:
For applications requiring multiple ports or high performance, consider
dedicated networking hardware like the [Banana Pi R3][12].
[0]: https://www.kernelkit.org/posts/flashing-sdcard/
[1]: https://www.kernelkit.org/infix/latest/
[0]: https://kernelkit.org/posts/flashing-sdcard/
[1]: https://kernelkit.org/infix/latest/
[2]: https://github.com/kernelkit/infix/releases/download/latest-boot/infix-rpi64-sdcard.img
[3]: https://www.kernelkit.org/infix/latest/container/#content-mounts
[4]: https://www.kernelkit.org/infix/latest/scripting-restconf/
[3]: https://kernelkit.org/infix/latest/container/#content-mounts
[4]: https://kernelkit.org/infix/latest/scripting-restconf/
[8]: https://github.com/kernelkit/infix/releases/tag/latest-boot
[9]: https://www.kernelkit.org/infix/latest/networking/#wifi
[9]: https://kernelkit.org/infix/latest/networking/#wifi
[10]: https://www.raspberrypi.com/products/raspberry-pi-touch-display/
[11]: https://www.raspberrypi.com/documentation/
[12]: https://www.kernelkit.org/infix/latest/hardware/#banana-pi-bpi-r3
[12]: https://kernelkit.org/infix/latest/hardware/#banana-pi-bpi-r3
@@ -0,0 +1,4 @@
#!/bin/sh
# Workaround for: https://github.com/kernelkit/infix/issues/1357
udevadm control --reload-rules
udevadm trigger --subsystem-match=net --action=add
@@ -0,0 +1,4 @@
#!/bin/sh
# Workaround for: https://github.com/kernelkit/infix/issues/1357
udevadm control --reload-rules
udevadm trigger --subsystem-match=net --action=add
-1
View File
@@ -1,6 +1,5 @@
config BR2_PACKAGE_STYX_DCP_SC_28P
bool "Styx DCP-SC-28P"
depends on BR2_aarch64
select BR2_PACKAGE_LINUX_FIRMWARE_INSIDE_SECURE_MINIFW
help
Styx DCP-SC-28P
-6
View File
@@ -1,6 +0,0 @@
if BR2_arm
source "$BR2_EXTERNAL_INFIX_PATH/board/arm/microchip-sama7g54-ek/Config.in"
source "$BR2_EXTERNAL_INFIX_PATH/board/arm/raspberrypi-rpi2/Config.in"
endif
-1
View File
@@ -1 +0,0 @@
include $(sort $(wildcard $(BR2_EXTERNAL_INFIX_PATH)/board/arm/*/*.mk))
@@ -1,7 +0,0 @@
config BR2_PACKAGE_MICROCHIP_SAMA7G54_EK
bool "Microchip SAMA7G54-EK Evaluation Kit"
depends on BR2_arm
select SDCARD_AUX
help
Support for the Microchip SAMA7G54 Evaluation Kit featuring
a Cortex-A7 processor with MACB Gigabit Ethernet and MMC storage.
-13
View File
@@ -1,13 +0,0 @@
Copyright (c) 2026 The KernelKit Authors
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-116
View File
@@ -1,116 +0,0 @@
Microchip SAMA7G54-EK
=====================
The [SAMA7G54-EK][1] is an evaluation kit for the Microchip SAMA7G5 series,
featuring an ARM Cortex-A7 processor @ 800 MHz with 512 MB DDR3L RAM.
The board features:
- 2x MACB Gigabit Ethernet ports
- 8 GB eMMC (SDMMC0) + microSD card slot (SDMMC1)
- QSPI NOR flash
- USB 2.0 host ports
- CAN bus interfaces
- Flexcom serial ports (UART, SPI, I2C)
How to Build
------------
Since there are no pre-built images for ARM 32-bit, you need to build
both Infix and the bootloader from source.
### SD Card
1. Build the bootloader
make O=x-boot-sama7g54 sama7g54_ek_sd_boot_defconfig
make O=x-boot-sama7g54
2. Build Infix
make O=x-arm arm_defconfig
make O=x-arm
3. Create the SD card image
./utils/mkimage.sh -b x-boot-sama7g54 -r x-arm microchip-sama7g54-ek
### eMMC
1. Build the bootloader
make O=x-boot-sama7g54-emmc sama7g54_ek_emmc_boot_defconfig
make O=x-boot-sama7g54-emmc
2. Build Infix (same as above, skip if already built)
make O=x-arm arm_defconfig
make O=x-arm
3. Create the eMMC image
./utils/mkimage.sh -b x-boot-sama7g54-emmc -r x-arm -t emmc microchip-sama7g54-ek
Flashing to SD Card
-------------------
[Flash the image][0] to a microSD card (at least 2 GB):
```bash
sudo dd if=x-boot-sama7g54/images/infix-arm-sdcard.img of=/dev/sdX \
bs=1M status=progress oflag=direct
```
You can also use `bmaptool` for faster writes:
```bash
sudo bmaptool copy x-boot-sama7g54/images/infix-arm-sdcard.img /dev/sdX
```
> [!WARNING]
> Ensure `/dev/sdX` is the correct device for your SD card and not used
> by the host system! Use `lsblk` to verify.
Flashing to eMMC
-----------------
The SAMA7G5EK has an on-board 8 GB eMMC (SDMMC0/mmc0). Jumper J22
controls if booting from onboard storage is allowed or not; open means
allowed. When open, the SW4 button can also prevent booting from eMMC
if held at power on.
The easiest method is to flash from a running SD card system:
1. Boot the board from SD card
2. Transfer the eMMC image to the board (USB drive, network, etc.)
3. Flash the eMMC:
sudo bmaptool copy emmc.img /dev/mmcblk0
4. Power off, remove SD card, and boot from eMMC
Booting the Board
-----------------
1. Insert the flashed SD card (or ensure eMMC is flashed)
2. Connect an Ethernet cable
3. Power up the board
4. Find the assigned IP and SSH in, default login: `admin` / `admin`
Console Port
------------
The debug console is on Flexcom3 (active by default):
- Baud rate: 115200
- Data bits: 8
- Parity: None
- Stop bits: 1
Connect a USB-to-serial adapter to the board's debug UART header.
> [!WARNING]
> Use only 3.3V serial adapters.
[0]: https://www.kernelkit.org/posts/flashing-sdcard/
[1]: https://www.microchip.com/en-us/development-tool/EV21H18A
@@ -1 +0,0 @@
dtb-y += microchip/at91-sama7g5ek.dtb
@@ -1,18 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Infix OS device tree for Microchip SAMA7G5 Evaluation Kit
*/
#include <arm/microchip/at91-sama7g5ek.dts>
#include "infix.dtsi"
/ {
chosen {
stdout-path = "serial0:115200n8";
};
};
/* Thermal sensor disabled until OTP is calibrated */
&thermal_sensor {
status = "disabled";
};
@@ -1,85 +0,0 @@
# Disk image for Microchip SAMA7G5EK (sama7g5 evaluation kit)
image boot.vfat {
vfat {
files = {
"boot.bin",
"u-boot.bin"
}
}
size = 16M
}
image cfg.ext4 {
empty = true
temporary = true
size = 16M
ext4 {
label = "cfg"
use-mke2fs = true
features = "uninit_bg"
extraargs = "-m 0 -i 4096"
}
}
# The /var partition will be expanded automatically at first boot
# to use the full size of the SD-card or eMMC media.
image var.ext4 {
empty = true
temporary = true
size = 128M
ext4 {
label = "var"
use-mke2fs = true
features = "uninit_bg"
extraargs = "-m 0 -i 4096"
}
}
image #INFIX_ID##VERSION#-sama7g54-ek-#TARGET#.img {
hdimage {
partition-table-type = "hybrid"
}
partition boot {
partition-type = 0xC
bootable = "true"
image = "boot.vfat"
offset = 1M
}
partition aux {
partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035
image = "aux.ext4"
}
partition primary {
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
bootable = true
size = 250M
image = "rootfs.squashfs"
}
partition secondary {
partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
bootable = true
size = 250M
image = "rootfs.squashfs"
}
partition cfg {
partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105
image = "cfg.ext4"
}
partition var {
partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F
image = "var.ext4"
}
}
# Silence genimage warnings
config {}
@@ -1,69 +0,0 @@
# Microchip SAMA7G54-EK kernel configuration fixups
define MICROCHIP_SAMA7G54_EK_LINUX_CONFIG_FIXUPS
# AT91/Microchip SoC
$(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_AT91)
$(call KCONFIG_ENABLE_OPT,CONFIG_SOC_SAMA7G5)
$(call KCONFIG_ENABLE_OPT,CONFIG_ATMEL_CLOCKSOURCE_TCB)
# Serial console (FLEXCOM)
# Use ttyAT naming to avoid major/minor conflict with the
# 8250 driver (needed by Raspberry Pi 2 in the shared ARM config)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_ATMEL)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_ATMEL_CONSOLE)
$(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_ATMEL_TTYAT)
$(call KCONFIG_ENABLE_OPT,CONFIG_MFD_ATMEL_FLEXCOM)
# Network: MACB Ethernet
$(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_MICROCHIP)
$(call KCONFIG_ENABLE_OPT,CONFIG_MACB)
$(call KCONFIG_ENABLE_OPT,CONFIG_MICREL_PHY)
# MMC/SD
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_SDHCI)
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_SDHCI_PLTFM)
$(call KCONFIG_ENABLE_OPT,CONFIG_MMC_SDHCI_OF_AT91)
# Pin control and GPIO
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_AT91)
$(call KCONFIG_ENABLE_OPT,CONFIG_PINCTRL_AT91PIO4)
$(call KCONFIG_ENABLE_OPT,CONFIG_GPIO_SYSFS)
# I2C and SPI
$(call KCONFIG_ENABLE_OPT,CONFIG_I2C_AT91)
$(call KCONFIG_ENABLE_OPT,CONFIG_SPI_ATMEL)
$(call KCONFIG_ENABLE_OPT,CONFIG_SPI_ATMEL_QUADSPI)
# Power management and reset
$(call KCONFIG_ENABLE_OPT,CONFIG_POWER_RESET)
$(call KCONFIG_ENABLE_OPT,CONFIG_POWER_RESET_AT91_RESET)
$(call KCONFIG_ENABLE_OPT,CONFIG_POWER_RESET_AT91_SAMA5D2_SHDWC)
# Watchdog
$(call KCONFIG_ENABLE_OPT,CONFIG_WATCHDOG)
$(call KCONFIG_ENABLE_OPT,CONFIG_SAMA5D4_WATCHDOG)
# DMA and RTC
$(call KCONFIG_ENABLE_OPT,CONFIG_AT_XDMAC)
$(call KCONFIG_ENABLE_OPT,CONFIG_RTC_CLASS)
$(call KCONFIG_ENABLE_OPT,CONFIG_RTC_DRV_AT91SAM9)
# Crypto hardware acceleration
$(call KCONFIG_ENABLE_OPT,CONFIG_CRYPTO_DEV_ATMEL_AES)
$(call KCONFIG_ENABLE_OPT,CONFIG_CRYPTO_DEV_ATMEL_TDES)
$(call KCONFIG_ENABLE_OPT,CONFIG_CRYPTO_DEV_ATMEL_SHA)
# USB Host
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_EHCI_HCD)
$(call KCONFIG_ENABLE_OPT,CONFIG_USB_OHCI_HCD)
# Regulators
$(call KCONFIG_ENABLE_OPT,CONFIG_REGULATOR)
$(call KCONFIG_ENABLE_OPT,CONFIG_REGULATOR_FIXED_VOLTAGE)
$(call KCONFIG_ENABLE_OPT,CONFIG_REGULATOR_MCP16502)
# NVMEM for OTP
$(call KCONFIG_ENABLE_OPT,CONFIG_NVMEM_MICROCHIP_OTPC)
endef
$(eval $(ix-board))
$(eval $(generic-package))
@@ -1,12 +0,0 @@
[system]
compatible=infix-sama7g54-ek
bootloader=uboot
statusfile=/mnt/aux/rauc.status
[slot.rootfs.0]
device=/dev/disk/by-partlabel/primary
bootname=primary
[slot.rootfs.1]
device=/dev/disk/by-partlabel/secondary
bootname=secondary
@@ -1,5 +0,0 @@
{
"@ethtool:driver=macb": {
"broken-flow-control": true
}
}
@@ -1 +0,0 @@
CONFIG_DEVICE_TREE_INCLUDES="infix-env.dtsi infix-key.dtsi sama7g54-ek-env-emmc.dtsi"
@@ -1,13 +0,0 @@
# Common U-Boot extras for SAMA7G54-EK
CONFIG_EFI_PARTITION=y
CONFIG_ENV_IMPORT_FDT=y
CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y
CONFIG_RSA=y
CONFIG_RSA_VERIFY=y
CONFIG_BLKMAP=y
CONFIG_LZ4=y
CONFIG_LZMA=y
CONFIG_CMD_UNLZ4=y
CONFIG_CMD_UNZIP=y
CONFIG_CMD_IMI=y
@@ -1,19 +0,0 @@
/ {
config {
environment {
vendor = "Microchip";
bootcmd = "run ixboot";
boot_targets = "mmc0";
fdtfile = "microchip/at91-sama7g5ek.dtb";
fdt_addr_r = "0x62000000";
kernel_addr_r = "0x63000000";
scriptaddr = "0x68000000";
ramdisk_addr_r = "0x69000000";
ixbootdelay = "0.5";
bootdelay = "-2";
bootmenu_delay = "10";
ixbtn-devmode = "setenv dev_mode yes; echo Enabled";
ixbtn-factory = "echo \"No button, use bootmenu\"";
};
};
};
@@ -1,19 +0,0 @@
/ {
config {
environment {
vendor = "Microchip";
bootcmd = "run ixboot";
boot_targets = "mmc1";
fdtfile = "microchip/at91-sama7g5ek.dtb";
fdt_addr_r = "0x62000000";
kernel_addr_r = "0x63000000";
scriptaddr = "0x68000000";
ramdisk_addr_r = "0x69000000";
ixbootdelay = "0.5";
bootdelay = "-2";
bootmenu_delay = "10";
ixbtn-devmode = "setenv dev_mode yes; echo Enabled";
ixbtn-factory = "echo \"No button, use bootmenu\"";
};
};
};
@@ -1 +0,0 @@
CONFIG_DEVICE_TREE_INCLUDES="infix-env.dtsi infix-key.dtsi sama7g54-ek-env-sd.dtsi"
@@ -1,13 +0,0 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Common Infix OS defaults
*/
/ {
chosen {
infix {
/* Default admin user password: 'admin' */
factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A";
};
};
};
@@ -1,4 +0,0 @@
label Infix (arm)
kernel /boot/zImage
fdtdir /boot
append ${bootargs_root} ${bootargs_log} usbcore.authorized_default=2 -- ${bootargs_user}
@@ -12,7 +12,7 @@ cat <<EOF >"${gns3a}"
"category": "router",
"description": "${ARTIFACT} development appliance",
"vendor_name": "Kernelkit",
"vendor_url": "https://www.kernelkit.org",
"vendor_url": "https://kernelkit.org",
"product_name": "${ARTIFACT} devel",
"registry_version": 6,
"status": "experimental",
+1 -1
View File
@@ -50,7 +50,7 @@ The default credentials for the demo builds is
Password:
.-------.
| . . | Infix OS — Immutable.Friendly.Secure
|-. v .-| https://www.kernelkit.org
|-. v .-| https://kernelkit.org
'-'---'-'
Run the command 'cli' for interactive OAM
+1 -1
View File
@@ -231,7 +231,7 @@ config QEMU_NET_MODEL
if you want to play with low-level stuff like ethtool, you
might want to test the Intel 82545EM driver, e1000.
Note: ARM 32-bit uses virtio-net-device (MMIO) by default.
Note: ARM32 uses virtio-net-device (MMIO) by default.
config QEMU_NET_BRIDGE_DEV
string "Bridge device"
+10 -9
View File
@@ -83,7 +83,7 @@ loader_args()
append_args()
{
# ARM 32-bit doesn't support virtio console properly, always use serial
# ARM32 doesn't support virtio console properly, always use serial
if [ "$CONFIG_QEMU_arm" ]; then
echo -n "console=ttyAMA0 "
elif [ "$CONFIG_QEMU_CONSOLE_VIRTIO" ]; then
@@ -122,7 +122,7 @@ rootfs_args()
echo -n "-device sd-card,drive=mmc "
echo -n "-drive id=mmc,file=$CONFIG_QEMU_ROOTFS,if=none,format=raw "
elif [ "$CONFIG_QEMU_ROOTFS_VSCSI" = "y" ]; then
# ARM 32-bit virt machine uses MMIO virtio devices, not PCI
# ARM32 virt machine uses MMIO virtio devices, not PCI
if [ "$CONFIG_QEMU_arm" ]; then
echo -n "-drive file=qemu.qcow2,if=none,format=qcow2,id=rootfs "
echo -n "-device virtio-blk-device,drive=rootfs "
@@ -189,7 +189,7 @@ rw_args()
mkfs.ext4 -L cfg "$CONFIG_QEMU_RW" >/dev/null 2>&1
fi
# ARM 32-bit virt machine uses MMIO virtio devices, not PCI
# ARM32 virt machine uses MMIO virtio devices, not PCI
if [ "$CONFIG_QEMU_arm" ]; then
echo -n "-drive file=aux.ext4,if=none,format=raw,id=aux "
echo -n "-device virtio-blk-device,drive=aux "
@@ -358,12 +358,13 @@ extract_squashfs()
run_qemu()
{
# Auto-extract rootfs.squashfs from rootfs.itb if needed for initrd mode
if [ "$CONFIG_QEMU_ROOTFS_INITRD" = "y" ] && [ ! -f "$CONFIG_QEMU_ROOTFS" ]; then
itb="${CONFIG_QEMU_ROOTFS%.squashfs}.itb"
if [ -f "$itb" ]; then
extract_squashfs "$itb" "$CONFIG_QEMU_ROOTFS"
else
die "Missing $CONFIG_QEMU_ROOTFS and cannot find $itb to extract it from"
if [ "$CONFIG_QEMU_ROOTFS_INITRD" = "y" ]; then
if [ "$CONFIG_QEMU_ROOTFS" = "rootfs.squashfs" ] && [ ! -f "rootfs.squashfs" ]; then
if [ -f "rootfs.itb" ]; then
extract_squashfs "rootfs.itb" "rootfs.squashfs"
else
die "Missing rootfs.squashfs and cannot find rootfs.itb to extract it from"
fi
fi
fi
+2
View File
@@ -0,0 +1,2 @@
# --log-level debug
ZEBRA_ARGS="-A 127.0.0.1 -u frr -g frr --log syslog --log-level err"
@@ -1,2 +0,0 @@
#set DEBUG=1
service [2345] <pid/confd,pid/staticd> name:netd netd -- Network route daemon
@@ -1 +0,0 @@
../available/netd.conf
@@ -0,0 +1,9 @@
! Default settings for staticd, used for both
! confd generated routes, udhcpc and zeroconf
frr defaults traditional
hostname Router
password zebra
enable password zebra
no log unique-id
log syslog informational
log facility local2
+1 -1
View File
@@ -1,4 +1,4 @@
.-------.
| . . | Infix OS — Immutable.Friendly.Secure
|-. v .-| https://www.kernelkit.org
|-. v .-| https://kernelkit.org
'-'---'-'
+9 -35
View File
@@ -1,49 +1,23 @@
#!/bin/sh
# Prompt for a secret with confirmation, then encode and output it.
#
# Default mode: hash with mkpasswd (for system passwords)
# askpass [OUTPUT]
#
# Base64 mode (-b): base64-encode (for keystore passphrases)
# askpass -b [OUTPUT]
#
# If OUTPUT is given, result is written to the file.
# If omitted, result is written to stdout.
# shellcheck disable=SC3045
LABEL="New password"
MODE=hash
if [ "$1" = "-b" ]; then
LABEL="Passphrase"
MODE=base64
shift
fi
OUTPUT=$1
read -r -s -p "$LABEL: " secret
read -r -s -p "New password: " password
>&2 echo
read -r -s -p "Retype $LABEL: " secret_again
read -r -s -p "Retype password: " password_again
>&2 echo
if [ "$secret" != "$secret_again" ]; then
echo "${LABEL}s do not match, try again."
if [ "$password" != "$password_again" ]; then
echo "Passwords do not match, try again."
exit 1
fi
if [ -z "$secret" ]; then
echo "Empty $LABEL, try again."
exit 1
fi
if [ "$MODE" = "base64" ]; then
encoded=$(printf '%s' "$secret" | base64 -w 0)
else
encoded=$(printf '%s\n' "$secret" | mkpasswd -s)
if [ -z "$OUTPUT" ]; then
echo "$password"
exit 0
fi
umask 0177
if [ -z "$OUTPUT" ]; then
echo "$encoded"
else
printf '%s' "$encoded" > "$OUTPUT"
fi
echo "$password" | mkpasswd -s > "$OUTPUT"
exit 0
@@ -1,18 +0,0 @@
# Copy product-specific files (udev rules, factory config, etc.) to /
# based on DT compatible strings, before udevd processes any events.
#
# <hook/mount/all> fires after all filesystems are mounted but before
# finit enters runlevel S and starts any service, so the run task is
# guaranteed to start ahead of udevd. The <run/preudev/success>
# condition below then blocks udevd until pre-udev has finished.
#
# Systems without a matching product directory exit immediately.
run name:preudev cgroup.init [S] <hook/mount/all> log \
/usr/libexec/infix/pre-udev -- Probing platform
# Hold udevd back until pre-udev has had a chance to install any
# product-specific udev rules so that they are applied on first pass.
service nowarn cgroup.system name:udevd notify:none env:-/etc/default/udevd pid:udevd log \
[S12345789] <run/preudev/success> /lib/systemd/systemd-udevd $UDEVD_ARGS -- Device event daemon (udev)
service nowarn cgroup.system name:udevd notify:none env:-/etc/default/udevd pid:udevd log \
[S12345789] <run/preudev/success> udevd $UDEVD_ARGS -- Device event daemon (udev)
@@ -5,5 +5,5 @@ run nowarn if:udevd cgroup.init <service/udevd/ready> log \
# Now that everything should be probed, do a final pass over the
# uevent queue before starting syslogd and everything else
run nowarn if:udevd cgroup.init :post <run/preudev/success,service/udevd/ready> log \
run nowarn if:udevd cgroup.init :post <service/udevd/ready> log \
[S] udevadm settle -t 30 --
@@ -1,22 +1,40 @@
#!/bin/sh
# Run product specific init scripts and set bootstrap conditions.
#
# Product-specific files (udev rules, factory config, etc.) are already
# copied to / by the pre-udev run task before udevd starts. This
# script handles the remaining product init: running custom scripts
# from /etc/product/init.d/ and setting finit conditions.
# Find, install, and run product specific files and script in /etc
# before resuming bootstrap.
#
# Use /etc/product/init.d/S01-myscript for scripts, may be a symlink, it
# will be called with `start` as its only argument.
#
# The compatible array is listed in the same order as the device tree,
# most significant to least. Hence the reverse.[], to ensure overrides
# are applied in order of significance.
ident=$(basename "$0")
PRODUCT_INIT=/etc/product/init.d
PREFIXD=/usr/share/product
COMPATIBLES=$(jq -r '.compatible | reverse.[] | ascii_downcase' /run/system.json)
note()
{
logger -I $$ -k -p user.notice -t "$ident" "$1"
}
found=false
for PRODUCT in $COMPATIBLES; do
DIR="$PREFIXD/$PRODUCT"
if [ -d "$DIR" ]; then
note "Using vendor/product-specific defaults for $PRODUCT."
for dir in "$DIR"/*; do
[ -d "$dir" ] && cp -a "$dir" /
done
found=true
fi
done
if [ "$found" = false ]; then
note "No vendor/product-specific directory found, using built-in defaults."
fi
# Conditions for bootstrap services, this enables product specific
# init scripts to prevent select services from starting.
initctl -nbq cond set led
@@ -290,14 +290,6 @@ def parse_interface_info(ifname):
if power_match:
result['txpower'] = float(power_match.group(1))
# wiphy index -> phy/radio name
elif stripped.startswith('wiphy '):
try:
wiphy_idx = int(stripped.split()[1])
result['phy'] = normalize_phy_name(f'phy{wiphy_idx}')
except (ValueError, IndexError):
pass
return result
@@ -1,48 +0,0 @@
#!/bin/sh
# Copy product-specific files to / based on DT compatible strings.
# Designed to run before udevd, so that udev rules are in place when
# the kernel starts enumerating devices. No Python, no jq, no syslogd.
#
# Mirrors the platform detection from 00-probe and the copy logic from
# 05-product, but reads the DT directly instead of /run/system.json.
PREFIXD=/usr/share/product
COMPAT=/sys/firmware/devicetree/base/compatible
IDENT=$(basename "$0")
note()
{
logger -I $$ -k -p user.notice -t "$IDENT" "$*"
}
# Only DT-based systems have product-specific data keyed by compatible.
# QEMU and x86/DMI systems have no product dirs to copy.
[ -f "$COMPAT" ] || exit 0
# The DT compatible property is a null-separated list of strings,
# ordered most-specific first (e.g. "bananapi,bpi-r3\0mediatek,mt7986a").
# Reverse the list so least-specific is applied first and more-specific
# overrides it, matching the behaviour of 05-product.
reversed=""
while IFS= read -r c; do
[ -n "$c" ] || continue
reversed="$c${reversed:+ $reversed}"
done <<EOF
$(tr '\0' '\n' < "$COMPAT" | tr '[:upper:]' '[:lower:]')
EOF
found=false
for compat in $reversed; do
dir="$PREFIXD/$compat"
[ -d "$dir" ] || continue
note "Using product-specific defaults for $compat."
for subdir in "$dir"/*; do
[ -d "$subdir" ] && cp -a "$subdir" /
done
found=true
done
$found || note "No product-specific directory found, using built-in defaults."
exit 0

Some files were not shown because too many files have changed in this diff Show More