2 Commits

Author SHA1 Message Date
1a47837a2c Add prebuilt firmware package
Some checks failed
build / host-tests (push) Has been cancelled
build / esp-idf (push) Has been cancelled
2026-07-21 08:45:33 +00:00
edacf69fb8 Document firmware build and flashing
Some checks failed
build / host-tests (push) Has been cancelled
build / esp-idf (push) Has been cancelled
2026-07-21 07:54:14 +00:00
9 changed files with 190 additions and 5 deletions

1
.gitignore vendored
View File

@@ -5,5 +5,6 @@
/sdkconfig
/sdkconfig.old
*.bin
!/firmware/*.bin
*.elf
*.map

View File

@@ -57,25 +57,101 @@ J1 커넥터의 pin 1은 `BAT+`, pin 2는 `GND`입니다. 커넥터 규격만
## 빌드와 설치
권장 환경은 ESP-IDF **v5.3.4**입니다. 저장소 루트에서 다음을 실행합니다.
직접 빌드하지 않고 바로 플래싱하려면 저장소의 [사전 빌드 펌웨어](firmware/)를 사용하십시오. 앱·부트로더·파티션 테이블과 Linux/macOS 및 Windows용 플래시 스크립트가 함께 들어 있습니다.
권장 환경은 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 의존성 없이 테스트할 수 있습니다.

49
firmware/README.md Normal file
View File

@@ -0,0 +1,49 @@
# Radick 사전 빌드 펌웨어
Basic CrowPanel 7.0 V3.0(`DIS08070H`, ESP32-S3 N4R8)용 펌웨어입니다. ESP-IDF v5.3.4로 소스 커밋 `edacf69`에서 클린 빌드했습니다. 다른 CrowPanel 버전이나 RD-03D V2에는 올리지 마십시오.
## 포함 파일
| 파일 | 크기 | Flash 오프셋 |
|---|---:|---:|
| `bootloader.bin` | 14,736 bytes | `0x0` |
| `partition-table.bin` | 3,072 bytes | `0x8000` |
| `radick.bin` | 639,952 bytes | `0x10000` |
세 바이너리를 모두 같은 빌드에서 만들었습니다. `radick.bin` 하나만 올리지 말고 세 파일을 모두 기록하십시오.
## 빠른 플래싱
1. RD-03D에 공급하는 외부 5 V 전원을 끄거나 VCC를 분리합니다.
2. 데이터 USB-C 케이블로 CrowPanel을 PC에 연결합니다.
3. Python용 esptool 4.9.0을 준비합니다.
```bash
python3 -m pip install esptool==4.9.0
```
Linux/macOS:
```bash
./firmware/flash.sh /dev/ttyUSB0
```
Windows PowerShell:
```powershell
powershell -ExecutionPolicy Bypass -File .\firmware\flash.ps1 COM5
```
포트 이름은 실제 환경에 맞게 바꾸십시오. `Connecting...`에서 멈추면 `BOOT`을 누른 채 `RESET`을 짧게 누르고, `BOOT`을 놓은 뒤 다시 실행합니다. 완료 후 RD-03D의 5 V 전원을 켜고 CrowPanel을 리셋합니다.
## 무결성 확인
Linux/macOS:
```bash
(cd firmware && sha256sum -c SHA256SUMS)
```
자세한 포트 확인, ESP-IDF 빌드 및 문제 해결 방법은 루트 [README](../README.md#빌드와-설치)를 참고하십시오.
> 이 펌웨어는 ESP-IDF 클린 빌드와 자동 테스트를 통과했지만 실제 CrowPanel에 직접 플래싱한 실기 검증은 아직 수행하지 않았습니다.

3
firmware/SHA256SUMS Normal file
View File

@@ -0,0 +1,3 @@
cfc2b532f0a41d4e9b3af4c953e154780b328adc0f04e4cf91e452179244c0fa bootloader.bin
73c0b5c3e5fcba3a151cc70c453c93dd5f4798899e7f2f8cca76da1f32ffc501 partition-table.bin
73059503d1602322b045d8eac868b885b4a9946deba63a109d3fda930082d80c radick.bin

BIN
firmware/bootloader.bin Normal file

Binary file not shown.

30
firmware/flash.ps1 Normal file
View File

@@ -0,0 +1,30 @@
param(
[Parameter(Mandatory = $true, Position = 0)]
[string]$Port
)
$ErrorActionPreference = "Stop"
$FirmwareDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Write-Host "Keep the RD-03D external 5 V supply OFF while flashing."
$EsptoolArgs = @(
"-m", "esptool",
"--chip", "esp32s3",
"--port", $Port,
"--baud", "460800",
"--before", "default_reset",
"--after", "hard_reset",
"write_flash",
"--flash_mode", "dio",
"--flash_freq", "80m",
"--flash_size", "4MB",
"0x0", (Join-Path $FirmwareDir "bootloader.bin"),
"0x8000", (Join-Path $FirmwareDir "partition-table.bin"),
"0x10000", (Join-Path $FirmwareDir "radick.bin")
)
& python @EsptoolArgs
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}

26
firmware/flash.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -euo pipefail
if [ "$#" -ne 1 ]; then
echo "Usage: $0 /dev/ttyUSB0" >&2
exit 2
fi
radick_port="$1"
firmware_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "Keep the RD-03D external 5 V supply OFF while flashing."
exec python3 -m esptool \
--chip esp32s3 \
--port "$radick_port" \
--baud 460800 \
--before default_reset \
--after hard_reset \
write_flash \
--flash_mode dio \
--flash_freq 80m \
--flash_size 4MB \
0x0 "$firmware_dir/bootloader.bin" \
0x8000 "$firmware_dir/partition-table.bin" \
0x10000 "$firmware_dir/radick.bin"

Binary file not shown.

BIN
firmware/radick.bin Normal file

Binary file not shown.