From c146e9151e21b0f39a31db2f299ab5c8b26ae2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Selman=20=C3=87etin?= Date: Mon, 4 May 2026 02:03:27 +0300 Subject: [PATCH] board/t3/t3-gem-o1: add new board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- board/t3/t3-gem-o1/genimage.cfg | 30 ++++++++++ .../arm-trusted-firmware.hash | 2 + .../patches/linux-headers/linux-headers.hash | 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 00000000000..36477065422 --- /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 00000000000..6f02bfbb22e --- /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 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 00000000000..3c4761fa9cf --- /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 00000000000..3c4761fa9cf --- /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 00000000000..3f5c58fcffa --- /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 00000000000..df7ddbd7cb7 --- /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 00000000000..592ea667511 --- /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 00000000000..df7ddbd7cb7 --- /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 00000000000..592ea667511 --- /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 00000000000..e09294a1136 --- /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 00000000000..8ac17e821cc --- /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 00000000000..1354cc863f8 --- /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 00000000000..f26b6243227 --- /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 00000000000..d4dd672e4a3 --- /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"