Firmware in het veld updaten met de DFU-modus van een microcontroller

Door Jacob Beningo

Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey

Vrijwel ieder embedded systeem moet over de mogelijkheid beschikken om de firmware in het veld bij te werken om nieuwe functies toe te voegen of bugs op te lossen. Firmware-updates in het veld kunnen echter een uitdaging vormen, omdat ontwikkelaars hun eigen bootloader moeten programmeren of er een moeten aanschaffen bij een externe leverancier van componenten.

Er bestaat een gemakkelijkere weg. Dit artikel laat zien hoe de functie Device Firmware Updates (DFU) moet worden gebruikt. De DFU-functie is in veel microcontrollers ingebouwd, maar wordt vaak over het hoofd gezien.

Opties voor het updaten van firmware

Een compleet nieuwe bootloader ontwikkelen is geen peulenschil. Ontwikkelaars moeten hun flash-ruimte parseren zodat meerdere applicaties naast elkaar kunnen bestaan. Vervolgens moeten ze een manier ontwikkelen om hun gecompileerde binaire bestand naar de microcontroller over te brengen zonder een programmeertool te gebruiken. Hiervoor moeten ze of hun communicatieprotocol ontwikkelen of hun systeemcomplexiteit vergroten door extern geheugen toe te voegen om nieuwe afbeeldingen op te slaan. Ook kunnen ze de omvang van het interne geheugen op de microcontroller vergroten.

Ook de software zelf kan complex worden, aangezien de bootloader de systeemstatus moet instellen en bepalen of het al dan niet veilig is om naar de toepassingscode te gaan.

Het gebruik van een aangepaste bootloader kan ontwikkelaars de broodnodige flexibiliteit voor hun toepassingen bieden, maar er bestaat een standaard voor firmware-update die geschikt is voor veel toepassingen en die geen werk van een ontwikkelaar vereisen: de ingebouwde firmware-update (DFU) van de USB-standaard. Deze kan worden gebruikt om de toepassingscode van een microcontroller in het veld te updaten via de USB-poort, wat het firmware-updateproces en de ontwikkelingscyclus aanzienlijk kan verkorten.

DFU is zo wijdverbreid geworden dat sommige leveranciers van microcontrollers zoals STMicroelectronics zelfs de voor de updates benodigde software als hardcode in hun ROM vastleggen. Degenen die dat niet doen, leveren vaak wel een voorbeeldcode over hoe DFU kan worden ondersteund.

Een microcontroller met DFU-capaciteit selecteren

De gemakkelijkste manier om DFU te ondersteunen, is een microcontroller te kiezen waarop de DFU reeds is opgenomen in het ROM, zoals de STM32 microcontrollers van STMicroelectronics. De apparaten die voor een ontwikkelaar het meest interessant zijn om mee te experimenteren zijn die op deSTM32 IoT Discovery Node en de STM32F429 Discovery Kit.

Afbeelding van STM32 IoT Discovery Node van STMicroelectronics

Afbeelding 1: de STM32 IoT Discovery Node van STMicroelectronics is gebaseerd op een ARM® Cortex®-M4 core met een STM32L475 MCU die de mogelijkheid tot gebruik van de DFU-modus biedt voor firmware-updates. Dit specifieke apparaat is ontworpen voor gebruik als een IoT node. (Bron afbeelding: STMicroelectronics)

De STM32 IoT Discovery Node is een goedkoop ontwikkelingsbord dat is ontworpen voor gebruik als een IoT sensor-node. Het bord heeft een aantal verschillende interfaces voor de verbinding van het bord, zoals Wi-Fi en Bluetooth. Wat interessant is, is dat de STM32L475 op het bord ontwikkelaars de mogelijkheid biedt tot het testen en gebruiken van DFU-capaciteit op een apparaat dat is ontworpen om met het internet te worden verbonden.

Voor ontwikkelaars die alleen DFU willen testen op een normaal apparaat dat zelfstandig moet werken, is de STM32F429 Discovery Kit een befaamde, goedkope ontwikkelingskit voor de STM32F4-microcontrollerserie. Laten we nu gaan kijken naar hoe een ontwikkelaar DFU kan testen op deze microcontrollers.

Afbeelding van STM32F429 Discovery Kit van STMicroelectronics

Afbeelding 2: de STM32F429 Discovery Kit van STMicroelectronics is gebaseerd op een ARM® Cortex®-M4 core. De MCU van dit goedkope ontwikkelingsbord biedt ook de mogelijkheid tot gebruik van de DFU-modus voor firmware-updates. (Bron afbeelding: STMicroelectronics)

Een eenvoudig voorbeeld van DFU

De toegang tot DFU is op elke microcontroller anders. Hier ziet u een eenvoudig voorbeeld van hoe een ontwikkelaar zijn firmware zou updaten op een apparaat waarop een STM32L475 MCU draait.

Als eerder gezegd bevatten de STM32-microcontrollers een in het ROM ingebouwde DFU bootloader. Om toegang tot die bootloader te krijgen moet een ontwikkelaar één van de BOOT-pennen met de aarde verbinden terwijl MCU aan het opstarten is. De BOOT-pennen bepalen in welke modus de MCU opstart, bijvoorbeeld flash, RAM of, zoals in ons geval, de DFU USB-modus.

Het voorbereiden van een toepassing om met behulp van DFU te downloaden vereist geen extra werk van de ontwikkelaar. GNU compilercollectie (GCC) en vele andere toolchains ondersteunen het genereren van een DFU-bestand wanneer een toepassing wordt gecompileerd. De enige truc die de ontwikkelaar hier moet kennen is weten waar dat bestand is opgeslagen: net als bij elke standaard toepassing, is het .dfu bestand te vinden in de map debug of objecten.

Het DFU-bestand lijkt sterk op andere recordformaten van de toepassingen zoals binaire, s-record- en hex-bestanden. Het bestandsformaat bevat adres- en gegevensinformatie die via de USB wordt doorgestuurd, verwerkt en vervolgens naar de in het flash opgegeven locatie wordt geschreven. Het proces verloopt zo naadloos dat een ontwikkelaar zelden of nooit het gebruikte protocol hoeft te onderzoeken. Dit wordt allemaal achter de schermen geabstraheerd, waardoor het firmware-updateproces en de ontwikkeling minder complex worden.

Er bestaan verschillende tools die ontwikkelaar kan gebruiken om de toepassing met behulp van DFU over te brengen naar hun microcontroller. Een algemeen commandoregel-tool dat kan worden gebruikt is dfu-util. Dit is zowel op Linux als Windows® beschikbaar als een open-source softwarepakket. Als ontwikkelaars met de STM toolchain werken, kunnen ze hun voordeel doen met de toepassing DfuSe van STMicroelectronics (Afbeelding 3).

Afbeelding van het DfuSe tool van STMicroelectronics

Afbeelding 3: het DfuSe-tool van STMicroelectronics kan worden gebruikt voor het programmeren van een DFU-bestand dat is gegenereerd door een compiler, bijvoorbeeld GCC, en op een microcontroller met DFU-capaciteit is geladen. (Bron afbeelding: Beningo Embedded Group)

DfuSe is een Windows GUI utiliteit die elk in DFU-modus opgestart en via USB met de computer verbonden STM32-apparaat zal detecteren. Ontwikkelaars kunnen informatie zoals de geprogrammeerde leverancier en product-ID's ophalen. Als de flash-ruimte niet correct beveiligd is, kunnen ze zelfs de geheugeninhoud van de MCU kopiëren en deze op de computer opslaan met behulp van het Upload Action-veld.

Bij gebruik van DfuSe zal een ontwikkelaar gewoonlijk alleen de secties Upgrade of Verify Action gebruiken. In deze zone kan een ontwikkelaar het DFU-toepassingsbestand selecteren en vervolgens de upgrade-knop selecteren. Vervolgens zal DfuSe het firmware-updateproces automatisch coördineren totdat het volledige bestand met succes op de MCU is geladen. Vervolgens kan de ontwikkelaar ervoor kiezen om te controleren of de afbeelding met succes werd ontvangen. Na de controle kunnen de BOOT-pennen worden teruggezet in de standaardconfigurate, bijvoorbeeld 'booten vanaf flash', en daarna wordt de modus ‘Leave DFU’ geselecteerd om de bijgewerkte firmware te uploaden en uit te voeren.

DFU gebruiken op apparaten zonder DFU ondersteuning

Als een microcontroller geen DFU bootloader in het ROM heeft, wil dit nog niet zeggen dat de ontwikkelaar geen DFU-capaciteit kan gebruiken. DFU is een USB klasse en wordt in veel USB stacks ondersteund. Dit betekent dat een ontwikkelaar net zo gemakkelijk DFU-capaciteit aan toepassings-frameworks kan toevoegen en toch een DFU-update kan uitvoeren.

De AT32UC3A3 van Microchip Technology heeft bijvoorbeeld geen ingebouwde DFU-modus (Afbeelding 4). Een ontwikkelaar kan een eenvoudige toepassingsnotitie volgen, die beschrijft hoe DFU werkt en hoe een microcontroller moet worden geconfigureerd om DFU correct te ondersteunen.

Afbeelding van Atmel AT32UC3A3 UC3-A3 XPLD AVR®32 MCU 32-bits AVR embedded-evaluatiebord

Afbeelding 4: het AT32UC3A3 UC3-A3 XPLD AVR®32 MCU 32-bits AVR embedded evaluatiebord heeft geen DFU on-chip maar er kan een framework USB code worden toegevoegd om de functie voor DFU firmware-update mogelijk te maken. (Bron afbeelding: Microchip Technology)

Tips en trucs voor het uitvoeren van firmware-updates

Het updaten van firmware in het veld hoeft niet noodzakelijkerwijs te gebeuren via een microcontroller met DFU-capaciteit. Een ontwikkelaar kan besluiten om een alternatieve benadering te gebruiken voor het updaten van de firmware omdat dit noodzakelijk of handiger is. In een dergelijke situatie dient de ontwikkelaar bij het uitvoeren van het firmware-updateproces een aantal belangrijke punten in acht te nemen. Dit zijn onder meer:

  • Een controlesom of hash gebruiken om de toepassing te controleren die naar het geheugen van de microcontroller wordt geschreven.
  • Een microcontroller selecteren met genoeg geheugen om een backupkopie van de firmware op te slaan, zodat de firmwareversie kan worden teruggezet als er iets mis mocht gaan.
  • Verifiëren dat, als de microcontroller een ingebouwde flashloader heeft, de eindgebruiker deze niet per ongeluk kan activeren.
  • Ervoor zorgen dat eventuele software-bootloaders zijn gecompileerd en geoptimaliseerd voor het formaat.
  • De flash-randapparatuur vergrendelen om uit het geheugen aflezen van de toepassing en reverse engineering onmogelijk worden gemaakt.
  • Er altijd voor zorgen dat de stackpointer, vectortabel en programmatellerregisters op de juiste toepassingswaarde zijn ingesteld.
  • Overwegen om alternatieve updatemethodes te gebruiken, bijvoorbeeld drag-n-drop updates met behulp van USB MSD zoals gedemonstreerd op het KL46Z Freedom Board (Afbeelding 5).

Afbeelding van het KL46Z Freedom Board van NXP Semiconductor

Afbeelding 5: KL46Z Freedom Board van NXP Semiconductor is een goedkoop ontwikkelings dat standaard geen DFU ondersteunt. Ontwikkelaars kunnen alternatieve updatemethodes gebruiken, zoals USB MSD, waarbij een nieuw firmwarebeeld naar het interne geheugen wordt gesleept en geplakt. (Bron afbeelding: NXP Semiconductor)

Conclusie

Bijna elk embedded systeem vereist een methode om de toepassingscode in het veld bij te werken om terugroepacties te voorkomen. Een complete nieuwe bootloader maken of een bestaande bootloader wijzigen kan voor complexiteits- en integratieproblemen in de ontwikkelingscyclus zorgen.

In plaats hiervan kunnen ontwikkelaars gebruik maken van de beproefde DFU-capaciteit in in de USB-standaard is ingebouwd om snel, efficiënt en vrijwel moeiteloos upgrades in het veld door te voeren. Om dit soepel te laten verlopen, moeten ontwikkelaars goed naar hun microcontrollers kijken om te bepalen of DFU is ingebouwd in hun microcontroller of dat ze een softwarestack moeten gebruiken die DFU-capaciteit mogelijk maakt.
DigiKey logo

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.

Achtergrondinformatie over deze auteur

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo is een embedded software consultant. Hij heeft meer dan 200 artikelen over embedded software ontwikkelingstechnieken gepubliceerd, is een veelgevraagde spreker en technische trainer en heeft drie universitaire graden, waaronder een Masters of Engineering bij de University of Michigan.

Over deze uitgever

De Noord-Amerikaanse redacteurs van DigiKey