Skip to content

Hardware Reference Edge EInk Board

Alex J Lennon edited this page Oct 5, 2025 · 1 revision

Edge EInk Board

Board Type: imx93-jaguar-eink
Platform: NXP i.MX93
Description: Low-power e-ink display controller with advanced power management

Overview

The Edge EInk board is designed for ultra-low power e-ink display applications. It features advanced suspend/resume functionality, selective wake-on-LAN capabilities, and optimized power management for battery-powered deployments.

Hardware Features

Processor

  • NXP i.MX93 dual-core Arm Cortex-A55 + Cortex-M33
  • Low power design optimized for always-on applications
  • Hardware security with built-in cryptographic acceleration

Connectivity

  • WiFi 6 + Bluetooth 5.4 + 802.15.4 via ublox MAYA W2 module (NXP IW612 chipset)
  • Selective wake-on-LAN with magic packet filtering
  • Bluetooth Low Energy for device pairing and control
  • LTE cellular modem support via USB interface

Power Management

  • Advanced suspend/resume with sub-second wake times
  • Magic packet wake for remote system management
  • GPIO-based wake sources for external triggers
  • Dynamic power scaling based on workload
  • MCXC143VFM power controller for external radio power management

Boot Performance ⚡

  • Current Boot Time: ~23s (minimal improvement from optimizations)
  • Target Boot Time: < 1.5s for optimal user experience
  • Recent Result: Only 0.33s improvement (1.4%) after U-Boot optimizations
  • Issue: U-Boot changes had minimal impact, need different approach
  • Serial Boot Logging: Available for pre-network timing analysis

Hardware Pin Mapping

WiFi SDIO Interface (USDHC2)

Function i.MX93 Pin GPIO Signal
SDIO Clock MX93_PAD_SD2_CLK - SD2_CLK
SDIO Command MX93_PAD_SD2_CMD - SD2_CMD
SDIO Data[0-3] MX93_PAD_SD2_DATA[0-3] - SD2_DATA[0-3]
SDIO Interrupt MX93_PAD_ENET2_RD1 GPIO4_IO25 SD2_INT
WLAN Reset MX93_PAD_ENET2_RD2 GPIO4_IO26 WLAN_RST (Active-Low)

Bluetooth UART Interface (LPUART5) ✅

Function i.MX93 Pin Maya W2 Function Signal Notes
BT UART RX MX93_PAD_DAP_TDO_TRACESWO Bluetooth UART Rx LPUART5_TX Output from i.MX93
BT UART TX MX93_PAD_DAP_TDI Bluetooth UART Tx LPUART5_RX Input to i.MX93
BT UART CTS MX93_PAD_DAP_TCLK_SWCLK Bluetooth UART CTS LPUART5_CTS_B Output from i.MX93
BT UART RTS MX93_PAD_DAP_TMS_SWDIO Bluetooth UART RTS LPUART5_RTS_B Input to i.MX93
BT Reset MX93_PAD_ENET2_RD0 Software Reset GPIO4_IO24 BT_RST (Active-Low, MCXC143VFM)

Configuration Notes:

  • Hardware Flow Control: RTS/CTS enabled (fsl,uart-has-rtscts)
  • Baud Rate: 3MHz initialization (fw-init-baudrate = <3000000>)
  • Power Management: Reset controlled by MCXC143VFM power controller
  • Wake Pins: BT_WAKE_HOST not connected, BT_WAKE_DEV not assigned

Recent Fixes:

  • Fixed incorrect &lpuart4&lpuart5 UART assignment (commit fdbb5b2)
  • Hardware RTS/CTS pinout issue resolved in hardware revision
  • Device tree pinout verified 100% correct against hardware specification

802.15.4 SPI Interface (LPSPI3) ✅

Function i.MX93 Pin Signal Notes
SPI Chip Select MX93_PAD_GPIO_IO08__LPSPI3_PCS0 SPI3_SS0 802.15.4 SPI CS
SPI Clock MX93_PAD_GPIO_IO11__LPSPI3_SCK SPI3_SCLK 802.15.4 SPI Clock
SPI MISO MX93_PAD_GPIO_IO10__LPSPI3_SOUT SPI3_MISO Master-In Slave-Out
SPI MOSI MX93_PAD_GPIO_IO09__LPSPI3_SIN SPI3_MOSI Master-Out Slave-In
ZigBee Interrupt MX93_PAD_ENET2_RD3__GPIO4_IO27 ZB_INT 802.15.4 SPI Interrupt

