diff options
| author | Your Name <you@example.com> | 2026-05-18 18:34:33 +0530 |
|---|---|---|
| committer | Your Name <you@example.com> | 2026-05-18 18:34:33 +0530 |
| commit | 067a5700e26518d9a3f8bd92966c8957d17f0817 (patch) | |
| tree | 1379c544731f0edd9c52016c117221085713887d /Makefile | |
| parent | 8f00db9d57e9e06df7fbf3e7285ae9256d21d716 (diff) | |
Document QSPI protocol findings and display fix plan
- DISPLAY_FIX_PLAN.md: root cause analysis, byte-order mismatch,
PSRAM cache coherency issue, reference implementations studied
- axs15231b.c: QSPI protocol rewrite with correct ArduinoGFX framing
(cmd=0x02 for regs, cmd=0x32/addr=0x003C00 for pixels)
- display.c: portrait centering for 320x480, render-on-change logic
- Makefile: Board C support (flash-c, lock-c)
- axs15231b.h: QSPI command/address constants
Display shows recognizable text, colors wrong due to byte-swap
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 43 |
1 files changed, 40 insertions, 3 deletions
| @@ -9,6 +9,7 @@ PROJECT_DIR := $(shell pwd) | |||
| 9 | BUILD_DIR := $(PROJECT_DIR)/build | 9 | BUILD_DIR := $(PROJECT_DIR)/build |
| 10 | PORT_A ?= /dev/ttyACM1 | 10 | PORT_A ?= /dev/ttyACM1 |
| 11 | PORT_B ?= /dev/ttyACM2 | 11 | PORT_B ?= /dev/ttyACM2 |
| 12 | PORT_C ?= /dev/ttyACM0 | ||
| 12 | PORT ?= $(PORT_A) | 13 | PORT ?= $(PORT_A) |
| 13 | BAUD ?= 460800 | 14 | BAUD ?= 460800 |
| 14 | TARGET ?= esp32s3 | 15 | TARGET ?= esp32s3 |
| @@ -45,6 +46,14 @@ define require_lock_b | |||
| 45 | fi | 46 | fi |
| 46 | endef | 47 | endef |
| 47 | 48 | ||
| 49 | define require_lock_c | ||
| 50 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-c.lock" ]; then \ | ||
| 51 | echo "$(RED)$(BOLD)Board C not locked — run 'make lock-c PHASE=\"description\"' first$(RESET)"; \ | ||
| 52 | echo "$(YELLOW)Another LLM session may be using Board C.$(RESET)"; \ | ||
| 53 | exit 1; \ | ||
| 54 | fi | ||
| 55 | endef | ||
| 56 | |||
| 48 | define _require_board_lock | 57 | define _require_board_lock |
| 49 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-$(BOARD).lock" ]; then \ | 58 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-$(BOARD).lock" ]; then \ |
| 50 | echo "$(RED)$(BOLD)Board $(BOARD) not locked — run 'make lock-$(BOARD) PHASE=\"description\"' first$(RESET)"; \ | 59 | echo "$(RED)$(BOLD)Board $(BOARD) not locked — run 'make lock-$(BOARD) PHASE=\"description\"' first$(RESET)"; \ |
| @@ -83,7 +92,7 @@ endef | |||
| 83 | .PHONY: tokens wallet-setup wallet-info wallet-balance mint-token send-token | 92 | .PHONY: tokens wallet-setup wallet-info wallet-balance mint-token send-token |
| 84 | .PHONY: clean erase-nvs reset serial-log bootstrap-config | 93 | .PHONY: clean erase-nvs reset serial-log bootstrap-config |
| 85 | .PHONY: cvm-pubkey cvm-test-tool cvm-announce | 94 | .PHONY: cvm-pubkey cvm-test-tool cvm-announce |
| 86 | .PHONY: lock-a lock-b unlock-a unlock-b force-unlock-a force-unlock-b lock-status | 95 | .PHONY: lock-a lock-b lock-c unlock-a unlock-b unlock-c force-unlock-a force-unlock-b force-unlock-c lock-status |
| 87 | 96 | ||
| 88 | help: | 97 | help: |
| 89 | @echo "TollGate ESP32 — Makefile" | 98 | @echo "TollGate ESP32 — Makefile" |
| @@ -186,7 +195,7 @@ setup: | |||
| 186 | 195 | ||
| 187 | flash: build | 196 | flash: build |
| 188 | @echo "=== Flashing to $(PORT) ===" | 197 | @echo "=== Flashing to $(PORT) ===" |
| 189 | @echo "$(RED)Error: use 'make flash-a' or 'make flash-b' (per-board lock required)$(RESET)" | 198 | @echo "$(RED)Error: use 'make flash-a', 'make flash-b', or 'make flash-c' (per-board lock required)$(RESET)" |
| 190 | @exit 1 | 199 | @exit 1 |
| 191 | 200 | ||
| 192 | flash-a: build | 201 | flash-a: build |
| @@ -199,6 +208,11 @@ flash-b: build | |||
| 199 | @echo "=== Flashing to $(PORT_B) (Board B) ===" | 208 | @echo "=== Flashing to $(PORT_B) (Board B) ===" |
| 200 | . $(IDF_PATH)/export.sh && idf.py -p $(PORT_B) -b $(BAUD) flash | 209 | . $(IDF_PATH)/export.sh && idf.py -p $(PORT_B) -b $(BAUD) flash |
| 201 | 210 | ||
| 211 | flash-c: build | ||
| 212 | $(call require_lock_c) | ||
| 213 | @echo "=== Flashing to $(PORT_C) (Board C / Display) ===" | ||
| 214 | . $(IDF_PATH)/export.sh && idf.py -p $(PORT_C) -b $(BAUD) flash | ||
| 215 | |||
| 202 | build: | 216 | build: |
| 203 | @echo "=== Building $(TARGET) ===" | 217 | @echo "=== Building $(TARGET) ===" |
| 204 | . $(IDF_PATH)/export.sh && \ | 218 | . $(IDF_PATH)/export.sh && \ |
| @@ -213,6 +227,10 @@ monitor-b: | |||
| 213 | $(call require_lock_b) | 227 | $(call require_lock_b) |
| 214 | . $(IDF_PATH)/export.sh && idf.py -p $(PORT_B) monitor | 228 | . $(IDF_PATH)/export.sh && idf.py -p $(PORT_B) monitor |
| 215 | 229 | ||
| 230 | monitor-c: | ||
| 231 | $(call require_lock_c) | ||
| 232 | . $(IDF_PATH)/export.sh && idf.py -p $(PORT_C) monitor | ||
| 233 | |||
| 216 | # ────────────────────────────────────────────── | 234 | # ────────────────────────────────────────────── |
| 217 | # Testing | 235 | # Testing |
| 218 | # ────────────────────────────────────────────── | 236 | # ────────────────────────────────────────────── |
| @@ -379,6 +397,9 @@ lock-a: ## Acquire Board A lock (set PHASE="description") | |||
| 379 | lock-b: ## Acquire Board B lock (set PHASE="description") | 397 | lock-b: ## Acquire Board B lock (set PHASE="description") |
| 380 | $(call _acquire_lock,board-b) | 398 | $(call _acquire_lock,board-b) |
| 381 | 399 | ||
| 400 | lock-c: ## Acquire Board C lock (set PHASE="description") | ||
| 401 | $(call _acquire_lock,board-c) | ||
| 402 | |||
| 382 | unlock-a: ## Release Board A lock | 403 | unlock-a: ## Release Board A lock |
| 383 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-a.lock" ]; then \ | 404 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-a.lock" ]; then \ |
| 384 | echo "$(YELLOW)Board A not locked.$(RESET)"; exit 0; \ | 405 | echo "$(YELLOW)Board A not locked.$(RESET)"; exit 0; \ |
| @@ -393,6 +414,13 @@ unlock-b: ## Release Board B lock | |||
| 393 | rm -f $(HARDWARE_LOCK_DIR)/board-b.lock; \ | 414 | rm -f $(HARDWARE_LOCK_DIR)/board-b.lock; \ |
| 394 | echo "$(GREEN)Board B lock released.$(RESET)" | 415 | echo "$(GREEN)Board B lock released.$(RESET)" |
| 395 | 416 | ||
| 417 | unlock-c: ## Release Board C lock | ||
| 418 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-c.lock" ]; then \ | ||
| 419 | echo "$(YELLOW)Board C not locked.$(RESET)"; exit 0; \ | ||
| 420 | fi; \ | ||
| 421 | rm -f $(HARDWARE_LOCK_DIR)/board-c.lock; \ | ||
| 422 | echo "$(GREEN)Board C lock released.$(RESET)" | ||
| 423 | |||
| 396 | force-unlock-a: ## Force-release Board A lock | 424 | force-unlock-a: ## Force-release Board A lock |
| 397 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-a.lock" ]; then \ | 425 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-a.lock" ]; then \ |
| 398 | echo "$(YELLOW)Board A not locked.$(RESET)"; exit 0; \ | 426 | echo "$(YELLOW)Board A not locked.$(RESET)"; exit 0; \ |
| @@ -411,8 +439,17 @@ force-unlock-b: ## Force-release Board B lock | |||
| 411 | rm -f $(HARDWARE_LOCK_DIR)/board-b.lock; \ | 439 | rm -f $(HARDWARE_LOCK_DIR)/board-b.lock; \ |
| 412 | echo "$(GREEN)Board B force-released.$(RESET)" | 440 | echo "$(GREEN)Board B force-released.$(RESET)" |
| 413 | 441 | ||
| 442 | force-unlock-c: ## Force-release Board C lock | ||
| 443 | @if [ ! -f "$(HARDWARE_LOCK_DIR)/board-c.lock" ]; then \ | ||
| 444 | echo "$(YELLOW)Board C not locked.$(RESET)"; exit 0; \ | ||
| 445 | fi; \ | ||
| 446 | echo "$(RED)$(BOLD)WARNING: Force-releasing Board C!$(RESET)"; \ | ||
| 447 | cat $(HARDWARE_LOCK_DIR)/board-c.lock | sed 's/^/ /'; \ | ||
| 448 | rm -f $(HARDWARE_LOCK_DIR)/board-c.lock; \ | ||
| 449 | echo "$(GREEN)Board C force-released.$(RESET)" | ||
| 450 | |||
| 414 | lock-status: ## Show all board lock statuses | 451 | lock-status: ## Show all board lock statuses |
| 415 | @for board in a b; do \ | 452 | @for board in a b c; do \ |
| 416 | if [ -f "$(HARDWARE_LOCK_DIR)/board-$$board.lock" ]; then \ | 453 | if [ -f "$(HARDWARE_LOCK_DIR)/board-$$board.lock" ]; then \ |
| 417 | echo "$(YELLOW)Board $$board: LOCKED$(RESET)"; \ | 454 | echo "$(YELLOW)Board $$board: LOCKED$(RESET)"; \ |
| 418 | cat $(HARDWARE_LOCK_DIR)/board-$$board.lock | sed 's/^/ /'; \ | 455 | cat $(HARDWARE_LOCK_DIR)/board-$$board.lock | sed 's/^/ /'; \ |