Forum: Mikrocontroller und Digitale Elektronik Pin-Interrupt ISR soll Read auf Schnittstelle ausführen unter Linux


von Piwi (Gast)


Lesenswert?

Hi,

ich habe ein kleines Problem.

Folgende Situation:
Ich möchte von meinem RFID Transceiver Daten über SPI (/dev/spi1) 
auslesen.
Ich habe ein Embedded Linux System (Kernel 2.6.21.7) mit ein AT91RM9200.

-Der RFID Transceiver schickt einen Interrupt (steigende Flanke), den 
ich an PA23 angeschlossen habe.
Nun müsste ich es irgendwie hinbekommen, die read-funktion für die SPI 
Schnittstelle aufzurufen.
Ich habe bereits einen kleinen Kernel Treiber geschrieben, der eine 
Vabriable, die bei Interrupteintritt geändert wird, in einer 
Endlosschleife abfragt. Jedoch dauert das ausführen und das polling zu 
lange.
Ist es vielleicht möglich einen Thread im User Space aufzuwecken, der 
dann die Read-Funktion auf meine SPI-Schnittstelle ausführt und 
anschließend wieder schlafen gelegt wird?


Wie könnte ich das realisieren? Oder gibt es bessere Möglichkeiten???
Für einen Tip wäre ich dankbar...
Vielen Dank im Voraus!!

//ISR für PIN23 Interrupt:
static irqreturn_t triggerFromIDS_irq(int irq, void *pDevId){
       idsirq.lastState = idsirq.currState; 
idsirq.currState = gpio_get_value(AT91_PIN_PA23);
       if(idsirq.lastState < idsirq.currState){ 
//auswertung steigende Flanke
           gpio_set_value(AT91_PIN_PA21, N_ON);
           gpio_set_value(AT91_PIN_PA18, N_ON);
           ...
           ...
           //auslesen über SPI

       }
       else
       if(idsirq.lastState > idsirq.currState)               //fallende 
Flanke
           gpio_set_value(AT91_PIN_PA18, N_OFF);
             return IRQ_HANDLED;
}

von Peter D. (peda)


Lesenswert?

Wow, da kann man nicht meckern.
Wie kompliziert doch die einfachsten Sachen werden, wenn man sie auf nem 
32Bit-Boliden ausführen muß.

Gibts da nicht auch nen SPI-Interrupt?
Den gibts Du frei und läßt ihn den ganzen RFID-Kram machen.


Peter

von Thomas (Gast)


Lesenswert?

Der Weg in den User-Space kostet doch sicherlich mehr Zeit, als die 
Treiber untereinander benötigen?

Mein Ansatz wäre; SPI-Treiber direkt anpassen, dass dieser parallel zum 
SPI-Interrupt deinen PIN-Interrupt als Trigger zum lesen verwendet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.