[pso] [Tema2][Linux]Problema enunt si implementare
Bogdan Nitu
nitubogdan_cc at yahoo.com
Thu Apr 8 19:00:54 EEST 2010
Am simplificat handlerul. Oricum eu sunt tot la faza de testare,
(nu este cod din tema) asadar este ok sa pun cod.
HANDLER:
unsigned char iir, ch = 0,lsr; // THREI
int sender = is_EnableTransmitterHoldingRegisterEmptyInterrupt(data->base);
iir = inb((data->base)+2);
if (sender) {
// daca sunt sender
if(cursorTransmitator<14)
outb(bufferTransmitator[cursorTransmitator], data->base);
lsr = inb((data->base)+5);
printk(LOG_LEVEL "T %x\n",lsr);
cursorTransmitator++;
}
else
{
ch = inb(data->base);
lsr = inb((data->base)+5);
printk(LOG_LEVEL "R %x ::: %c (%x)\n",lsr,ch,ch);
}
return IRQ_HANDLED;
IN FUNCTIA WRITE:
struct so2_device_data *data =
(struct so2_device_data *) file->private_data;
// activez intreruperile
set_EnableTransmitterHoldingRegisterEmptyInterrupt(COM1_BASE);
unset_EnableTransmitterHoldingRegisterEmptyInterrupt(COM1_BASE);
return 1;
IN FUNTCITA INIT A MODULULUI:
- macroul din laboratorul de anul trecut SET_LINE pe ambele comuri
- Aux2 in MCR pe ambele
- 14 octeti fifo pe ambele
- dezactivare DLAB pe ambele
- si activare RDAI
----------------------------------------------------------
----------------------------------------------------------
cand scriu echo -n "b" > /dev/com1
in dmesg am:
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
T 60
COM1 closed
R 61 ::: Z (5a)
R 61 ::: a (61)
R 61 ::: b (62)
R 61 ::: c (63)
R 61 ::: d (64)
R 61 ::: e (65)
R 61 ::: f (66)
R 61 ::: g (67)
R 61 ::: h (68)
R 61 ::: i (69)
R 61 ::: j (6a)
R 61 ::: k (6b)
R 61 ::: l (6c)
R 60 ::: m (6d)
T - transmitator
R - receptor
60, 61 valoarea LSR-ului (decat primul bit Data Available mai sufera o schimbare)
De ce mi se genereaza asa tarziu RDAI?
Practic sunt nevoit ca la iesire din handler, threi sa il dezactivez, si sa il
reactivez cand DATA available devine 0 (ultima intrerupere RDAI).
--- On Thu, 4/8/10, Razvan Deaconescu <razvan.deaconescu at cs.pub.ro> wrote:
From: Razvan Deaconescu <razvan.deaconescu at cs.pub.ro>
Subject: Re: [pso] [Tema2][Linux]Problema enunt si implementare
To: "Proiectarea Sistemelor de Operare" <pso at cursuri.cs.pub.ro>
Date: Thursday, April 8, 2010, 5:23 PM
On Thu, 2010-04-08 at 05:29 -0700, Bogdan Nitu wrote:
> Salut!
>
> Intrebarea este urmatoare: daca eu sunt la unul dintre capete (sa
> zicem COM2) am voie sa activez/dezactivez intreruperi pe portul
> celalalt (COM1) ?
>
<snip>
>
> Este ok solutia, am voie? Va rog sa imi raspundeti, ca tot ma chinui
> la problema asta de ceva vreme.
Nu ar trebui sa ajungi sa dezactivezi intreruperile unui port folosind
driverul altui port.
Intreruperile THREI ar trebui sa ti se activeze _doar_ cand ai FIFO-ul
hardware gol. Asa de repede se goleste buffer-ul incat vine o noua
intrerupere THREI? Sigur rulezi cat de rapid se poate intreruperea?
Pentru a nu veni in nestire, recomandam ca intreruperile THREI sa fie
dezactivate/reactivate la sfarsitul functiei write.
> Si o alta intrebare scurta, bufferul circular ce dimensiune trebuie sa
> aiba?
De ce ar fi relevant?
Razvan
_______________________________________________
pso mailing list
pso at cursuri.cs.pub.ro
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/lurker/list/pso.html/attachments/20100408/9b1d9248/attachment.htm>
More information about the pso
mailing list