Ich versuche zu lernen, wie man einen grundlegenden SPI-Treiber schreibt und unten ist die Probe-Funktion, die ich geschrieben habe.SPI Linux Treiber
Was ich versuche, hier zu tun ist, richten Sie das spi Gerät für Fram (datasheet) und verwenden Sie den spi_sync_transfer()
api description den Hersteller id aus dem Chip zu erhalten.
Wenn ich diesen Code ausführen, kann ich die Daten auf dem SPI-Bus mit Logikanalysator sehen, aber ich kann es nicht mit dem RX-Puffer lesen. Fehle ich hier etwas? Könnte mir bitte jemand dabei helfen?
static int fram_probe(struct spi_device *spi)
{
int err;
unsigned char ch16[] = {0x9F,0x00,0x00,0x00};// 0x9F => 10011111
unsigned char rx16[] = {0x00,0x00,0x00,0x00};
printk("[FRAM DRIVER] fram_probe called \n");
spi->max_speed_hz = 1000000;
spi->bits_per_word = 8;
spi->mode = (3);
err = spi_setup(spi);
if (err < 0) {
printk("[FRAM DRIVER::fram_probe spi_setup failed!\n");
return err;
}
printk("[FRAM DRIVER] spi_setup ok, cs: %d\n", spi->chip_select);
spi_element[0].tx_buf = ch16;
spi_element[1].rx_buf = rx16;
err = spi_sync_transfer(spi, spi_element, ARRAY_SIZE(spi_element)/2);
printk("rx16=%x %x %x %x\n",rx16[0],rx16[1],rx16[2],rx16[3]);
if (err < 0) {
printk("[FRAM DRIVER]::fram_probe spi_sync_transfer failed!\n");
return err;
}
return 0;
}
Hier sind viele Probleme mit diesem Code. Vor allem ist es kein SPI-Treiber. Zweitens müssen Sie verstehen, wie Sie mit SPI im Kernel und im Benutzerbereich kommunizieren.Drittens müssen Sie lernen, wie der SPI-Bus auf Hardwareebene funktioniert. Was signalisiert es und wie werden sie im Laufe der Zeit verändert? – 0andriy
Der Kernel hat zwei Arten von Treibern, die man SPI-Treiber nennen könnte. Dies scheint die Sondenfunktion eines 'spi_driver' zu sein, die durch Registrieren eines' struct spi_driver' mit 'module_spi_driver()' erzeugt wird. Also denke ich, es ist durchaus vernünftig, es einen SPI-Treiber zu nennen. Die andere Art wäre ein Master-Treiber, definiert durch eine 'struct spi_master' und registriert mit' spi_register_master() '. – TrentP
@TrentP, Dies ist nicht SPI Master-Treiber, ich stehe behoben. – 0andriy