Linux Step By Steps
ISAPNP-Programming-Isolation

UP

INTERFACE
SERIAL NUMBER
RECORDS
DECODES
REGISTERS


The process of detecting individual pnp cards is part of the serial isolation process. Initially, all pnp cards have their csn, (card select number) reset to 0 with the following C psuedo code.

    outp(0x279,2);        // set the address (function) register to configuration control
    outp(0x2A9,4);      // reset all csn's to 0

ALL cards are then told to wakeup and respond to all commands

    outp(0x279,3);          // set the address (function) register to   wakeup
    outp(0x2A9,0);         // select logical board 0, ie ALL cards because all cards have a csn of 0

all cards are then told their common read address

    outp(0x279,0);       // select the 'set read port address'
    outp(0x2A9,some address>>2);  // tell all cards with a csn of zero to send data on this address

    outp(0x279,1);     // all cards are asked to return their serial number on the above address


Each card has a unique, 72 bit, serial number burnt into that card at time of manufacture.

The 72 bits consist of 8 bytes of encoded data, followed by an 8 bit checksum.

For any 'one bit', the card sends AA55 (two bytes) on the read address.
For any 'zero bit', the card sends nothing (tristate), but 'listens' instead.

In this way, all cards are initially responding, only the card with the most 'one bits' will be detected. Other cards, having a zero bit send nothing but detect that the read data bus has 0xAA55 on it. Since they did not do this, another card must have, and they stop responding and go back to sleep.

*In fact, the other cards are only looking at bits 0 and 1 of each byte sent to see if they are 10 and 01 respectively. (Meaning some other card is responding on the bus with a 'one bit' even though, they aren't).

 
1st Card  1x..........
2nd Card  11x1xx1x
Interface 11010010

The second card in the above example becomes logical card 1 with a csn of 1. The software assigns this value to this card with

    outp(0x279,6);        // set the csn function
    outp(0x2A9,1);      // set this card to csn 1

No other card will be affected, because, by this time, all other cards have gone back to sleep.

The process then repeats itself where all remaining cards (with a csn of zero) are woken up again, another card detected and an incremented value set in the csn.

Psuedo code would look like this

    reset_cards();     //reset all csns to 0.

    sample_address=0x203;

    csn=1;

for (ever)
{
    wake_up(0);    // all cards with a csn of 0
    if (read(sample_address,72))    set_csn(csn++);
    else
   {
        if (csn>1) break;  // all cards found at a specific read address
        sample_address+=8;
   }
}

Once all cards have been 'isolated', eg their read port address and their csn set. The pnp interface will respond in a traditional manner. Ie the data read from the read port of a card is genuine 8 bit data, rather than pseudo serialised one bit words (0xAA55).