Mínimo reg
+ interrupt
exemplo com dispositivo virtual QEMU
Como outros disseram, a árvore de dispositivos é fornecida por fornecedores de hardware e informa ao kernel do Linux como falar com dispositivos.
Talvez as duas informações mais notáveis que o kernel do Linux precisa são:
- registrar endereços. No ARM-land, você fala com dispositivos escrevendo para locais de memória física mágica que vão para o dispositivo em vez de memória. É assim que você diz ao dispositivo para começar a trabalhar.
- interromper números de linha. É assim que o dispositivo diz ao kernel que ele terminou de fazer alguma coisa.
Nosso exemplo adicionará o seguinte nó da árvore de dispositivos à árvore de dispositivos versatilepb
, que o QEMU usará em função de -M versatilepb
:
lkmc_platform_device@101e9000 {
compatible = "lkmc_platform_device";
reg = <0x101e9000 0x1000>;
interrupts = <18>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&pclk>;
clock-names = "apb_pclk";
lkmc-asdf = <0x12345678>;
};
Em seguida, usando um módulo do kernel do Linux para interagir com o dispositivo, testaremos os seguintes recursos do DTS:
- registra endereços
- IRQs
- leia as propriedades personalizadas do driver
Estes são os principais componentes do exemplo:
-
Linux versátil
.dts
patch no fork do Linux
-
reg
e interrupt
correspondem a números codificados na máquina versátil QEMU (que representa o SoC)
-
compatible
corresponde ao platform_driver.name
no módulo do kernel e informa ao kernel qual módulo manipulará este dispositivo
- também passamos uma propriedade personalizada para o driver:
lkmc-asdf = <0x12345678>;
, que é lido com of_property_read_u32
- a árvore de dispositivos é passada para o firmware do QEMU com o argumento
-dtb
garfo - QEMU:
-
módulo do kernel Grava na memória no probe para testar as coisas, que também gera um IRQ.
As árvores de dispositivos têm muito mais recursos que não foram abordados, mas este exemplo deve ajudá-lo a começar a usar facilmente todos os novos recursos que surgirem.
Mais recursos:
- tutorial indispensável de elinux: link
- brinca com
dtc
para perguntas puramente sintáticas. Por exemplo, mostra como os nós são simplesmente mesclados por caminho: link
- link