Dai un'occhiata ai dts della scheda che assomiglia di più alla tua scheda di sviluppo. Usalo come riferimento e apporta modifiche al dts in base alle differenze tra la scheda di riferimento e la tua scheda di sviluppo.
Controlla anche quanto segue:
- Progetto Device-tree Documentation su eLinux (ha una vasta collezione di link per iniziare a leggere).
- Serie di articoli sulle basi dell'albero dei dispositivi.
- Procedura dettagliata della migrazione all'albero dei dispositivi.
Minimo reg
+ interrupt
esempio con dispositivo virtuale QEMU
Il nostro esempio aggiungerà il seguente nodo dell'albero dei dispositivi a versatilepb
albero dei dispositivi che QEMU utilizzerà a causa di -M versatilepb
:
[email protected] {
compatible = "lkmc_platform_device";
reg = <0x101e9000 0x1000>;
interrupts = <18>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&pclk>;
clock-names = "apb_pclk";
lkmc-asdf = <0x12345678>;
};
Quindi, utilizzando un modulo del kernel Linux per interagire con il dispositivo, testeremo le seguenti funzionalità DTS:
- registra gli indirizzi
- IRQ
- leggere le proprietà personalizzate dal driver
Questi sono i componenti principali dell'esempio:
- Linux versatile
.dts
patch sul fork di Linuxreg
einterrupt
numeri di corrispondenza codificati nella macchina versatile QEMU (che rappresenta il SoC)compatible
corrisponde aplatform_driver.name
nel modulo del kernel e informa il kernel quale modulo gestirà questo dispositivo- passiamo anche una proprietà personalizzata al driver:
lkmc-asdf = <0x12345678>;
, che viene letto conof_property_read_u32
- l'albero dei dispositivi viene passato al firmware di QEMU con
-dtb
argomento
- Forcella QEMU:
- dispositivo che legge un registro e genera interrupt
- inserisci il dispositivo in
-M versatilepb
- modulo del kernel Scrive in memoria su probe per testare le cose, che genera anche un IRQ.
Le strutture dei dispositivi hanno molte altre funzionalità che non abbiamo trattato, ma questo esempio dovrebbe aiutarti a iniziare e consentirti di giocare facilmente con le nuove funzionalità che si presenteranno.
Ulteriori risorse:
- Tutorial Elinux indispensabile:http://elinux.org/Device_Tree_Usage
- gioca con
dtc
per questioni puramente sintattiche. Ad esempio, mostra come i nodi vengono semplicemente uniti per percorso:https://unix.stackexchange.com/a/375923/32558 - https://unix.stackexchange.com/questions/118683/what-is-a-device-tree-and-a-device-tree-blob
Facciamo un esempio e spiegherò ciascuno di essi come di seguito
auart0: [email protected] {
compatible = "fsl,imx28-auart", "fsl,imx23-auart";
reg = <0x8006a000 0x2000>;
interrupts = <112>;
dmas = <&dma_apbx 8>, <&dma_apbx 9>;
dma-names = "rx", "tx";
};
Proprietà richieste:
- compatibile :dovrebbe essere "fsl,-auart". I SoC supportati includono imx23 e imx28.
- reg :Indirizzo e lunghezza del registro impostato per il dispositivo
- interrupt :dovrebbe contenere i numeri di interrupt auart
- dmas:specificatore DMA, costituito da un phandle al nodo controller DMA e ID canale AUART DMA.
- dma-names:"rx" per canale RX, "tx" per canale TX.
Nota:ogni porta auart dovrebbe avere un alias correttamente numerato nel nodo "alias".
Per ulteriori proprietà avanzate, vai a questo link, è molto utile
Spiegazione dell'albero dei dispositivi
Spero ti sia d'aiuto!