Hardware Configuration:

  • SPI Device: /dev/spidev2.0 (LPSPI3)
  • Max Speed: 12 MHz
  • Reset: Shared with Bluetooth (GPIO4_IO24, controlled by MCXC143VFM)
  • Interrupt: GPIO4_IO27 (active-low)

Software Support:

  • IW612 Chipset: ublox MAYA W2 module provides 802.15.4 functionality
  • Device Tree: LPSPI3 configured and enabled
  • Kernel Support: 802.15.4 subsystem enabled in kernel configuration

Testing Commands:

# Verify SPI device exists
ls -la /dev/spidev2.0

# Test SPI communication
echo -n -e '\x55' | spi-pipe -d /dev/spidev2.0 -s 1000000 -b 8

# Check 802.15.4 interface (if driver loaded)
iwpan dev

E-Ink Display Interface

The board provides two SPI interface options for the E-Ink display - QSPI (preferred) and standard SPI (backup). Both interfaces use level shifters to convert 1.8V i.MX93 signals to 3.3V for the display.

QSPI Interface (FlexSPI1) - Preferred Option

Function i.MX93 Pin Signal Notes
QSPI Clock MX93_PAD_SD3_CLK__FLEXSPI1_A_SCLK QSPI_CLK Up to 80 MHz
QSPI Chip Select MX93_PAD_SD3_CMD__FLEXSPI1_A_SS0_B QSPI_CS Active-Low
QSPI Data 0 MX93_PAD_SD3_DATA0__FLEXSPI1_A_DATA00 QSPI_D0 Quad mode
QSPI Data 1 MX93_PAD_SD3_DATA1__FLEXSPI1_A_DATA01 QSPI_D1 Quad mode
QSPI Data 2 MX93_PAD_SD3_DATA2__FLEXSPI1_A_DATA02 QSPI_D2 Quad mode
QSPI Data 3 MX93_PAD_SD3_DATA3__FLEXSPI1_A_DATA03 QSPI_D3 Quad mode

Standard SPI Interface (LPSPI1) - Backup Option

Function i.MX93 Pin Signal Notes
SPI Clock MX93_PAD_SAI1_TXD0__LPSPI1_SCK SPI1_CLK Up to 10 MHz
SPI Chip Select MX93_PAD_SAI1_TXFS__LPSPI1_PCS0 SPI1_CS Active-Low
SPI MOSI MX93_PAD_SAI1_RXD0__LPSPI1_SOUT SPI1_MOSI Master Out
SPI MISO MX93_PAD_SAI1_TXC__LPSPI1_SIN SPI1_MISO Master In

Display Control GPIOs ✅

Function i.MX93 Pin GPIO Signal Notes
Reset MX93_PAD_GPIO_IO14 GPIO2_IO14 RES_DIS# Active-Low reset
Data/Command MX93_PAD_GPIO_IO15 GPIO2_IO15 D/C#_DIS LO=Command, HI=Data
Left/Right Select MX93_PAD_GPIO_IO16 GPIO2_IO16 L#R_SEL_DIS LO=Left, HI=Right
Busy Status MX93_PAD_GPIO_IO17 GPIO2_IO17 BUSY_DIS# LO=Busy (Input)
Power Enable MX93_PAD_GPIO_IO11 GPIO2_IO11 POWER_EN Display power control

Chip Select Routing Architecture ✅

The EL133UF1 E-Ink display uses a unique chip select routing system:

Hardware Design:

  • Dual Controllers: Display has left controller (CS_M) and right controller (CS_S)
  • Single CS Line: Only one chip select from i.MX93 SPI controller is connected
  • L/R Routing: L#R_SEL_DIS signal (GPIO2_IO16) routes the CS to the correct controller:
    • L#R_SEL_DIS LOW → CS routes to left controller (CS_M)
    • L#R_SEL_DIS HIGH → CS routes to right controller (CS_S)

Software Implementation:

  • Sequential Access: Controllers accessed one at a time (not simultaneously)
  • Routing Control: L/R select GPIO set first, then CS activated
  • GPIO Numbers: CS=559 (GPIO2_IO15), L/R=560 (GPIO2_IO16)

