Eche un vistazo a los dts de la placa que más se parezcan a su placa de desarrollo. Úselo como referencia y realice cambios en el dts de acuerdo con las diferencias entre la placa de referencia y su placa de desarrollo.
También echa un vistazo a lo siguiente:
- Proyecto de documentación Device-tree en eLinux (tiene una gran colección de enlaces para empezar a leer).
- Serie de artículos sobre los conceptos básicos del árbol de dispositivos.
- Tutorial de migración al árbol de dispositivos.
Mínimo reg
+ interrupt
ejemplo con dispositivo virtual QEMU
Nuestro ejemplo agregará el siguiente nodo del árbol de dispositivos al versatilepb
árbol de dispositivos que utilizará QEMU debido a -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>;
};
Luego, mediante el uso de un módulo del kernel de Linux para interactuar con el dispositivo, probaremos las siguientes características de DTS:
- registra direcciones
- IRQ
- leer propiedades personalizadas desde el controlador
Estos son los componentes principales del ejemplo:
- Linux versátil
.dts
parche en la bifurcación de Linuxreg
yinterrupt
números de coincidencia codificados en la máquina versátil QEMU (que representa el SoC)compatible
coincide con elplatform_driver.name
en el módulo del kernel e informa al kernel qué módulo manejará este dispositivo- también pasamos una propiedad personalizada al controlador:
lkmc-asdf = <0x12345678>;
, que se lee conof_property_read_u32
- el árbol de dispositivos se pasa al firmware de QEMU con el
-dtb
argumento
- Bifurcación QEMU:
- dispositivo que lee un registro y genera interrupciones
- insertar dispositivo en
-M versatilepb
- módulo kernel Escribe en la memoria en la sonda para probar cosas, lo que también genera una IRQ.
Los árboles de dispositivos tienen muchas más funciones que no hemos cubierto, pero este ejemplo debería ayudarlo a comenzar y permitirle jugar fácilmente con cualquier función nueva que surja.
Más recursos:
- tutorial indispensable de elinux:http://elinux.org/Device_Tree_Usage
- juega con
dtc
para cuestiones puramente sintácticas. Por ejemplo, muestra cómo los nodos simplemente se fusionan por ruta:https://unix.stackexchange.com/a/375923/32558 - https://unix.stackexchange.com/questions/118683/what-is-a-device-tree-and-a-device-tree-blob
Tomemos un ejemplo y explicaré cada uno de ellos a continuación
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";
};
Propiedades requeridas:
- compatible:debe ser "fsl,-auart". Los SoC compatibles incluyen imx23 e imx28.
- reg :Dirección y longitud del registro establecido para el dispositivo
- interrupciones:debe contener los números de interrupción auart
- dmas:especificador de DMA, que consiste en un nodo controlador de phandle to DMA y un ID de canal AUART DMA.
- nombres dma:"rx" para el canal RX, "tx" para el canal TX.
Nota:Cada puerto auart debe tener un alias correctamente numerado en el nodo "aliases".
Para propiedades más avanzadas, por favor vaya a este enlace, es muy útil
Explicación del árbol de dispositivos
¡Espero que ayude!