Skip to content

Latest commit

 

History

138 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OTA (Over-The-Air) 펌웨어 업데이트 시스템

Infineon AURIX TC375 기반 마이크로컨트롤러에 대한 원격 펌웨어 업데이트를 지원하는 통합 시스템입니다. Windows GUI 클라이언트, Raspberry Pi 게이트웨이 서버, TC375 부트로더/펌웨어로 구성되어 있으며, 안전한 네트워크 기반 펌웨어 배포 및 검증을 제공합니다.

현재 구현 기준: 이 문서는 최신 코드 기반으로 작성되었습니다. Windows 앱이 Raspberry Pi 서버를 통해 TC375 ECU에 펌웨어를 업데이트하는 End-to-End OTA 흐름을 지원합니다.

📁 프로젝트 구성

폴더 설명 기술 스택 상태
OTA_Win/ Windows 기반 OTA 운영 UI .NET 8, Windows Forms, HTTP REST 🟢 완성
OTA_Ras/ Raspberry Pi 게이트웨이 서버 Python 3, FastAPI, SQLAlchemy 🟢 완성
OTA_TC375/ TC375 부트로더 및 OTA 펌웨어 AURIX C (TriCore), lwIP, iLLD 🟢 완성
modified_lsl/ 슬롯별 메모리 레이아웃 정의 TASKING 링커 스크립트 (.lsl) 🟢 사용 중

OTA_Win/ - Windows OTA 클라이언트

  • 진입점: Program.cs
  • 주요 폼:
    • LoginForm.cs: 서버 접속 및 인증
    • MainForm.cs: OTA 작업 UI (연결, HEX 분석, 실행)
  • 핵심 모듈:
    • ApiClient.cs: FastAPI 서버 HTTP 통신
    • IntelHexParser.cs: Intel HEX 파일 분석 및 검증
    • OtaPackager.cs: 업데이트 패키지 준비
    • AuthService.cs: JWT 토큰 관리
    • Models.cs: 데이터 모델
  • 기본 설정:
    • 기본 서버 URL: http://192.168.137.4:8000 -> 본인의 라즈베리파이 IP로 설정하면 됨
    • 기본 API Key: default-api-key
    • 기본 사용자: admin / 비밀번호: 0000

OTA_Ras/ - Raspberry Pi OTA 게이트웨이

  • 진입점: main.py (FastAPI 서버)
  • 핵심 모듈:
    • config.py: 네트워크, ECU, 보안 설정
    • auth.py: 사용자 인증, JWT 토큰 발급
    • schemas.py: API 요청/응답 모델 (Pydantic)
    • transport/ota_protocol.py: OTA Ethernet Protocol v1 프레임 인코딩/디코딩
    • transport/tc375_transport.py: TC375 TCP 클라이언트
    • transport/job_runner.py: OTA 작업 오케스트레이션
    • transport/hex_handler.py: Intel HEX 파일 분석 및 이미지 생성
    • transport/metadata_service.py: 메타데이터 조회
    • transport/dflash_smoke_test.py: DFlash 테스트
  • API 서버:
    • Host: 10.37.50.1 (기본)
    • Port: 8000 (기본)
    • 보안: API Key + JWT 이중 인증
  • 데이터베이스: SQLite (data/ota.sqlite)
  • 의존성: requirements.txt 참조

OTA_TC375/ - TC375 부트로더 및 펌웨어

  • 진입점: Cpu0_Main.c, Cpu1_Main.c, Cpu2_Main.c
  • 핵심 OTA 모듈 (OTA/ 폴더):
    • OTA/Boot/: 부트로더 부팅 로직
    • OTA/DFlash/: DFlash 메타데이터 관리
    • OTA/PFlash/: PFlash 읽기/쓰기/검증
    • OTA/Handler/: OTA 프레임 수신 및 처리
    • OTA/Transport/: TCP 서버 및 OTA Protocol v1 파서
    • OTA/Protocol/: 프로토콜 타입 정의
  • 설정 (Config/ 폴더):
    • Ota_EcuTarget_Cfg.h: ECU 대상 (MAIN/SUB), IP, MAC 주소
    • Ota_PFlash_Cfg.h: PFlash 슬롯 메모리 주소
    • Ota_DFlash_Cfg.h: DFlash 메타데이터 주소
  • 빌드: TASKING TriCore Compiler 사용
  • 디버그 설정: OTA_TC375 TriCore Debug (TASKING).launch

