Kontroler LPT na PCI
: 01 września 2011, 07:05
Witam.
Chciałem mieć trzy niezależne porty LPT w komputerze i zamontowałem dwa dodatkowe kontrolery na PCI.
Teraz łącznie z tym na płycie głównej są ich trzy. Lecz chcąc się posłużyć, myślę, że dość znanym kodem (zamieszczam poniżej) należy odwołać się do konkretnego LPT. 1, 2 bądź 3.
I tutaj pojawiają się schody, bo gdy adresuję porty według drugiego załącznika, mogę sterować jedynie LPT1 na płycie. Pozostałe kontrolery PCI pozostają martwe.
Załącznik1:
Załącznik 2
Zamieszczam linki, którymi posługiwałem się pisząc temat:
http://vlab.pjwstk.edu.pl/~vlabdemo/io/lpt/lpt.htmlhttp://www.elektroda.pl/rtvforum/topic851694.htmlPlus:
http://dhost.info/ky3orr/index.php?dzia ... _portu_lpt
Chciałem mieć trzy niezależne porty LPT w komputerze i zamontowałem dwa dodatkowe kontrolery na PCI.
Teraz łącznie z tym na płycie głównej są ich trzy. Lecz chcąc się posłużyć, myślę, że dość znanym kodem (zamieszczam poniżej) należy odwołać się do konkretnego LPT. 1, 2 bądź 3.
I tutaj pojawiają się schody, bo gdy adresuję porty według drugiego załącznika, mogę sterować jedynie LPT1 na płycie. Pozostałe kontrolery PCI pozostają martwe.
Załącznik1:
Kod: Zaznacz cały
//lptset.c
#include <stdio.h>
#include <string.h>
#include <sys/io.h>
#include <sys/perm.h>
#define BASEPORT 0x378
void help(void);
int main(int liczba, char *parametr[])
{
if (liczba > 1)
{
//ioperm otwiera port
ioperm(BASEPORT,1,1); //rejestr danych
ioperm(BASEPORT+1,1,1); //rejestr wejscia
ioperm(BASEPORT+2,1,1); //rejestr statusu
int wynik = 2;
// PISZ
wynik = strcmp(parametr[1],"-pisz");
if (wynik == 0)
{
if (liczba > 2)
{
wynik = atoi(parametr[2]); //atoi() -stringa na intrger
printf("Port danych ustawiono na : %Xh \n",wynik);
outb(wynik,BASEPORT);
printf("gotowe \n");
return 0;
}
else
{
printf("BLAD!!\n");
return 0;
}
}
// PISZ starus
wynik = strcmp(parametr[1],"-piszs");
if (wynik == 0)
{
if (liczba > 2)
{
wynik = atoi(parametr[2]); //atoi() -stringa na intrger
printf("Port statusu ustawiono na : %Xh\n",wynik);
outb(wynik,BASEPORT+2);
printf("gotowe \n");
return 0;
}
else
{
printf("BLAD!!\n");
return 0;
}
}
//CZYTAJ
wynik = strcmp(parametr[1],"-czytaj");
if (wynik == 0)
{
wynik = inb(BASEPORT);
printf("stan portu danych: %Xh\n",wynik);
return 0;
}
//PIN
wynik = strcmp(parametr[1],"-pin");
if (wynik ==0)
{
wynik = inb(BASEPORT+1);
printf("Stan portu do odczytu : %Xh\n",wynik);
wynik = inb(BASEPORT+2);
printf("Stan portu sterujacego : %Xh\n",wynik);
return 0;
}
//help
wynik = strcmp(parametr[1],"-h");
if (wynik == 0 | wynik != 0 )
{
help();
return 0;
}
}
else help();
return 0;
}
void help(void)
{
printf("\n lptset - ustawia i odczytuje wartości na porcie LPT \n\n");
printf("-pisz xxx pozwala włączyć poszczegóe piny w porcie LPT\n");
printf("-piszs xxx pozwala włączyć poszczegóe piny w porcie statusu LPT\n");
printf("paramet powinien być podany w formie dziesiętnej.\n");
printf("-czytaj pozwala odczytać stany pinów\n");
printf("-pin podaje stan portów tylko do odczytu\n");
printf("PROGRAM DZIALA TYLKO Z ROOT-a\n");
}
Kod: Zaznacz cały
[TABLE="width: 90%"]
[TR]
[/TR]
[TR]
[TD]0040:0008[/TD]
[TD]słowo[/TD]
[TD]adres bazowy LPT1[/TD]
[TD][B]378[/B][/TD]
[TD]3BC[/TD]
[/TR]
[TR]
[TD]0040:000A[/TD]
[TD]słowo[/TD]
[TD]adres bazowy LPT2[/TD]
[TD][B]278[/B][/TD]
[TD]378[/TD]
[/TR]
[TR]
[TD]0040:000C[/TD]
[TD]słowo[/TD]
[TD]adres bazowy LPT3[/TD]
[TD][B]3BC[/B][/TD]
[TD]278[/TD]
[/TR]
[TR]
[TD]0040:000E[/TD]
[TD]słowo[/TD]
[TD]adres bazowy LPT4[/TD]
[TD][B]2BC[/B][/TD]
[TD]2BC[/TD]
[/TR]
[/TABLE]
http://vlab.pjwstk.edu.pl/~vlabdemo/io/lpt/lpt.htmlhttp://www.elektroda.pl/rtvforum/topic851694.htmlPlus:
http://dhost.info/ky3orr/index.php?dzia ... _portu_lpt