#include <stdio.h>
#include <dos.h>
unsigned char GetCOMNum(unsigned int *Amount, unsigned int *COMA, unsigned int *COMB);
unsigned char GetLPTNum(unsigned int *Amount, unsigned int *PRT1);
unsigned char VerifySIO(unsigned int COM1, unsigned int COM2, unsigned int LPT);
unsigned char VerifyCOM(unsigned int COM);
unsigned char VerifyPRT(unsigned int LPT);
int main(void)
{
unsigned char bTestResult, bTemp;
unsigned int COMNum, LPTNum;
unsigned int COM1PORT, COM2PORT, LPTPORT;
printf("\n======================================");
printf("\n=== Nuvoton 2011-07-27===");
printf("\n=== NCT6681 LPT Test Ver 1.0===");
printf("\n======================================");
bTestResult = 99;
// bTemp = GetCOMNum(&COMNum, &COM1PORT, &COM2PORT);
// if (bTemp != 0) return 1;
bTemp = GetLPTNum(&LPTNum, &LPTPORT);
printf("1"); //debug
if (bTemp != 0) return bTestResult;
COM1PORT = 0x0000;
COM2PORT = 0x0000;
bTemp = VerifySIO(COM1PORT, COM2PORT, LPTPORT);
printf("2");
if (bTemp != 0) return bTestResult;
printf("\nCOM1: %04X", COM1PORT);
printf("\nCOM2: %04X", COM2PORT);
printf("\n LPT: %04X", LPTPORT);
bTemp = VerifyCOM(COM1PORT);
if (bTemp != 0) return bTestResult;
bTemp = VerifyCOM(COM2PORT);
if (bTemp != 0) return bTestResult;
bTemp = VerifyPRT(LPTPORT);
if (bTemp != 0) return bTestResult;
printf("\nPASS");
return 0x00;
}
/*unsigned char GetCOMNum(unsigned int *Amount, unsigned int *COMA, unsigned int *COMB)
{
unsigned int Equipment;
unsigned int Num;
unsigned int PORTA, PORTB;
Equipment = peek(0x40, 0x10);
Num = (Equipment & 0x0E00) >> 9;
if (Num > 4) return 1;
PORTA = peek(0x40, 0x00);
PORTB = peek(0x40, 0x02);
// if ((PORTA == 0x0000) && (PORTB == 0x0000) && (Num != 0)) return 2;
*Amount = Num;
*COMA = PORTA;
*COMB = PORTB;
return 0;
}*/
unsigned char GetLPTNum(unsigned int *Amount, unsigned int *PRT1)
{
unsigned int Equipment;
unsigned int Num;
unsigned int PRTPORT;
// Equipment = peek(0x40, 0x10);
// Num = (Equipment & 0xC000) >> 13;
// if (Num > 3) return 1;
// *Amount = Num;
// if (Num == 0) return 0;
PRTPORT = peek(0x40, 0x08);
if (PRTPORT != 0x0000)
{
*Amount = 1;
*PRT1 = PRTPORT;
return 0;
}
/*
PRTPORT = peek(0x40, 0x0A);
if (PRTPORT != 0x0000)
{
*PRT1 = PRTPORT;
return 0;
}
PRTPORT = peek(0x40, 0x0C);
if (PRTPORT != 0x0000)
{
*PRT1 = PRTPORT;
return 0;
}
*/
return 2;
}
unsigned char VerifySIO(unsigned int COM1, unsigned int COM2, unsigned int LPT)
{
unsigned char EFER, EFIR, EFDR;
unsigned int i;
unsigned char CHIPID_H, CHIPID_L, ucHi, ucLo, ucTemp;
for (i = 0; i < 2; i++)
{
if (i == 0) EFER = 0x2E;
else EFER = 0x4E;
EFIR = EFER;
EFDR = EFER + 1;
outportb(EFER, 0xAA);
outportb(EFER, 0x87);
outportb(EFER, 0x87);
outportb(EFIR, 0x20);
CHIPID_H = inportb(EFDR);
if (CHIPID_H != 0xB2) continue;
outportb(EFIR, 0x21);
CHIPID_L = inportb(EFDR);
if (CHIPID_L != 0x71) continue;
// Test BIOS SETTING
if (LPT != 0x0000)
{
ucHi = (unsigned char)(LPT >> 8);
ucLo = (unsigned char)LPT;
outportb(EFIR, 0x07);
outportb(EFDR, 0x01);
outportb(EFIR, 0x30);
ucTemp = inportb(EFDR);
if (ucTemp != 0x01) return 2;
outportb(EFIR, 0x60);
ucTemp = inportb(EFDR);
if (ucTemp != ucHi) return 2;
outportb(EFIR, 0x61);
ucTemp = inportb(EFDR);
if (ucTemp != ucLo) return 2;
}
if (COM1 != 0x0000)
{
ucHi = (unsigned char)(COM1 >> 8);
ucLo = (unsigned char)COM1;
outportb(EFIR, 0x07);
outportb(EFDR, 0x02);
outportb(EFIR, 0x30);
ucTemp = inportb(EFDR);
if (ucTemp != 0x01) return 2;
outportb(EFIR, 0x60);
ucTemp = inportb(EFDR);
if (ucTemp != ucHi) return 2;
outportb(EFIR, 0x61);
ucTemp = inportb(EFDR);
if (ucTemp != ucLo) return 2;
}
if (COM2 != 0x0000)
{
ucHi = (unsigned char)(COM2 >> 8);
ucLo = (unsigned char)COM2;
outportb(EFIR, 0x07);
outportb(EFDR, 0x02);
outportb(EFIR, 0x30);
ucTemp = inportb(EFDR);
if (ucTemp != 0x01) return 2;
outportb(EFIR, 0x60);
ucTemp = inportb(EFDR);
if (ucTemp != ucHi) return 2;
outportb(EFIR, 0x61);
ucTemp = inportb(EFDR);
if (ucTemp != ucLo) return 2;
}
return 0;
}
return 1;
}
unsigned char VerifyCOM(unsigned int COM)
{
unsigned char ucTemp, ucLC, ucNew;
if (COM == 0x0000) return 0;
// set baudrate
ucLC = inportb(COM + 3);
outportb(COM + 3, 0x83);
outportb(COM + 0, 0x01);
outportb(COM + 1, 0x00);
outportb(COM + 3, 0x03);
// internal loopback
ucTemp = inportb(COM + 4);
outportb(COM + 4, ucTemp | 0x10);
ucTemp = inportb(COM);
if (ucTemp != 0x55) ucNew = 0x55;
else ucNew = 0xAA;
outportb(COM, ucNew);
delay(10);
ucTemp = inportb(COM + 5);
if ((ucTemp & 0x01) == 0x00) return 1;
ucTemp = inportb(COM);
if (ucTemp != ucNew) return 1;
ucTemp = inportb(COM + 5);
if ((ucTemp & 0x01) == 0x01) return 1;
// restore setting
ucTemp = inportb(COM + 4);
outportb(COM + 4, ucTemp & 0xEF);
outportb(COM + 3, ucLC);
return 0;
}
unsigned char VerifyPRT(unsigned int LPT)
{
unsigned char ucTemp, ucNew;
if (LPT == 0x0000) return 0;
ucTemp = inportb(LPT);
if (ucTemp != 0x00) ucNew = 0x00;
else ucNew = 0x00;
outportb(LPT, ucNew);
ucTemp = inportb(LPT);
if (ucTemp != ucNew) return 1;
return 0;
}