This shows you the differences between two versions of the page.
so2:teme:tema2:faq [2017/03/23 21:12] adrian.stanciu [2 - Funcții blocante] |
so2:teme:tema2:faq [2017/03/23 21:48] (current) adrian.stanciu [3 - Legătura între read/write și întreruperi] |
||
---|---|---|---|
Line 43: | Line 43: | ||
[[http://cursuri.cs.pub.ro/lurker/message/20070413.104853.300f0d29.en.html | Context ]] | [[http://cursuri.cs.pub.ro/lurker/message/20070413.104853.300f0d29.en.html | Context ]] | ||
- | :?: În handler-ul pentru intrerupere <code c>irqreturn_t my_handler(int irq_no,void *dev_id,struct pt_regs *regs)</code> | + | :?: În handler-ul pentru intrerupere <code c>irqreturn_t my_irq_handler(int irq_no, void *dev_id)</code> |
putem să folosim dev_id astfel încât să refere serial[0] și serial[1] ? | putem să folosim dev_id astfel încât să refere serial[0] și serial[1] ? | ||
serial [0] de exemplu este : | serial [0] de exemplu este : | ||
- | <code c>err = request_irq(MY_IRQ1,my_handler,SA_INTERRUPT,"uart16550",&serial[0]);</code> | + | <code c>err = request_irq(MY_IRQ1, my_irq_handler, IRQF_SHARED, "uart16550", &serial[0]);</code> |
:!: Poți să înregistrezi același handler pentru ambele întreruperi (și MY_IRQ1 și MY_IRQ2); spre exemplu: | :!: Poți să înregistrezi același handler pentru ambele întreruperi (și MY_IRQ1 și MY_IRQ2); spre exemplu: | ||
<code c> | <code c> | ||
- | request_irq(MY_IRQ1,my_handler,SA_INTERRUPT,"uart16550",&my_serial[0]); | + | request_irq(MY_IRQ1, my_irq_handler, IRQF_SHARED, "uart16550", &my_serial[0]); |
- | request_irq(MY_IRQ2,my_handler,SA_INTERRUPT,"uart16550",&my_serial[1]); | + | request_irq(MY_IRQ2, my_irq_handler, IRQF_SHARED, "uart16550", &my_serial[1]); |
</code> | </code> | ||
Line 76: | Line 76: | ||
<code c> | <code c> | ||
- | struct structura_mea * sm = (struct structura_mea *) dev_id; | + | struct structura_mea *sm = (struct structura_mea *)dev_id; |
sm->base; | sm->base; | ||
</code> | </code> | ||
Line 86: | Line 86: | ||
:?: Din câte am înțeles, în write copiez din userspace într-un write buffer local. Write Bufferul este scris pe serial cu outb în handlerul de intrerupere. În read copiez în userspace dintr-un read buffer local. Read bufferul este umplut cu date primite pe serială(inb) în handlerul de întrerupere. Cum se leagă exact funcțiile de read și write de întrerupere? Mie îmi intră o singură dată în întrerupere la inițializarea modulului. | :?: Din câte am înțeles, în write copiez din userspace într-un write buffer local. Write Bufferul este scris pe serial cu outb în handlerul de intrerupere. În read copiez în userspace dintr-un read buffer local. Read bufferul este umplut cu date primite pe serială(inb) în handlerul de întrerupere. Cum se leagă exact funcțiile de read și write de întrerupere? Mie îmi intră o singură dată în întrerupere la inițializarea modulului. | ||
- | :!: La sfârșitul fiecărei funcții write va trebui fie să reactivați întreruperile <code c>outb(0x00, IER); outb (0x03, IER);</code> fie activați întreruperea de empty buffer doar când există ceva în buffer-ul device-ului de scris. | + | :!: RDAI trebuie să fie activă cât timp buffer-ul de citire nu este plin. Funcția de read ar trebui să activeze RDAI după ce a luat date din buffer-ul de citire iar handler-ul de întrerupere să dezactiveze RDAI dacă buffer-ul de citire devine plin. |
+ | THREI trebuie să fie activă cât timp buffer-ul de scriere nu este gol. Funcția de write ar trebui să activeze THREI după ce a pus date în buffer-ul de scriere iar handler-ul de întrerupere să dezactiveze THREI dacă buffer-ul de scriere devine gol. | ||
==== 4 - Buffer circular ==== | ==== 4 - Buffer circular ==== |