From edacf69fb89a502661102132c1845a6895934692 Mon Sep 17 00:00:00 2001 From: dami Date: Tue, 21 Jul 2026 07:54:14 +0000 Subject: [PATCH] Document firmware build and flashing --- README.md | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 08e6481..1d9737e 100644 --- a/README.md +++ b/README.md @@ -57,25 +57,99 @@ J1 커넥터의 pin 1은 `BAT+`, pin 2는 `GND`입니다. 커넥터 규격만 ## 빌드와 설치 -권장 환경은 ESP-IDF **v5.3.4**입니다. 저장소 루트에서 다음을 실행합니다. +권장 환경은 ESP-IDF **v5.3.4**입니다. 다른 ESP-IDF 버전은 RGB LCD와 I2S API 차이 때문에 빌드 결과가 달라질 수 있습니다. + +### 1. 플래싱 준비 + +1. RD-03D에 공급하는 외부 5 V 승압 전원을 끄거나 레이더 VCC를 분리합니다. UART 선은 그대로 두어도 됩니다. +2. 데이터 통신이 가능한 USB-C 케이블로 CrowPanel의 CH340C 프로그래밍 포트를 PC에 연결합니다. 첫 플래싱은 배터리를 분리하고 USB 전원만 사용하는 것을 권장합니다. +3. 새로 생긴 시리얼 포트를 확인합니다. + +Linux에서는 보통 `/dev/ttyUSB0`입니다. + +```bash +ls -l /dev/serial/by-id/ 2>/dev/null +ls /dev/ttyUSB* 2>/dev/null +``` + +Windows에서는 장치 관리자의 `포트(COM 및 LPT)`에서 `COM5` 같은 이름을 확인합니다. macOS에서는 `/dev/cu.usbserial-*` 또는 `/dev/cu.wchusbserial*` 형태입니다. 아래 명령의 `/dev/ttyUSB0`을 확인한 포트로 바꾸십시오. + +### 2. ESP-IDF로 빌드하고 바로 올리기 + +ESP-IDF v5.3.4 환경을 활성화한 뒤 저장소 루트에서 실행합니다. `set-target`은 최초 한 번만 필요합니다. ```bash . "$IDF_PATH/export.sh" idf.py set-target esp32s3 -idf.py build -idf.py -p /dev/ttyUSB0 flash +idf.py -p /dev/ttyUSB0 build flash ``` -첫 빌드에서 Component Manager가 LVGL 8.3.11을 받습니다. 애플리케이션 UART 콘솔은 레이더 핀과의 간섭을 피하려고 꺼 두었으므로 `monitor`에 런타임 로그가 표시되지 않는 것이 정상입니다. +Windows의 ESP-IDF PowerShell에서는 환경이 이미 활성화되므로 저장소로 이동한 뒤 `idf.py set-target esp32s3`와 `idf.py -p COM5 build flash`를 실행하면 됩니다. + +첫 빌드에서 Component Manager가 LVGL 8.3.11을 받습니다. 성공하면 다음 세 파일이 생성되고 ESP-IDF가 올바른 오프셋에 모두 기록합니다. + +| 파일 | Flash 오프셋 | +|---|---:| +| `build/bootloader/bootloader.bin` | `0x0` | +| `build/partition_table/partition-table.bin` | `0x8000` | +| `build/radick.bin` | `0x10000` | + +애플리케이션 UART 콘솔은 레이더 핀과의 간섭을 피하려고 꺼 두었습니다. 따라서 `idf.py monitor`에 런타임 로그가 표시되지 않는 것은 정상이며, 플래싱 성공 메시지와 실제 화면으로 동작을 확인합니다. + +### 3. 생성된 바이너리를 esptool로 다시 올리기 + +이미 한 번 빌드했다면 다시 컴파일하지 않고 아래 명령으로 세 바이너리를 직접 기록할 수 있습니다. `radick.bin` 하나만 기록하면 부트로더나 파티션 테이블이 없는 보드에서는 부팅되지 않을 수 있으므로 세 파일을 모두 지정합니다. + +```bash +python3 -m esptool \ + --chip esp32s3 \ + --port /dev/ttyUSB0 \ + --baud 460800 \ + --before default_reset \ + --after hard_reset \ + write_flash \ + --flash_mode dio \ + --flash_freq 80m \ + --flash_size 4MB \ + 0x0 build/bootloader/bootloader.bin \ + 0x8000 build/partition_table/partition-table.bin \ + 0x10000 build/radick.bin +``` + +`esptool`이 없다면 ESP-IDF 환경을 활성화하거나 별도 Python 환경에 `python3 -m pip install esptool==4.9.0`으로 설치할 수 있습니다. + +### 4. Docker로 빌드하기 로컬 ESP-IDF 설치 없이 Docker로 빌드할 수도 있습니다. ```bash docker run --rm \ -v "$PWD:/project" -w /project \ - espressif/idf:v5.3.4 idf.py build + espressif/idf:v5.3.4 \ + idf.py -B build-docker build ``` +Linux에서는 시리얼 장치를 컨테이너에 전달해 빌드와 플래시를 한 번에 할 수도 있습니다. + +```bash +docker run --rm \ + --device=/dev/ttyUSB0 \ + -v "$PWD:/project" -w /project \ + espressif/idf:v5.3.4 \ + idf.py -B build-docker -p /dev/ttyUSB0 build flash +``` + +Windows/macOS Docker Desktop은 USB 직렬 장치 전달이 복잡하므로 네이티브 ESP-IDF 또는 `esptool` 사용을 권장합니다. + +### 5. 연결 문제 해결 + +- `Connecting...`에서 멈추면 `BOOT`을 누른 상태로 `RESET`을 짧게 누르고, `BOOT`을 놓은 뒤 플래시 명령을 다시 실행합니다. +- Linux에서 `Permission denied`가 나오면 `sudo usermod -aG dialout "$USER"`를 실행하고 로그아웃한 뒤 다시 로그인합니다. +- 포트가 보이지 않으면 충전 전용이 아닌 데이터 USB 케이블인지 확인하고 다른 USB 포트에 연결합니다. +- 직렬 모니터나 다른 프로그램이 포트를 잡고 있으면 종료한 후 다시 시도합니다. +- 설정까지 완전히 초기화해야 할 때만 `idf.py -p /dev/ttyUSB0 erase-flash`를 실행한 후 다시 플래싱합니다. 이 작업은 저장된 밝기와 음소거 설정도 삭제합니다. +- 플래싱이 끝나면 RD-03D의 외부 5 V 전원을 켜고 CrowPanel을 한 번 리셋합니다. + ## 호스트 테스트 레이더 프로토콜과 추적기는 ESP32 의존성 없이 테스트할 수 있습니다.