[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