Agent Skills
› miantiao-me/giligili
› giligili-develop
giligili-develop
GitHub用于开发 giligili 设备的固件与原生应用,涵盖构建配置、UI 视图实现、硬件驱动集成及内存并发管理。
Trigger Scenarios
编写或修改 ESP-IDF 固件代码
开发 MicroTS 原生视图界面
排查嵌入式硬件驱动问题
配置构建环境与依赖
Install
npx skills add miantiao-me/giligili --skill giligili-develop -g -y
SKILL.md
Frontmatter
{
"name": "giligili-develop",
"description": "开发 giligili StackChan 的 MicroTS 原生视图、Rust 应用和 ESP-IDF 固件。用于 UI、手势、屏保、设备驱动与固件构建排障。"
}
giligili 开发
构建与路径
./setup.sh # 初始化仓库内 esp/、vendor/ 与 vendor Bun 依赖
./build.sh build # MicroTS strict、原生字体/图片与 ESP-IDF 固件
bun tools/check-tailwind.ts
- 唯一应用入口是
native/App.vue,视图契约为native/App.d.ts,业务在native/src/。MicroTS AOT 生成 Rust,固件链接libgiligili_app.a。 - 字体在
native/fonts/,SVG 在native/icons/;tools/build-native.ts直接使用 vendor 编译器烘焙资源,CMake 增量生成并嵌入native/gen/native.pak。 新增 UI 字串需检查native/gen/assets.json的字符集;图片缺失或字形不全会失败。 - Rust 必须使用
esp/esp-rust的 esp-rs fork 1.97.0.0;上游 xtensa 后端会编坏 ROM 调用,导致 IllegalInstruction。所有构建走./build.sh。 - PSRAM 为
CONFIG_SPIRAM_MODE_QUAD(8MB quad)。UI task 使用 64K PSRAM 栈, 内部 SRAM 栈留给底层中断与 sys_io_call() 代理任务,避免挤占 BLE/音频内部内存。 - 烧录前确认用户授权与设备节点;只请求构建时不要烧录。串口通常为
/dev/cu.usbmodem*(macOS)或/dev/ttyUSB*(Linux),设备操作见skills/giligili-device/SKILL.md。
视图与输入
- 物理屏为 320×240,安全区为居中 240×240,左右各 40px 状态栏;
静态内容用
px-10,滑动条带使用全宽。 - 视图只用 MicroTS strict 支持的
View/Text/Image、模板与类型。model.rs实现生成的AppViewModel;screens.rs处理模式与事件。 - 所有 class 字面量运行 Tailwind 校验。未知 token 会丢弃整个 class;
rounded-2xl/3xl改用rounded-[N],rounded-full同时固定 w/h。 - FT6336U @ I2C 0x38 原始坐标直通逻辑屏,无 mirror/swap。输入在 C 采样, Rust 统一处理四缘手势、点按与拖动。设置滚动使用每帧负增量,松手速度同样取负。
native_ui_task是 UI core 的唯一 owner,控制台只读 mutex 快照。 模式清理、陈旧 close、预览暂停规则见memos/app-ui.md。- Maple Mono NF CN 保持中英文字体效果。SVG 显式固定 pow2 width/height,
每个形状写
fill="#ffffff";根节点 fill 不继承,不能直接用 currentColor 原件。
内存与并发
- UI core 初始化先于 WiFi/BLE;无线 buffer 使用 PSRAM。PSRAM 栈任务不能
直接调用 flash/NVS,必须走预建内部栈
sys_io_call(),参数先复制到内部 buffer。 - UI/audio/AEC/camera 钉 core1。camera/AEC 活跃时 UI 每帧让 50ms;
audio 用 20ms
vTaskDelayUntil限速,不能依赖 I2S 阻塞。 - S2S websocket core0:RX 回调只重组排队,cJSON/base64 在 s2s task 执行; PCM 使用常驻 48K decode buffer。独立 TX 必须保留 websocket-tx-abort-race 补丁。
- vision 使用常驻 12K 内部栈 worker,快照后立即停预览释放内存;
DeepSeek V4 关闭 thinking。TLS 与 mount 预留逻辑在
sys/ui_memory.c。 - 相机补丁必须保持 DVP event_queue 先于 callback、GPIO ISR 只装一次;
单帧 MMAP 缓冲(VIDIOC_QUERYBUF 动态映射约 150KB)+ s_fb 帧缓存,关闭后完整释放。
CONFIG_CAM_CTRL_DVP_LOG_ENABLE=n。 - ES7210 偶发 I2C NACK:codec_dev 单笔重试 5ms,audio.c 整段重试 x6, 失败后循环 AW9523B P0_2 电源。勿回退这些实测修复。
- TCP 冒烟面为 health/capabilities/cam on|off/tap/swipe/uistats/uimode/vtstats/uptime。
不在未授权时操控设备;宿主行为测试见
tools/test-*.py。
配网与硬件知识
- NimBLE 广播 Giligili,service 0x5A10,SMP 关闭,地址来自 efuse MAC。 0x5A11 写 ssid\npassword,0x5A12 状态,0x5A13 与 TCP:23 共用命令表。 WiFi 连接后 SNTP 自动校时并回写 BM8563。
- 修改驱动前读
memos/hardware.md与memos/audio.md;当前运行时规则见memos/runtime.md。
官方硬件能力
- PY32@0x6F:VM_EN=pin0,RGB=pin13;灯条 LED_CFG=0x24, LED_RAM=0x30 RGB565 LE。不要把 VM_EN 写成 pin1。
- SCS0009:UART1 G6/G7@1M;
WritePos必须写 position/time/speed 共6字节。 回读寄存器大端: pos=56 load=60 temp=63 moving=66。空闲 300ms 自动松力矩 (body_poll); 零位 NVS "servo" ns, 限出厂 ±150 步, 自检页"舵机归零"或servoZero()触发;servoPos()回 0.1° 相对零位。 - INA226@0x41:10mΩ,CAL=2048,0.25mA/LSB;Si12T@0x68:前中后0..3。
- LTR553@0x23:ambient/proximity;IR NEC:RMT G5 TX/G10 RX。
- BMI270@0x69 + BMM150@0x10(AUX):锁定
bmi270_sensor==0.4.1,bmm150==1.1.0。manual 完成 BMM reset/trim 后 对齐 M5Unified 切 auto:0x42/8-byte/25Hz + enable BMI2_AUX;运行期从bmi2_sens_data.aux_data补偿,勿反复 manual 读。 - ST25R3916B@0x50: board/nfc.c 自研驱动(对照 M5Unit-NFC 实现)。IRQ 未接,
轮询中断寄存器; WUPA/anticoll 要 antcl+no_crc_rx; NTAG READ=0x30
WRITE=0xA2(ACK 低半字节 0x0A); NDEF 从 page4 起, 格式
giligili:<appid>。 - 原生设备 FFI 在
firmware/main/native_dev.c/.h;新增接口同步 Rust 声明与链接符号。
Version History
- c767c4e Current 2026-11-02 08:43