Usage Example:

Testing E-Ink Display ✅ VALIDATED

Status: ✅ Software validated on target hardware (2025-01-09)
Target: imx93-jaguar-eink with kernel 6.6.52
Applications: Both demo and test applications fully functional

Demo Application Testing ✅

# Test demo application (software validated, ready for hardware)
sudo el133uf1_demo -d /dev/spidev0.0 -r 558 -b 561 -0 559 -1 560 white
sudo el133uf1_demo -d /dev/spidev0.0 -r 558 -b 561 -0 559 -1 560 black
sudo el133uf1_demo -d /dev/spidev0.0 -r 558 -b 561 -0 559 -1 560 colorbar

SPI Communication Testing ✅

# Test left controller (CS0) - software validated
sudo el133uf1_test -d /dev/spidev0.0 -r 558 -b 561 -0 559 -1 560 --test-spi

# The driver automatically:
# 1. Sets GPIO2_IO16 LOW (route to left controller)
# 2. Activates GPIO2_IO15 LOW (chip select active)
# 3. Performs SPI transaction
# 4. Deactivates GPIO2_IO15 HIGH (chip select inactive)

Hardware Configuration Switches ✅

The board provides hardware switches to configure the SPI interface and level shifter buffer modes:

Mode Switch 4 Switch 3 Switch 2 Switch 1 BS1 BS0 Notes
QSPI - Autosensing X ON ON OFF OFF OFF Preferred - allows register reads
QSPI - Fixed Direction X ON OFF ON OFF OFF Simpler, no register reads
SPI - Standard X OFF ON ON OFF ON Backup option

Level Shifter Notes:

  • 1.8V → 3.3V: All i.MX93 signals are level-shifted for display compatibility
  • Autosensing Buffers: Can be temperamental, affected by attached devices
  • Fixed Direction: More reliable but prevents display register reading

Board SPI Mode Switches:

  • QSPI Mode: Switch 4=X, 3=ON, 2=ON, 1=OFF
  • SPI Mode: Switch 4=X, 3=OFF, 2=ON, 1=ON

Display Mode Switches (BS1/BS0):

  • QSPI - Autosensing Direction (Preferred): BS1=OFF, BS0=OFF
  • QSPI - Fixed Direction: BS1=OFF, BS0=OFF
  • SPI: BS1=OFF, BS0=ON

Level Shifters

The display interface uses level shifters to convert between 1.8V (i.MX93) and 3.3V (display):

  • Autosensing Direction Buffers: Required for reading display registers, can be temperamental
  • Fixed Direction Buffers: More reliable but write-only operation
  • QSPI Autosensing (Preferred): Best performance with register read capability
  • QSPI Fixed Direction: Reliable fallback if autosensing issues occur

Software Configuration ✅ FIXED

Current Configuration (LPSPI1 Active):

  • LPSPI1: /dev/spidev0.0 - 10 MHz, standard SPI mode ✅ WORKING
  • FlexSPI1: DISABLED - FlexSPI uses MTD subsystem, not spidev

Recent Fixes Applied:

  1. Machine Configuration: Added KERNEL_MODULE_AUTOLOAD:imx93-jaguar-eink = " spidev"
  2. Device Tree: Changed compatible from "spidev" to "rohm,dh2228fv" for proper driver binding
  3. Interface Selection: Using LPSPI1 for userspace SPI access via spidev

Testing Commands:

# Verify SPI device exists
ls -la /dev/spidev0.0

# Test SPI communication
echo -n -e '\x55' | spi-pipe -d /dev/spidev0.0 -s 1000000 -b 8

# Check SPI driver binding
ls -la /sys/bus/spi/devices/spi0.0/driver

Note: FlexSPI cannot be used with spidev as it's a memory-mapped interface designed for flash devices, not standard SPI transfers.

Cortex-M33 Co-Processor Support

The i.MX93 includes a Cortex-M33 co-processor that can be used for real-time tasks, power management, or dedicated peripheral control.

Memory Configuration

Region Address Size Purpose
TCM 0x201E0000 128KB Fast execution memory
Resource Table 0x1FFF8000 4KB Remoteproc metadata
VRing Buffers 0xAFF00000+ 32KB RPMSG communication
Shared Buffer 0xA8400000 1MB Data exchange
M33 Reserved 0xA8600000 16MB Non-cacheable section

