-
Notifications
You must be signed in to change notification settings - Fork 0
Hardware Reference Edge EInk Board
Board Type: imx93-jaguar-eink
Platform: NXP i.MX93
Description: Low-power e-ink display controller with advanced power management
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.
- 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
- 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
- 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
- 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
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) |
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
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
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.
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 |
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 |
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 |
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:
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
# 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
# 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)
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
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
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:
-
Machine Configuration: Added
KERNEL_MODULE_AUTOLOAD:imx93-jaguar-eink = " spidev"
-
Device Tree: Changed compatible from
"spidev"
to"rohm,dh2228fv"
for proper driver binding - 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.
The i.MX93 includes a Cortex-M33 co-processor that can be used for real-time tasks, power management, or dedicated peripheral control.
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 |
# Load CM33 firmware from SD card
=> fatload mmc 1:1 ${loadaddr} cm33_firmware.bin
=> cp.b ${loadaddr} 0x201e0000 ${filesize}
=> bootaux 0x201e0000 0
# 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
-
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
- 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.
The Edge EInk board implements sophisticated power management designed for e-ink applications:
The board supports multiple suspend modes:
- s2idle (freeze) - CPU suspended, devices remain powered
- mem (deep sleep) - Maximum power savings with selective wake sources
# Suspend the system
sudo systemctl suspend
The board can wake from:
- Magic packets (Wake-on-LAN)
- USB activity (when enabled)
- GPIO interrupts (external triggers)
- RTC alarms (scheduled 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
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.
- 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
Correct GPIO mappings for i.MX93:
- WiFi Power GPIO: 634 (GPIO4_26)
- Bluetooth Power GPIO: 632 (GPIO4_24)
- WiFi Wake GPIO: 633 (GPIO4_25)
# Check WiFi interface
ip addr show wlan0
# Check connection status
nmcli device status
# 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"
# Check IW612 firmware version
cat /proc/mwlan/adapter0/wlan0/info | grep version
# 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.
For development, you can set up local WiFi credentials without committing them to git:
- 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
- Edit the local config:
# Edit wifi-config.local with your network credentials
WIFI_SSID="YourNetwork"
WIFI_PASSWORD="YourPassword"
- Rebuild the image - the credentials will be included but not committed to git.
# 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!"
# Check suspend/resume logs
sudo journalctl -u eink-suspend.service -f
# Check WoWLAN setup logs
sudo tail -f /var/log/setup-wowlan.log
- 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
# 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
# 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
- U-Boot bootdelay=0 (3s savings, low risk) ← Next target
- U-Boot config optimization (1-2s savings, medium risk)
- Kernel quiet boot (0.5s savings, low risk)
- Kernel built-in drivers (1s savings, medium risk)
- Systemd service reduction (0.5s savings, high risk)
- 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
-
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
-
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
-
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
- 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
# Set machine type for Edge EInk board
export MACHINE=imx93-jaguar-eink
# Build factory image
kas build kas/lmp-dynamicdevices.yml
- eink-power-management - Power management and WoWLAN configuration
- default-network-manager - Local WiFi testing infrastructure
- lmp-device-tree - Board-specific device tree configuration
- 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.