Skip to content
Alex J Lennon edited this page Sep 8, 2025 · 11 revisions

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

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) - Removed in Production

Function i.MX93 Pin Signal Notes
SPI Chip Select MX93_PAD_GPIO_IO08 LPSPI3_PCS0 SPI3_SS0
SPI Clock MX93_PAD_GPIO_IO11 LPSPI3_SCK SPI3_SCLK
SPI MISO MX93_PAD_GPIO_IO10 LPSPI3_SOUT SPI3_MISO
SPI MOSI MX93_PAD_GPIO_IO09 LPSPI3_SIN SPI3_MOSI
ZigBee Interrupt MX93_PAD_ENET2_RD3 GPIO4_IO27 ZB_INT

Note: ZigBee/802.15.4 functionality has been removed from the production boards to simplify the design and reduce power consumption.

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

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

Both interfaces are enabled by default in the device tree:

  • QSPI: /dev/spidev0.0 - 80 MHz, quad mode
  • SPI: /dev/spidev1.0 - 10 MHz, standard mode

Applications can choose the appropriate interface based on requirements.

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 docs/CM33_FIRMWARE_GUIDE.md.

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

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