Introduzione

Dopo aver progettato una carrier board personalizzata per un Variscite System on Module, una delle prime attività del software è aggiungere supporto al kernel Linux. Ciò consiste in:

  1. Aggiungere una nuova struttura ad albero dei dispositivi al kernel Linux
  2. Aggiungere dispositivi alla struttura ad albero dei dispositivi
  3. Abilitare i driver nella configurazione del kernel per ogni dispositivo

Questa guida mostra come aggiungere nuovi file all’albero dei dispositivi e configurare nuovi dispositivi nella relativa struttura ad albero. Visita la Guida alla configurazione del kernel di Variscite per scoprire come abilitare i driver nella configurazione del kernel.

Cos’è una struttura ad albero dei dispositivi?

La struttura ad albero dei dispositivi, o albero dei dispositivi, è una struttura di nodi che descrive l’hardware del sistema al kernel Linux. Durante il processo di avvio, U-Boot carica l’albero dei dispositivi dal file system in memoria. Il kernel Linux analizza quindi l’albero dei dispositivi in fase di esecuzione e alla fine chiamerà la funzione sonda per ciascun driver.

L’albero dei dispositivi include solo i dispositivi che non possono essere scoperti automaticamente. Ad esempio, l’albero dei dispositivi deve definire i controller USB SoC, ma il kernel può rilevare i dispositivi USB in fase di esecuzione.

File dell’albero dei dispositivi Variscite

I file dell’albero dei dispositivi Variscite i.MX8 si trovano nella directory arch/arm64/boot/dts/freescale nell’albero dei sorgenti di Linux e sono creati utilizzando una combinazione di file SoC NXP, Variscite SoM e file della carrier board Variscite. Ogni carrier board deve avere un albero dei dispositivi univoco che includa il relativo albero dei dispositivi SoM di Variscite. La Figura 1 che segue mostra un esempio di file dell’albero dei dispositivi per i kit di valutazione VAR-SOM-MX8M-MINI e DART-MX8M-MINI di Variscite:

arch/arm64/boot/dts/freescale/

imx8mm.dtsi

imx8mm-var-dart.dtsi
imx8mm-var-dart-dt8mcustomboard.dts

imx8mm-var-som.dtsi
imx8mm-var-som-symphony.dts

Getting Started with Variscite Device Trees_Figure 1

Figura 1: Esempio di file dell’albero dei dispositivi SoC, SoM e carrier board per i kit di valutazione Variscite VAR-SOM-MX8M-MINI e DART-MX8M-MINI.

 

DART-MX8M-MINI System on Module (SoM)

DART-MX8M-MINI System on Module

 

Aggiungere nuovi file all’albero dei dispositivi

È consigliabile creare un nuovo albero dei dispositivi per la tua carrier board personalizzata. Sebbene sia possibile modificare direttamente l’albero dei dispositivi di Variscite, ciò renderà più difficile il trasferimento delle modifiche alle versioni Linux più recenti poiché è probabile che si verifichino conflitti nel merge. Quando si creano nuovi file dell’albero dei dispositivi, esistono due approcci:

1. Includere l’albero dei dispositivi a livello di SoM di Variscite e aggiungere tutti i nodi necessari. Questo approccio è ideale se la tua carrier board è significativamente diversa dal kit di valutazione di Variscite. Ad esempio:

arch/arm64/boot/dts/freescale/imx8mm-var-som-customer.dts

/dts-v1/;
#include “imx8mm-var-som.dtsi”

2. Includere l’albero dei dispositivi EVK di Variscite ed estenderlo per aggiungere e rimuovere dispositivi per la tua carrier board. Questo approccio è ideale se la tua carrier board è simile all’EVK di Variscite. Ad esempio:

arch/arm64/boot/dts/freescale/imx8mm-var-som-customer.dts

/dts-v1/;
#include “imx8mm-var-som-symphony.dts”

Quindi, aggiungere il nuovo albero dei dispositivi al Makefile in modo che venga creato dal target Make ‘dtbs’:

arch/arm64/boot/dts/freescale/Makefile

dtb-$(CONFIG_ARCH_MXC) += imx8mm-var-som-customer.dtb

Aggiungere nuovi dispositivi

Di seguito è riportato un processo generale per aggiungere nuovi nodi di dispositivo all’albero dei dispositivi:

1. Trovare i binding dell’albero dei dispositivi

Quando si aggiungono nuovi nodi di dispositivo, la prima risorsa da utilizzare sono i binding dell’albero dei dispositivi nella documentazione del kernel. I binding dell’albero dei dispositivi riconosciuti dal kernel sono documentati in Documentation/DeviceTree/Bindings.

Un modo per trovare i binding dell’albero dei dispositivi per il dispositivo consiste nell’aprire la cartella Documentazione per il modello di dispositivo. L’esempio seguente mostra come trovare la documentazione per l’orologio in tempo reale DS1337 utilizzato su alcuni kit di valutazione Variscite:

linux-imx$ grep ds1337 -lr ./Documentation/

./Documentation/devicetree/bindings/rtc/rtc-ds1307.txt

2. Aggiungere nodi del dispositivo all’albero dei dispositivi

Successivamente, seguire la documentazione dei binding per aggiungere un nuovo nodo all’albero dei dispositivi. La documentazione relativa ai binding dell’albero dei dispositivi fornirà una descrizione del dispositivo, le proprietà obbligatorie e opzionali e un esempio di nodo del dispositivo.
Ad esempio, ecco la documentazione per l’orologio in tempo reale DS1337 (dal ramo del kernel 5.4-2.3.x-imx_var01):
https://github.com/varigit/linux-imx/blob/5.4-2.3.x-imx_var01/Documentation/devicetree/bindings/rtc/rtc-ds1307.txt

Può anche essere utile cercare la stringa compatibile in arch/arm64/boot/dts, ad esempio nodi su piattaforme simili.

3. Creare, installare e testare il nuovo albero dei dispositivi

Dopo aver aggiunto i nuovi nodi del dispositivo, prova il nuovo dispositivo ricostruendo l’albero dei dispositivi e distribuendolo sul dispositivo di destinazione. Innanzitutto, configura il tuo ambiente utilizzando l’SDK fornito da Yocto:

linux-imx$ source /opt/<sdk>/<sdk version>/environment-setup-aarch64-fslc-linux

Nota: Per scoprire come installare l’SDK, visita https://variwiki.com, clicca sul SOM e sulla versione Yocto che desideri utilizzare, quindi clicca sul link «Installazione della Toolchain per le build fuori da Yocto».

Quindi, crea l’albero dei dispositivi:

linux-imx$ make mrproper
linux-imx$ make imx8_var_defconfig
linux-imx$ make dtbs

Distribuisci l’albero dei dispositivi sul tuo dispositivo di destinazione tramite Ethernet:

linux-imx$ scp arch/arm64/boot/dts/freescale/imx8mn-var-som-customer.dtb root@<target ip address>:/boot/

Infine, configura il dispositivo di destinazione per avviare il nuovo albero dei dispositivi:

root@imx8mm-var-dart:~# fw_setenv fdt_file imx8mn-var-som-customer.dtb
root@imx8mm-var-dart:~# reboot

Nota: Dovresti anche verificare che il driver del dispositivo sia abilitato nella configurazione del kernel. Consulta la  Guida alla configurazione del kernel Variscite per maggiori informazioni.

 

VAR-SOM-MX8M-MINI System on Module (SoM)

VAR-SOM-MX8M-MINI SoM

 

Suggerimenti per il debug

L’albero dei dispositivi non si avvia?

È possibile che un albero o un driver del dispositivo configurati in modo errato possano causare il mancato avvio del sistema. Se ti trovi in questa situazione, può essere utile seguire questa procedura:

  • Inizia con un albero minimo dei dispositivi che si avvia rimuovendo o disabilitando i nodi del dispositivo
  • Aggiungi e testa un singolo dispositivo alla volta
  • Apporta piccole modifiche iterative
  • Quando aggiungi e provi nuovi dispositivi, registra le modifiche usando Git in modo da avere un albero dei dispositivi funzionante da ripristinare

Il driver non esegue la verifica?

Di seguito sono riportati alcuni suggerimenti per il debug se il driver non esegue la verifica dopo aver aggiunto il nodo del dispositivo:

  • Verifica che il driver sia abilitato nella configurazione del kernel
  • Verifica che il dispositivo sia abilitato nell’albero dei dispositivi (status = “okay”)
  • Verifica che i binding del dispositivo corrispondano alla documentazione
  • Cerca altri esempi in arch/arm64/boot/dts
  • Controlla che dmesg non presenti errori relativi al driver

Il flusso di lavoro per la modifica e il test dell’albero dei dispositivi può essere eseguito in pochi secondi:

  1. Modifica l’albero dei dispositivi
  2. $ make dtbs
  3. $ scp arch/arm64/boot/dts/freescale/<device tree> root@<ip addr>:/boot/
  4. Riavvia la board

Per verificare che il flusso di lavoro funzioni e che si stia avviando l’albero dei dispositivi aggiornato, può essere utile controllare /sys/firmware/devicetree per verificare che il kernel abbia analizzato correttamente l’albero dei dispositivi aggiornato.

Riepilogo

Gli alberi dei dispositivi sono responsabili della descrizione dell’hardware al kernel Linux. Variscite fornisce i file dell’albero dei dispositivi di riferimento per ciascuno dei suoi SoM e le carrier board del kit di valutazione che possono essere utilizzate come riferimento o estese per carrier board personalizzate. Per ulteriore assistenza, visita il software wiki di Variscite, che fornisce guide dettagliate per ciascuno dei moduli e dei sistemi operativi supportati di Variscite.

Risorse correlate

Webinar: Getting Started with Device Trees on Variscite SOMs
Post sul blog: i.MX Device Tree Pinmux Settings
Post sul blog: Variscite Kernel Configuration Guide
Post sul blog: Creating a Custom Yocto BSP Layer
Post sul blog: Disabling Unused Drivers and Peripherals in Linux