Skip to content

T-Deck Max does not boot on main: GDEQ031T10 init lost its reset pulse #602

Description

@Crazypedia

Summary

On current main (c729e83), the LilyGO T-Deck Max does not boot. The GDEQ031T10 e-paper panel never reports ready, so display fails to start, and because a failed device start aborts kernel_init, the whole boot is taken down with it.

I (1566) device: start display
E (6571) GDEQ031T10: Timed out waiting for panel BUSY
E (6571) GDEQ031T10: Full init failed
E (6571) device: Failed to start device display: resource
E (6573) kernel: kernel_init failed to construct+add+start device: display (gooddisplay,gdeq031t10)
E (6582) Tactility: Failed to initialize kernel
I (6586) main_task: Returned from app_main()

Reproduced on hardware with an unmodified main checkout: python device.py lilygo-tdeck-max && idf.py build flash monitor.

Cause

The kernel-driver port in #582 dropped the reset pulse that the pre-migration driver issued at the top of its full init.

The old Drivers/GDEQ031T10/Source/Gdeq031t10Display.cpp:

bool Gdeq031t10Display::initFull() {
    reset();
    bool ok = writeCommand(CMD_PANEL_SETTING);
    ...

The new Drivers/gdeq031t10-module/source/gdeq031t10.cpp goes straight to the command sequence:

static bool init_full(Gdeq031t10Internal* internal, bool mirror_180) {
    bool ok = write_command(internal, CMD_PANEL_SETTING);
    ...

hardware_reset() still exists but is only reachable from the reset() display op, which nothing calls on the start path. Without the pulse, a cold-booted controller never drives BUSY ready after CMD_POWER_ON.

The rest of the driver still assumes the pulse is there. gdeq031t10_disp_on_off() documents its deep-sleep wake as relying on it:

// Toggling RST (in init_full) also wakes the panel from deep sleep.

and a waveform-mode change needs the reset to clear partial mode's lingering VCOM/data-interval setting, which was the stated reason the old driver put reset() in initFull() rather than at construction.

Fix

Calling hardware_reset(internal) at the top of init_full() restores the old behaviour. Confirmed on hardware: the panel initialises, boot completes, and refreshes run normally.

I (1566) device: start display
I (1631) GDEQ031T10: waited 42 ms until not busy
I (1631) driver: bound gdeq031t10 to display
I (1631) kernel: init done
...
I (5631) GDEQ031T10: draw_bitmap: refresh_full
I (6724) GDEQ031T10: waited 1014 ms until not busy

I have the one-line change ready and will open a PR against this issue.

Environment

  • Device: lilygo-tdeck-max
  • Commit: c729e83 (main)
  • ESP-IDF: v5.5.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions