HowTo-Artikel zum Entwickeln eingebetteter Linux-Gerätetreiber als Kernelmodule. Der gesamte Inhalt dieses Artikels kann auf Raspberry Pi ausgeführt werden.
Ich habe bisher Gerätetreiber erstellt, diese aber jedes Mal manuell modifiziert. Dies mag während der Entwicklung in Ordnung sein, aber wenn es tatsächlich in das Produkt integriert wird, möchte ich, dass es automatisch geladen wird, wenn der Kernel gestartet wird.
Bisher habe ich die Datei MyDeviceModule.ko in meinem Entwicklungsverzeichnis erstellt. Kopieren Sie dies an den offiziellen Speicherort des Kernelmoduls. Dieser Speicherort hängt von der Kernel-Version ab, also holen Sie ihn sich mit uname
. Danach müssen Sie die Abhängigkeitsinformationen des Kernelmoduls aktualisieren. Verwenden Sie dazu den Befehl depmod
.
sudo cp MyDeviceModule.ko /lib/modules/$(uname -r)/kernel/drivers/.
sudo depmod -ae
Mit der obigen Kopie und den Einstellungen können Sie jetzt den von modprobe MyDeviceModule
erstellten Gerätetreiber von überall laden. Es ist in Ordnung, wenn Sie dies in dem Skript beschreiben, das beim Start ausgeführt wird (z. B. RC-Skript). Ich denke, dass es verschiedene Umgebungsabhängigkeiten gibt, aber in Raspeye scheint es, dass der Modulname in / etc / modules-load.d / modules.conf
beschrieben werden sollte. Eigentlich denke ich, dass es entschieden wird, indem man die Abhängigkeit von anderen Modulen berücksichtigt und wie schnell es gemäß den Produktspezifikationen geladen werden soll.
sudo bash -c 'echo MyDeviceModule >> /etc/modules-load.d/modules.conf'
Wenn Sie mit dmesg neu starten und das Protokoll anzeigen, können Sie feststellen, dass dieser Gerätetreiber beim Start geladen wird.
dmesg
[ 7.595531] sd 0:0:0:0: Attached scsi generic sg0 type 0
[ 7.955417] usb 1-1.3: reset high-speed USB device number 4 using dwc_otg
[ 8.097012] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 5390, rev 0502 detected
[ 8.124187] MyDeviceModule: loading out-of-tree module taints kernel.
[ 8.131765] mydevice_i2c_probe
[ 8.131785] slave address = 0x18
[ 8.132270] id = 0x33
[ 8.173190] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 5370 detected
[ 8.224829] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 8.231902] usbcore: registered new interface driver rt2800usb
[ 11.534982] Adding 102396k swap on /var/swap. Priority:-1 extents:1
Im Fall des Gerätetreibers, der den zuletzt erstellten Gerätebaum unterstützt, lädt der Kernel automatisch MyDeviceModule.ko, ohne / etc / modules-load.d / modules.conf
zu bearbeiten und explizit zu laden. Ich werde. Dies liegt anscheinend daran, dass der Kernel automatisch nach dem Gerätetreiber sucht und diesen lädt, der dem im Gerätebaum registrierten Gerät entspricht.
Endlich ist es vorbei! !! Ich bin froh, dass ich dieses Jahr fertig bin ~
Aus irgendeinem Grund habe ich plötzlich darüber nachgedacht und Artikel über Linux-Gerätetreiber insgesamt 12 Mal für ungefähr 10 Tage veröffentlicht. Ich beabsichtige, den Inhalt so zu gestalten, dass Anfänger, einschließlich ich, ihn verstehen können, während sie ihn tatsächlich ausprobieren. Es ist vielmehr eine Aufzeichnung dessen, was der Anfänger selbst in den letzten zwei Wochen gelernt hat.
Daher denke ich, dass es verschiedene fehlende Teile gibt. Beispielsweise sollte beim Zugriff auf Variablen eine exklusive Steuerung verwendet werden, die jedoch weggelassen wurde. Bevor ich die Adresse übersetze, sollte ich prüfen, ob auf die Adresse zugegriffen werden kann, aber ich habe das auch weggelassen. Diese wurden aus Gründen der Klarheit im Code und in der Beschreibung absichtlich weggelassen. Abgesehen davon denke ich jedoch, dass es viele Fehler gibt, die mir aufgrund meines Mangels an Wissen und Verständnis fehlen. Ich hoffe, Sie können in den Kommentaren immer mehr darauf hinweisen.
Der in dieser Serie beschriebene Inhalt ist nur ein kleiner Teil des Linux-Gerätetreibers. Außerdem ändern sich die Implementierungsmethode und die Regeln täglich. Sie müssen noch den Linux-Quellcode und die Dokumentation lesen, um die neuesten Informationen richtig zu erhalten. Wir hoffen, dass diese Serie als Sprungbrett für einen solchen nächsten Schritt dienen wird.
Abschließend möchten wir Yutaka Hirata, der "Linux Device Driver Programming" geschrieben hat, unseren tiefen Dank aussprechen. Es wird oft gesagt, dass man den Quellcode und die Dokumente lesen kann, aber am Anfang waren die Bücher, die auf Japanisch leicht verständlich erklärt wurden, sehr nützlich.
http://elixir.free-electrons.com/linux/v4.14/source https://people.freedesktop.org/~narmstrong/meson_drm_doc/index.html
Recommended Posts