I1 绘制缓冲布局写入 ui_port.h 并去掉多余护栏,取帧端补防回归注记

This commit is contained in:
2026-09-21 03:50:54 +08:00
parent 368050dbc3
commit e6876cf979
3 changed files with 27 additions and 15 deletions
+4 -14
View File
@@ -15,18 +15,9 @@
/* 160x160 1bpp 帧 = 3200 字节 */
static uint8_t g_ui_fbuf[UI_FB_SIZE];
/* LVGL 9.3 索引色(I1)绘制缓冲的真实布局 = [palette 8B][pixel data stride*h]:
* - lv_draw_buf_create() 按 stride*h + palette 分配;
* - lv_draw.c:497 → lv_draw_buf_goto_xy() 取绘制指针时先 += palette;
* - lv_refr.c get_max_row() 也从 data_size 里扣掉 palette 才当可用像素。
* 但 lv_display_set_buffers()/lv_draw_buf_init() 的容量校验只看 stride*h(不含 palette),
* 所以"只给 stride*h 字节"会被静默接受 → 末 8 个像素字节写到缓冲之外
* (2026-09-21 金丝雀实测:越界 n=8,且 flush 回调收到的首地址前 8 字节是 palette)。
* 本端口据此按 stride*h + palette 提供缓冲,flush 时跳过 palette 取真实像素。
* UI_DRAW_BUF_GUARD 只给后续 LVGL 版本差异留余量,不再依赖它吸收越界。 */
#define UI_DRAW_BUF_PALETTE ((uint32_t)LV_COLOR_INDEXED_PALETTE_SIZE(LV_COLOR_FORMAT_I1) * 4u)
#define UI_DRAW_BUF_GUARD 32
static uint8_t g_ui_draw_buf[UI_FB_SIZE + UI_DRAW_BUF_PALETTE + UI_DRAW_BUF_GUARD];
/* 绘制缓冲:I1 索引色布局 = [palette 8B][pixel data],尺寸与取像素偏移的完整说明见
* ui_port.h 中 UI_DRAW_BUF_PALETTE / UI_DRAW_BUF_SIZE 注释(含越界与整帧错位的历史成因)。 */
static uint8_t g_ui_draw_buf[UI_DRAW_BUF_SIZE];
/* 单键缓冲:菜单无需多键队列,仅保存最近一次待处理键 */
static volatile uint8_t g_pending_key = 0;
@@ -109,8 +100,7 @@ int ui_port_init(void) {
return -1;
}
lv_display_set_color_format(disp, LV_COLOR_FORMAT_I1);
lv_display_set_buffers(disp, g_ui_draw_buf, NULL,
UI_FB_SIZE + UI_DRAW_BUF_PALETTE,
lv_display_set_buffers(disp, g_ui_draw_buf, NULL, UI_DRAW_BUF_SIZE,
LV_DISPLAY_RENDER_MODE_FULL);
lv_display_set_flush_cb(disp, ui_flush_cb);