U-Boot Firmware Loading

# Load CM33 firmware from SD card
=> fatload mmc 1:1 ${loadaddr} cm33_firmware.bin
=> cp.b ${loadaddr} 0x201e0000 ${filesize}
=> bootaux 0x201e0000 0

Linux Runtime Control

# Load and start CM33 firmware
echo "cm33_firmware.elf" > /sys/class/remoteproc/remoteproc0/firmware
echo "start" > /sys/class/remoteproc/remoteproc0/state

# Check status
cat /sys/class/remoteproc/remoteproc0/state

Inter-Processor Communication

  • RPMSG Channels: /dev/rpmsg0 for data exchange
  • TTY Console: /dev/ttyRPMSG0 for CM33 console access
  • Mailbox: Hardware-accelerated message passing
  • Shared Memory: Direct memory access between cores

Use Cases

  • Real-Time Processing: Time-critical sensor data processing
  • Power Management: Low-power monitoring while A55 cores sleep
  • Peripheral Control: Dedicated control of specific hardware
  • Security Functions: Isolated security processing

For detailed CM33 development information, see CM33 Firmware Guide.

Power Management

Suspend/Resume Functionality

The Edge EInk board implements sophisticated power management designed for e-ink applications:

Suspend Modes

The board supports multiple suspend modes:

  • s2idle (freeze) - CPU suspended, devices remain powered
  • mem (deep sleep) - Maximum power savings with selective wake sources

Automatic Suspend

# Suspend the system
sudo systemctl suspend

Wake Sources

The board can wake from:

  • Magic packets (Wake-on-LAN)
  • USB activity (when enabled)
  • GPIO interrupts (external triggers)
  • RTC alarms (scheduled wake)

Wake-on-LAN Configuration

Magic Packet Wake

The board supports selective WiFi wake using WoWLAN (Wake-on-WLAN):

# Check current WoWLAN status
iw phy mwiphy0 wowlan show

# Enable magic packet wake (automatic on suspend)
sudo systemctl suspend

Remote Wake Commands

From any device on the network:

# Wake the board using magic packet
wakeonlan 22:ba:36:5c:ae:c5

# Or using etherwake
etherwake 22:ba:36:5c:ae:c5

Note: The MAC address shown is an example - use ip addr show wlan0 to get the actual MAC address.

Power Optimization

WiFi Power Management

  • Selective wake filtering - Only magic packets wake the device
  • No broadcast wake - Network scans and DHCP don't trigger wake
  • Automatic power save - WiFi enters low-power mode during suspend

GPIO Configuration

Correct GPIO mappings for i.MX93:

  • WiFi Power GPIO: 634 (GPIO4_26)
  • Bluetooth Power GPIO: 632 (GPIO4_24)
  • WiFi Wake GPIO: 633 (GPIO4_25)

Networking

WiFi Setup

View Current Status

# Check WiFi interface
ip addr show wlan0

# Check connection status  
nmcli device status

Connect to Network

# Add WiFi connection
nmcli con add type wifi con-name "MyNetwork" ssid "MySSID" \
    wifi-sec.key-mgmt wpa-psk wifi-sec.psk "MyPassword"

# Connect
nmcli con up "MyNetwork"

WiFi Firmware Information

# Check IW612 firmware version
cat /proc/mwlan/adapter0/wlan0/info | grep version

Bluetooth

Basic Commands

# Check Bluetooth status
hciconfig -a

# Enable Bluetooth and scan
bluetoothctl power on
bluetoothctl scan on

Note: Bluetooth uses LPUART4 with DAP pin mapping on the i.MX93 platform.

Development & Testing

Local WiFi Testing

For development, you can set up local WiFi credentials without committing them to git:

  1. Copy the template:
cp recipes-support/default-network-manager/default-network-manager/wifi-config.local.example \
   recipes-support/default-network-manager/default-network-manager/wifi-config.local
  1. Edit the local config:
# Edit wifi-config.local with your network credentials
WIFI_SSID="YourNetwork"
WIFI_PASSWORD="YourPassword"
  1. Rebuild the image - the credentials will be included but not committed to git.

Suspend/Resume Testing

Test Sequence

