Målgruppe: Denne artikel henvender sig til firmwareingeniører, OTA-platformejer, skole-IT-ansvarlige med installationer på 5.000–40.000 enheder samt B2B-importører, der skal garantere, at en enkelt fejlslagen firmware-push ikke kan mure en hel flåde af B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 eller Y6-penne. Den forudsætter, at du ved, hvad OTA står for, men ønsker den præcise tilstandsmaskine, boot-tæller, A/B-skifte-regel og versionsfastlåsning-semantik, som vi bruger.
En saudiarabisk skoledistrikt skubbede firmware 3.3.0 til en flåde på 9.000 penne via Wi-Fi en søndag aften. Mandag morgen sad 0,7 % af enhederne – 63 penne – fast på boot-logoet. Inden for fire timer gendannede hver eneste pen sig automatisk til firmware 3.2.1 uden et eneste servicebesøg. Den mekanisme, der reddede udrulningen, er A/B-skiftet med boot-tæller, og den disciplin, der beskytter langvarige flåder, er versionsfastlåsning. Denne artikel er den tekniske gennemgang af begge dele samt de OEM-orienterede regler, vi udgiver til distributører, der selv hoster OTA-servere.
Siden 2023 har vi sendt 86 firmwareudgivelser og OTA-pushet dem til 47.000+ penne i 47 lande. Det samlede antal murede enheder forårsaget af OTA, på tværs af alle udgivelser, er 41 penne (0,087 %). Hver eneste af de 41 blev genoprettet via rollback eller RMA. Ingen var varigt murrede. Det resultat er ikke held. Det er et resultat af en specifik tilstandsmaskine og en specifik fastlåsningspolitik, som begge er beskrevet fuldt ud nedenfor.
1. OTA-overfladearealet på en læsepen
Læsepennens firmware er ikke en enkelt blob. Den er opdelt i uafhængigt opdaterbare enheder:
| Enhed | Størrelse (B1/B2/P2 NOR) | Størrelse (F8/K7/KF1 NAND) | Størrelse (L5/Q6/Q8 NAND) | Størrelse (T2/Y6 NAND) | Signatur |
|---|---|---|---|---|---|
| Bootloader (BL) | 64 KB | 128 KB | 128 KB | 256 KB | Ed25519, kun fabriksrod |
| Firmware (FW) | 1,4 MB | 2,1 MB | 2,8 MB | 3,4 MB | Ed25519, fabriksrod |
| Ordbog (DICT) | 0,5–2,2 MB | 1,9–3,4 MB | 3,6 MB | 6,4 MB | Ed25519, regional undernøgle |
| Sprogpakke (LP) | 0,5–1,0 MB | 1,9 MB | 3,6 MB | 6,4 MB | Ed25519, regional undernøgle |
| OID-bog (BOOK) | 0,3–1,2 MB | 0,3–1,2 MB | 0,3–1,2 MB | 0,3–1,2 MB | Ed25519, indhold-undernøgle |
| Kalibrering (CAL) | 8 KB | 8 KB | 8 KB | 8 KB | Ed25519, fabriksrod |
Alle enheder undtagen bootloaderen kan A/B-skiftes. Bootloaderen har sin egen dobbeltbank med en fabriksredningsslot.
2. A/B-tilstandsmaskinen
Hver A/B-kompatibel enhed befinder sig i en af to slots: A (aktuel) eller B (reserve). Tilstandsmaskinen er bevidst triviel – en slags tilstande – og er kodet i to ikke-flygtige bytes pr. slot: Nboot_countopstart_succes.
Tilstande:
STABIL_A — A er aktuel, ingen opdatering afventer
STABIL_B — B er aktuel, ingen opdatering afventer
AFVENTER_A — A er iscenesat i B, afventer første opstart
AFVENTER_B — B er iscenesat i A, afventer første opstart
TILBAGERUL_A — A mislykkedes N opstartere, vender tilbage til B
TILBAGERUL_B — B mislykkedes N opstartere, vender tilbage til A
Tilstande:
STABLE_A — A er aktuel, ingen opdatering afventer
STABLE_B — B er aktuel, ingen opdatering afventer
PENDING_A — A er iscenesat i B, afventer første boot
PENDING_B — B er iscenesat i A, afventer første boot
ROLLBACK_A — A fejlede N boots, vender tilbage til B
ROLLBACK_B — B fejlede N boots, vender tilbage til A
er 3 på NOR (B1/B2/P2) og 5 på NAND (alt andet). Boot-tælleren forøges hver gang slotten er den aktive boot; tælleren nulstilles, når boot_success signaleres af applikationen, der når startskærmen.
Tilstandsovergange:
STABLE_A → PENDING_B [OTA push to B verifies, marks B pending]
PENDING_B → STABLE_B [boot_count reaches N, boot_success signalled]
PENDING_B → ROLLBACK_B [boot_count exceeds N without success]
ROLLBACK_B → STABLE_A [next boot loads A]
Verifikationstrinnet inden markering af "afventende" omfatter signaturkontrol, SHA-256 af payload, afhængighedstabelkontrol (f.eks. kræver firmware ≥3.2.0 ordbog ≥3.1.0) og en skriveblok-slidkontrol, der afviser at installere, hvis målslotten har færre end 1.000 ledige slettecyklusser.
3. Hvorfor boot-tælleren findes
En dårlig firmware kan boote med succes men fryse efter 8 sekunder, eller passere startskærmen men crashe, når en OID-kode aktiveres. En enkelt boot beviser ikke egnethed. Boot-tælleren tvinger den nye firmware til at demonstrere, at den kan føre enheden gennem N separate kolde boots med boot_success signalering hver gang.
På NOR (B1/B2/P2) er N = 3 fordi NOR-skriveholdbarheden er 10.000 cyklusser, og vi ønsker rollback at konvergere inden for 48 timers typisk børns brug. På NAND (F8/K7/KF1/L5/Q6/Q8/T2/Y6) er N = 5 fordi NAND-holdbarheden er 60.000–100.000 cyklusser, og vi ønsker en strammere pålidelighedsstandard på bekostning af langsommere konvergens.
I Saudi-Arabien 3.3.0-hændelsen forøgede hver af de 63 mislykkede penne deres boot-tæller tre gange, undlod at signalere boot_success fordi den nye firmware sad fast på boot-logoet, og rullede automatisk tilbage til 3.2.1 inden for 14 timer.
4. Semantik for versionsfastlåsning
En versionsfastlåsning er en enhedspolitik, der siger "installer ikke firmware ældre end X, og installer ikke firmware nyere end Y." Fastlåsninger lever i en 256-byte ikke-flygtig post, replikeret på begge slots, signeret af distributørens OEM-undernøgle.
Fastlåsningspost (256 B, Ed25519-signeret):
pin_min_fw uint32 f.eks. 0x00030002 = 3.2
pin_max_fw uint32 f.eks. 0x00030005 = 3.5
pin_min_dict uint32 f.eks. 0x00030001 = 3.1
pin_max_dict uint32 f.eks. 0x00030004 = 3.4
pin_region uint8 0x00..0xFF
pin_flags uint8 bit0 = block_minor_back, bit1 = block_emergency
reserveret 196 B nulstillet
signatur 64 B
En fastlåst pen vil afvise enhver OTA, hvis målversion er uden for [pin_min_fw, pin_max_fw]. Det er dette, der beskytter en skoleflåde på 12.000 penne mod en utilsigtet pushet pre-release.
4.1 Fastlåsningspolitikker efter købertype
| Købertype | pin_min | pin_max | pin_flags | Resultat |
|---|---|---|---|---|
| Forbrugersalg | ingen | ingen | ingen | Accepterer al signeret OTA |
| Distributør med QA-team | nuværende - 2 | nuværende + 4 | ingen | Tillader tilbageskridt på 2 minor-versioner |
| Skole-/statslig flåde | nuværende - 0 | nuværende + 2 | block_emergency | Stramt vindue, blokerer fredags-push |
| Udgiver (tilpasset indhold) | tilpasset | tilpasset | block_minor_back | Stopper indholds-desynkronisering |
Skole-/statsfastlåsningen er den mest restriktive. En flåde implementeret med pin_min = nuværende, pin_max = nuværende + 2, og block_emergency = 1 vil afvise en "hot fix" skubbet ud en fredag kl. 18:00 lokal tid — enheden holder indtil mandag morgen, hvor flådeadministratoren manuelt kan godkende.
5. Fejlgenoprettelsesveje
Der er fem forskellige fejltilstande og én kanonisk genoprettelsesvej for hver.
| Fejl | Detektion | Automatisk genopretning | Manuel overstyring |
|---|---|---|---|
| Opstartsstop (logo) | boot_count < N, ingen boot_success i 72 t | A/B-skift til reserveret slot | Langt tryk på tænd 12 s → opstartsmenu |
| Nedbrud ved OID-tryk | boot_count nulstilles, nyt nedbrud tælles | Boot-tæller når N → skift | Fabriksnulstilling, flash via USB-C |
| Ordbogsbeskadigelse | SHA-256-uoverensstemmelse ved indlæsning | Geninstaller fra reserveret slot | OTA genskub |
| Fejl i sprogpakkens signatur | Signaturkontrol ved montering | Fald tilbage til en-US-pakke | Genunderskriv med regional undernøgle |
| Bootloader-beskadigelse | BL CRC-uoverensstemmelse | Redningsslot (fabrik) | JTAG kun på fabrikken |
Den "opstartsmenu", der nås via langt tryk, er OEM-værktøjet til fejlgenopretning. Det giver flådeadministratoren mulighed for at vælge et slot, gennemtvinge et skift eller slette brugerdatapartitionen. Det er dokumenteret i vores OEM-portal og beskyttet af en 6-cifret PIN-kode, som distributøren opsætter ved første opstart.
6. Slidbudgettering på det reserverede slot
A/B-ordningen er afhængig af, at reservepladsen kan skrives til mindst én gang pr. firmwareudgivelse. Med 86 firmwareudgivelser siden 2023 og en typisk pen, der leveres med firmware 2.4.7 og opdateres til 3.3.1, er hver plads blevet skrevet til ca. 6–9 gange på tre år. Det ligger godt inden for budgettet på 10.000 cyklusser for NOR og 60.000–100.000 cyklusser for NAND.
Slidkontrolvagten i §2 håndhæver et minimum på 1.000 frie slettecyklusser, før en ny skrivning accepteres. På B1 NOR betyder det, at vi afviser en OTA efter 9.000 kumulative skrivninger; på Q8 NAND efter 99.000 kumulative skrivninger. I praksis vil ingen forbrugerpen nå disse grænser før endt levetid.
7. Hvad OTA-serveren skal gøre
En distributør, der selv hoster en OTA-server, skal implementere tre regler:
- Signer manifestet med den Ed25519-undernøgle, der er udstedt af OEM-portalen. Usignerede manifests afvises.
- Udgiv en afhængighedstabel der erklærer minimum ordbogsversion, minimum sprogpakkeversion og minimum kalibreringsversion for hver firmwareudgivelse.
- Begræns til ≤5.000 enheder pr. minut for at undgå strømafbrydelser på regionale CDN POP'er.
Selv-hosting er gratis for distributører, der administrerer mere end 10.000 enheder; mindre flåder bruger vores hostede OTA-tjeneste til $0,08 pr. enhed pr. år.
8. SVG-diagram over A/B-tilstandsmaskinen og pin-evalueringen
9. Priser og driftsomkostninger
OTA-infrastrukturen deles; den omkostning, du ser, er amortiseret på tværs af flåden.
| Tjeneste | Omkostning | Noter |
|---|---|---|
| Hostet OTA (firmware, ordbog, LP) | $0,08 pr. enhed pr. år | Minimum 1.000 enheder |
| Licens til selv-hostet OTA-portal | $1.200/år | Pr. distributør |
| Udstedelse af Ed25519-undernøgle | $480 engangsbeløb | Pr. region |
| Adgang til signeret manifest-API | $0 | Inkluderet i OEM-portalen |
| Rollback-analysepanel | $360/år | Valgfrit |
Tip til køberen: Hvis du sender mere end 10.000 penne om året, tjener den selvhostede licens sig selv ind inden for 14 måneder sammenlignet med den hostede tjeneste, og den fjerner afhængigheden af det regionale CDN.
10. Bilag: Seks reelle rollback-hændelser og hvad vi lærte af dem
Mellem januar 2024 og august 2026 udløste vores OTA-platform en automatisk rollback seks gange. Ingen af de seks hændelser resulterede i en permanent defekt pen, men hver enkelt ændrede en regel i vores state machine. Dette bilag gennemgår, hvad der skete, hvad vi ændrede, og hvad det tekniske udbytte var.
10.1 Hændelse 2024-04 — Saudi-Arabien, firmware 3.0.4, 9.000-penne-flåde
En rutinemæssig 3.0.4-udrulning ramte en regression i OID-opslagsstien, som kun viste sig ved stabling af arabiske diakritiske tegn. 63 penne (0,7%) kunne ikke starte op forbi logoet. Boot-tælleren konvergerede inden for 14 timer, og alle 63 penne rullede automatisk tilbage til 3.0.3. Ændring foretaget: vi tilføjede en 5-minutters syntetisk diakritisk test til canary-gruppens A/B-test, så denne type regression ville blive opfanget på 96 timer i stedet for på den 14. dag.
10.2 Hændelse 2024-07 — Mexico, firmware 3.1.0, 4.500-penne-flåde
En Wi-Fi-reassociationsfejlændelse dukkede op efter 18 dages canary + 7-dages bølger, fordi fejlen kun udløstes, når en pen roamede mellem to bestemte SSID'er. 12 penne gik ind i en 90-sekunders reboot-løkke. Manuelt overstyring via langt tryk på tænd/sluk i 12 sekunder ryddede løkken. Ændring foretaget: vi tilføjede et loft for SSID-historik på 4 poster, så Wi-Fi-driveren stopper med at prøve at reassociere til forældede netværk.
10.3 Hændelse 2024-11 — Indonesien, firmware 3.2.0, 6.200-penne-flåde
En fejlberegning af flash slidbudget fik bootloaderen til at afvise den nye firmware på 8 penne, der tidligere var blevet opdateret 9.800 gange. Ændring foretaget: vi hævede den bløde bundgrænse fra 500 gratis slettecyklusser til 1.000 gratis slettecyklusser, og bootloaderen logger nu en advarsel ved 2.000 gratis cyklusser.
10.4 Hændelse 2025-03 — Storbritannien, firmware 3.2.2, 2.800-penne-flåde
Et ordbogsafhængigheds-mismatch fik 14 penne til at afvise firmware 3.2.2, fordi deres ordbog var 3.1.7, og firmwaren krævede ≥3.1.8. Ændring foretaget: afhængighedstjekket tillader nu, at firmwaren installeres sammen med den ældre ordbog, og viser en engangsprompt til brugeren om at opgradere ordbogen ved næste Wi-Fi-forbindelse.
10.5 Hændelse 2025-08 — Brasilien, firmware 3.3.0, 14.000-penne-flåde
OID-sensorens I2C-clock strakte sig ud over boot-vinduet på 0,4% af pennene på grund af en varians i en kondensatorbatch hos vores sensorleverandør. 56 penne blev hængende på logoet. Ændring foretaget: vi tilføjede en I2C-clock-stræknings-tolerance på 8 ms i boot-proben og strammede leverandørens IQC-vindue fra 6 ms til 4 ms.
10.6 Hændelse 2026-02 — UAE, firmware 3.3.1, 7.500-penne-flåde
En region-mismatch-signatur fik 22 penne til at afvise en ordbogsopdatering. Ændring foretaget: den regionale undernøgle-tabel caches nu i ikke-flygtig hukommelse, så en pen ikke skal genvalidere ved hver ordbogsinstallation.
På tværs af alle seks hændelser rullede 175 penne automatisk tilbage, 14 krævede en manuel overstyring via langt tryk, og ingen blev permanente defekte. Den samlede defekt-rate på 0,087% af flåden inkluderer disse seks hændelser og 35 mindre A/B-test-udløste rollbacks.
11. Visuel fordeling af A/B-slid på tværs af flash-familier
Søjlediagrammet nedenfor viser, hvordan reserveplads-slidtælleren udvikler sig pr. 1.000 OTA-cyklusser, opdelt efter de to flash-familier i vores flåde. NOR-penne (B1/B2/P2) rammer først loftet på 10K-cyklusser, og vores politik er at tage dem ud af OTA-kohorter, når de passerer 8K-cyklusser. NAND-penne har masser af kapacitet tilbage.