Introduzione

Dopo aver progettato una scheda portante personalizzata per un Variscite System on Module / Computer on Module, una delle prime attività del software è aggiungere supporto al kernel Linux. Consiste di quanto segue:

  1. Aggiunta di un nuovo file dell’albero dei dispositivi al kernel Linux
  2. Aggiunta di dispositivi al file dell’albero dei dispositivi
  3. Abilitazione dei driver nella configurazione del kernel per ogni dispositivo

Questa guida illustra come abilitare i driver di dispositivo nel kernel Linux. Visita la guida “Getting Started with Variscite Device Trees” di Variscite per informazioni su come aggiungere nuovi nodi di dispositivo all’albero del dispositivi.

Defconfig del kernel

Il file defconfig è una rappresentazione minimale della configurazione del kernel. Contiene un elenco di driver che saranno compilati come integrati o come moduli. I driver integrati sono inclusi nel formato binario del kernel (image.gz/zimage/UImage). I moduli driver sono compilati in file .ko e installati nel root del filesystem “/lib/modules/…”.

La posizione del file defconfig nell’albero sorgente kernel Linux dipende dall’architettura SoC:

Per processori a 32 bit:

arch/arm/configs

Per processori a 64 bit:

arch/arm64/configs

Ad esempio, il defconfig per NXP i.MX8M Mini di Variscite si trova in:

arch/arm64/configs/imx8_var_defconfig

Il defconfig contiene un elenco dei driver disponibili. Ad esempio:

# CONFIG_CXD2880_SPI_DRV is not set
CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=m
CONFIG_CRC_ITU_T=m
CONFIG_CRC7=m
CONFIG_DMA_CMA=y

Sono disponibili tre opzioni di configurazione per ogni driver:

“is not set” Non sarà compilato
“=m” Verrà compilato e installato come modulo (file.ko)
“=y” Verrà compilato e installato come integrato

È da notare che, come specificato in precedenza, il file defconfig è una rappresentazione minimale della configurazione del kernel, quindi non elenca esplicitamente tutti i driver disponibili, ma si basa sui valori predefiniti e sulle dipendenze dei driver per rappresentare la configurazione completa.

 

DART-MX8M-MINI System on Module (SoM)

NXP iMX 8M Mini System on Module

 

Modifica della configurazione

  1. Non è consigliabile modificare direttamente defconfig. Piuttosto, il kernel dovrebbe essere configurato utilizzando il target Make “menuconfig”.
    Quanto segue mostra il processo per configurare il kernel per DART-MX8M-MINI/VAR-SOM-MX8M-MINI di Variscite:
    visita https://variwiki.com , clicca su SOM e sulla release Yocto da utilizzare, poi clicca sul link “Crea il kernel Linux dal codice sorgente”.
    Segui le istruzioni sulla pagina per scaricare il codice sorgente del kernel, modificare il ramo e configurare il cross-compiler.

    Ad esempio, di seguito il link per la release DART-MX8M-MINI/VAR-SOM-MX8M-MINI Yocto Hardknott:
    https://variwiki.com/index.php?title=Yocto_Build_Linux&release=RELEASE_HARDKNOTT_V1.0_DART-MX8M-MINI
  2. Configura il kernel utilizzando il defconfig predefinito per la scheda target. In questo esempio, utilizza:
    $ make imx8_var_defconfig

    Questo comando creerà un file di configurazione completo chiamato .config, basato su imx8_var_defconfig, nella radice dell’albero sorgente del kernel Linux. Tutte le modifiche ora verranno apportate al file .config .

  3. Le modifiche saranno apportate al file di configurazione utilizzando menuconfig:
    		
    $ make menuconfig
    Il seguente menu verrà aperto nella finestra del terminale

    Variscite Kernel Configuration Guide_Figure 1

    Figura 2: schermata del menuconfig del kernel

    All’interno della voce “Driver del dispositivo” tutti i driver disponibili saranno elencati con una casella di controllo a sinistra di ciascun driver. Di seguito le opzioni disponibili:
    [ ] -Non sarà compilato
    [M] – Verrà compilato e installato come modulo
    [*] – Verrà compilato e installato come integrato.
    Dopo aver modificato la selezione del driver, salvare ed uscire dalla configurazione. La nuova configurazione verrà scritta nel file .config .

  4. Compila il kernel con il comando make. Tale azione genererà l’immagine del kernel, i moduli e gli alberi del dispositivo.
    		
    $ make -j$(nproc)


    Dopo aver compilato il kernel, il binario (Image.gz/Zimage/uImage) sarà situato in  arch/arm64/boot/.

    E i blob compilati dell’albero del dispositivo (file.dtb) si troveranno in  arch/arm64/boot/dts/freescale/imx8*.

    Per installare i moduli nel root del file system, esegui:

    		
    $ make modules_install
    INSTALL_MOD_PATH=path_to_the_target_rootfs		
  5. Salva le modifiche al file defconfig

    Dopo aver apportato le modifiche con menuconfig, la nuova configurazione sarà salvata su .config. Per rendere permanenti le modifiche, aggiorna arch/arm64/configs/imx8_var_defconfig e memorizza su Git:
    		
    $ make savedefconfig $ mv defconfig arch/arm64/configs/imx8_var_defconfig $ git add arch/arm64/configs/imx8_var_defconfig $ git commit –m “commit message”

 

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

