Compare commits
2 Commits
agent/nati
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 1a47837a2c | |||
| edacf69fb8 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,5 +5,6 @@
|
|||||||
/sdkconfig
|
/sdkconfig
|
||||||
/sdkconfig.old
|
/sdkconfig.old
|
||||||
*.bin
|
*.bin
|
||||||
|
!/firmware/*.bin
|
||||||
*.elf
|
*.elf
|
||||||
*.map
|
*.map
|
||||||
|
|||||||
86
README.md
86
README.md
@@ -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
|
```bash
|
||||||
. "$IDF_PATH/export.sh"
|
. "$IDF_PATH/export.sh"
|
||||||
idf.py set-target esp32s3
|
idf.py set-target esp32s3
|
||||||
idf.py build
|
idf.py -p /dev/ttyUSB0 build flash
|
||||||
idf.py -p /dev/ttyUSB0 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로 빌드할 수도 있습니다.
|
로컬 ESP-IDF 설치 없이 Docker로 빌드할 수도 있습니다.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
-v "$PWD:/project" -w /project \
|
-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 의존성 없이 테스트할 수 있습니다.
|
레이더 프로토콜과 추적기는 ESP32 의존성 없이 테스트할 수 있습니다.
|
||||||
|
|||||||
49
firmware/README.md
Normal file
49
firmware/README.md
Normal 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
3
firmware/SHA256SUMS
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
cfc2b532f0a41d4e9b3af4c953e154780b328adc0f04e4cf91e452179244c0fa bootloader.bin
|
||||||
|
73c0b5c3e5fcba3a151cc70c453c93dd5f4798899e7f2f8cca76da1f32ffc501 partition-table.bin
|
||||||
|
73059503d1602322b045d8eac868b885b4a9946deba63a109d3fda930082d80c radick.bin
|
||||||
BIN
firmware/bootloader.bin
Normal file
BIN
firmware/bootloader.bin
Normal file
Binary file not shown.
30
firmware/flash.ps1
Normal file
30
firmware/flash.ps1
Normal 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
26
firmware/flash.sh
Executable 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"
|
||||||
BIN
firmware/partition-table.bin
Normal file
BIN
firmware/partition-table.bin
Normal file
Binary file not shown.
BIN
firmware/radick.bin
Normal file
BIN
firmware/radick.bin
Normal file
Binary file not shown.
Reference in New Issue
Block a user