|
| 1 | +# Guida Tecnica: Forzare il Boot da USB su Spacemit Muse Book (K1 SoC) |
| 2 | + |
| 3 | +Questa guida riassume i passaggi per configurare un laptop basato su SoC Spacemit K1 (RISC-V) per avviarsi da USB, superando le limitazioni del firmware di fabbrica che ignora i tasti di boot standard e le ISO generiche. |
| 4 | + |
| 5 | +## Il Problema |
| 6 | +* Nessun Menu di Boot: I tasti standard (ESC, F7, F11, Spazio) spesso non interrompono il boot automatico. |
| 7 | + |
| 8 | +* U-Boot Bloccato: La configurazione di avvio è cablata nel codice e la partizione delle variabili d'ambiente (env) è spesso non inizializzata, rendendo inefficace `fw_setenv`. |
| 9 | + |
| 10 | +* ISO Incompatibili: Le immagini ISO standard (UEFI/Grub) non contengono il Device Tree (DTB) specifico per il laptop, quindi il bootloader le ignora o mostra schermo nero. |
| 11 | + |
| 12 | +## Parte 1: Abilitare la modifica dell'ordine di avvio (Host Side) |
| 13 | +L'obiettivo è scrivere fisicamente nella memoria flash le istruzioni per dare priorità alla USB (usb0) rispetto al disco interno (nvme0/mmc). |
| 14 | + |
| 15 | +1. Individuare la partizione ENV Su questi dispositivi, le variabili U-Boot risiedono solitamente in /dev/mtd3. |
| 16 | + |
| 17 | +``` |
| 18 | +cat /proc/mtd |
| 19 | +``` |
| 20 | +Cerca la riga: mtd3: ... "env" |
| 21 | + |
| 22 | +2. Configurare gli strumenti U-Boot Creare il file /etc/fw_env.config per dire al sistema dove leggere/scrivere: |
| 23 | + |
| 24 | +``` |
| 25 | +echo "/dev/mtd3 0x0 0x10000 0x1000" | sudo tee /etc/fw_env.config |
| 26 | +``` |
| 27 | +3. Creare e Flashare la nuova configurazione |
| 28 | +Poiché fw_setenv fallisce su partizioni vuote, bisogna creare un'immagine binaria e scriverla con dd. |
| 29 | + |
| 30 | +Crea un file my_boot.txt con il contenuto: |
| 31 | + |
| 32 | +``` |
| 33 | +boot_targets=usb0 nvme0 mmc0 pxe |
| 34 | +bootdelay=5 |
| 35 | +``` |
| 36 | +Converti in binario (richiede u-boot-tools): |
| 37 | +``` |
| 38 | +mkenvimage -s 65536 -o env.bin my_boot.txt |
| 39 | +``` |
| 40 | + |
| 41 | +Passaggio Critico: Cancella la partizione e scrivi (richiede mtd-utils): |
| 42 | +``` |
| 43 | +sudo flash_erase /dev/mtd3 0 0 |
| 44 | +sudo dd if=env.bin of=/dev/mtd3 |
| 45 | +``` |
| 46 | + |
| 47 | +Verifica: ```sudo strings /dev/mtd3 | grep boot_targets``` |
| 48 | + |
| 49 | +Parte 2: Preparazione della USB (La "Chirurgia") |
| 50 | + |
| 51 | +Le ISO standard non partono? (verificare) Bisogna creare una chiavetta "manualmente" che usi Extlinux e contenga il Device Tree corretto. |
| 52 | + |
| 53 | +1. Partizionamento La chiavetta deve avere una partizione che occupi tutto lo spazio (attenzione a lsblk, a volte le partizioni ISO sono minuscole). |
| 54 | + |
| 55 | +Filesystem consigliato: FAT32 (massima compatibilità con U-Boot) o EXT4 (se U-Boot lo supporta, meglio per i permessi). |
| 56 | + |
| 57 | +2. Copia dei File |
| 58 | + |
| 59 | +Montare la ISO originale e copiare tutto il contenuto (vmlinuz, initrd, cartella live) nella root della USB. |
| 60 | + |
| 61 | +3. Il "Trapianto" del Device Tree (DTB) Per far funzionare schermo e periferiche, copiare il file .dtb dal sistema funzionante alla USB. |
| 62 | + |
| 63 | +Sorgente (esempio): /boot/spacemit/6.6.63/k1-x_MUSE-Book.dtb |
| 64 | + |
| 65 | +Destinazione: / (root della USB). |
| 66 | + |
| 67 | +4. Creazione menu Extlinux Creare il file /extlinux/extlinux.conf sulla USB: |
| 68 | + |
| 69 | +``` |
| 70 | +label custom-live |
| 71 | + kernel /live/vmlinuz-6.6.63 |
| 72 | + initrd /live/initrd.img-6.6.63 |
| 73 | + fdt /k1-x_MUSE-Book.dtb |
| 74 | + append boot=live components quiet splash console=ttyS0,115200n8 console=tty0 |
| 75 | +``` |
| 76 | +(Nota: fdt è il comando fondamentale che manca nelle installazioni standard). |
| 77 | + |
| 78 | +Diagnostica: Perché potrebbe non partire? |
| 79 | +Se dopo tutto questo riparte il disco interno: |
| 80 | + |
| 81 | +Filesystem: U-Boot potrebbe saper leggere solo FAT32 per il file extlinux.conf iniziale, anche se il kernel Linux supporta EXT4. |
| 82 | + |
| 83 | +Porta USB: Spesso su questi SoC solo una porta è scansionata all'avvio (solitamente la USB 3.0 Type-A, oppure la OTG). |
| 84 | + |
| 85 | +Bootcmd: In alcune versioni di U-Boot, la variabile bootcmd è hardcodata e ignora boot_targets. In quel caso serve un cavo seriale per il debug. |
| 86 | + |
| 87 | + |
| 88 | +# Creazione img al posto di ISO |
| 89 | +Per risv64 dovrei creare una img al posto di una iso, in pratica si tratta di sostituire xorriso con uno script adatto che copi la struttura, aggiunga DTB_FILE ed extlinux. |
| 90 | + |
| 91 | +``` |
| 92 | +Bash |
| 93 | +#!/bin/bash |
| 94 | +
|
| 95 | +# 1. Configurazione |
| 96 | +IMG_NAME="eggs-musebook-riscv64.img" |
| 97 | +IMG_SIZE="4096" # Dimensione in MB (4GB) |
| 98 | +SRC_DIR="./output_eggs" # La cartella dove eggs ha messo vmlinuz, initrd, filesystem.squashfs, etc. |
| 99 | +DTB_FILE="./k1-x_MUSE-Book.dtb" # Il file DTB che hai estratto dal notebook |
| 100 | +
|
| 101 | +echo "--- 1. Creazione contenitore vuoto ($IMG_SIZE MB) ---" |
| 102 | +dd if=/dev/zero of=$IMG_NAME bs=1M count=$IMG_SIZE status=progress |
| 103 | +
|
| 104 | +echo "--- 2. Partizionamento (Creiamo una partizione EXT4 che occupa tutto) ---" |
| 105 | +# Usiamo sfdisk per automatizzare fdisk. Crea una partizione Linux standard. |
| 106 | +echo "type=83" | sfdisk $IMG_NAME |
| 107 | +
|
| 108 | +echo "--- 3. Setup del dispositivo di Loopback ---" |
| 109 | +# Collega il file .img a un dispositivo virtuale /dev/loopX |
| 110 | +LOOP_DEV=$(sudo losetup -fP --show $IMG_NAME) |
| 111 | +echo "Immagine montata su: $LOOP_DEV" |
| 112 | +
|
| 113 | +echo "--- 4. Formattazione in EXT4 ---" |
| 114 | +# Formattiamo la prima partizione del loop device (es. /dev/loop0p1) |
| 115 | +sudo mkfs.ext4 -L "MUSEBOOT" -m 0 "${LOOP_DEV}p1" |
| 116 | +
|
| 117 | +echo "--- 5. Montaggio e Copia dei File ---" |
| 118 | +sudo mkdir -p /mnt/tmpeggs |
| 119 | +sudo mount "${LOOP_DEV}p1" /mnt/tmpeggs |
| 120 | +
|
| 121 | +# A. Copia la cartella 'live' generata da eggs |
| 122 | +echo "Copia del sistema live..." |
| 123 | +sudo cp -r $SRC_DIR/live /mnt/tmpeggs/ |
| 124 | +
|
| 125 | +# B. Copia il DTB (Fondamentale!) |
| 126 | +echo "Copia del Device Tree..." |
| 127 | +sudo cp $DTB_FILE /mnt/tmpeggs/ |
| 128 | +
|
| 129 | +# C. Creazione Extlinux |
| 130 | +echo "Creazione configurazione di boot..." |
| 131 | +sudo mkdir -p /mnt/tmpeggs/extlinux |
| 132 | +cat <<EOF | sudo tee /mnt/tmpeggs/extlinux/extlinux.conf |
| 133 | +label eggs-live |
| 134 | + kernel /live/vmlinuz-6.6.63 |
| 135 | + initrd /live/initrd.img-6.6.63 |
| 136 | + fdt /k1-x_MUSE-Book.dtb |
| 137 | + append boot=live components quiet splash console=ttyS0,115200n8 console=tty0 |
| 138 | +EOF |
| 139 | +
|
| 140 | +echo "--- 6. Chiusura e Pulizia ---" |
| 141 | +sudo umount /mnt/tmpeggs |
| 142 | +sudo losetup -d $LOOP_DEV |
| 143 | +rmdir /mnt/tmpeggs |
| 144 | +
|
| 145 | +echo "FATTO! L'immagine $IMG_NAME è pronta per essere flashata." |
| 146 | +``` |
| 147 | + |
| 148 | +## Modifiche ad eggs |
| 149 | + |
| 150 | +produce --dtb path-file-dtb |
| 151 | + |
| 152 | +se path-file-dtb esiste, allora continua e formato img. |
| 153 | + |
| 154 | +Si interviene solo su produce e xorriso, la cartella ISO viene smembrata: |
| 155 | +* ISO/isolinux |
| 156 | +* ISO/boot/grub/efi.img |
| 157 | + |
| 158 | +# Partizione 1 BOOT (FAT32) |
| 159 | +* ISO/EFI -> BOOT/EFI |
| 160 | +* ISO/live/vmlinu? -> BOOT/live/vmlinu? |
| 161 | + |
| 162 | +## File da aggiungere (Generati/Copiati da Eggs durante la build): |
| 163 | +* k1-x_MUSE-Book.dtb (o altri DTB) → Root della partizione. |
| 164 | +* extlinux/extlinux.conf → Generato al volo (per Spacemit/U-Boot). |
| 165 | +``` |
| 166 | +label eggs |
| 167 | + kernel /vmlinuz-6.12... |
| 168 | + initrd /initrd.img-6.12... |
| 169 | + fdt /k1-x_MUSE-Book.dtb |
| 170 | + append boot=live components splash ... |
| 171 | +``` |
| 172 | +* config.txt + Firmware → (Solo se stai facendo la build per Raspberry Pi). |
| 173 | + |
| 174 | + |
| 175 | +# Partizione 2 (ext4) |
| 176 | +ISO/live/filesystem.squashfs -> ROOT/live/filesystem.squashfs |
0 commit comments