So erstellen Sie einen eingebetteten Linux-Gerätetreiber (12) (vollständig)

12. Mal: Laden Sie den erstellten Gerätetreiber beim Start

Über diese Serie

HowTo-Artikel zum Entwickeln eingebetteter Linux-Gerätetreiber als Kernelmodule. Der gesamte Inhalt dieses Artikels kann auf Raspberry Pi ausgeführt werden.

Inhalt dieser Zeit

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.

Beim Start automatisch laden

Platzieren Sie den Gerätetreiber an einem formellen (?) Ort

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

Registrieren Sie sich bei dem Modul, das beim Start geladen werden soll

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'

Bestätigen

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 

Für Gerätebaum-kompatible Devadras

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.

__ Abschluss dieser Serie __

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

So erstellen Sie einen eingebetteten Linux-Gerätetreiber (12) (vollständig)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (8)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (1)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (4)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (7)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (2)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (3)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (5)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (10)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (9)
Wie man Yubico Yubikey von Manjaro Linux erkennt
So erstellen Sie ein interaktives CLI-Tool mit Golang
So erstellen Sie einen HTTPS-Server mit Go / Gin
[Python] Erstellen einer Adjazenzmatrix / Adjazenzliste [Graphentheorie]
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit Teil 2-
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit-Edition -
So erstellen Sie eine ISO-Datei (CD-Image) unter Linux
Wie erstelle ich eine japanisch-englische Übersetzung?
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
So bringen Sie den Druckertreiber für Oki Mac in Linux
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
So installieren Sie MBDyn (Linux Ubuntu)
[Blender] So erstellen Sie ein Blender-Plug-In
[Blender] So erstellen Sie Blender-Skripte mehrsprachig
Wie erstelle ich einen Crawler?
So erstellen Sie den MongoDB C-Sprachtreiber
So überprüfen Sie die Linux-Betriebssystemversion
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
So machen Sie Word Cloud-Zeichen monochromatisch
Wie baue ich meinen eigenen Linux-Server?
Wie man Selen so leicht wie möglich macht
[Linux] Unterteilen von Dateien und Ordnern
So installieren Sie das aws-session-manager-Plugin unter Manajro Linux
[Python] Wie man eine Klasse iterierbar macht
python3 So installieren Sie ein externes Modul
So erstellen Sie eine NVIDIA Docker-Umgebung
So konvertieren Sie Python in eine exe-Datei
Ich möchte wissen, wie LINUX funktioniert!
[Linux] Verwendung des Befehls echo
So aktualisieren Sie PHP unter Amazon Linux 2
So zeigen Sie Piktogramme unter Manjaro Linux an
So installieren Sie Pakete unter Alpine Linux
[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 2)
So bedienen Sie Linux von der Konsole aus
So installieren Sie das Windows-Subsystem für Linux
So schalten Sie Linux unter Ultra96-V2 aus
So aktualisieren Sie die Sicherheit unter CentOS Linux 8
Ich möchte ein Automatisierungsprogramm erstellen!
Wie installiere ich php7.4 unter Linux (Ubuntu)
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 1)