Re: 2 UARTy na jednym IRQ - czy da sie to zrobic w DOSie

Autor: Michal Schulz (szuler_at_venus.wmid.amu.edu.pl)
Data: Wed 20 Dec 2000 - 12:56:23 MET


On Wed, 20 Dec 2000, MariuszC wrote:

> Witam
>
> czy udalo sie komus obsluzyc 2 porty szeregowe (np COM1 i COM3) ktore
> wywoluja
> jedno przerwanie (standardowo IRQ4) w DOSie. Oczywiscie chodzi mi o
> calkowita
> kontrole nad tym, tzn oba UARTy sa obslugiwane w jednym programie, a
> jedna
> funkcja obslugi przerwania wywoluje konkretne funkcje odczytu z bufora
> UARTa.
> W wielu artykulach czytalem ze potrzebna jest specjalna wieloportowa
> karta I/O
> w ktorej istnieje dodatkowy rejestr z ktorego odczytuje sie, ktory port
> wymaga obslugi.
> Ale dorwalem tej jeden ktory stwierdza, ze da sie obsluzyc wiele portow
> na jednym
> IRQ, ale wlasnie jedynie gdy zajmuje sie tym jeden program. Tyle ze mi
> jakos to nie
> dziala. Ok, jeden port chodzi, ale jak otworze drugi - to ani jeden ani
> drugi nie odbiera
> wszystkich wyslanych danych.
> Jednak ciekawi mnie fakt, ze Windowsy radza sobie z tym problemem i sa w
> stanie
> obsluzyc tez dodatkowo inne urzadzenia pod jednym IRQ. A przeciez nie
> zmieniam
> nic w Sprzecie przy przechodzeniu do DOSa.

Jest taki rejestr w kazdym UAR'cie, nazywa sie IIR (interrupt id register)
i z niego nalezy korzystac. Mowi on co bylo zrodlem przerwania (lub zero
jesli ten uart nie generowal zadnego). Kawalek kodu (z mojego drivera)
wyglada tak:

void serial_int_13(HIDDT_IRQ_Handler *irq, HIDDT_IRQ_HwInfo *hw)
{
    UBYTE code;

    code = 1;

    if (csd->units[0])
        code = serial_inp(csd->units[0], UART_IIR) & 0x07;

    switch (code)
    {
        case UART_IIR_RLSI:
            (void)serial_inp(csd->units[0], UART_LSR);
            break;
        case UART_IIR_RDI:
            if (csd->units[0]) cos_co_odczyta_bajt(csd->units[0])
            break;
        case UART_IIR_MSI:
            (void)serial_inp(csd->units[0], UART_MSR);
            break;
    }

    code = 1;
    if (csd->units[2])
        code = serial_inp(csd->units[2], UART_IIR) & 0x07;
    switch (code)
 ... itd....

Nie zauwazylem jak narazie zeby nie dzialalo.

Jak chcesz wiedziec wiecej to info znajdziesz albo w zrodlach aros'a
(ftp.aros.org o ile sie nic nie zmienilo) albo linuxa.

Swoja droga smieszne ze winda jednak sobie z tym nie radzi :))))

pozdrowienia,

-- 
Michal Schulz
szuler_at_venus.wmid.amu.edu.pl


To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 21:03:54 MET DST