modified_lsl/ - 링커 스크립트

  • Lcf_Tasking_Tricore_Tc_Bootloader.lsl: 부트로더 메모리 배치
  • Lcf_Tasking_Tricore_Tc_AppA.lsl: App Slot A 메모리 배치
  • Lcf_Tasking_Tricore_Tc_AppB.lsl: App Slot B 메모리 배치

🔄 시스템 아키텍처

전체 데이터 흐름

┌─────────────────────────────────────────────────────────────────┐
│                         Windows PC                               │
│                  ┌──────────────────┐                            │
│                  │   OTA_Win GUI    │                            │
│                  │  (.NET 8 Forms)  │                            │
│                  └────────┬─────────┘                            │
│                           │ HTTP REST + JWT Token               │
└───────────────────────────┼────────────────────────────────────┘
                            │
                            ↓
┌─────────────────────────────────────────────────────────────────┐
│                    Raspberry Pi                                  │
│         ┌───────────────────────────────────┐                   │
│         │   OTA_Ras FastAPI Server         │                   │
│         │  (Python + SQLAlchemy + Uvicorn) │                   │
│         ├───────────────────────────────────┤                   │
│         │ • 사용자 인증 (JWT)               │                   │
│         │ • HEX 파일 분석 & 검증           │                   │
│         │ • 작업 상태 관리                 │                   │
│         │ • 슬롯 및 버전 검증             │                   │
│         └───────────────┬───────────────────┘                   │
│                         │ OTA Ethernet Protocol v1 (TCP 5000)   │
│                         │ Command/Response 프레임              │
└─────────────────────────┼────────────────────────────────────┘
                          │
                          ↓
┌─────────────────────────────────────────────────────────────────┐
│                  Infineon AURIX TC375 MCU                        │
│         ┌───────────────────────────────────┐                   │
│         │  OTA_TC375 부트로더               │                   │
│         │  (AURIX C + lwIP raw API)        │                   │
│         ├───────────────────────────────────┤                   │
│         │ • TCP Server (Listening)          │                   │
│         │ • OTA Protocol v1 Parser          │                   │
│         │ • PFlash R/W/Verify               │                   │
│         │ • DFlash 메타데이터 관리          │                   │
│         │ • 활성/비활성 슬롯 관리           │                   │
│         └───────────────────────────────────┘                   │
│                         │                                        │
│         ┌───────────────┴───────────────┐                       │
│         ↓                               ↓                       │
│    ┌─────────┐                   ┌──────────┐                  │
│    │ Slot A  │                   │ Slot B   │                  │
│    │ 1 MB    │                   │ 2 MB     │                  │
│    │ PFlash  │                   │ PFlash   │                  │
│    └─────────┘                   └──────────┘                  │
│                                                                 │
│    ┌──────────────────────────────────────┐                   │
│    │ DFlash Metadata & OTA State          │                   │
│    │ (활성 슬롯, 버전, CRC, 상태)        │                   │
│    └──────────────────────────────────────┘                   │
└─────────────────────────────────────────────────────────────────┘

OTA 작업 흐름 (상세)

1. 사용자 작업 (Windows OTA_Win)
   ├─ 서버 URL, API Key 입력
   ├─ 사용자명/비밀번호 입력
   └─ 로그인 → JWT 토큰 획득

2. HEX 파일 선택 및 분석
   ├─ Intel HEX 파일 열기
   ├─ 주소 범위 분석 (Slot A: 0x80300000-0x80400000 또는 Slot B: 0x80400000-0x80600000)
   ├─ 버전 메타데이터 추출 (Main Ver, Sub Ver)
   └─ 서버에 파일 전송 (multipart/form-data)

3. 서버 검증 및 준비 (OTA_Ras)
   ├─ 수신한 HEX 파일 저장
   ├─ 슬롯 범위 재검증
   ├─ 활성/비활성 슬롯 결정
   ├─ 버전 증가 조건 검증
   ├─ 바이너리 이미지 생성 (256바이트 청크 단위)
   └─ 작업 상태를 메모리에 저장 (작업 ID별)

4. TC375 상태 확인
   ├─ STATUS_REQ 전송
   ├─ STATUS_RSP 수신 (활성 슬롯, 현재 버전, CRC)
   ├─ UPDATE_CHECK_REQ 전송
   ├─ UPDATE_CHECK_RSP 수신 (업데이트 가능 여부, 대상 슬롯)
   └─ 조건 만족 확인

5. 펌웨어 업데이트 (OTA_Ras → TC375)
   ├─ START_UPDATE 전송 (대상 슬롯, 이미지 크기)
   ├─ TC375에서 PFlash 영역 Erase
   ├─ DATA_CHUNK 반복 전송 (256바이트 × N)
   │  └─ 각 청크마다 ACK 수신
   ├─ FINISH_UPDATE 전송
   ├─ TC375에서 이미지 CRC32 검증
   ├─ DFlash 메타데이터 업데이트 (새 버전, 슬롯, CRC)
   └─ 작업 완료 응답

6. 결과 확인 (Windows OTA_Win)
   ├─ 서버에서 작업 상태 폴링 (`/api/ota/status/{job_id}`)
   ├─ 진행률 표시
   └─ 성공/실패 알림

🌐 네트워크 설정

기본 IP 주소 할당

디바이스 인터페이스 IP 주소 포트 용도 설정 위치
Raspberry Pi eth0 (ECU망) 10.37.50.1 8000 OTA 서버 API OTA_Ras/config.py
MAIN ECU (TC375) Ethernet 10.37.50.10 5000 OTA 부트로더 OTA_TC375/Config/Ota_EcuTarget_Cfg.h
SUB ECU (TC375) Ethernet 10.37.50.11 5000 OTA 부트로더 OTA_TC375/Config/Ota_EcuTarget_Cfg.h
Windows PC (개발망) 192.168.x.x - OTA 클라이언트 런타임에 설정 가능

네트워크 서브넷

ECU 전용 네트워크 (Isolated)
├─ 서브넷: 10.37.50.0/24
├─ 게이트웨이/Raspberry Pi: 10.37.50.1
├─ MAIN ECU: 10.37.50.10
└─ SUB ECU: 10.37.50.11

Windows PC 개발망
├─ DHCP 또는 정적 할당
└─ Raspberry Pi 접근: 192.168.137.x 또는 별도 경로

Raspberry Pi 네트워크 설정

eth0 인터페이스 설정 (Linux):

# /etc/network/interfaces 또는 netplan 설정
auto eth0
iface eth0 inet static
    address 10.37.50.1
    netmask 255.255.255.0
    gateway 10.37.50.1  # 또는 필요시 설정

또는 OTA_Ras/scripts/setup_ecu_eth0.sh 사용:

bash scripts/setup_ecu_eth0.sh

환경 변수를 통한 네트워크 커스터마이징

OTA_Ras/config.py에서 다음 환경 변수로 네트워크 설정 오버라이드 가능:

# 네트워크 인터페이스
export ECU_INTERNAL_INTERFACE=eth0
export ECU_INTERNAL_PI_IP=10.37.50.1
export ECU_INTERNAL_CIDR=10.37.50.1/24
export ECU_INTERNAL_NETMASK=255.255.255.0

# TC375 연결
export TC375_HOST=10.37.50.10        # MAIN ECU
export TC375_PORT=5000
export TC375_CONNECT_TIMEOUT=10      # 초
export TC375_READ_TIMEOUT=180        # 초

# ECU 대상 매핑
export MAIN_ECU_HOST=10.37.50.10
export SUB_ECU_HOST=10.37.50.11
export MAIN_ECU_PORT=5000
export SUB_ECU_PORT=5000

# 보안
export OTA_API_KEY=your-custom-api-key
export JWT_SECRET=your-custom-jwt-secret

💾 메모리 레이아웃 (TC375)

PFlash 슬롯 주소 맵

영역 Cached Address Non-cached Address 크기 용도 보호
Bootloader 0x80000000 0xA0000000 1 MB OTA 부트로더 (읽기 전용) 🔒 Yes
Slot A 0x80300000 0xA0300000 1 MB App Slot A (비활성 시 쓰기 가능) Conditional
Slot B 0x80400000 0xA0400000 2 MB App Slot B (비활성 시 쓰기 가능) Conditional

DFlash 메타데이터 영역

영역 Address 크기 용도
OTA Metadata 0xAF000000 1 sector 활성 슬롯, 버전, CRC, 상태

메모리 레이아웃 시각화

PFlash (Program Flash)
┌──────────────────────────────────────────────┐
│ Bootloader                                    │  1 MB
│ 0x80000000 - 0x80100000 (cached)            │  (보호됨)
│ 0xA0000000 - 0xA0100000 (non-cached)        │
├──────────────────────────────────────────────┤
│ Reserved / Unused                             │
│ 0x80100000 - 0x80300000                     │
├──────────────────────────────────────────────┤
│ App Slot A                                    │  1 MB
│ 0x80300000 - 0x80400000 (cached)            │  (활성일 때 읽기전용)
│ 0xA0300000 - 0xA0400000 (non-cached)        │
├──────────────────────────────────────────────┤
│ App Slot B                                    │  2 MB
│ 0x80400000 - 0x80600000 (cached)            │  (활성일 때 읽기전용)
│ 0xA0400000 - 0xA0600000 (non-cached)        │
├──────────────────────────────────────────────┤
│ Reserved                                      │
└──────────────────────────────────────────────┘

DFlash (Data Flash)
┌──────────────────────────────────────────────┐
│ OTA Metadata Sector                           │
│ 0xAF000000 (non-cached)                     │
│ Content:                                      │
│  - Active Slot ID (0=A, 1=B)                │
│  - Main Version                              │
│  - Sub Version                               │
│  - App CRC32                                 │
│  - Last Update Time                         │
│  - Last Error Code                          │
└──────────────────────────────────────────────┘

중요 사항

  • 보호 메커니즘: Bootloader와 활성 슬롯은 OTA_TC375/OTA/PFlash/ 코드에서 보호됩니다.
  • 비활성 슬롯 선택: 서버가 업데이트 전에 활성/비활성 슬롯을 판정하고 비활성 슬롯을 선택합니다.
  • HEX 주소 검증: Windows 앱과 서버가 HEX 파일의 주소 범위를 선택한 슬롯 범위와 일치하는지 검증합니다.
  • CRC32 검증: 전체 이미지 기록 후 TC375에서 CRC32를 계산하고 DFlash 메타데이터와 비교합니다.

📡 OTA Ethernet Protocol v1

현재 모든 OTA 통신은 OTA Ethernet Protocol v1를 사용합니다. 이는 Raspberry Pi와 TC375 사이, 그리고 Windows 클라이언트와 TC375 직접 통신 시에도 동일합니다.

프로토콜 기본 사항

항목 값 설명
Sync Magic 0xA55A3750 프레임 시작 표시
Version 0x01 프로토콜 버전 1
TCP Port 5000 모든 OTA 통신 포트
Byte Order Little-endian 모든 다중 바이트 값
Header Size 24 bytes 프레임 헤더 고정 크기
Data Chunk 256 bytes 한 번에 전송되는 데이터 크기
CRC CRC32 IEEE 표준 CRC32 (little-endian)

프레임 구조

┌─────────────────────────────────────────────────────────────┐
│ OTA Frame (24 + Payload + 4 bytes)                          │
├─────────────────────────────────────────────────────────────┤
│ Offset │ Size  │ Field          │ Description               │
├─────────────────────────────────────────────────────────────┤
│ 0      │ 4     │ Sync           │ 0xA55A3750 (Magic)       │
│ 4      │ 1     │ Version        │ 0x01 (Protocol v1)       │
│ 5      │ 1     │ Command        │ 명령 코드 (0x01-0x0A)    │
│ 6      │ 2     │ Sequence       │ 요청 ID / 응답 매치      │
│ 8      │ 4     │ PayloadLength  │ Payload 바이트 수        │
│ 12     │ 4     │ Address        │ PFlash 쓰기 시작 주소    │
│ 16     │ 4     │ Length         │ 총 이미지 크기           │
│ 20     │ 4     │ Checksum       │ Payload CRC32            │
│ 24     │ ...   │ Payload        │ 실제 데이터 (가변)       │
│ 24+L   │ 4     │ FrameCRC       │ 전체 프레임 CRC32        │
└─────────────────────────────────────────────────────────────┘

명령 코드

값 명령 방향 설명
0x01 STATUS_REQ Client → TC375 현재 상태, 메타데이터 요청
0x02 STATUS_RSP TC375 → Client 활성 슬롯, 버전, CRC, 오류 응답
0x03 UPDATE_CHECK_REQ Client → TC375 업데이트 가능 여부 확인
0x04 UPDATE_CHECK_RSP TC375 → Client 허용 여부, 대상 슬롯, 사유
0x05 START_UPDATE Client → TC375 업데이트 시작 선언 (슬롯, 크기)
0x06 START_UPDATE_RSP TC375 → Client 시작 확인 또는 오류
0x07 DATA_CHUNK Client → TC375 256바이트 데이터 청크
0x08 DATA_CHUNK_RSP TC375 → Client 청크 수신 확인 (ACK)
0x09 FINISH_UPDATE Client → TC375 업데이트 완료 신호
0x0A FINISH_UPDATE_RSP TC375 → Client CRC 검증 결과 응답

프로토콜 구현 위치

  • Encoder/Decoder: OTA_Ras/transport/ota_protocol.py
  • TC375 Parser: OTA_TC375/OTA/Transport/ (C 구현)
  • Reference: OTA_TC375/Common/OtaProtocolTypes.h

전송 예시

1. STATUS_REQ 전송
   Client → TC375: [Sync | Ver | CMD:0x01 | Seq:0001 | PLen:0 | ... | CRC]

2. STATUS_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x02 | Seq:0001 | PLen:32 | ... | Status Data | CRC]
   → Status Data: Active Slot (0=A, 1=B), Main Ver, Sub Ver, CRC32, Last Error

3. UPDATE_CHECK_REQ 전송
   Client → TC375: [Sync | Ver | CMD:0x03 | Seq:0002 | PLen:8 |
                     Address:0x80400000 | Length:0x00200000 | CRC]

4. UPDATE_CHECK_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x04 | Seq:0002 | PLen:4 | Allow:1 | Reason:0 | CRC]

5. START_UPDATE 전송
   Client → TC375: [Sync | Ver | CMD:0x05 | Seq:0003 | PLen:8 |
                     Address:0x80400000 | Length:0x00200000 | CRC]

6. START_UPDATE_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x06 | Seq:0003 | PLen:2 | Status:OK | CRC]

7. DATA_CHUNK 반복 (0x00200000 / 256 = 2048번)
   Client → TC375: [Sync | Ver | CMD:0x07 | Seq:0004+ | PLen:256 |
                     Data[0-255] | CRC]
   TC375 → Client: [Sync | Ver | CMD:0x08 | Seq:0004+ | PLen:0 | CRC]

8. FINISH_UPDATE 전송
   Client → TC375: [Sync | Ver | CMD:0x09 | Seq:0005 | PLen:4 |
                     ExpectedCRC32 | CRC]

9. FINISH_UPDATE_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x0A | Seq:0005 | PLen:4 |
                     VerifyResult (0=OK) | CRC]

| 0x05 | START_UPDATE | Client → TC375 | 업데이트 시작 선언 (슬롯, 크기) | | 0x06 | START_UPDATE_RSP | TC375 → Client | 시작 확인 또는 오류 | | 0x07 | DATA_CHUNK | Client → TC375 | 256바이트 데이터 청크 | | 0x08 | DATA_CHUNK_RSP | TC375 → Client | 청크 수신 확인 (ACK) | | 0x09 | FINISH_UPDATE | Client → TC375 | 업데이트 완료 신호 | | 0x0A | FINISH_UPDATE_RSP | TC375 → Client | CRC 검증 결과 응답 |

전송 예시

1. STATUS_REQ 전송
   Client → TC375: [Sync | Ver | CMD:0x01 | Seq:0001 | PLen:0 | ... | CRC]

2. STATUS_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x02 | Seq:0001 | PLen:32 | ... | Status Data | CRC]
   → Status Data: Active Slot (0=A, 1=B), Main Ver, Sub Ver, CRC32, Last Error

3. UPDATE_CHECK_REQ 전송
   Client → TC375: [Sync | Ver | CMD:0x03 | Seq:0002 | PLen:8 |
                     Address:0x80400000 | Length:0x00200000 | CRC]

4. UPDATE_CHECK_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x04 | Seq:0002 | PLen:4 | Allow:1 | Reason:0 | CRC]

5. START_UPDATE 전송
   Client → TC375: [Sync | Ver | CMD:0x05 | Seq:0003 | PLen:8 |
                     Address:0x80400000 | Length:0x00200000 | CRC]

6. START_UPDATE_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x06 | Seq:0003 | PLen:2 | Status:OK | CRC]

7. DATA_CHUNK 반복 (0x00200000 / 256 = 2048번)
   Client → TC375: [Sync | Ver | CMD:0x07 | Seq:0004+ | PLen:256 |
                     Data[0-255] | CRC]
   TC375 → Client: [Sync | Ver | CMD:0x08 | Seq:0004+ | PLen:0 | CRC]

8. FINISH_UPDATE 전송
   Client → TC375: [Sync | Ver | CMD:0x09 | Seq:0005 | PLen:4 |
                     ExpectedCRC32 | CRC]

9. FINISH_UPDATE_RSP 수신
   TC375 → Client: [Sync | Ver | CMD:0x0A | Seq:0005 | PLen:4 |
                     VerifyResult (0=OK) | CRC]

🚀 설치 및 실행 가이드

요구 사항

컴포넌트 요구 사항
OTA_Win Windows 10+, .NET 8 SDK
OTA_Ras Python 3.9+, Raspberry Pi 또는 Linux
OTA_TC375 TASKING TriCore Compiler, AURIX Development Studio

Raspberry Pi 서버 설치

1단계: 종속성 설치

cd OTA_Ras
pip install -r requirements.txt

2단계: 네트워크 설정 (ECU 전용망)

# 자동 설정 스크립트 사용
sudo bash scripts/setup_ecu_eth0.sh

# 또는 수동 설정
sudo nano /etc/network/interfaces
# 다음 내용 추가:
# auto eth0
# iface eth0 inet static
#     address 10.37.50.1
#     netmask 255.255.255.0

sudo systemctl restart networking
ip addr show eth0  # 설정 확인

3단계: 서버 실행

# Linux/Raspberry Pi
cd OTA_Ras
chmod +x run_server.sh
./run_server.sh

# 또는 수동 실행
export OTA_API_KEY=your-api-key
export JWT_SECRET=your-jwt-secret
export ECU_INTERNAL_PI_IP=10.37.50.1
python -m uvicorn main:app --host 0.0.0.0 --port 8000

4단계: 서버 상태 확인

curl http://10.37.50.1:8000/health
# 또는 Windows에서
curl http://<raspberry-pi-ip>:8000/health

Windows 클라이언트 설치

1단계: 종속성 설치

cd OTA_Win
dotnet restore

2단계: 빌드

dotnet build
# Release 빌드
dotnet build -c Release

3단계: 실행

dotnet run
# 또는
dotnet run --no-build

# Release 실행
dotnet run -c Release

4단계: 로그인

로그인 화면에서:

  • Server URL: http://<raspberry-pi-ip>:8000
  • API Key: 서버의 OTA_API_KEY (기본: default-api-key)
  • Username: admin 또는 user
  • Password: 0000 또는 user123

TC375 펌웨어 빌드 및 플래시

1단계: 프로젝트 열기

  • AURIX Development Studio 실행
  • OTA_TC375 폴더를 workspace로 import

2단계: 링커 스크립트 설정

  • Bootloader 빌드 시: modified_lsl/Lcf_Tasking_Tricore_Tc_Bootloader.lsl 사용
  • App Slot A: modified_lsl/Lcf_Tasking_Tricore_Tc_AppA.lsl 사용
  • App Slot B: modified_lsl/Lcf_Tasking_Tricore_Tc_AppB.lsl 사용

3단계: 빌드

프로젝트 우클릭 → Build → Build Project

4단계: 디버거/플래시 도구로 실행

OTA_TC375 TriCore Debug (TASKING).launch 설정 사용


📚 API 문서

Raspberry Pi FastAPI 서버 엔드포인트

헬스 체크

GET /health

응답:

{ "status": "OK", "server_time": "2024-01-01T12:00:00Z" }

로그인

POST /api/auth/login
Content-Type: application/json

{
  "username": "admin",
  "password": "0000",
  "api_key": "default-api-key"
}

응답:

{
  "access_token": "eyJ0eXAi...",
  "token_type": "bearer",
  "user_id": 1,
  "username": "admin"
}

ECU 메타데이터 조회

GET /api/ecu/metadata?ecu_target=MAIN_ECU
Authorization: Bearer {access_token}

응답:

{
  "ecu_target": "MAIN_ECU",
  "ip": "10.37.50.10",
  "port": 5000,
  "active_slot": "A",
  "main_version": "1.0.0",
  "sub_version": "1.0.0",
  "crc32": "0x12345678",
  "last_error": 0
}

HEX 파일 업로드 및 OTA 시작

POST /api/ota/upload-hex-with-version
Authorization: Bearer {access_token}
Content-Type: multipart/form-data

{
  "hex_file": <binary>,
  "ecu_target": "MAIN_ECU",
  "main_version": "2.0.0",
  "sub_version": "1.0.0"
}

응답:

{
  "job_id": "job_20240101_120000_001",
  "status": "STARTED",
  "progress": 0,
  "message": "OTA job started"
}

OTA 작업 상태 조회

GET /api/ota/status/{job_id}
Authorization: Bearer {access_token}

응답:

{
  "job_id": "job_20240101_120000_001",
  "status": "IN_PROGRESS",
  "progress": 45,
  "current_step": "Sending data chunks",
  "chunks_sent": 500,
  "total_chunks": 1024,
  "message": "Uploading firmware...",
  "error": null
}

작업 완료 후:

{
  "job_id": "job_20240101_120000_001",
  "status": "COMPLETED",
  "progress": 100,
  "message": "OTA completed successfully",
  "result": {
    "active_slot": "B",
    "new_version": "2.0.0",
    "crc32": "0xABCDEF00"
  },
  "error": null
}

DFlash Smoke 테스트

POST /api/test/tc375-dflash
Authorization: Bearer {access_token}
Content-Type: application/json

{
  "ecu_target": "MAIN_ECU"
}

🔧 개발 및 테스트

TC375 연결 테스트

cd OTA_Ras
python tests/tc375_link_check.py

TC375 LED 테스트

cd OTA_Ras
python tests/tc375_target_led_test.py --target MAIN_ECU

DFlash 테스트

cd OTA_Ras
python tests/tc375_dflash_smoke.py --target MAIN_ECU

직접 TCP 클라이언트 테스트 (Python)

from OTA_Ras.transport.tc375_transport import TC375TransportClient
from OTA_Ras.transport.ota_protocol import OtaProtocol

client = TC375TransportClient("10.37.50.10", 5000, timeout=10)
status = client.send_status_request()
print(f"Active Slot: {status['active_slot']}")
print(f"Main Version: {status['main_version']}")
print(f"CRC32: {status['crc32']}")

⚠️ 트러블슈팅

문제: Raspberry Pi에서 TC375에 연결할 수 없음

원인: 네트워크 설정 또는 IP 주소 불일치

해결 방법:

# 1. eth0 인터페이스 확인
ip addr show eth0

# 2. TC375 IP로 ping 테스트
ping 10.37.50.10

# 3. 포트 5000 열려 있는지 확인
nc -zv 10.37.50.10 5000

# 4. 네트워크 재설정
sudo bash OTA_Ras/scripts/setup_ecu_eth0.sh
sudo systemctl restart networking

문제: Windows 앱이 Raspberry Pi 서버에 연결 실패

원인: 방화벽 또는 서버 미실행

해결 방법:

# 1. 서버 실행 상태 확인 (Raspberry Pi)
curl http://localhost:8000/health

# 2. Windows 방화벽 설정
# Settings → Firewall & network protection → Allow app through firewall
# FastAPI/Python 추가

# 3. 서버 로그 확인
# run_server.sh 또는 run_server.ps1에서 로그 출력 확인

# 4. Windows 호스트 파일 추가 (선택)
# C:\Windows\System32\drivers\etc\hosts
# 192.168.137.x  raspberry-pi-ota

문제: HEX 파일 업로드 후 주소 범위 오류

원인: HEX 파일의 주소가 선택한 슬롯과 불일치

해결 방법:

HEX 파일이 0x80300000-0x80400000 범위면 → Slot A 선택
HEX 파일이 0x80400000-0x80600000 범위면 → Slot B 선택

또는 HEX 파일의 주소를 링커 스크립트로 조정

문제: TC375 업데이트 중 CRC 불일치

원인: 데이터 전송 오류, 메모리 손상, 또는 타이밍 문제

해결 방법:

# 1. TC375 상태 확인
python OTA_Ras/tests/tc375_link_check.py

# 2. 네트워크 노이즈 감소 (케이블 재연결)

# 3. 타임아웃 값 증가
export TC375_READ_TIMEOUT=300
python -m uvicorn OTA_Ras.main:app --host 0.0.0.0 --port 8000

# 4. HEX 파일 재생성 및 검증

문제: API Key 또는 JWT 토큰 오류

해결 방법:

# API Key 확인 (Raspberry Pi)
grep OTA_API_KEY OTA_Ras/config.py

# 또는 환경 변수 확인
echo $OTA_API_KEY

# 토큰 만료 시 다시 로그인
# Windows 앱에서 로그인 화면으로 돌아가 다시 인증

📋 체크리스트

프로덕션 배포 전 확인사항

  • API Key 변경 (OTA_Ras/config.py 또는 환경 변수)
  • JWT Secret 변경
  • 기본 계정 비밀번호 변경 (admin, user)
  • Windows 앱의 기본 서버 URL 업데이트
  • 방화벽 규칙 설정 (포트 5000, 8000)
  • SSL/TLS 인증서 설정 (프로덕션)
  • 로그 저장 디렉토리 권한 설정
  • 정기적 백업 및 롤백 계획 수립
  • ECU 메타데이터 및 슬롯 주소 검증
  • 테스트 OTA 작업 실행

📖 추가 문서

각 컴포넌트의 상세 문서:


📝 변경 로그

현재 이 파일은 최신 코드 기준(OTA Protocol v1)으로 작성되었습니다.

About

OTA를 통해 TC375의 펌웨어 업데이트를 진행하는 프로젝트입니다.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages