imx: add Gateworks Venice support

Add support for Gateworks Venice imx8m family of boards:
 - required kernel modules for on-board devices
 - image generation
 - initial network config
 - sysupgrade support

The resulting compressed disk image
(bin/targets/imx/cortexa53/openwrt-imx-cortexa53-gateworks_venice-squashfs-img.gz)
can be installed on a Gateworks venice board via U-Boot:

u-boot=> tftpboot $loadaddr openwrt-imx-cortexa53-gateworks_venice-squashfs-img.gz && \
         gzwrite mmc $dev $loadaddr $filesize

WARNING: this will overwrite any boot firmware on the eMMC user hardware
partition which if being used will brick your board requiring JTAG to
re-program boot firmware and recover

The compressed disk image contains the partition table and filesystems only
and that it is expected that boot firmware is installed properly on the
eMMC boot0 hardware partition. The easiest way to ensure this is to
use the Gateworks JTAG adapter/process to install the latest boot firmware
as follows from a Linux host:
  wget http://dev.gateworks.com/jtag/jtag_usbv4
  chmod +x jtag_usbv4
  wget http://dev.gateworks.com/venice/images/firmware-venice-imx8mm.bin
  sudo ./jtag_usbv4 -p firmware-venice-imx8mm.bin

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
This commit is contained in:
Tim Harvey 2024-01-12 11:34:28 -08:00 committed by Robert Marko
parent ae8bf1a26e
commit bd512e368f
6 changed files with 194 additions and 0 deletions

View File

@ -0,0 +1,27 @@
. /lib/functions/uci-defaults.sh
board=$(board_name)
board_config_update
case "$board" in
gw,imx8mm-gw72xx-0x|\
gw,imx8mp-gw72xx-2x|\
gw,imx8mm-gw73xx-0x|\
gw,imx8mp-gw73xx-2x|\
gw,imx8mm-gw7902-0x)
ucidef_set_interfaces_lan_wan 'eth1' 'eth0'
;;
gw,imx8mm-gw7901)
ucidef_set_interfaces_lan_wan 'lan2 lan3 lan4' 'lan1'
;;
gateworks,imx8mp-gw74xx)
ucidef_set_network_device_path "eth0" "platform/soc@0/30800000.bus/30bf0000.ethernet"
ucidef_set_network_device_path "eth1" "platform/soc@0/30800000.bus/30be0000.ethernet"
ucidef_set_interfaces_lan_wan 'lan1 lan2 lan3 lan4' 'eth1'
;;
esac
board_config_flush
exit 0

View File

@ -0,0 +1,17 @@
. /lib/functions.sh
. /lib/upgrade/common.sh
move_config() {
local board=$(board_name)
local partdev
export_bootdevice && export_partdevice partdev 1 && {
mount -o rw,noatime "/dev/$partdev" /mnt
[ -f "/mnt/$BACKUP_FILE" ] && {
mv -f "/mnt/$BACKUP_FILE" /
}
umount /mnt
}
}
boot_hook_add preinit_mount_root move_config

View File

@ -0,0 +1,53 @@
enable_image_metadata_check() {
case "$(board_name)" in
gw,imx8m*)
REQUIRE_IMAGE_METADATA=1
;;
esac
}
enable_image_metadata_check
platform_check_image() {
local board=$(board_name)
case "$board" in
gw,imx8m*)
return 0
;;
esac
echo "Sysupgrade is not yet supported on $board."
return 1
}
platform_do_upgrade() {
local board=$(board_name)
case "$board" in
gw,imx8m*)
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to find root device."
return 1
}
v "Updating /dev/$diskdev..."
get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
;;
esac
}
platform_copy_config() {
local board=$(board_name)
local partdev
case "$board" in
gw,imx8m*)
export_partdevice partdev 1 && {
v "Storing $UPGRADE_BACKUP on /dev/$partdev..."
mount -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
}
;;
esac
}

View File

@ -45,6 +45,7 @@ CONFIG_CMA_AREAS=7
# CONFIG_CMA_DEBUG is not set
# CONFIG_CMA_DEBUGFS is not set
# CONFIG_CMA_SYSFS is not set
# CONFIG_COMMON_CLK_BD718XX is not set
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_CONTIG_ALLOC=y
CONFIG_CRYPTO_AES_ARM64=y
@ -96,9 +97,16 @@ CONFIG_INTERCONNECT_IMX8MN=y
CONFIG_INTERCONNECT_IMX8MP=y
CONFIG_INTERCONNECT_IMX8MQ=y
CONFIG_MEMORY_ISOLATION=y
CONFIG_MFD_CORE=y
CONFIG_MFD_ROHM_BD718XX=y
# CONFIG_MMC_SDHCI_PCI is not set
CONFIG_MODULES_USE_ELF_RELA=y
CONFIG_NEED_SG_DMA_LENGTH=y
# CONFIG_NET_DSA_MICROCHIP_KSZ8863_SMI is not set
CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C=y
CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON=y
# CONFIG_NET_DSA_MICROCHIP_KSZ_SPI is not set
CONFIG_NET_DSA_TAG_KSZ=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_PARTITION_PERCPU=y
CONFIG_PCI=y
@ -133,8 +141,11 @@ CONFIG_POWER_RESET=y
CONFIG_POWER_SUPPLY=y
CONFIG_QUEUED_RWLOCKS=y
CONFIG_QUEUED_SPINLOCKS=y
CONFIG_REGMAP_IRQ=y
CONFIG_REGULATOR_BD718XX=y
CONFIG_REGULATOR_MP5416=y
CONFIG_REGULATOR_PCA9450=y
CONFIG_REGULATOR_ROHM=y
CONFIG_RESET_IMX7=y
CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
CONFIG_SOC_IMX8M=y

View File

@ -0,0 +1,41 @@
# distro-config bootscript
# - use only well-known variable names provided by U-Boot Distro boot
# - devtype - device type script run from (mmc|usb|scsi)
# - devnum - device number script run from (0 based int)
# - distro_bootpart - partition script run from (0 based int)
# - prefix - directory boot script was found in
# - kernel_addr_r - address to load kernel image to
# - fdt_addr_r - address to load dtb to
# - ftdcontroladdr - address dtb is at
# - fdt_file{1,2,3,4,5} name of fdt to load
# - fdt_overlays - list of fdt overlay files to load and apply
echo "Gateworks Venice OpenWrt Boot script v1.0"
# determine root device using PARTUUID:
# - this avoids any difference beteween uboot's device names/numbers
# not matching Linux as device enumeration is not a set API.
# - PARTUUID is disk UUID concatenated with partition number
# - for MBR disk UUID is unique disk id at offset 440
# - for GPT disk UUID is GPT UUID
# - for OpenWrt the squasfs rootfs is not readable by U-Boot so we have
# a 'boot' partition containing bootscript kernel dtbs followed by the rootfs
# partition, therefore we add 1 to the current partition
setexpr rootpart ${distro_bootpart} + 1 # root on 'next' partition
part uuid ${devtype} ${devnum}:${rootpart} uuid
setenv bootargs ${bootargs} console=${console} root=PARTUUID=${uuid} rootfstype=squashfs,ext4,f2fs rootwait
# load dtb (we try fdt_file and then fdt_file{1,2,3,4,5})
echo "loading DTB..."
setenv fdt_addr
setenv fdt_list $fdt_file $fdt_file1 $fdt_file2 $fdt_file3 $fdt_file4 $fdt_file5
setenv load_fdt 'echo Loading $fdt...; load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${fdt} && setenv fdt_addr ${fdt_addr_r}'
setenv apply_overlays 'fdt addr $fdt_addr_r && fdt resize && for fdt in "$fdt_overlays"; do load ${devtype} ${devnum}:${distro_bootpart} $loadaddr $prefix/$fdt && fdt apply $loadaddr && echo applied $prefix/$fdt; done'
for fdt in ${fdt_list}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${fdt}; then run load_fdt; fi; done
if test -z "$fdt_addr"; then echo "Warning: Using bootloader DTB"; setenv fdt_addr $fdtcontroladdr; fi
if test -n "$fdt_overlays"; then echo "Applying overlays"; run apply_overlays; fi
if test -n "$fixfdt"; then echo "Adjusting FDT"; run fixfdt; fi
# load and boot kernel
echo "loading kernel..."
load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} ${prefix}Image &&
booti ${kernel_addr_r} - ${fdt_addr}

View File

@ -1,3 +1,30 @@
define Build/boot-scr
rm -f $@-boot.scr
mkimage -A arm64 -O linux -T script -C none -a 0 -e 0 \
-d bootscript-$(BOOT_SCRIPT) $@-boot.scr
endef
define Build/boot-img-ext4
rm -fR $@.boot
mkdir -p $@.boot
$(foreach dts,$(DEVICE_DTS), $(CP) $(KDIR)/image-$(dts).dtb $@.boot/$(dts).dtb;)
$(CP) $(IMAGE_KERNEL) $@.boot/$(KERNEL_NAME)
-$(CP) $@-boot.scr $@.boot/boot.scr
make_ext4fs -J -L kernel -l $(CONFIG_TARGET_KERNEL_PARTSIZE)M \
$(if $(SOURCE_DATE_EPOCH),-T $(SOURCE_DATE_EPOCH)) \
$@.bootimg $@.boot
endef
define Build/sdcard-img-ext4
SIGNATURE="$(IMG_PART_SIGNATURE)" \
PARTOFFSET="$(PARTITION_OFFSET)" PADDING=1 \
$(if $(filter $(1),efi),GUID="$(IMG_PART_DISKGUID)") $(SCRIPT_DIR)/gen_image_generic.sh \
$@ \
$(CONFIG_TARGET_KERNEL_PARTSIZE) $@.boot \
$(CONFIG_TARGET_ROOTFS_PARTSIZE) $(IMAGE_ROOTFS) \
256
endef
define Device/Default
PROFILES := Default
FILESYSTEMS := squashfs ubifs ext4
@ -13,3 +40,21 @@ define Device/imx8m
DEVICE_DTS := $(basename $(notdir $(wildcard $(DTS_DIR)/freescale/imx8m*.dts)))
endef
TARGET_DEVICES += imx8m
define Device/gateworks_venice
$(call Device/Default)
FILESYSTEMS := squashfs ext4
DEVICE_VENDOR := Gateworks
DEVICE_MODEL := i.MX8M Venice
BOOT_SCRIPT := gateworks_venice
PARTITION_OFFSET := 16M
DEVICE_DTS := $(basename $(notdir $(wildcard $(DTS_DIR)/freescale/imx8m*-venice*.dts)))
DEVICE_PACKAGES := \
kmod-hwmon-gsc kmod-rtc-ds1672 kmod-eeprom-at24 \
kmod-gpio-button-hotplug kmod-leds-gpio kmod-pps-gpio \
kmod-lan743x kmod-sky2 kmod-iio-st_accel-i2c \
kmod-can kmod-can-flexcan kmod-can-mcp251x
IMAGES := img.gz
IMAGE/img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata
endef
TARGET_DEVICES += gateworks_venice