VAR-SOM-MX8M-MINI SoM

 

Trovare e abilitare i driver su defconfig

Per trovare i driver nel kernel, è meglio iniziare cercando nelle directory dei driver e della documentazione il modello del dispositivo. Il nome del file del driver può essere usato per trovare l’opzione di configurazione del kernel.

L’esempio seguente mostra come trovare e abilitare il driver per il clock in tempo reale ds1337, utilizzato in alcuni kit di valutazione Variscite:

1. Cerca il dispositivo nella directory “driver”:

$ grep -ir --include "*.c" "ds1337" ./drivers

Tale azione produrrà numerose corrispondenze per:

drivers/rtc/rtc-ds1307.c

2. Trova la stringa di configurazione cercando il Makefile nella stessa directory del file .c:

$ grep "rtc-ds1307" drivers/rtc/Makefile
obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o

3. Abilita CONFIG_RTC_DRV_DS1307 utilizzando menuconfig

$ make menuconfig

Variscite Kernel Configuration Guide_Figure 2
Cerca le opzioni di configurazione del kernel digitando ‘/’

Variscite Kernel Configuration Guide_Figure 3

Digita CONFIG_RTC_DRV_DS1307 e seleziona Ok, potrai consultare i risultati della ricerca:

Variscite Kernel Configuration Guide_Figure 4

Per selezionare il primo risultato della ricerca, digita ‘1’ e verifica che il driver sia abilitato:

Variscite Kernel Configuration Guide_Figure 5

Se il driver non è abilitato, seleziona  [*] or [M] , esci e salva. Verranno selezionate anche tutte le dipendenze necessarie e verrà scritta la nuova configurazione nel file .config

4. Salva le modifiche su

arch/arm64/configs/imx8_var_defconfig
$ make savedefconfig
$ mv defconfig arch/arm64/configs/imx8_var_defconfig

5. Crea l’immagine del kernel, i moduli e gli alberi del dispositivo

$ make -j$(nproc)

Passaggi successivi

Per i dispositivi che possono essere rilevati automaticamente, come un dispositivo USB, abilitare il driver nella configurazione del kernel potrebbe essere l’unica azione necessaria. Tuttavia, molti dispositivi richiedono l’aggiunta di uno o più nodi all’albero del dispositivo. Per saperne di più su come modificare l’albero del dispositivo Linux, consulta la guida “Getting Started with Variscite Device Trees” di Variscite o il software wiki di Variscite, che offre guide dettagliate per ciascuno dei moduli e sistemi opehttps://www.variscite.com/blog/getting-started-with-variscite-device-trees/rativi supportati di Variscite.

 

Risorse correlate

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