* [Buildroot] [PATCH] board/t3/t3-gem-o1: add new board
@ 2026-07-06 18:39 Selman Çetin via buildroot
2026-07-13 14:56 ` [Buildroot] " dowan gullient via buildroot
2026-07-19 17:12 ` [Buildroot] [PATCH] " Selman Çetin via buildroot
0 siblings, 2 replies; 4+ messages in thread
From: Selman Çetin via buildroot @ 2026-07-06 18:39 UTC (permalink / raw)
To: buildroot; +Cc: selman.cetin, support
This commit adds support for the T3-GEM-O1
More information about the board can be found at:
https://t3gemstone.org/en
Documentation and usage guides are available at:
https://docs.t3gemstone.org/en/introduction
The official GitHub repository can be found at:
https://github.com/t3gemstone
Hardware Specifications:
- Processor: Quad-core ARM Cortex-A53 @1.4 GHz with GPU, DSP and AI accelerators
- RAM: 4 GB LPDDR4
- Storage: 32 GB eMMC, MicroSD slot (SDR104), M.2 2280 NVMe SSD Port
- Connectivity: Wi-Fi 802.11n & Bluetooth 5.1 (WL1835MOD)
- Network: Gigabit Ethernet
- USB: 2x USB 3.0 Type-A, 1x USB 2.0 Type-A, 1x USB 2.0 Type-C (Device + PD)
- Display/Camera: 1x HDMI, 1x 4-lane MIPI display, 1x 4-lane MIPI camera
- Peripherals: CAN FD, 40-pin GPIO Header, 10-pin JTAG, RTC (Maxim DS1340)
- Sensors: ICM-20948 (9-Axis IMU), BMP390 (Barometric), HDC2010 (Humidity/Temp)
- Power: USB Type-C (5-9V/3A) or DC Jack (5-12V/5A)
Signed-off-by: Selman Çetin <selman.cetin@t3gemstone.org>
---
board/t3/t3-gem-o1/genimage.cfg | 30 ++++++++++
.../arm-trusted-firmware.hash | 2 +
| 2 +
board/t3/t3-gem-o1/patches/linux/linux.hash | 2 +
.../t3-gem-o1/patches/optee-os/optee-os.hash | 2 +
.../0001-fix-binman-importlib.patch | 37 ++++++++++++
.../ti-k3-r5-loader/ti-k3-r5-loader.hash | 2 +
.../uboot/0001-fix-binman-importlib.patch | 37 ++++++++++++
board/t3/t3-gem-o1/patches/uboot/uboot.hash | 2 +
board/t3/t3-gem-o1/post-image.sh | 22 +++++++
board/t3/t3-gem-o1/readme.txt | 35 +++++++++++
.../rootfs_overlay/etc/init.d/S89firstboot | 50 ++++++++++++++++
board/t3/t3-gem-o1/uEnv.txt | 6 ++
configs/t3_gem_o1_defconfig | 59 +++++++++++++++++++
14 files changed, 288 insertions(+)
create mode 100644 board/t3/t3-gem-o1/genimage.cfg
create mode 100644 board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash
create mode 100644 board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
create mode 100644 board/t3/t3-gem-o1/patches/linux/linux.hash
create mode 100644 board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
create mode 100644 board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
create mode 100644 board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash
create mode 100644 board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
create mode 100644 board/t3/t3-gem-o1/patches/uboot/uboot.hash
create mode 100755 board/t3/t3-gem-o1/post-image.sh
create mode 100644 board/t3/t3-gem-o1/readme.txt
create mode 100755 board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
create mode 100644 board/t3/t3-gem-o1/uEnv.txt
create mode 100644 configs/t3_gem_o1_defconfig
diff --git a/board/t3/t3-gem-o1/genimage.cfg b/board/t3/t3-gem-o1/genimage.cfg
new file mode 100644
index 0000000000..3647706542
--- /dev/null
+++ b/board/t3/t3-gem-o1/genimage.cfg
@@ -0,0 +1,30 @@
+image boot.vfat {
+ vfat {
+ files = {
+ "tiboot3.bin",
+ "tispl.bin",
+ "u-boot.img",
+ "Image",
+ "k3-am67a-t3-gem-o1.dtb",
+ "uEnv.txt"
+ }
+ }
+ size = 64M
+}
+
+image sdcard.img {
+ hdimage {
+ }
+
+ partition boot {
+ partition-type = 0xC
+ bootable = "true"
+ image = "boot.vfat"
+ offset = 4M
+ }
+
+ partition rootfs {
+ partition-type = 0x83
+ image = "rootfs.ext4"
+ }
+}
diff --git a/board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash b/board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash
new file mode 100644
index 0000000000..6f02bfbb22
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 7efa89e1b4e4106ee05d68e876c8efbb146364d89cfd5d26bf4647b09c08f32b arm-trusted-firmware-v2.10-git4.tar.gz
--git a/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash b/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
new file mode 100644
index 0000000000..3c4761fa9c
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 631d4166e2700c4777fa10edde89015efa37e69ac8f43ca301f29d70419e353d linux-c0d426f64f22aa7ddba37b5552dd5b2013654990-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/linux/linux.hash b/board/t3/t3-gem-o1/patches/linux/linux.hash
new file mode 100644
index 0000000000..3c4761fa9c
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/linux/linux.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 631d4166e2700c4777fa10edde89015efa37e69ac8f43ca301f29d70419e353d linux-c0d426f64f22aa7ddba37b5552dd5b2013654990-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash b/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
new file mode 100644
index 0000000000..3f5c58fcff
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 9400e16c45bfa45f15585b2c933b86c449e7de05def0ecaaa62a4f38973a3a45 optee-os-4.9.0.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
new file mode 100644
index 0000000000..df7ddbd7cb
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
@@ -0,0 +1,37 @@
+diff --git a/tools/binman/control.py.orig b/tools/binman/control.py
+index e73c598298..7ce325ec5e 100644
+--- a/tools/binman/control.py
++++ b/tools/binman/control.py
+@@ -13,7 +13,7 @@ except ImportError: # pragma: no cover
+ # for Python 3.6
+ import importlib_resources
+ import os
+-import pkg_resources
++import importlib.resources
+ import re
+
+ import sys
+@@ -96,12 +96,12 @@ def _ReadMissingBlobHelp():
+ msg = ''
+ return tag, msg
+
+- my_data = pkg_resources.resource_string(__name__, 'missing-blob-help')
++ my_data = importlib.resources.files(__name__).joinpath('missing-blob-help').read_text(encoding='utf-8')
+ re_tag = re.compile('^([-a-z0-9]+):$')
+ result = {}
+ tag = None
+ msg = ''
+- for line in my_data.decode('utf-8').splitlines():
++ for line in my_data.splitlines():
+ if not line.startswith('#'):
+ m_tag = re_tag.match(line)
+ if m_tag:
+@@ -151,7 +151,7 @@ def GetEntryModules(include_testing=True):
+ Returns:
+ Set of paths to entry class filenames
+ """
+- glob_list = pkg_resources.resource_listdir(__name__, 'etype')
++ glob_list = [f.name for f in importlib.resources.files(__name__).joinpath('etype').iterdir() if f.is_file()]
+ glob_list = [fname for fname in glob_list if fname.endswith('.py')]
+ return set([os.path.splitext(os.path.basename(item))[0]
+ for item in glob_list
diff --git a/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash
new file mode 100644
index 0000000000..592ea66751
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 4e98496545b7f9955b178d65489624691e0d4ba2687fb507ffa364a9978bb51a uboot-8b5ae72c281207430fcc58031fe36f40900f7a2d-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch b/board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
new file mode 100644
index 0000000000..df7ddbd7cb
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
@@ -0,0 +1,37 @@
+diff --git a/tools/binman/control.py.orig b/tools/binman/control.py
+index e73c598298..7ce325ec5e 100644
+--- a/tools/binman/control.py
++++ b/tools/binman/control.py
+@@ -13,7 +13,7 @@ except ImportError: # pragma: no cover
+ # for Python 3.6
+ import importlib_resources
+ import os
+-import pkg_resources
++import importlib.resources
+ import re
+
+ import sys
+@@ -96,12 +96,12 @@ def _ReadMissingBlobHelp():
+ msg = ''
+ return tag, msg
+
+- my_data = pkg_resources.resource_string(__name__, 'missing-blob-help')
++ my_data = importlib.resources.files(__name__).joinpath('missing-blob-help').read_text(encoding='utf-8')
+ re_tag = re.compile('^([-a-z0-9]+):$')
+ result = {}
+ tag = None
+ msg = ''
+- for line in my_data.decode('utf-8').splitlines():
++ for line in my_data.splitlines():
+ if not line.startswith('#'):
+ m_tag = re_tag.match(line)
+ if m_tag:
+@@ -151,7 +151,7 @@ def GetEntryModules(include_testing=True):
+ Returns:
+ Set of paths to entry class filenames
+ """
+- glob_list = pkg_resources.resource_listdir(__name__, 'etype')
++ glob_list = [f.name for f in importlib.resources.files(__name__).joinpath('etype').iterdir() if f.is_file()]
+ glob_list = [fname for fname in glob_list if fname.endswith('.py')]
+ return set([os.path.splitext(os.path.basename(item))[0]
+ for item in glob_list
diff --git a/board/t3/t3-gem-o1/patches/uboot/uboot.hash b/board/t3/t3-gem-o1/patches/uboot/uboot.hash
new file mode 100644
index 0000000000..592ea66751
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/uboot/uboot.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 4e98496545b7f9955b178d65489624691e0d4ba2687fb507ffa364a9978bb51a uboot-8b5ae72c281207430fcc58031fe36f40900f7a2d-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/post-image.sh b/board/t3/t3-gem-o1/post-image.sh
new file mode 100755
index 0000000000..e09294a113
--- /dev/null
+++ b/board/t3/t3-gem-o1/post-image.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+set -e
+
+BOARD_DIR="$(dirname "$0")"
+GENIMAGE_CFG="${BOARD_DIR}/genimage.cfg"
+GENIMAGE_TMP="$(mktemp -d)"
+
+# Copy uEnv.txt to binaries directory so genimage can pack it into FAT
+cp -f "${BOARD_DIR}/uEnv.txt" "${BINARIES_DIR}/uEnv.txt"
+
+trap 'rm -rf "${GENIMAGE_TMP}" "${ROOTPATH_TMP}"' EXIT
+ROOTPATH_TMP="$(mktemp -d)"
+
+${HOST_DIR}/bin/genimage \
+ --rootpath "${ROOTPATH_TMP}" \
+ --tmppath "${GENIMAGE_TMP}" \
+ --inputpath "${BINARIES_DIR}" \
+ --outputpath "${BINARIES_DIR}" \
+ --config "${GENIMAGE_CFG}"
+
+exit $?
diff --git a/board/t3/t3-gem-o1/readme.txt b/board/t3/t3-gem-o1/readme.txt
new file mode 100644
index 0000000000..8ac17e821c
--- /dev/null
+++ b/board/t3/t3-gem-o1/readme.txt
@@ -0,0 +1,35 @@
+T3 Gemstone O1 (AM67A) Buildroot Support
+========================================
+
+How to build
+============
+
+$ make t3_gem_o1_defconfig
+$ make
+
+How to write the SD card
+========================
+
+Once the build process is finished you will have an image
+called "sdcard.img" in the output/images/ directory.
+
+Copy the bootable "sdcard.img" onto an SD card with "dd":
+
+ $ sudo dd if=output/images/sdcard.img of=/dev/sdX bs=1M && sync
+
+Where /dev/sdX is the device node of your SD card.
+
+If you would like use tool with gui, you can use gem-imager.
+- Gem-imager: https://github.com/t3gemstone/gem-imager
+
+Booting the board
+=================
+
+Insert the SD card into the T3 Gemstone O1 board.
+Connect the UART cable to get terminal access.
+Power on the board. The system should boot into Buildroot.
+
+Repositories Used
+=================
+- U-Boot: https://github.com/t3gemstone/u-boot.git (branch: v2025.04-rc3-t3-gem-o1)
+- Linux Kernel: https://github.com/t3gemstone/linux.git (branch: v6.12.24-ti-arm64-r43-t3-gem-o1)
diff --git a/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot b/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
new file mode 100755
index 0000000000..1354cc863f
--- /dev/null
+++ b/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
@@ -0,0 +1,50 @@
+#!/bin/sh
+# S89firstboot: Resize root partition and filesystem on first boot via uEnv.txt params
+
+case "$1" in
+ start)
+ if ! grep -q "firstboot=1" /proc/cmdline; then
+ exit 0
+ fi
+
+ printf "\nLooks like system is booting for the first time\n" >/dev/console
+
+ BOOTPART=$(cat /proc/cmdline | tr ' ' '\n' | grep '^bootpart=' | cut -d= -f2)
+ ROOT_DEV=$(cat /proc/cmdline | tr ' ' '\n' | grep '^root=' | cut -d= -f2)
+
+ if [ -z "$BOOTPART" ] || [ -z "$ROOT_DEV" ]; then
+ echo "Error: bootpart or root param missing in cmdline."
+ exit 1
+ fi
+
+ DRIVE=$(echo $ROOT_DEV | sed 's/p[0-9]*$//')
+ PART=$(echo $ROOT_DEV | grep -o '[0-9]*$')
+
+ echo "Expanding root partition on '${DRIVE}'..."
+ parted -m -s "$DRIVE" resizepart "$PART" 100% > /dev/null
+ partprobe "$DRIVE" || true
+
+ echo "Expanding root filesystem on '${ROOT_DEV}'..."
+ resize2fs "$ROOT_DEV"
+
+ echo "Disabling firstboot in uEnv.txt..."
+ boot_mntpoint="/tmp/bootmnt"
+ mkdir -p "$boot_mntpoint"
+
+ if mount "$BOOTPART" "$boot_mntpoint"; then
+ sed -i 's/firstboot=1/firstboot=0/g' "$boot_mntpoint/uEnv.txt"
+ umount "$boot_mntpoint"
+ echo "Operation is successful."
+ else
+ echo "Error: Unable to mount boot partition to disable firstboot"
+ fi
+ ;;
+ stop)
+ ;;
+ *)
+ echo "Usage: $0 {start|stop}"
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/board/t3/t3-gem-o1/uEnv.txt b/board/t3/t3-gem-o1/uEnv.txt
new file mode 100644
index 0000000000..f26b624322
--- /dev/null
+++ b/board/t3/t3-gem-o1/uEnv.txt
@@ -0,0 +1,6 @@
+# Environment file for T3 Gemstone O1 to override U-Boot default variables
+rootfstype=ext4
+
+# Override U-boot args to force ext4
+args_eth=setenv bootargs console=${console} ${optargs} root=/dev/mmcblk0p2 rw rootfstype=${rootfstype} bootpart=/dev/mmcblk0p1 firstboot=1 init_fatal_sh=1;
+args_mmc=setenv bootargs console=${console} ${optargs} root=/dev/mmcblk${mmcdev}p2 rw rootfstype=${rootfstype} rootwait bootpart=/dev/mmcblk${mmcdev}p1 firstboot=1 init_fatal_sh=1;
diff --git a/configs/t3_gem_o1_defconfig b/configs/t3_gem_o1_defconfig
new file mode 100644
index 0000000000..d4dd672e4a
--- /dev/null
+++ b/configs/t3_gem_o1_defconfig
@@ -0,0 +1,59 @@
+BR2_aarch64=y
+BR2_cortex_a53=y
+BR2_ROOTFS_POST_IMAGE_SCRIPT="board/t3/t3-gem-o1/post-image.sh"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_GIT=y
+BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/t3gemstone/linux.git"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="02ecef0cb08a6bd123a4f035a296bc824bcfe5b4"
+BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
+BR2_LINUX_KERNEL_DTS_SUPPORT=y
+BR2_LINUX_KERNEL_INTREE_DTS_NAME="ti/k3-am67a-t3-gem-o1"
+BR2_LINUX_KERNEL_INSTALL_TARGET=y
+BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
+BR2_KERNEL_HEADERS_AS_KERNEL=y
+BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_12=y
+BR2_TARGET_TI_K3_R5_LOADER=y
+BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_GIT=y
+BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_REPO_URL="https://github.com/t3gemstone/u-boot.git"
+BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_REPO_VERSION="8b5ae72c281207430fcc58031fe36f40900f7a2d"
+BR2_TARGET_TI_K3_R5_LOADER_BOARD_DEFCONFIG="am67a_t3_gem_o1_r5"
+BR2_TARGET_TI_K3_R5_LOADER_USE_DEFCONFIG=y
+BR2_TARGET_UBOOT=y
+BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
+BR2_TARGET_UBOOT_CUSTOM_GIT=y
+BR2_TARGET_UBOOT_CUSTOM_REPO_URL="https://github.com/t3gemstone/u-boot.git"
+BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="8b5ae72c281207430fcc58031fe36f40900f7a2d"
+BR2_TARGET_UBOOT_BOARD_DEFCONFIG="am67a_t3_gem_o1_a53"
+BR2_TARGET_UBOOT_NEEDS_DTC=y
+BR2_TARGET_UBOOT_NEEDS_PYTHON3=y
+BR2_TARGET_UBOOT_NEEDS_PYLIBFDT=y
+BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
+BR2_TARGET_UBOOT_NEEDS_GNUTLS=y
+BR2_TARGET_UBOOT_NEEDS_ATF_BL31=y
+BR2_TARGET_UBOOT_NEEDS_OPTEE_TEE=y
+BR2_TARGET_UBOOT_NEEDS_OPTEE_TEE_RAW_BIN=y
+BR2_TARGET_UBOOT_USE_BINMAN=y
+# BR2_TARGET_UBOOT_FORMAT_BIN is not set
+BR2_TARGET_UBOOT_FORMAT_IMG=y
+BR2_TARGET_UBOOT_SPL=y
+BR2_TARGET_UBOOT_SPL_NAME="tispl.bin"
+BR2_TARGET_TI_K3_BOOT_FIRMWARE=y
+BR2_TARGET_ARM_TRUSTED_FIRMWARE=y
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE="v2.10"
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_PLATFORM="k3"
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_TARGET_BOARD="lite"
+BR2_TARGET_OPTEE_OS=y
+BR2_TARGET_OPTEE_OS_PLATFORM="k3-am62x"
+BR2_TARGET_ROOTFS_EXT2=y
+BR2_TARGET_ROOTFS_EXT2_4=y
+BR2_TARGET_ROOTFS_EXT2_SIZE="256M"
+BR2_PACKAGE_HOST_GENIMAGE=y
+BR2_PACKAGE_HOST_DOSFSTOOLS=y
+BR2_PACKAGE_HOST_MTOOLS=y
+BR2_GLOBAL_PATCH_DIR="board/t3/t3-gem-o1/patches"
+BR2_TARGET_UBOOT_CUSTOM_MAKEOPTS="BINMAN_INDIRS=$(BINARIES_DIR) TEE=$(BINARIES_DIR)/tee-pager_v2.bin"
+BR2_PACKAGE_E2FSPROGS=y
+BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
+BR2_PACKAGE_PARTED=y
+BR2_ROOTFS_OVERLAY="board/t3/t3-gem-o1/rootfs_overlay"
--
2.43.0
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Buildroot] board/t3/t3-gem-o1: add new board
2026-07-06 18:39 [Buildroot] [PATCH] board/t3/t3-gem-o1: add new board Selman Çetin via buildroot
@ 2026-07-13 14:56 ` dowan gullient via buildroot
2026-07-19 17:12 ` [Buildroot] [PATCH] " Selman Çetin via buildroot
1 sibling, 0 replies; 4+ messages in thread
From: dowan gullient via buildroot @ 2026-07-13 14:56 UTC (permalink / raw)
To: selman.cetin, buildroot
Hello Selman Çetin, thanks for your patch and for this new board !
I have few comments :
> board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
> board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
These patch files are missing a proper header. A message explaining what
the patch does and why it is needed should be added in the header
commentary of each patch, along with a Signed-off-by statement. -
[Source:
https://buildroot.org/downloads/manual/manual.html#_format_and_licensing_of_the_package_patches]
> +trap 'rm -rf "${GENIMAGE_TMP}" "${ROOTPATH_TMP}"' EXIT
> +ROOTPATH_TMP="$(mktemp -d)"
(You might want to move the `ROOTPATH_TMP` assignment before the `trap`
to ensure the cleanup trap works correctly but that's just a detail,
it's working this way too.)
Also, when adding a new board, you should add an entry for yourself in
the DEVELOPERS file so you can be notified of build failures or
maintenance issues on this board. - [Source:
https://buildroot.org/downloads/manual/manual.html#DEVELOPERS]
Apart from that, the patch looks good to me.
Best regards, Gullient.
Assisted by Buildroot Review Assistant (used openrouter).
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Buildroot] [PATCH] board/t3/t3-gem-o1: add new board
2026-07-06 18:39 [Buildroot] [PATCH] board/t3/t3-gem-o1: add new board Selman Çetin via buildroot
2026-07-13 14:56 ` [Buildroot] " dowan gullient via buildroot
@ 2026-07-19 17:12 ` Selman Çetin via buildroot
2026-08-02 8:29 ` Julien Olivain via buildroot
1 sibling, 1 reply; 4+ messages in thread
From: Selman Çetin via buildroot @ 2026-07-19 17:12 UTC (permalink / raw)
To: buildroot; +Cc: support, selman.cetin
This commit adds support for the T3-GEM-O1
More information about the board can be found at:
https://t3gemstone.org/en
Documentation and usage guides are available at:
https://docs.t3gemstone.org/en/introduction
The official GitHub repository can be found at:
https://github.com/t3gemstone
Hardware Specifications:
- Processor: Quad-core ARM Cortex-A53 @1.4 GHz with GPU, DSP and AI accelerators
- RAM: 4 GB LPDDR4
- Storage: 32 GB eMMC, MicroSD slot (SDR104), M.2 2280 NVMe SSD Port
- Connectivity: Wi-Fi 802.11n & Bluetooth 5.1 (WL1835MOD)
- Network: Gigabit Ethernet
- USB: 2x USB 3.0 Type-A, 1x USB 2.0 Type-A, 1x USB 2.0 Type-C (Device + PD)
- Display/Camera: 1x HDMI, 1x 4-lane MIPI display, 1x 4-lane MIPI camera
- Peripherals: CAN FD, 40-pin GPIO Header, 10-pin JTAG, RTC (Maxim DS1340)
- Sensors: ICM-20948 (9-Axis IMU), BMP390 (Barometric), HDC2010 (Humidity/Temp)
- Power: USB Type-C (5-9V/3A) or DC Jack (5-12V/5A)
Signed-off-by: Selman Çetin <selman.cetin@t3gemstone.org>
---
DEVELOPERS | 4 ++
board/t3/t3-gem-o1/genimage.cfg | 30 ++++++++++
.../arm-trusted-firmware.hash | 2 +
| 2 +
board/t3/t3-gem-o1/patches/linux/linux.hash | 2 +
.../t3-gem-o1/patches/optee-os/optee-os.hash | 2 +
.../0001-fix-binman-importlib.patch | 49 +++++++++++++++
.../ti-k3-r5-loader/ti-k3-r5-loader.hash | 2 +
.../uboot/0001-fix-binman-importlib.patch | 49 +++++++++++++++
board/t3/t3-gem-o1/patches/uboot/uboot.hash | 2 +
board/t3/t3-gem-o1/post-image.sh | 21 +++++++
board/t3/t3-gem-o1/readme.txt | 35 +++++++++++
.../rootfs_overlay/etc/init.d/S89firstboot | 50 ++++++++++++++++
board/t3/t3-gem-o1/uEnv.txt | 6 ++
configs/t3_gem_o1_defconfig | 59 +++++++++++++++++++
15 files changed, 315 insertions(+)
create mode 100644 board/t3/t3-gem-o1/genimage.cfg
create mode 100644 board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash
create mode 100644 board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
create mode 100644 board/t3/t3-gem-o1/patches/linux/linux.hash
create mode 100644 board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
create mode 100644 board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
create mode 100644 board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash
create mode 100644 board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
create mode 100644 board/t3/t3-gem-o1/patches/uboot/uboot.hash
create mode 100755 board/t3/t3-gem-o1/post-image.sh
create mode 100644 board/t3/t3-gem-o1/readme.txt
create mode 100755 board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
create mode 100644 board/t3/t3-gem-o1/uEnv.txt
create mode 100644 configs/t3_gem_o1_defconfig
diff --git a/DEVELOPERS b/DEVELOPERS
index c6c228ae91..05c9a000d8 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2996,6 +2996,10 @@ F: package/python-flask-login/
F: package/qt5/qt5charts/
F: package/wlr-randr/
+N: Selman Çetin <selman.cetin@t3gemstone.org>
+F: board/t3/t3-gem-o1/
+F: configs/t3_gem_o1_defconfig
+
N: Semyon Kolganov <semenak94@mail.ru>
F: package/fmt/
F: package/lua-resty-http/
diff --git a/board/t3/t3-gem-o1/genimage.cfg b/board/t3/t3-gem-o1/genimage.cfg
new file mode 100644
index 0000000000..3647706542
--- /dev/null
+++ b/board/t3/t3-gem-o1/genimage.cfg
@@ -0,0 +1,30 @@
+image boot.vfat {
+ vfat {
+ files = {
+ "tiboot3.bin",
+ "tispl.bin",
+ "u-boot.img",
+ "Image",
+ "k3-am67a-t3-gem-o1.dtb",
+ "uEnv.txt"
+ }
+ }
+ size = 64M
+}
+
+image sdcard.img {
+ hdimage {
+ }
+
+ partition boot {
+ partition-type = 0xC
+ bootable = "true"
+ image = "boot.vfat"
+ offset = 4M
+ }
+
+ partition rootfs {
+ partition-type = 0x83
+ image = "rootfs.ext4"
+ }
+}
diff --git a/board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash b/board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash
new file mode 100644
index 0000000000..6f02bfbb22
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/arm-trusted-firmware/arm-trusted-firmware.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 7efa89e1b4e4106ee05d68e876c8efbb146364d89cfd5d26bf4647b09c08f32b arm-trusted-firmware-v2.10-git4.tar.gz
--git a/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash b/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
new file mode 100644
index 0000000000..3c4761fa9c
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 631d4166e2700c4777fa10edde89015efa37e69ac8f43ca301f29d70419e353d linux-c0d426f64f22aa7ddba37b5552dd5b2013654990-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/linux/linux.hash b/board/t3/t3-gem-o1/patches/linux/linux.hash
new file mode 100644
index 0000000000..3c4761fa9c
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/linux/linux.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 631d4166e2700c4777fa10edde89015efa37e69ac8f43ca301f29d70419e353d linux-c0d426f64f22aa7ddba37b5552dd5b2013654990-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash b/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
new file mode 100644
index 0000000000..3f5c58fcff
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 9400e16c45bfa45f15585b2c933b86c449e7de05def0ecaaa62a4f38973a3a45 optee-os-4.9.0.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
new file mode 100644
index 0000000000..67324956d7
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
@@ -0,0 +1,49 @@
+Fix binman importlib usage for modern Python
+
+The binman `control.py` used `pkg_resources.resource_string()` and
+`pkg_resources.resource_listdir()` which are not ideal on newer Python
+versions. Replace usage with the `importlib.resources` API which is the
+recommended approach in recent Python releases. This avoids runtime
+errors when `pkg_resources` is not available or when the packaged
+resources are accessed differently.
+
+Signed-off-by: Selman Çetin <selman.cetin@t3gemstone.org>
+
+---
+diff --git a/tools/binman/control.py.orig b/tools/binman/control.py
+index e73c598298..7ce325ec5e 100644
+--- a/tools/binman/control.py
++++ b/tools/binman/control.py
+@@ -13,7 +13,7 @@ except ImportError: # pragma: no cover
+ # for Python 3.6
+ import importlib_resources
+ import os
+-import pkg_resources
++import importlib.resources
+ import re
+
+ import sys
+@@ -96,12 +96,12 @@ def _ReadMissingBlobHelp():
+ msg = ''
+ return tag, msg
+
+- my_data = pkg_resources.resource_string(__name__, 'missing-blob-help')
++ my_data = importlib.resources.files(__name__).joinpath('missing-blob-help').read_text(encoding='utf-8')
+ re_tag = re.compile('^([-a-z0-9]+):$')
+ result = {}
+ tag = None
+ msg = ''
+- for line in my_data.decode('utf-8').splitlines():
++ for line in my_data.splitlines():
+ if not line.startswith('#'):
+ m_tag = re_tag.match(line)
+ if m_tag:
+@@ -151,7 +151,7 @@ def GetEntryModules(include_testing=True):
+ Returns:
+ Set of paths to entry class filenames
+ """
+- glob_list = pkg_resources.resource_listdir(__name__, 'etype')
++ glob_list = [f.name for f in importlib.resources.files(__name__).joinpath('etype').iterdir() if f.is_file()]
+ glob_list = [fname for fname in glob_list if fname.endswith('.py')]
+ return set([os.path.splitext(os.path.basename(item))[0]
+ for item in glob_list
diff --git a/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash
new file mode 100644
index 0000000000..592ea66751
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/ti-k3-r5-loader.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 4e98496545b7f9955b178d65489624691e0d4ba2687fb507ffa364a9978bb51a uboot-8b5ae72c281207430fcc58031fe36f40900f7a2d-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch b/board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
new file mode 100644
index 0000000000..67324956d7
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/uboot/0001-fix-binman-importlib.patch
@@ -0,0 +1,49 @@
+Fix binman importlib usage for modern Python
+
+The binman `control.py` used `pkg_resources.resource_string()` and
+`pkg_resources.resource_listdir()` which are not ideal on newer Python
+versions. Replace usage with the `importlib.resources` API which is the
+recommended approach in recent Python releases. This avoids runtime
+errors when `pkg_resources` is not available or when the packaged
+resources are accessed differently.
+
+Signed-off-by: Selman Çetin <selman.cetin@t3gemstone.org>
+
+---
+diff --git a/tools/binman/control.py.orig b/tools/binman/control.py
+index e73c598298..7ce325ec5e 100644
+--- a/tools/binman/control.py
++++ b/tools/binman/control.py
+@@ -13,7 +13,7 @@ except ImportError: # pragma: no cover
+ # for Python 3.6
+ import importlib_resources
+ import os
+-import pkg_resources
++import importlib.resources
+ import re
+
+ import sys
+@@ -96,12 +96,12 @@ def _ReadMissingBlobHelp():
+ msg = ''
+ return tag, msg
+
+- my_data = pkg_resources.resource_string(__name__, 'missing-blob-help')
++ my_data = importlib.resources.files(__name__).joinpath('missing-blob-help').read_text(encoding='utf-8')
+ re_tag = re.compile('^([-a-z0-9]+):$')
+ result = {}
+ tag = None
+ msg = ''
+- for line in my_data.decode('utf-8').splitlines():
++ for line in my_data.splitlines():
+ if not line.startswith('#'):
+ m_tag = re_tag.match(line)
+ if m_tag:
+@@ -151,7 +151,7 @@ def GetEntryModules(include_testing=True):
+ Returns:
+ Set of paths to entry class filenames
+ """
+- glob_list = pkg_resources.resource_listdir(__name__, 'etype')
++ glob_list = [f.name for f in importlib.resources.files(__name__).joinpath('etype').iterdir() if f.is_file()]
+ glob_list = [fname for fname in glob_list if fname.endswith('.py')]
+ return set([os.path.splitext(os.path.basename(item))[0]
+ for item in glob_list
diff --git a/board/t3/t3-gem-o1/patches/uboot/uboot.hash b/board/t3/t3-gem-o1/patches/uboot/uboot.hash
new file mode 100644
index 0000000000..592ea66751
--- /dev/null
+++ b/board/t3/t3-gem-o1/patches/uboot/uboot.hash
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 4e98496545b7f9955b178d65489624691e0d4ba2687fb507ffa364a9978bb51a uboot-8b5ae72c281207430fcc58031fe36f40900f7a2d-git4.tar.gz
diff --git a/board/t3/t3-gem-o1/post-image.sh b/board/t3/t3-gem-o1/post-image.sh
new file mode 100755
index 0000000000..9747f4ef90
--- /dev/null
+++ b/board/t3/t3-gem-o1/post-image.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -e
+
+BOARD_DIR="$(dirname "$0")"
+GENIMAGE_CFG="${BOARD_DIR}/genimage.cfg"
+GENIMAGE_TMP="$(mktemp -d)"
+ROOTPATH_TMP="$(mktemp -d)"
+
+# Copy uEnv.txt to binaries directory so genimage can pack it into FAT
+cp -f "${BOARD_DIR}/uEnv.txt" "${BINARIES_DIR}/uEnv.txt"
+
+trap 'rm -rf "${GENIMAGE_TMP}" "${ROOTPATH_TMP}"' EXIT
+
+${HOST_DIR}/bin/genimage \
+ --rootpath "${ROOTPATH_TMP}" \
+ --tmppath "${GENIMAGE_TMP}" \
+ --inputpath "${BINARIES_DIR}" \
+ --outputpath "${BINARIES_DIR}" \
+ --config "${GENIMAGE_CFG}"
+
+exit $?
diff --git a/board/t3/t3-gem-o1/readme.txt b/board/t3/t3-gem-o1/readme.txt
new file mode 100644
index 0000000000..8ac17e821c
--- /dev/null
+++ b/board/t3/t3-gem-o1/readme.txt
@@ -0,0 +1,35 @@
+T3 Gemstone O1 (AM67A) Buildroot Support
+========================================
+
+How to build
+============
+
+$ make t3_gem_o1_defconfig
+$ make
+
+How to write the SD card
+========================
+
+Once the build process is finished you will have an image
+called "sdcard.img" in the output/images/ directory.
+
+Copy the bootable "sdcard.img" onto an SD card with "dd":
+
+ $ sudo dd if=output/images/sdcard.img of=/dev/sdX bs=1M && sync
+
+Where /dev/sdX is the device node of your SD card.
+
+If you would like use tool with gui, you can use gem-imager.
+- Gem-imager: https://github.com/t3gemstone/gem-imager
+
+Booting the board
+=================
+
+Insert the SD card into the T3 Gemstone O1 board.
+Connect the UART cable to get terminal access.
+Power on the board. The system should boot into Buildroot.
+
+Repositories Used
+=================
+- U-Boot: https://github.com/t3gemstone/u-boot.git (branch: v2025.04-rc3-t3-gem-o1)
+- Linux Kernel: https://github.com/t3gemstone/linux.git (branch: v6.12.24-ti-arm64-r43-t3-gem-o1)
diff --git a/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot b/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
new file mode 100755
index 0000000000..1354cc863f
--- /dev/null
+++ b/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
@@ -0,0 +1,50 @@
+#!/bin/sh
+# S89firstboot: Resize root partition and filesystem on first boot via uEnv.txt params
+
+case "$1" in
+ start)
+ if ! grep -q "firstboot=1" /proc/cmdline; then
+ exit 0
+ fi
+
+ printf "\nLooks like system is booting for the first time\n" >/dev/console
+
+ BOOTPART=$(cat /proc/cmdline | tr ' ' '\n' | grep '^bootpart=' | cut -d= -f2)
+ ROOT_DEV=$(cat /proc/cmdline | tr ' ' '\n' | grep '^root=' | cut -d= -f2)
+
+ if [ -z "$BOOTPART" ] || [ -z "$ROOT_DEV" ]; then
+ echo "Error: bootpart or root param missing in cmdline."
+ exit 1
+ fi
+
+ DRIVE=$(echo $ROOT_DEV | sed 's/p[0-9]*$//')
+ PART=$(echo $ROOT_DEV | grep -o '[0-9]*$')
+
+ echo "Expanding root partition on '${DRIVE}'..."
+ parted -m -s "$DRIVE" resizepart "$PART" 100% > /dev/null
+ partprobe "$DRIVE" || true
+
+ echo "Expanding root filesystem on '${ROOT_DEV}'..."
+ resize2fs "$ROOT_DEV"
+
+ echo "Disabling firstboot in uEnv.txt..."
+ boot_mntpoint="/tmp/bootmnt"
+ mkdir -p "$boot_mntpoint"
+
+ if mount "$BOOTPART" "$boot_mntpoint"; then
+ sed -i 's/firstboot=1/firstboot=0/g' "$boot_mntpoint/uEnv.txt"
+ umount "$boot_mntpoint"
+ echo "Operation is successful."
+ else
+ echo "Error: Unable to mount boot partition to disable firstboot"
+ fi
+ ;;
+ stop)
+ ;;
+ *)
+ echo "Usage: $0 {start|stop}"
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/board/t3/t3-gem-o1/uEnv.txt b/board/t3/t3-gem-o1/uEnv.txt
new file mode 100644
index 0000000000..f26b624322
--- /dev/null
+++ b/board/t3/t3-gem-o1/uEnv.txt
@@ -0,0 +1,6 @@
+# Environment file for T3 Gemstone O1 to override U-Boot default variables
+rootfstype=ext4
+
+# Override U-boot args to force ext4
+args_eth=setenv bootargs console=${console} ${optargs} root=/dev/mmcblk0p2 rw rootfstype=${rootfstype} bootpart=/dev/mmcblk0p1 firstboot=1 init_fatal_sh=1;
+args_mmc=setenv bootargs console=${console} ${optargs} root=/dev/mmcblk${mmcdev}p2 rw rootfstype=${rootfstype} rootwait bootpart=/dev/mmcblk${mmcdev}p1 firstboot=1 init_fatal_sh=1;
diff --git a/configs/t3_gem_o1_defconfig b/configs/t3_gem_o1_defconfig
new file mode 100644
index 0000000000..d4dd672e4a
--- /dev/null
+++ b/configs/t3_gem_o1_defconfig
@@ -0,0 +1,59 @@
+BR2_aarch64=y
+BR2_cortex_a53=y
+BR2_ROOTFS_POST_IMAGE_SCRIPT="board/t3/t3-gem-o1/post-image.sh"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_GIT=y
+BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/t3gemstone/linux.git"
+BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="02ecef0cb08a6bd123a4f035a296bc824bcfe5b4"
+BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
+BR2_LINUX_KERNEL_DTS_SUPPORT=y
+BR2_LINUX_KERNEL_INTREE_DTS_NAME="ti/k3-am67a-t3-gem-o1"
+BR2_LINUX_KERNEL_INSTALL_TARGET=y
+BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
+BR2_KERNEL_HEADERS_AS_KERNEL=y
+BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_12=y
+BR2_TARGET_TI_K3_R5_LOADER=y
+BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_GIT=y
+BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_REPO_URL="https://github.com/t3gemstone/u-boot.git"
+BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_REPO_VERSION="8b5ae72c281207430fcc58031fe36f40900f7a2d"
+BR2_TARGET_TI_K3_R5_LOADER_BOARD_DEFCONFIG="am67a_t3_gem_o1_r5"
+BR2_TARGET_TI_K3_R5_LOADER_USE_DEFCONFIG=y
+BR2_TARGET_UBOOT=y
+BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
+BR2_TARGET_UBOOT_CUSTOM_GIT=y
+BR2_TARGET_UBOOT_CUSTOM_REPO_URL="https://github.com/t3gemstone/u-boot.git"
+BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="8b5ae72c281207430fcc58031fe36f40900f7a2d"
+BR2_TARGET_UBOOT_BOARD_DEFCONFIG="am67a_t3_gem_o1_a53"
+BR2_TARGET_UBOOT_NEEDS_DTC=y
+BR2_TARGET_UBOOT_NEEDS_PYTHON3=y
+BR2_TARGET_UBOOT_NEEDS_PYLIBFDT=y
+BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
+BR2_TARGET_UBOOT_NEEDS_GNUTLS=y
+BR2_TARGET_UBOOT_NEEDS_ATF_BL31=y
+BR2_TARGET_UBOOT_NEEDS_OPTEE_TEE=y
+BR2_TARGET_UBOOT_NEEDS_OPTEE_TEE_RAW_BIN=y
+BR2_TARGET_UBOOT_USE_BINMAN=y
+# BR2_TARGET_UBOOT_FORMAT_BIN is not set
+BR2_TARGET_UBOOT_FORMAT_IMG=y
+BR2_TARGET_UBOOT_SPL=y
+BR2_TARGET_UBOOT_SPL_NAME="tispl.bin"
+BR2_TARGET_TI_K3_BOOT_FIRMWARE=y
+BR2_TARGET_ARM_TRUSTED_FIRMWARE=y
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE="v2.10"
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_PLATFORM="k3"
+BR2_TARGET_ARM_TRUSTED_FIRMWARE_TARGET_BOARD="lite"
+BR2_TARGET_OPTEE_OS=y
+BR2_TARGET_OPTEE_OS_PLATFORM="k3-am62x"
+BR2_TARGET_ROOTFS_EXT2=y
+BR2_TARGET_ROOTFS_EXT2_4=y
+BR2_TARGET_ROOTFS_EXT2_SIZE="256M"
+BR2_PACKAGE_HOST_GENIMAGE=y
+BR2_PACKAGE_HOST_DOSFSTOOLS=y
+BR2_PACKAGE_HOST_MTOOLS=y
+BR2_GLOBAL_PATCH_DIR="board/t3/t3-gem-o1/patches"
+BR2_TARGET_UBOOT_CUSTOM_MAKEOPTS="BINMAN_INDIRS=$(BINARIES_DIR) TEE=$(BINARIES_DIR)/tee-pager_v2.bin"
+BR2_PACKAGE_E2FSPROGS=y
+BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
+BR2_PACKAGE_PARTED=y
+BR2_ROOTFS_OVERLAY="board/t3/t3-gem-o1/rootfs_overlay"
--
2.43.0
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Buildroot] [PATCH] board/t3/t3-gem-o1: add new board
2026-07-19 17:12 ` [Buildroot] [PATCH] " Selman Çetin via buildroot
@ 2026-08-02 8:29 ` Julien Olivain via buildroot
0 siblings, 0 replies; 4+ messages in thread
From: Julien Olivain via buildroot @ 2026-08-02 8:29 UTC (permalink / raw)
To: Selman Çetin; +Cc: buildroot, support
Hi Selman,
Thanks for the patch. I have several comments.
As a general comment, this series generates sereval check-package
errors. Before sending patches, please make sure to run:
"utils/docker-run make check-package"
and fix all errors. See:
https://nightly.buildroot.org/manual.html#_preparing_a_patch_series
Also, this patch should have been marked as a "v2" with a small
description what changed since the previous submission. See:
https://nightly.buildroot.org/manual.html#_patch_revision_changelog
Please mark you next submission as "v3".
See below for my other comments.
On 19/07/2026 19:12, Selman Çetin via buildroot wrote:
> This commit adds support for the T3-GEM-O1
>
> More information about the board can be found at:
> https://t3gemstone.org/en
>
> Documentation and usage guides are available at:
> https://docs.t3gemstone.org/en/introduction
>
> The official GitHub repository can be found at:
> https://github.com/t3gemstone
>
> Hardware Specifications:
> - Processor: Quad-core ARM Cortex-A53 @1.4 GHz with GPU, DSP and AI
> accelerators
> - RAM: 4 GB LPDDR4
> - Storage: 32 GB eMMC, MicroSD slot (SDR104), M.2 2280 NVMe SSD Port
> - Connectivity: Wi-Fi 802.11n & Bluetooth 5.1 (WL1835MOD)
> - Network: Gigabit Ethernet
> - USB: 2x USB 3.0 Type-A, 1x USB 2.0 Type-A, 1x USB 2.0 Type-C (Device
> + PD)
> - Display/Camera: 1x HDMI, 1x 4-lane MIPI display, 1x 4-lane MIPI
> camera
> - Peripherals: CAN FD, 40-pin GPIO Header, 10-pin JTAG, RTC (Maxim
> DS1340)
> - Sensors: ICM-20948 (9-Axis IMU), BMP390 (Barometric), HDC2010
> (Humidity/Temp)
> - Power: USB Type-C (5-9V/3A) or DC Jack (5-12V/5A)
>
> Signed-off-by: Selman Çetin <selman.cetin@t3gemstone.org>
> ---
[...]
> diff --git
> a/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
> b/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
> new file mode 100644
> index 0000000000..3c4761fa9c
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/patches/linux-headers/linux-headers.hash
Since new defconfigs should use an external toolchain, this
linux-headers.hash file is not needed. Could you remove it
please?
See also my comment in the defconfig for the external
toolchain.
> @@ -0,0 +1,2 @@
> +# Locally calculated
> +sha256
> 631d4166e2700c4777fa10edde89015efa37e69ac8f43ca301f29d70419e353d
> linux-c0d426f64f22aa7ddba37b5552dd5b2013654990-git4.tar.gz
> diff --git a/board/t3/t3-gem-o1/patches/linux/linux.hash
> b/board/t3/t3-gem-o1/patches/linux/linux.hash
> new file mode 100644
> index 0000000000..3c4761fa9c
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/patches/linux/linux.hash
> @@ -0,0 +1,2 @@
> +# Locally calculated
> +sha256
> 631d4166e2700c4777fa10edde89015efa37e69ac8f43ca301f29d70419e353d
> linux-c0d426f64f22aa7ddba37b5552dd5b2013654990-git4.tar.gz
> diff --git a/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
> b/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
> new file mode 100644
> index 0000000000..3f5c58fcff
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/patches/optee-os/optee-os.hash
> @@ -0,0 +1,2 @@
> +# Locally calculated
> +sha256
> 9400e16c45bfa45f15585b2c933b86c449e7de05def0ecaaa62a4f38973a3a45
> optee-os-4.9.0.tar.gz
> diff --git
> a/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
> b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
> new file mode 100644
> index 0000000000..67324956d7
> --- /dev/null
> +++
> b/board/t3/t3-gem-o1/patches/ti-k3-r5-loader/0001-fix-binman-importlib.patch
> @@ -0,0 +1,49 @@
> +Fix binman importlib usage for modern Python
> +
> +The binman `control.py` used `pkg_resources.resource_string()` and
> +`pkg_resources.resource_listdir()` which are not ideal on newer Python
> +versions. Replace usage with the `importlib.resources` API which is
> the
> +recommended approach in recent Python releases. This avoids runtime
> +errors when `pkg_resources` is not available or when the packaged
> +resources are accessed differently.
> +
> +Signed-off-by: Selman Çetin <selman.cetin@t3gemstone.org>
The patch you add in Buildroot should be formatted with
"git format-patch -N". See:
https://nightly.buildroot.org/manual.html#_within_buildroot
The "Upstream:" tag is also missing. Since a similar patch was
accepted in u-boot upstream, you could probably use it and add:
Upstream:
https://source.denx.de/u-boot/u-boot/-/commit/538719cb6a77934d069e0e64f264457a59a9ebfc
Could you use the upstream patch, format it with git and add
the Upstream tag, please?
> +
> +---
> +diff --git a/tools/binman/control.py.orig b/tools/binman/control.py
> +index e73c598298..7ce325ec5e 100644
> +--- a/tools/binman/control.py
> ++++ b/tools/binman/control.py
> +@@ -13,7 +13,7 @@ except ImportError: # pragma: no cover
> + # for Python 3.6
> + import importlib_resources
> + import os
> +-import pkg_resources
> ++import importlib.resources
> + import re
> +
> + import sys
> +@@ -96,12 +96,12 @@ def _ReadMissingBlobHelp():
> + msg = ''
> + return tag, msg
> +
> +- my_data = pkg_resources.resource_string(__name__,
> 'missing-blob-help')
> ++ my_data =
> importlib.resources.files(__name__).joinpath('missing-blob-help').read_text(encoding='utf-8')
> + re_tag = re.compile('^([-a-z0-9]+):$')
> + result = {}
> + tag = None
> + msg = ''
> +- for line in my_data.decode('utf-8').splitlines():
> ++ for line in my_data.splitlines():
> + if not line.startswith('#'):
> + m_tag = re_tag.match(line)
> + if m_tag:
> +@@ -151,7 +151,7 @@ def GetEntryModules(include_testing=True):
> + Returns:
> + Set of paths to entry class filenames
> + """
> +- glob_list = pkg_resources.resource_listdir(__name__, 'etype')
> ++ glob_list = [f.name for f in
> importlib.resources.files(__name__).joinpath('etype').iterdir() if
> f.is_file()]
> + glob_list = [fname for fname in glob_list if
> fname.endswith('.py')]
> + return set([os.path.splitext(os.path.basename(item))[0]
> + for item in glob_list
[...]
> diff --git a/board/t3/t3-gem-o1/post-image.sh
> b/board/t3/t3-gem-o1/post-image.sh
> new file mode 100755
> index 0000000000..9747f4ef90
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/post-image.sh
> @@ -0,0 +1,21 @@
> +#!/bin/bash
Could you change the interpreter to:
#!/bin/sh
Bash is not really needed in this script
> +set -e
> +
> +BOARD_DIR="$(dirname "$0")"
> +GENIMAGE_CFG="${BOARD_DIR}/genimage.cfg"
> +GENIMAGE_TMP="$(mktemp -d)"
> +ROOTPATH_TMP="$(mktemp -d)"
> +
> +# Copy uEnv.txt to binaries directory so genimage can pack it into FAT
> +cp -f "${BOARD_DIR}/uEnv.txt" "${BINARIES_DIR}/uEnv.txt"
> +
> +trap 'rm -rf "${GENIMAGE_TMP}" "${ROOTPATH_TMP}"' EXIT
> +
> +${HOST_DIR}/bin/genimage \
ShellCheck reports a warning here. This should preferably
quoted as:
"${HOST_DIR}"/bin/genimage \
> + --rootpath "${ROOTPATH_TMP}" \
> + --tmppath "${GENIMAGE_TMP}" \
> + --inputpath "${BINARIES_DIR}" \
> + --outputpath "${BINARIES_DIR}" \
> + --config "${GENIMAGE_CFG}"
> +
> +exit $?
> diff --git a/board/t3/t3-gem-o1/readme.txt
> b/board/t3/t3-gem-o1/readme.txt
> new file mode 100644
> index 0000000000..8ac17e821c
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/readme.txt
> @@ -0,0 +1,35 @@
> +T3 Gemstone O1 (AM67A) Buildroot Support
> +========================================
> +
> +How to build
> +============
> +
> +$ make t3_gem_o1_defconfig
> +$ make
> +
> +How to write the SD card
> +========================
> +
> +Once the build process is finished you will have an image
> +called "sdcard.img" in the output/images/ directory.
> +
> +Copy the bootable "sdcard.img" onto an SD card with "dd":
> +
> + $ sudo dd if=output/images/sdcard.img of=/dev/sdX bs=1M && sync
> +
> +Where /dev/sdX is the device node of your SD card.
> +
> +If you would like use tool with gui, you can use gem-imager.
> +- Gem-imager: https://github.com/t3gemstone/gem-imager
> +
> +Booting the board
> +=================
> +
> +Insert the SD card into the T3 Gemstone O1 board.
> +Connect the UART cable to get terminal access.
> +Power on the board. The system should boot into Buildroot.
> +
> +Repositories Used
> +=================
> +- U-Boot: https://github.com/t3gemstone/u-boot.git (branch:
> v2025.04-rc3-t3-gem-o1)
> +- Linux Kernel: https://github.com/t3gemstone/linux.git (branch:
> v6.12.24-ti-arm64-r43-t3-gem-o1)
I discourage to put branches or tags names in the readme.txt. They
are easy to forget when the defconfig gets updated. A user can check
the defconfig to see what version is used.
Could you remove the branch names, please?
Or alternatively, you could give a hint which branches should be used
for future updates. For example (use branches: *-t3-gem-o1).
> diff --git a/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
> b/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
> new file mode 100755
> index 0000000000..1354cc863f
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/rootfs_overlay/etc/init.d/S89firstboot
Buildroot in-tree defconfigs should not contain customization other
than those needed to reach the login. See:
https://elinux.org/Buildroot:DeveloperDaysELCE2024#Rules_for_defconfigs
Could you remove this file, please?
You can eventually quickly explain that in the readme.txt.
> @@ -0,0 +1,50 @@
> +#!/bin/sh
> +# S89firstboot: Resize root partition and filesystem on first boot via
> uEnv.txt params
> +
> +case "$1" in
> + start)
> + if ! grep -q "firstboot=1" /proc/cmdline; then
> + exit 0
> + fi
> +
> + printf "\nLooks like system is booting for the first time\n"
> >/dev/console
> +
> + BOOTPART=$(cat /proc/cmdline | tr ' ' '\n' | grep '^bootpart=' |
> cut -d= -f2)
> + ROOT_DEV=$(cat /proc/cmdline | tr ' ' '\n' | grep '^root=' | cut
> -d= -f2)
> +
> + if [ -z "$BOOTPART" ] || [ -z "$ROOT_DEV" ]; then
> + echo "Error: bootpart or root param missing in cmdline."
> + exit 1
> + fi
> +
> + DRIVE=$(echo $ROOT_DEV | sed 's/p[0-9]*$//')
> + PART=$(echo $ROOT_DEV | grep -o '[0-9]*$')
> +
> + echo "Expanding root partition on '${DRIVE}'..."
> + parted -m -s "$DRIVE" resizepart "$PART" 100% > /dev/null
> + partprobe "$DRIVE" || true
> +
> + echo "Expanding root filesystem on '${ROOT_DEV}'..."
> + resize2fs "$ROOT_DEV"
> +
> + echo "Disabling firstboot in uEnv.txt..."
> + boot_mntpoint="/tmp/bootmnt"
> + mkdir -p "$boot_mntpoint"
> +
> + if mount "$BOOTPART" "$boot_mntpoint"; then
> + sed -i 's/firstboot=1/firstboot=0/g' "$boot_mntpoint/uEnv.txt"
> + umount "$boot_mntpoint"
> + echo "Operation is successful."
> + else
> + echo "Error: Unable to mount boot partition to disable
> firstboot"
> + fi
> + ;;
> + stop)
> + ;;
> + *)
> + echo "Usage: $0 {start|stop}"
> + exit 1
> + ;;
> +esac
> +
> +exit 0
> diff --git a/board/t3/t3-gem-o1/uEnv.txt b/board/t3/t3-gem-o1/uEnv.txt
> new file mode 100644
> index 0000000000..f26b624322
> --- /dev/null
> +++ b/board/t3/t3-gem-o1/uEnv.txt
> @@ -0,0 +1,6 @@
> +# Environment file for T3 Gemstone O1 to override U-Boot default
> variables
> +rootfstype=ext4
> +
> +# Override U-boot args to force ext4
> +args_eth=setenv bootargs console=${console} ${optargs}
> root=/dev/mmcblk0p2 rw rootfstype=${rootfstype} bootpart=/dev/mmcblk0p1
> firstboot=1 init_fatal_sh=1;
> +args_mmc=setenv bootargs console=${console} ${optargs}
> root=/dev/mmcblk${mmcdev}p2 rw rootfstype=${rootfstype} rootwait
> bootpart=/dev/mmcblk${mmcdev}p1 firstboot=1 init_fatal_sh=1;
If the "S89firstboot" file is removed, those "firstboot=1" are no
longer needed here. Could you remove those please?
> diff --git a/configs/t3_gem_o1_defconfig b/configs/t3_gem_o1_defconfig
> new file mode 100644
> index 0000000000..d4dd672e4a
> --- /dev/null
> +++ b/configs/t3_gem_o1_defconfig
> @@ -0,0 +1,59 @@
> +BR2_aarch64=y
> +BR2_cortex_a53=y
This patch adds the custom hash files, but the defconfig does not
enable the check of those hashes. Could you add here:
BR2_DOWNLOAD_FORCE_CHECK_HASHES=y
> +BR2_ROOTFS_POST_IMAGE_SCRIPT="board/t3/t3-gem-o1/post-image.sh"
> +BR2_LINUX_KERNEL=y
> +BR2_LINUX_KERNEL_CUSTOM_GIT=y
> +BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/t3gemstone/linux.git"
> +BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="02ecef0cb08a6bd123a4f035a296bc824bcfe5b4"
> +BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG=y
> +BR2_LINUX_KERNEL_DTS_SUPPORT=y
> +BR2_LINUX_KERNEL_INTREE_DTS_NAME="ti/k3-am67a-t3-gem-o1"
> +BR2_LINUX_KERNEL_INSTALL_TARGET=y
> +BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y
> +BR2_KERNEL_HEADERS_AS_KERNEL=y
> +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_12=y
New defconfigs are expected to use a Bootlin stable glibc
external toolchain. So, you should remove this:
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_12=y
and add instead:
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_AARCH64_GLIBC_STABLE=y
> +BR2_TARGET_TI_K3_R5_LOADER=y
> +BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_GIT=y
> +BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_REPO_URL="https://github.com/t3gemstone/u-boot.git"
> +BR2_TARGET_TI_K3_R5_LOADER_CUSTOM_REPO_VERSION="8b5ae72c281207430fcc58031fe36f40900f7a2d"
> +BR2_TARGET_TI_K3_R5_LOADER_BOARD_DEFCONFIG="am67a_t3_gem_o1_r5"
> +BR2_TARGET_TI_K3_R5_LOADER_USE_DEFCONFIG=y
> +BR2_TARGET_UBOOT=y
> +BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
> +BR2_TARGET_UBOOT_CUSTOM_GIT=y
> +BR2_TARGET_UBOOT_CUSTOM_REPO_URL="https://github.com/t3gemstone/u-boot.git"
> +BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="8b5ae72c281207430fcc58031fe36f40900f7a2d"
> +BR2_TARGET_UBOOT_BOARD_DEFCONFIG="am67a_t3_gem_o1_a53"
> +BR2_TARGET_UBOOT_NEEDS_DTC=y
> +BR2_TARGET_UBOOT_NEEDS_PYTHON3=y
> +BR2_TARGET_UBOOT_NEEDS_PYLIBFDT=y
> +BR2_TARGET_UBOOT_NEEDS_OPENSSL=y
> +BR2_TARGET_UBOOT_NEEDS_GNUTLS=y
> +BR2_TARGET_UBOOT_NEEDS_ATF_BL31=y
> +BR2_TARGET_UBOOT_NEEDS_OPTEE_TEE=y
> +BR2_TARGET_UBOOT_NEEDS_OPTEE_TEE_RAW_BIN=y
> +BR2_TARGET_UBOOT_USE_BINMAN=y
> +# BR2_TARGET_UBOOT_FORMAT_BIN is not set
> +BR2_TARGET_UBOOT_FORMAT_IMG=y
> +BR2_TARGET_UBOOT_SPL=y
> +BR2_TARGET_UBOOT_SPL_NAME="tispl.bin"
> +BR2_TARGET_TI_K3_BOOT_FIRMWARE=y
> +BR2_TARGET_ARM_TRUSTED_FIRMWARE=y
> +BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION=y
> +BR2_TARGET_ARM_TRUSTED_FIRMWARE_CUSTOM_VERSION_VALUE="v2.10"
> +BR2_TARGET_ARM_TRUSTED_FIRMWARE_PLATFORM="k3"
> +BR2_TARGET_ARM_TRUSTED_FIRMWARE_TARGET_BOARD="lite"
> +BR2_TARGET_OPTEE_OS=y
> +BR2_TARGET_OPTEE_OS_PLATFORM="k3-am62x"
> +BR2_TARGET_ROOTFS_EXT2=y
> +BR2_TARGET_ROOTFS_EXT2_4=y
> +BR2_TARGET_ROOTFS_EXT2_SIZE="256M"
> +BR2_PACKAGE_HOST_GENIMAGE=y
> +BR2_PACKAGE_HOST_DOSFSTOOLS=y
> +BR2_PACKAGE_HOST_MTOOLS=y
> +BR2_GLOBAL_PATCH_DIR="board/t3/t3-gem-o1/patches"
> +BR2_TARGET_UBOOT_CUSTOM_MAKEOPTS="BINMAN_INDIRS=$(BINARIES_DIR)
> TEE=$(BINARIES_DIR)/tee-pager_v2.bin"
Since you'll remove the "S89firstboot" script, the configs below
are no longer needed (e2fsprogs, parted, rootfs-overlay). Could
you also remove those, please?
> +BR2_PACKAGE_E2FSPROGS=y
> +BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
> +BR2_PACKAGE_PARTED=y
> +BR2_ROOTFS_OVERLAY="board/t3/t3-gem-o1/rootfs_overlay"
The defconfigs in Buildroot are expected to be minimal,
as generated by the command:
make t3_gem_o1_defconfig
make savedefconfig
Could you regenerate it with those commands, please?
> --
> 2.43.0
Could you send an updated patch addressing all those comments,
please?
Best regards,
Julien.
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-08-02 8:30 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-06 18:39 [Buildroot] [PATCH] board/t3/t3-gem-o1: add new board Selman Çetin via buildroot
2026-07-13 14:56 ` [Buildroot] " dowan gullient via buildroot
2026-07-19 17:12 ` [Buildroot] [PATCH] " Selman Çetin via buildroot
2026-08-02 8:29 ` Julien Olivain via buildroot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.