08-10-2000, 23:57
Also ich hab es jetzt geschafft mein Display das am Parallelport hängt anzusteuern.
Ich hab ein Programm für Win gefunden, dass ich für Linux umgeschrieben habe. Mein Problem ist aber, dass das Programm für Linux viel langsamer ist als das für Win.
Das ganze dürfte eigentlich nur an der Funktion liegen wo auf die Hardware zugegriffen wird.
Das ganze sieht unter Linux dann so auf:
void LCD_WriteData(unsigned char data)
{
outb(0x07,LPT_CONTROL); // RS=1, R/W=0, E=0
outb(data,LPT_DATA);
outb(0x06,LPT_CONTROL); // RS=1, R/W=0, E=1
outb(0x07,LPT_CONTROL); // RS=1, R/W=0, E=0
outb(0x05,LPT_CONTROL); // RS=1, R/W=1, E=0
usleep(1);
}
und unter Win:
static void LCD_WriteData (unsigned char data)
{
outport(LCD_CONTROL_ADDRESS,0x07); // RS=1, R/W=0, E=0
outport(LCD_DATA_ADDRESS,data);
outport(LCD_CONTROL_ADDRESS,0x06); // RS=1, R/W=0, E=1
outport(LCD_CONTROL_ADDRESS,0x07); // RS=1, R/W=0, E=0
outport(LCD_CONTROL_ADDRESS,0x05); // RS=1, R/W=1, E=0
delay(1); // 1ms delay
}
wobei jedesmal folgendes gilt:
#define LCD_DATA_ADDRESS 0x0378
#define LCD_CONTROL_ADDRESS LPT_DATA + 2
vorher ab ich unter Linux aber noch die Ports geöffnet:
if (ioperm(LPT_DATA, 3, 1))
{
fprintf(stderr, "Can't talk to I/O port!\n");
exit(-2);
}
ioperm(LPT_DATA, 1, 1);
if (ioperm(LPT_CONTROL, 3, 1))
{
fprintf(stderr, "Can't talk to I/O port!\n");
exit(-2);
}
ioperm(LPT_CONTROL, 1, 1);
tja, im Grunde sind die Programm fast gleich.
Allerdings hab ich in unter Linux usleep(1) verwendet und unter Win heißt es delay(1). Aber eigentlich ist doch usleep(1) viel kürzer. Wenn ich usleep weglasse ist der Abstand nicht groß genug und es werden nicht Zeichen ausgegeben.
Wenn jemand einen Tip hat bitte melden.
Besten Dank
Ich hab ein Programm für Win gefunden, dass ich für Linux umgeschrieben habe. Mein Problem ist aber, dass das Programm für Linux viel langsamer ist als das für Win.
Das ganze dürfte eigentlich nur an der Funktion liegen wo auf die Hardware zugegriffen wird.
Das ganze sieht unter Linux dann so auf:
void LCD_WriteData(unsigned char data)
{
outb(0x07,LPT_CONTROL); // RS=1, R/W=0, E=0
outb(data,LPT_DATA);
outb(0x06,LPT_CONTROL); // RS=1, R/W=0, E=1
outb(0x07,LPT_CONTROL); // RS=1, R/W=0, E=0
outb(0x05,LPT_CONTROL); // RS=1, R/W=1, E=0
usleep(1);
}
und unter Win:
static void LCD_WriteData (unsigned char data)
{
outport(LCD_CONTROL_ADDRESS,0x07); // RS=1, R/W=0, E=0
outport(LCD_DATA_ADDRESS,data);
outport(LCD_CONTROL_ADDRESS,0x06); // RS=1, R/W=0, E=1
outport(LCD_CONTROL_ADDRESS,0x07); // RS=1, R/W=0, E=0
outport(LCD_CONTROL_ADDRESS,0x05); // RS=1, R/W=1, E=0
delay(1); // 1ms delay
}
wobei jedesmal folgendes gilt:
#define LCD_DATA_ADDRESS 0x0378
#define LCD_CONTROL_ADDRESS LPT_DATA + 2
vorher ab ich unter Linux aber noch die Ports geöffnet:
if (ioperm(LPT_DATA, 3, 1))
{
fprintf(stderr, "Can't talk to I/O port!\n");
exit(-2);
}
ioperm(LPT_DATA, 1, 1);
if (ioperm(LPT_CONTROL, 3, 1))
{
fprintf(stderr, "Can't talk to I/O port!\n");
exit(-2);
}
ioperm(LPT_CONTROL, 1, 1);
tja, im Grunde sind die Programm fast gleich.
Allerdings hab ich in unter Linux usleep(1) verwendet und unter Win heißt es delay(1). Aber eigentlich ist doch usleep(1) viel kürzer. Wenn ich usleep weglasse ist der Abstand nicht groß genug und es werden nicht Zeichen ausgegeben.
Wenn jemand einen Tip hat bitte melden.
Besten Dank