epdiy — parallel e-paper driver
Upstream: https://github.com/vroland/epdiy
License: LGPL-3.0-or-later (see idf_component.yml)

本目录是 epdiy 的 fork，按 upstream 的 v2.0.0（组件版本号见 idf_component.yml）
裁剪而来，只保留 ESP32-S3 的 LCD 外设输出路径与本板需要的显示定义，本地改动包括：

- 删除 ESP32 的 I2S 输出路径（src/output_i2s/）、社区波形表与示例图片
- src/board/ 换成本板定义（引脚在 components/read_pico/read_pico_board.c 里注册）
- src/displays.c 只保留 4.7" 1216x684 单色面板（E0470_DISPLAY）
- 波形表改为从 components/e0470_epaper_waveform 取
- src/render.c / highlevel.c：差分按列裁剪、按 (from,to) 直方图无损跳过前导空相位、
  统计各阶段耗时；output_lcd/render_lcd.c：可配置的帧前预填行数

This directory is a trimmed fork of epdiy v2.0.0: only the ESP32-S3 LCD render
path and the display definition for this board are kept. Local changes are
listed above.

- output_lcd/render_lcd.c：扫描未消费完即结束时中止相位，汇合生产者后清理行队列，防止下一相位死锁。
  Abort incomplete scan phases and clear queues after joining producers to prevent next-phase deadlock.
- src/render.c / output_common/render_context.* / output_lcd/render_lcd.c：全屏差分单相扫描可借用逐物理行的
  1KB S3 VE LUT，完整扫描并汇合生产者后释放外部指针；普通公共 LUT 刷新行为保留。
  Full-screen single-phase differences can borrow a 1KB S3 VE LUT per physical row; complete the scan and
  join producers before releasing borrowed pointers, preserving ordinary shared-LUT updates.
- output_common/line_queue.c：指针表按指针大小分配，并显式保留在内部 RAM 供 LCD ISR 读取；
  行缓冲大小、队列长度与扫描时序不变。
  Size the queue pointer table by pointer width and explicitly allocate internal RAM for LCD ISR access;
  line-buffer sizes, queue depth and scan timing are unchanged.
- output_lcd/render_lcd.c：清屏 ISR 的固定行缓冲显式使用内部 RAM，避免通用 malloc 低内存回退至 PSRAM；
  保留原分配失败检查、长度与时序。
  Explicitly allocate internal RAM for the clear ISR's fixed line, preventing generic malloc's low-memory
  PSRAM fallback; retain the allocation-failure check, buffer length and timing.

The full text of the GNU Lesser General Public License version 3 is available at
https://www.gnu.org/licenses/lgpl-3.0.txt and applies to all files in this
directory unless a file states otherwise. 上游文件头部的版权声明保持原样。
