Treiberenwicklung Problemchen
-
Hi!
Ich spiele grad etwas mit Linux-Modul-Entwicklung herum, ist ne nette Sache. Ein paar Sachen drum-herum klappen aber nicht so, wie ich's gern hätte..
Also, ich hab meinen Mini-Treiber geschrieben, der ein Character-Device registriert. Der Treiber wird mit dem gcc erstellt, mit insmod eingefügt und erscheint bei lsmod. Dann führe ich "mknod treiber c 61 0" aus, um die Geräte-Datei zu erzeugen. Ist das eigentlich egal, wo die liegt, oder muss die im dev-Verzeichnis liegen? Und spielt der Name der Datei eine Rolle?
Naja, meine eigentliche Frage: Wenn ich "cat /proc/devices" ausführe, wird mein Treiber nicht mit-aufgelistet. Weiß jemand, woran das liegen könnte?
-
Badestrand schrieb:
Dann führe ich "mknod treiber c 61 0" aus, um die Geräte-Datei zu erzeugen. Ist das eigentlich egal, wo die liegt, oder muss die im dev-Verzeichnis liegen? Und spielt der Name der Datei eine Rolle?
Name spielt keine Rolle, die major und minor Zahlen (61, 0) sind die wichtigen.
Der Speicherort ist auch an sich nicht relevant, man sollte aber /dev aus Übersichtsgründen immer verwenden.Badestrand schrieb:
Naja, meine eigentliche Frage: Wenn ich "cat /proc/devices" ausführe, wird mein Treiber nicht mit-aufgelistet. Weiß jemand, woran das liegen könnte?
keine Ahnung, ohne Code kann man nur raten.
-
Danke für die schnelle Antwort! Der Code sieht so aus (minimal halt):
#include <linux/version.h> #include <linux/module.h> #include <linux/fs.h> MODULE_LICENSE( "LGPL" ); int driver_open( struct inode* device_file, struct file* caller ) { return 0; // Success } int driver_close( struct inode* device_file, struct file* caller ) { return 0; // Success } size_t driver_read( struct file* caller, char __user* puffer, size_t bytes, loff_t* offset ) { static const char* string = "Hallo Welt!"; static const int string_len = 12; int byte_count = bytes>string_len? string_len : bytes; __copy_to_user( puffer, string, byte_count ); return 0; // Count of bytes read } size_t driver_write( struct file* caller, char __user* puffer, size_t bytes, loff_t* offset ) { return 0; // Count of bytes written } struct file_operations fops = { .open = driver_open, .release = driver_close, .read = driver_read, .write = driver_write }; int init_module() { if ( register_chrdev( 61, "Treiber", &fops ) != 0 ) printk( "Fehler beim registrieren!" ); return 0; } void cleanup_module() { unregister_chrdev( 61, "Treiber" ); }
-
Alles merkwürdig, es wird nicht mal was nach /var/log/messages geschrieben:
#include <linux/version.h> #include <linux/module.h> MODULE_LICENSE( "GPL" ); int init_module() { printk( "Hallo Welt!\n" ); return 0; } void cleanup_module() { }
Makefile:
obj-m += rtc.ko all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
edit: Klappt auf einmal doch, versteh mir das mal einer
-
Mal noch ne Frage: Ich habe jetzt ein Character-Device-Modul registriert und kann mit "cat treiber" wunderbar Text daraus auslesen. Nur das reinschreiben gibt mir ein "permission denied", auch mit sudo.
Gibt's da nen Trick oder so?
PS: Reinschreiben mit
echo "blubb" > treiber
-
ehm - wie machst du das mit dem sudo? mit dem > operator ist das in zusammenhang mit sudo immer sone sache
versuch mal
sudo su -c "echo 'asdf' > /dev/treiber"
blan
-
Mist, das klappt nicht, hab ich nicht die Rechte für (arbeite grad per SSH)
-
Kann man das evtl irgendwie mit einem Shell-Skript machen? Ich bin leider total unbedarft mit diesen ganzen Sachen
-
das skript macht auch nur das automatisch was du von hand machst. also mein befehl sollte funktionieren - wenn ich das in eine datei umleite gehört diese root.
blan