Ich versuche, einen SPI-Treiber für benutzerdefinierte Hardware zu implementieren. Ich habe mit einer Kopie des Spidev-Treibers begonnen, der fast alles unterstützt, was ich brauche.Benutzerdefinierter SPI-Treiber zur Implementierung von lseek
Wir verwenden ein Protokoll, das aus drei Teilen besteht: einem Befehlsbit (Lesen/Schreiben), einer Adresse und einer beliebigen Datenmenge.
Ich hatte angenommen, dass das Hinzufügen von LSEEK-Funktionen der beste Weg wäre, dies zu tun. Suchen Sie nach der gewünschten Adresse und lesen oder schreiben Sie eine beliebige Anzahl von Bytes. Ich habe ein benutzerdefiniertes .llseek in den file_operations des neuen Treibers erstellt, aber ich habe nie gesehen, dass diese Funktion überhaupt aufgerufen wird. Ich habe versucht, fseek(), lseek() und pread() zu verwenden, und keine dieser Funktionen scheint die neue Funktion my_lseek() aufzurufen. Jeder Anruf Berichte „errno 29 ESPIPE Illegal Suche“
Das Gerät in der board.c-Datei definiert ist:
static struct spi_board_info my_spi_board_info[] __initdata = {
[0] = {
.modalias = "myspi",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 3000000,
.mode = SPI_MODE_0,
.controller_data = &spidev_mcspi_config,
}, ...
ich vermute, es etwas mit der Art und Weise sein könnte, dass die dev-Dateien erstellt bekommen, vor allem, weil das Beispiel, dass ich Referenzen filp-> f_pos
static int myspi_llseek(struct file *filp, loff_t off, int whence)
{
...
newpos = filp->f_pos + off;
...
}
So sind meine Fragen gefunden: gibt es eine Möglichkeit, diese Treiber zu haben (leicht modifizierte spidev) unterstützen die „suchen“ nennen? An welchem Punkt wird errno 29 zurückgegeben? Muss ich von einem neuen Treiber starten und mich nicht auf die Installation von spi_board_info() und spi_register_board_info() verlassen können?
Nur ein Treiber im Verzeichnis/drivers/spi (spi-dw) verweist auf lseek und verwendet die Implementierung default_llseek. Es gibt ein paar "Hacks", die wir uns ausgedacht haben, um alles zum Laufen zu bringen, aber ich bin eher eine Person, die lernen will, es richtig zu machen.
Alle Vorschläge werden sehr geschätzt! (PS, die Kernel-Version ist 3.4.48 für ein OMAP Android-System)
Ich vermute, dass irgendwo, müssen Sie die * anfängliche * Position auf "0" statt "-1", aber ich habe dieses Zeug nie getan. – o11c
* "Nur ein Treiber im Verzeichnis/drivers/spi (spi-dw) verweist auf lseek ..." * - Das ist völlig irrelevant. Dieses Verzeichnis (außer spidev.c) ist für SPI-Master-Controller und nicht für SPI-Slave-Geräte. Die SPI-Protokolltreiber für SPI-Slave-Geräte sind in ihrem jeweiligen Subsystemverzeichnis gespeichert. IOW durch ihre * Funktionalität *, und nicht ihre (SPI) Schnittstelle. * "An welchem Punkt wird das definiert, um errno 29 zurückzugeben?" * - Hast du versucht, nach ESPIPE zu suchen? Bist du vergesslich und hast immer noch den Anruf zu ** no_llseek() ** in deinem Code? – sawdust
@ sawdust Ich habe sicherlich die Funktion "my_llseek()" in der file_operations-Struktur implementiert. – ColoradoIcculus