Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Smart Card - czytanie ATR pod LPT

mcm 13 Lis 2009 19:20 704 0
  • #1
    mcm
    Poziom 12  
    Nie wiem czy to dobry dział, ale do programowania to się chyba nie nadaje. Chciałbym podłączyć kartę Smart Card (testuję na karcie telefonicznej) pod LPT i sczytać ATR. Kupiłem slot, podlutowałem kabelki do wtyczki od LPT:
    VCC - D0
    RST - D1
    CLK - D2
    I/O - D3
    VPP - D4
    Sprawdziłem miernikiem czy port działa jak mu każę, jest 0 lub 4,6V czyli ok. Niestety karta odpowiada mi samymi 0'ami. Działam na linux'ie bo tylko tam mam lpt. Czy to ma w ogóle prawo działać? Kod programu:
    Code:
    #include <stdio.h>
    
    #include <sys/io.h>
    #include <sys/perm.h>

    #define BASEPORT 0x378

    /* piny */
    #define VCC 0b00000001
    #define RST 0b00000010
    #define CLK 0b00000100
    #define IO  0b00001000
    #define VPP 0b00010000
    /* shift'y */
    #define SRST 1
    #define SCLK 2
    #define SIO  3
    #define SVPP 4

    char readByte()
    {
       char byte=0,i=0,rb;
       while(i<8)
       {
          outb(VCC|CLK,BASEPORT); /* tak zegara przez 15 ms */
          usleep(15000);
          outb(VCC,BASEPORT);
          usleep(15000);
          byte <<= 1;
          byte |= ((inb(BASEPORT) >> SIO)&1);
          ++i;
       }
    }

    void reset()
    {
        outb(VCC|RST,BASEPORT);
        usleep(15000);
        outb(VCC|RST|CLK,BASEPORT);
        usleep(15000);
        outb(VCC|RST,BASEPORT);
        usleep(15000);
        outb(VCC,BASEPORT);
        usleep(15000);
    }

    int main(void)
    {
       char i;
       printf("ioperm %d\n",ioperm(BASEPORT,1,1)); /* ioperm otwiera port */
       reset();
       for(i=0;i<23;i++) /* ATR */   
          printf("read byte 0x%X\n",readByte());
       outb(0,BASEPORT); /* wylaczamy */
       return 0;
    }