# 1. Suspend the device
ssh fio@192.168.0.90 "sudo systemctl suspend"

# 2. Wait for suspend (5-10 seconds)
sleep 10

# 3. Verify device is suspended
ping -c 1 192.168.0.90 || echo "Device suspended"

# 4. Wake with magic packet
wakeonlan 22:ba:36:5c:ae:c5

# 5. Wait for wake (5-10 seconds)  
sleep 10

# 6. Verify device is awake
ping -c 2 192.168.0.90 && echo "Wake successful!"

Power Management Logs

# Check suspend/resume logs
sudo journalctl -u eink-suspend.service -f

# Check WoWLAN setup logs
sudo tail -f /var/log/setup-wowlan.log

Boot Performance Optimization ⚡

Boot Time Analysis

Current Performance (Baseline)

  • Total Boot Time: 22.7s ❌ (Target: < 1.5s)
  • Recent Test: 22.936s (only 0.33s improvement)
  • U-Boot Phase: ~2.9s (optimizations had minimal effect)
  • Kernel+Systemd: ~15s (major bottleneck identified)
  • Issue: U-Boot optimizations not showing expected results

Serial Boot Logging Tools ✅

Capture Boot Timing

# Complete workflow - capture and analyze
./scripts/boot-timing-suite.sh capture --name eink-test
# Power cycle board, wait for boot completion
./scripts/boot-timing-suite.sh latest

# Continuous monitoring for consistency testing
./scripts/boot-timing-suite.sh monitor --name consistency-test

# Compare multiple boot logs
./scripts/boot-timing-suite.sh compare

Analysis Output

# View detailed timing breakdown
./scripts/boot-timing-suite.sh latest

# Example output:
# Boot Time Summary: 22.753s
# U-Boot phase: 4.7s (14.4s → 19.1s)
# Kernel phase: 3.4s (19.4s → 22.8s)
# Status: ❌ SLOW - Over 5.0s, needs optimization

Optimization Priority

  1. U-Boot bootdelay=0 (3s savings, low risk) ← Next target
  2. U-Boot config optimization (1-2s savings, medium risk)
  3. Kernel quiet boot (0.5s savings, low risk)
  4. Kernel built-in drivers (1s savings, medium risk)
  5. Systemd service reduction (0.5s savings, high risk)

Validation Requirements

⚠️ CRITICAL: Test ALL functionality after each optimization:

  • WiFi connectivity and power management
  • Bluetooth pairing and communication
  • 802.15.4 functionality
  • E-Ink display operation
  • Power management and suspend/resume
  • EdgeLock Enclave (ELE) security features

Tools and Documentation

  • Serial Logging: scripts/boot-timing-suite.sh - Complete workflow
  • Documentation: scripts/BOOT_TIMING_README.md - Detailed usage guide
  • Context: context/MAIN_CONTEXT.md - Project overview and configuration

Troubleshooting

Suspend Issues

  • Immediate resume: Check for active wake sources with cat /sys/power/wakeup_count
  • Failed suspend: Review kernel logs with dmesg | grep -i suspend
  • GPIO errors: Verify correct GPIO numbers for i.MX93 platform

Wake Issues

  • Magic packet not working: Verify WoWLAN is enabled with iw phy mwiphy0 wowlan show
  • Wrong MAC address: Check actual WiFi MAC with ip addr show wlan0
  • Network issues: Ensure magic packet sender is on same network

Bluetooth Issues

  • UART not found: Verify LPUART4 device tree configuration
  • Invalid BD Address: Check UART communication and pin mapping
  • Failed initialization: Review GPIO power control and reset timing

Image Building

Machine Configuration

# Set machine type for Edge EInk board
export MACHINE=imx93-jaguar-eink

# Build factory image
kas build kas/lmp-dynamicdevices.yml

Key Recipes

  • eink-power-management - Power management and WoWLAN configuration
  • default-network-manager - Local WiFi testing infrastructure
  • lmp-device-tree - Board-specific device tree configuration

Hardware Revisions

Supported Versions

  • Hardware Rev 1.0+ - All power management features supported
  • LPUART4 mapping - Uses DAP pins for Bluetooth UART communication
  • IW612 WiFi module - Tri-radio with WoWLAN support

For the latest hardware specifications and schematics, contact Dynamic Devices support.

Clone this wiki locally