You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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.
Activity
[-]QSPI mode skips RASET (0x2B) in draw_bitmap, breaking partial rendering[/-][+]QSPI mode skips RASET (0x2B) in draw_bitmap, breaking partial rendering (AEGHB-1425)[/+]dshil commentedon Nov 2, 2026
Hi Espressif team (probably @leeebo), any updates on it?
Horion0415 commentedon Nov 3, 2026
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.