Toradex AM62 Review/Notes

The Toradex AM62 SOM is an interesting product that comes in a number of versions from single to quad core. This setup is using the Dahlia carrier board. Initial connections are shown below;

Note, the USB serial console exposes 4 serial ports – use the last one.

After powering up the board, we see the following on the console:

Welcome to the Toradex Easy Installer

This is a Linux based installer for Toradex modules. Currently, the installer
does not have a serial console interface. You can use the Toradex Easy Installer via any of the available display interfaces using USB mouse/keyboard or via a network connection using VNC. Use:
# ip addr show
to display the Ethernet IP address(es) or use USB RNDIS at IP 192.168.11.1.

Check our documentation at:
Toradex Easy Installer Overview | Toradex Developer Center

After connecting via VNC (Vinagre is recommended), we see the following:

image

image

image

I chose the Multimedia image. After clicking through various licenses, it downloaded 946MB. It downloaded and programmed quickly.

After rebooting, VNC was not longer available.

Pressing the power switch while running goes through an orderly shutdown and then powers off.

I then connected the DSI adapter board and 10" Cap touch display – nothing displayed. Swapped out for the HDMI display adapter and the shows a Weston desktop on a HDMI monitor:

That’s all for today, stay tuned as we continue this evaluation.

root@verdin-am62-15207124:~# cat /proc/version 
Linux version 6.1.46-6.4.0+git.5ed54483177b (oe-user@oe-host) (aarch64-tdx-linux-gcc (GCC) 11.4.0, GNU ld (GNU Binutils) 2.38.20220708) #1 SMP PREEMPT Wed Oct  4 10:01:54 UTC 2023
root@verdin-am62-15207124:~# more /etc/os-release 
ID=tdx-xwayland
NAME="TDX Wayland with XWayland"
VERSION="6.4.0+build.8 (kirkstone)"
VERSION_ID=6.4.0-build.8
PRETTY_NAME="TDX Wayland with XWayland 6.4.0+build.8 (kirkstone)"
DISTRO_CODENAME="kirkstone"
1 Like

10" display is up:

Toradex provided some information on how to enable the correct overlay:

The touch is a little sensitive – pressing the console button gives me dozens of console windows. I guess the positive side is this processor is fast!

Building a Yocto Image

Had a go at building a Yocto image using the Toradex Yocto build. They use repo with manifests stored in toradex-manifest.git. There current release is based on the Yocto Kirkstone release, which is the last LTS release from May of 2022. This is a typical repo setup that is common in the Freescale/NXP world. These instructions show how to set up a build, etc. I build core-image-minimal and it build with no problems.

The image has the following flash layout:

root@verdin-am62-15207124:~# fdisk -l /dev/mmcblk0*
Disk /dev/mmcblk0: 14.6 GiB, 15678308352 bytes, 30621696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc35a4ec8

Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   106495    98304   48M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      106496 30621695 30515200 14.6G 83 Linux


Disk /dev/mmcblk0boot0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mmcblk0boot1: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mmcblk0p1: 48 MiB, 50331648 bytes, 98304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Recovery mode

The Toradax Easy Installer is the documented way to install stuff. This comes as a zip file that you download and has the following contents:

This appears to use the uuu utility.

To put the AM62 in recovery mode, power off, hold the recovery switch, and power on. The following device shows up on the USB recovery USB port:

[1483669.367668] usb 1-6.3: Product: AM62x DFU
[1483669.367670] usb 1-6.3: Manufacturer: Texas Instruments, Inc.
[1483669.367672] usb 1-6.3: SerialNumber: 01.00.00.00

After running recovery-linux.sh (requires sudo), I see the same Easy Installer message on the serial console as when the board was first powered up.

There is a recovery/uuu.auto file that appears to specify the image that gets downloaded:

uuu_version 1.4.127

CFG: FB: -vid 0x1b67 -pid 0x4000
FB: download -f ../tezi.itb
FB: ucmd cp.b 0xC0000000 0x90300000 ${filesize}
FB: download -f ../overlays.txt
FB: ucmd cp.b 0xC0000000 0x88200000 ${filesize}
FB: download -f ../boot.scr
FB: ucmd cp.b 0xC0000000 0x90280000 ${filesize}
FB: acmd source 0x90280000
FB: done

The easy installer appears to run from a squashfs filesystem. Rebooting confirms the original image is still intact in eMMC flash.

This is all pretty neat as it appears you can bootstrap a system over USB using only the boot-rom software.

Upstream First

Toradex has an “upstream first” policy with components like the Linux kernel.

This is commendable and really the only sustainable approach with OSS.

It is unclear how this policy applies to Yocto development itself.

Easy Installer Image Format

The Toradex Easy Installer uses images that are in a tar format. An example of the contents:

The image.json file drives the process:

{
    "config_format": "3",
    "autoinstall": false,
    "name": "TorizonCore",
    "description": "TorizonCore Linux with no containers pre-provisioned.",
    "version": "6.4.0+build.5",
    "release_date": "2023-10-10",
    "u_boot_env": "u-boot-initial-env-sd",
    "prepare_script": "prepare.sh",
    "wrapup_script": "wrapup.sh",
    "marketing": "marketing.tar",
    "icon": "toradexlinux.png",
    "license": "TI-TFL.txt",
    "supported_product_ids": [
        "0069",
        "0071",
        "0072",
        "0073",
        "0074",
        "0075",
        "0076"
    ],
    "blockdevs": [
        {
            "name": "mmcblk0",
            "partitions": [
                {
                    "partition_size_nominal": 512,
                    "want_maximised": true,
                    "content": {
                        "label": "otaroot",
                        "filesystem_type": "ext4",
                        "mkfs_options": "-E nodiscard",
                        "filename": "torizon-core-docker-verdin-am62.ota.tar.zst",
                        "uncompressed_size": 689.5703125
                    }
                }
            ]
        },
        {
            "name": "mmcblk0boot0",
            "erase": true,
            "content": {
                "filesystem_type": "raw",
                "rawfiles": [
                    {
                        "filename": "tiboot3-am62x-gp-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0069"
                    },
                    {
                        "filename": "tiboot3-am62x-gp-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0071"
                    },
                    {
                        "filename": "tiboot3-am62x-gp-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0072"
                    },
                    {
                        "filename": "tiboot3-am62x-hs-fs-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0073"
                    },
                    {
                        "filename": "tiboot3-am62x-hs-fs-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0074"
                    },
                    {
                        "filename": "tiboot3-am62x-hs-fs-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0075"
                    },
                    {
                        "filename": "tiboot3-am62x-hs-fs-verdin.bin",
                        "dd_options": "seek=0",
                        "product_ids": "0076"
                    },
                    {
                        "filename": "tispl.bin",
                        "dd_options": "seek=1024"
                    },
                    {
                        "filename": "u-boot.img",
                        "dd_options": "seek=5120"
                    }
                ]
            }
        }
    ]
}

It appears that a Yocto build generates this tar image:

[cbrake@ceres build]$ ls deploy/images/verdin-am62/*.tar
deploy/images/verdin-am62/core-image-minimal-verdin-am62-20240112162541-Tezi_6.5.0-devel-20240112162541+build.0.tar
deploy/images/verdin-am62/marketing.tar

The contents are a little different:

The bootfs.tar.gz appears to contain the kernel, DTB files, and a number of overlays:

The non-bootfs image also contains a kernel and DTB files, but no overlays.

Installing a custom Yocto build from USB

I extracted the following image from my Yocto build to a USB disk, inserted it into the AM62 board USB port, and clicked refresh in the Easy Installer UI.

deploy/images/verdin-am62/core-image-minimal-verdin-am62-20240112162541-Tezi_6.5.0-devel-20240112162541+build.0.tar

It found the image and displayed it:

After selecting and pressing install, it asked me to click through various licenses. It took about 10s or so to install.

It appears to build, but dates on u-boot and kernel are fairly old:

U-Boot 2023.04-6.5.0-devel+git.9c8485712f05 (Dec 19 2023 - 08:33:12 +0000)

root@localhost:~# cat /proc/version
Linux version 6.1.46-6.5.0-devel+git.8e6a2ddd4fe6 (oe-user@oe-host) (aarch64-tdx-linux-gcc (GCC) 11.4.0, GNU ld (GNU Binutils) 2.38.20220708) #1 SMP PREEMPT Thu Dec 21 17:08:38 UTC 2023

I did my build on Jan 12, so wondering if the Toradex build is set to get stuff from an external sstate cache or something?

The verdin-am62_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo does not seem to be in the image, so need to figure out how to get that back into the build.

First Impressions

The Toradex Easy Installer update system has some nice points:

  • easy GUI to use from development systems – helps quickly evaluate the Toradex system
  • declarative config that configures partitions, etc. This is likely easier than writing shell code in the Yoe updater.
  • shell hooks to add your logic
  • the ability to download OTA from image feeds
  • runs from RAM
  • provide scripts that can launch from a bricked system over USB port, but this requires some expertise – not an end-user operation.

It appears for production use, Toradex recommends their Torizon Update mechanism.

Overall, this setup has been a reasonably good experience. Toradex documentation is extensive, but it is written more from an end-user perspective and it is difficult to understand the big picture and how things work internally, which is the purpose of this topic. Toradex has put a lot of effort into making things easy, but in some ways, this adds some complexity when it comes to customizing the OS. Even though Toradex has an “upstream first” policy for the kernel, the Yocto version is dated and this limits your ability to add the latest software and technology to your product.

It seems there is still a place for distributions like Yoe which provide monthly releases, a simple, yet production-ready, updater and factory installer. Perhaps Yoe and Torizon complement each other well – Yoe is for people who want to track the latest software and build their own infrastructure (SIOT, etc). Torizon excels at providing an easy-to-use platform for developers who don’t want to mess much with the OS. However, this may limit your ability to own your own platform that you can scale across multiple products over many years. As an example, we have one customer who has built a very complex technology stack and has deployed it to several different platforms including a custom AM3352, Variscite i.MX6 and i.MX8, and Nvidia Jetson Orin Nano based products.

Next step is to build an AM62 image in Yoe …

I think there are good learnings as you noted. Perhaps convert some of them into github issues for yoe

Adding Yoe update functionality into SIOT for OTA updates seems like an interesting path forward and need that for a project anyway …

Lots to think about …

Verdin USB_1 (OTG) Port

The USB_1 port can function as both a client and host. This is useful in that the port can be used as a USB recovery mechanism, or as a host port during normal operation.

USBC to USBA adapter

With a USBC to USBA adapter, it detects a flash drive.

root@localhost:~# [   18.016508] xhci-hcd xhci-hcd.4.auto: xHCI Host Controller
[   18.022200] xhci-hcd xhci-hcd.4.auto: new USB bus registered, assigned bus number 2
[   18.030270] xhci-hcd xhci-hcd.4.auto: USB3 root hub has no ports
[   18.036387] xhci-hcd xhci-hcd.4.auto: hcc params 0x0258fe6d hci version 0x110 quirks 0x0000000000010010
[   18.045929] xhci-hcd xhci-hcd.4.auto: irq 485, io mem 0x31000000
[   18.053394] hub 2-0:1.0: USB hub found
[   18.057377] hub 2-0:1.0: 1 port detected
[   18.591759] usb 2-1: new high-speed USB device number 2 using xhci-hcd
[   18.753544] usb-storage 2-1:1.0: USB Mass Storage device detected
[   18.761086] scsi host0: usb-storage 2-1:1.0
[   20.083499] scsi 0:0:0:0: Direct-Access     JetFlash Transcend 32GB   1100 PQ: 0 ANSI: 6
[   20.093672] sd 0:0:0:0: [sda] 61685760 512-byte logical blocks: (31.6 GB/29.4 GiB)
[   20.102214] sd 0:0:0:0: [sda] Write Protect is off
[   20.108133] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[   20.123500]  sda: sda1
[   20.126516] sd 0:0:0:0: [sda] Attached SCSI removable disk

Connect to a USB Host

When connected to a USB Host, nothing happens, so perhaps some configuration work is required to switch modes. However, the port does work with the USB recovery process.

1 Like