Skip to content

QSPI mode skips RASET (0x2B) in draw_bitmap, breaking partial rendering (AEGHB-1425) #666

Open

Description

@orioncode-eu

Answers checklist.

  • I have read the documentation ESP-IDF Programming Guide and the issue is not addressed there.
  • I have updated my IDF branch (master or release) to the latest version and checked that the issue is present there.
  • I have searched the issue tracker for a similar issue and not found a similar issue.

General issue report

In panel_axs15231b_draw_bitmap(), the RASET command (0x2B) is skipped when use_qspi_interface is enabled:
// esp_lcd_axs15231b.c, line ~307
if (0 == axs15231b->flags.use_qspi_interface) {
tx_param(axs15231b, io, LCD_CMD_RASET, (uint8_t[]) {
(y_start >> 8) & 0xFF,
y_start & 0xFF,
((y_end - 1) >> 8) & 0xFF,
(y_end - 1) & 0xFF,
}, 4);
}
This means the panel never receives a Y-axis window command in QSPI mode. The driver relies on sequential writes starting from y=0 using RAMWR (0x2C) and RAMWRC (0x3C) continuation, which only works if frames are always written top-to-bottom from row 0.

Impact:
Partial rendering (LVGL's default mode — redrawing only dirty rectangles) does not work in QSPI mode. Any draw_bitmap call with y_start > 0 that is not part of a sequential top-to-bottom write will render to incorrect rows, producing garbled output.
The only workaround is full_refresh = true (sending the entire framebuffer every frame), which wastes bandwidth and CPU on rotation/copy even when only a small region changed.

Expected behavior:
RASET should be sent in QSPI mode as well, wrapped with the QSPI opcode just like CASET:
// RASET should always be sent, regardless of interface mode
tx_param(axs15231b, io, LCD_CMD_RASET, (uint8_t[]) {
(y_start >> 8) & 0xFF,
y_start & 0xFF,
((y_end - 1) >> 8) & 0xFF,
(y_end - 1) & 0xFF,
}, 4);
The tx_param() helper already handles QSPI opcode wrapping (LCD_OPCODE_WRITE_CMD), so there's no reason to skip RASET.

Question:
Is this an intentional workaround for a hardware limitation of the AXS15231B chip in QSPI mode, or an oversight? If it's a hardware limitation, it should be documented (e.g., in README or as a code comment), because it forces full_refresh on all QSPI users.

Activity

  1. changed the title [-]QSPI mode skips RASET (0x2B) in draw_bitmap, breaking partial rendering[/-] [+]QSPI mode skips RASET (0x2B) in draw_bitmap, breaking partial rendering (AEGHB-1425)[/+] on Feb 15, 2026
  2. added
    bug 🐞Inconsistencies or issues which will cause a problem for users or implementers.
    on Oct 26, 2026
  3. dshil commented on Nov 2, 2026

    @dshil

    Hi Espressif team (probably @leeebo), any updates on it?

  4. Horion0415 commented on Nov 3, 2026

    @Horion0415
    Contributor

    Sorry for overlooking this issue.

    The current driver implementation follows the panel manufacturer's recommendations at the time. They advised designing the driver around continuous full-frame transfers, as other approaches could cause issues.

    However, we're not sure whether they have made further improvements to the panel since then. We would greatly appreciate it if you could run some tests and share your feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug 🐞Inconsistencies or issues which will cause a problem for users or implementers.solution: lcd

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions