246 lines
7.5 KiB
Markdown
246 lines
7.5 KiB
Markdown
# SXXXXXXX_PyDownloadFwViaSRIO
|
||
|
||
Applicazione Python per la programmazione remota di flash memory via protocollo **SRIO-over-TFTP**.
|
||
|
||
## Caratteristiche
|
||
|
||
- ✅ **Protocollo SRIO completo**: Implementazione fedele del protocollo da `dwl_fw.cpp` (Linux) con gestione registri flash controller
|
||
- ✅ **GUI intuitiva**: Interfaccia Tkinter con selezione target, dual log panels (General + TFTP), progress bar
|
||
- ✅ **Gestione multi-target**: Configurazione basata su `targets.ini` con supporto Golden/User memory areas
|
||
- ✅ **TFTP client/server**: Comunicazione TFTP Windows-compatible (no dipendenze esterne)
|
||
- ✅ **Flash operations**: Erase (64KB sectors), Write (256-byte chunks), Verify con retry logic
|
||
- ✅ **QSPI initialization**: Sequenza `op_init_qspi()` automatica (chiamata 2x come da riferimento C++)
|
||
- ✅ **Server di test**: Emulatore TFTP con simulazione completa registri SRIO e flash controller
|
||
- ✅ **Abort operations**: Interruzione quasi istantanea (<2ms) di operazioni lunghe tramite pulsante dedicato
|
||
|
||
## Struttura Progetto
|
||
|
||
```
|
||
SXXXXXXX_PyDownloadFwViaSRIO/
|
||
├── pydownloadfwviasrio/ # Package principale
|
||
│ ├── core/
|
||
│ │ ├── core.py # FirmwareFlasher (erase/write/verify)
|
||
│ │ └── srio_flash.py # SRIOFlashController (protocollo registri)
|
||
│ ├── gui/
|
||
│ │ └── gui.py # FlasherGUI (interfaccia Tkinter)
|
||
│ ├── profiles.py # GlobalConfig, FlashModel, FlashTarget
|
||
│ ├── tftp_client.py # SRIOTFTPClient (TFTP sender)
|
||
│ └── __main__.py # Entry point
|
||
├── _OLD/ # Riferimenti C++/Qt (protocollo)
|
||
│ ├── linux_app/dwl_fw.cpp # Implementazione Linux SRIO (RIFERIMENTO)
|
||
│ └── Vecchia_app/ # Qt app (fpgaflashengine, fpgaflashinterface)
|
||
├── tools/
|
||
│ └── tftp_receiver.py # Server TFTP di test con simulazione flash
|
||
├── doc/ # Documentazione
|
||
└── flash_profiles.json # Configurazione target persistente
|
||
```
|
||
|
||
## Installazione
|
||
|
||
### Requisiti
|
||
- Python 3.10+
|
||
- Windows / Linux / macOS
|
||
|
||
### Setup ambiente virtuale
|
||
|
||
```bash
|
||
# Clona repository
|
||
git clone <repository_url>
|
||
cd SXXXXXXX_PyDownloadFwViaSRIO
|
||
|
||
# Crea virtual environment
|
||
python -m venv .venv
|
||
|
||
# Attiva venv (Windows)
|
||
.venv\Scripts\activate
|
||
|
||
# Attiva venv (Linux/macOS)
|
||
source .venv/bin/activate
|
||
|
||
# Installa dipendenze
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
## Utilizzo
|
||
|
||
### Avvio GUI
|
||
|
||
```bash
|
||
python -m pydownloadfwviasrio
|
||
```
|
||
|
||
### Workflow tipico
|
||
|
||
1. **Seleziona Target**: Scegli dal menu a tendina (es. "EIF_FPGA1")
|
||
2. **Verifica configurazione**: Il pannello "Target Information" mostra IP, slot SRIO, modello, aree memoria
|
||
3. **Scegli operazione**:
|
||
- **🗑️ Erase**: Cancella settore flash (64KB) → inserisci indirizzo start/end
|
||
- **✍️ Write**: Scrive file binario → seleziona file e indirizzo destinazione
|
||
- **🔍 Verify**: Legge flash e confronta con file
|
||
- **🔄 Full Sequence**: Sequenza completa automatica (Erase + Write + Verify)
|
||
- **🛑 ABORT**: Interrompe operazione in corso (disponibile durante operazioni lunghe)
|
||
|
||
### Funzione ABORT
|
||
|
||
Durante operazioni lunghe (Erase, Write, Verify, Full Sequence):
|
||
- Il pulsante **"🛑 ABORT"** (rosso) diventa attivo
|
||
- Cliccare per **interrompere immediatamente** l'operazione (< 2ms)
|
||
- La flash rimane nello stato raggiunto (es. settori parzialmente cancellati/scritti)
|
||
- Utile per correggere file/indirizzo sbagliato senza attendere il completamento
|
||
|
||
**⚠️ Attenzione**: Dopo un abort durante Full Sequence, ripetere l'operazione completa per garantire consistenza della flash.
|
||
|
||
### Log panels
|
||
|
||
- **General Log** (sinistra): Messaggi applicazione, progress, errori
|
||
- **TFTP Commands** (destra): Trace protocollo TFTP (PUT/GET con indirizzi SRIO)
|
||
|
||
### Testing con server emulatore
|
||
|
||
**Terminale 1 - Server:**
|
||
```bash
|
||
python tools/tftp_receiver.py --port 6969
|
||
```
|
||
|
||
**Terminale 2 - Client:**
|
||
```bash
|
||
python -m pydownloadfwviasrio
|
||
# Configura IP: 127.0.0.1, Port: 6969
|
||
```
|
||
|
||
Il server logga tutte le operazioni SRIO (MODE_REG, CMD_REG, flash erase/write/read) e simula il comportamento hardware.
|
||
|
||
## Configurazione
|
||
|
||
### File `targets.ini`
|
||
|
||
Formato INI con sezioni `[default]`, `[MODEL-x]`, `[TGT-x]`:
|
||
|
||
```ini
|
||
[default]
|
||
ip = 192.168.1.100
|
||
port = 69
|
||
default_target = TGT-DWL_BRD-1
|
||
|
||
[MODEL-1]
|
||
model = MT25QL128
|
||
description = Micron 128Mbit NOR Flash
|
||
flash_type = NOR
|
||
is_4byte_addressing = false
|
||
num_sectors = 256
|
||
golden_start = 0x00000000
|
||
golden_stop = 0x007FFFFF
|
||
user_start = 0x00800000
|
||
user_stop = 0x00FFFFFF
|
||
|
||
[TGT-1]
|
||
id_target = TGT-DWL_BRD-1
|
||
description = Download Board #1
|
||
slot_address = 0x13
|
||
architecture = PowerPC
|
||
model = MODEL-1
|
||
golden_binary_path = C:/firmware/golden.bin
|
||
user_binary_path = C:/firmware/user.bin
|
||
```
|
||
|
||
### Gestione profili via GUI
|
||
|
||
1. **Manage Configuration** → apre finestra multi-tab
|
||
2. **Tab "Global"**: IP, porta, target di default
|
||
3. **Tab "Flash Models"**: Definizione modelli flash (tipo, addressing, settori, aree memoria)
|
||
4. **Tab "Targets"**: Configurazione singoli target (slot SRIO, modello, path binari)
|
||
5. **Save** → persiste in `flash_profiles.json`
|
||
|
||
## Protocollo SRIO Flash
|
||
|
||
### Architettura registri (da `dwl_fw.h`)
|
||
|
||
```
|
||
MODE_REG 0x4700002C # Flash mode (primary/secondary)
|
||
CMD_REG 0x47000030 # Flash command (0x06,0xD8,0x02,0x0B,0x05)
|
||
ADDR_REG 0x47000034 # Flash address
|
||
NUM_BYTE_REG 0x47000038 # Transfer size
|
||
CTRL_REG 0x47000060 # Control (0x01=START, 0x00=END, 0x03=WRITE/READ)
|
||
TX_FIFO_REG 0x47000400 # TX FIFO (256 bytes)
|
||
STATUS_REG 0x47000864 # Status bits (11=busy, 12=tx_empty)
|
||
RX_FIFO_REG 0x47000C00 # RX FIFO (read data/status)
|
||
```
|
||
|
||
### Sequenza operazioni (da `dwl_fw.cpp`)
|
||
|
||
#### 1. Inizializzazione QSPI (automatica)
|
||
```python
|
||
# Chiamata automaticamente 2 volte al primo erase/write/verify
|
||
init_qspi() # op_init_qspi() + op_init_qspi()
|
||
```
|
||
|
||
#### 2. Erase sector
|
||
```python
|
||
# Cancella 64KB sector
|
||
erase_section(endpoint, address)
|
||
wait_flash_with_retry(MAX_RETRY_READ=1000)
|
||
```
|
||
|
||
#### 3. Write flash
|
||
```python
|
||
# Scrive 256 byte
|
||
write_flash(endpoint, address, data_256bytes)
|
||
usleep(WRITE_DELAY_US=100000) # 100ms
|
||
wait_flash_with_retry(MAX_RETRY_READ=1000)
|
||
usleep(WAITFLASH_DELAY_US=100000) # 100ms
|
||
```
|
||
|
||
#### 4. Verify
|
||
```python
|
||
# Legge 256 byte e confronta
|
||
read_flash(endpoint, address, 256)
|
||
```
|
||
|
||
### Comandi flash (CMD_REG values)
|
||
|
||
- **0x06**: Write Enable
|
||
- **0xD8**: Sector Erase (64KB)
|
||
- **0x02**: Page Program (256 bytes)
|
||
- **0x0B**: Fast Read
|
||
- **0x05**: Read Status Register
|
||
- **0x61**: Write Volatile Config (QSPI init)
|
||
- **0xB7**: Enter 4-byte Address Mode (QSPI init)
|
||
|
||
## Riferimenti
|
||
|
||
- **Protocollo Linux**: `_OLD/linux_app/dwl_fw.cpp` (implementazione C++ SRIO)
|
||
- **Vecchia GUI Qt**: `_OLD/Vecchia_app/FpgaBeamMeUp/` (fpgaflashengine, fpgaflashinterface)
|
||
- **Documentazione**: `doc/architecture.md`, `doc/Italian-manual.md`
|
||
|
||
## Sviluppo
|
||
|
||
### Run in modalità sviluppo
|
||
```bash
|
||
python -m pydownloadfwviasrio
|
||
```
|
||
|
||
### Test protocollo
|
||
```bash
|
||
# Test TFTP client
|
||
python -c "from pydownloadfwviasrio.tftp_client import SRIOTFTPClient; c = SRIOTFTPClient('127.0.0.1', 6969); print(c)"
|
||
|
||
# Migrazione profili
|
||
python tools/migrate_profiles_json.py
|
||
```
|
||
|
||
### Struttura codice
|
||
|
||
- **Separazione concerns**: `core/` (business logic), `gui/` (UI), `profiles.py` (config)
|
||
- **Type hints**: Tutte le funzioni pubbliche annotate
|
||
- **Logging**: Dual callbacks (general + TFTP) per separazione log
|
||
- **Retry logic**: Timeout e retry automatici su operazioni TFTP
|
||
|
||
## Licenza
|
||
|
||
[Specificare licenza]
|
||
|
||
## Contributi
|
||
|
||
[Linee guida per contributi]
|
||
|