/* A4TEST.C - Testing the functionality ASIC4 Example Interface Board device driver A4Exif.ldd A comprehensive test program which checks I/O request functionality of A4Exif.ldd Written by Mal, January 31, 1995 */ #include #include #define BUFLEN 1 #define MAXBUF 8 #define SERREAD_TIMEOUT 20L #define FLASH_TIME 1L GLREF_D TEXT *DatCommandPtr; GLREF_D VOID *winHandle; LOCAL_D VOID *serH; /* serial channel handle */ LOCAL_D VOID *timH; /* timer channel handle */ LOCAL_D WORD serReadStat; /* serial channel status word */ LOCAL_D WORD timStat; /* timer channel status word */ LOCAL_D WORD keyStat; /* console channel status word */ LOCAL_D P_CON_KBREC kbrec; LOCAL_D TEXT buf[40]; LOCAL_D UBYTE wowbuf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; LOCAL_D TEXT *head="LED: "; LOCAL_C VOID PrintHeader(VOID) /* Prints the title at the start of the program */ { p_printf("*********************"); p_printf("Welcome to the ASIC 4"); p_printf("Example IF board test"); p_printf("program"); p_printf("*********************"); p_printf(".....\n"); p_getch(); } LOCAL_C VOID PrintInstructions(VOID) { p_printf("Type in the test number"); p_printf(" 0 => Alternate flash"); p_printf(" 1 => Asynchronous read"); p_printf(" 2 => Sense"); p_printf(" 3 => Set"); p_printf(" 4 => Memory"); p_printf(" q => Quit"); p_printf(" ....."); } LOCAL_C VOID LoadLdd(VOID) /* Loads the LDD A4Exif.ldd from anywhere and exits on failure */ { TEXT filename[128]; INT ret; p_printf("\nLOADLDD=>"); p_fparse("A4EXIF.LDD",DatCommandPtr,&filename[0],NULL); if ((ret=p_loadldd(&filename[0]))<0) { p_printf("A4Exif.ldd failed to load"); if (ret==E_FILE_NXIST) { p_printf("Device does not exist"); p_getch(); p_exit(0); } else if (ret==E_FILE_EXIST) { p_printf("Device is already loaded"); p_getch(); } else if (ret==E_GEN_NOMEMORY) { p_printf("Not enough memory available"); p_getch(); p_exit(0); } else { p_printf("Unknown error %d on p_loadldd",ret); p_getch(); p_exit(0); } } else { p_printf("Successfully loaded A4Exif.ldd\n"); p_getch(); } } LOCAL_C VOID UnloadLdd(VOID) /* Removes the LDD A4Exif.ldd */ { INT ret; p_printf("\nUNLOADLDD=>"); if ((ret=p_devdel("LED",E_LDD))!=0) { p_printf("A4Exif.ldd failed to unload"); if (ret==E_FILE_DEVICE) p_printf("The device driver is not loaded"); else if (ret==E_GEN_INUSE) p_printf("Driver is open and cannot be deleted"); else p_printf("Unknown error %d on p_devdel",ret); p_getch(); } else { p_printf("Successfully deleted A4Exif.ldd"); p_getch(); } } LOCAL_C VOID OpenPort(VOID) /*Opens a serial port of the A4Example IF on the host machine*/ { INT ret, seropen; p_printf("\nOPENPORT=>"); DoAgain: p_printf("Type in the serial\r\nport to open"); p_printf("eg A => port A"); p_printf(".....\n"); ret=p_toupper(p_getch()); *(head+4)=ret; p_printf("%s",head); p_sleep(5L); if ((seropen=p_open(&serH,head,-1))<0) {/* Failed to open */ p_atos(&buf[0],"p_open on port %c has failed",ret); p_printf("%s\n",&buf[0],seropen); p_errs(buf,seropen); p_printf("%s\n",&buf[0]); p_getch(); goto DoAgain; } else {/* Succeeded in opening */ p_atos(&buf[0],"Successfully opened port %c",ret); p_printf("%s",&buf[0]); p_printf(".....\n"); p_getch(); } } LOCAL_C VOID ClosePort(VOID) { INT ret; p_printf("\nCLOSEPORT=>"); if ((ret=p_close(serH))!=0) p_printf("Error in closing port"); else p_printf("Successfully closed port"); p_getch(); } LOCAL_C VOID SensePort(VOID) { UBYTE A1,A2; p_printf("\nSENSEPORT=>"); p_iow(serH,P_FSENSE,&A1,&A2); p_printf("Status byte: 0x%x",A1); p_printf("LED byte: 0x%x",A2); p_getch(); } LOCAL_C INT SetPort(VOID) { UBYTE key; p_printf("\nSETPORT=>"); p_printf("Type a key"); p_printf("ESCAPE to exit\r\n"); if ((key=p_getch())==E_KEY_ESCAPE) { key=0x00; p_iow(serH,P_FSET,&key); return(-1); } else { p_printf("Output byte is 0x%x",key); p_iow(serH,P_FSET,&key); return(0); } } LOCAL_C VOID OpenTimer(VOID) { if (p_open(&timH,"TIM:",-1)<0) {/* Error in opening timer */ p_printf("Cannot open timer channel\n"); p_getch(); } } LOCAL_C VOID QueueTimer(ULONG timeouttime) { p_ioc4(timH,P_FRELATIVE,&timStat,&timeouttime); } LOCAL_C VOID CancelTimer(VOID) { p_iow(timH,P_FCANCEL); p_waitstat(&timStat); } LOCAL_C VOID QueueSerRead(UBYTE *statusptr,UBYTE *ledptr) { p_ioc5(serH,P_FREAD,&serReadStat,statusptr,ledptr); } LOCAL_C VOID CancelSerRead(VOID) { p_iow(serH,P_FCANCEL); p_waitstat(&serReadStat); } LOCAL_C VOID QueueKeypress(P_CON_KBREC *keybrec) { p_ioc4(winHandle,P_FREAD,&keyStat,keybrec); } LOCAL_C VOID AsynchRead(VOID) { UBYTE b_led; UBYTE b_status; p_printf("ASYNCH READ\r\n"); OpenTimer(); QueueTimer(SERREAD_TIMEOUT); QueueSerRead(&b_status,&b_led); QueueKeypress(&kbrec); FOREVER { p_iowait(); if (keyStat!=E_FILE_PENDING) {/* Keypress received */ p_printf("KEYPRESS"); if (kbrec.keycode==E_KEY_ESCAPE) { CancelSerRead(); CancelTimer(); b_led=0x00; p_iow(serH,P_FWRITE,&b_led); break; } else { /* Do nothing - requeue keypress */ QueueKeypress(&kbrec); continue; } } else if (serReadStat!=E_FILE_PENDING) { p_printf("SERIAL READ COMPLETED"); CancelTimer(); p_printf("Status byte is => 0x%x",b_status); p_printf("LED byte is => 0x%x",b_led); QueueTimer(SERREAD_TIMEOUT); QueueSerRead(&b_status,&b_led); continue; } else if (timStat!=E_FILE_PENDING) { p_printf("TIMEOUT"); CancelSerRead(); QueueSerRead(&b_status,&b_led); QueueTimer(SERREAD_TIMEOUT); continue; } else {/* Error - missing status word so fatal error */ p_printf("***Stray status word***"); break; } } p_close(timH); } LOCAL_C VOID AlternateFlash(VOID) { UBYTE b_led; INT i=0; p_printf("ALTERNATE FLASH\r\n"); p_printf("Hit ESCAPE to exit"); OpenTimer(); QueueTimer(FLASH_TIME); QueueKeypress(&kbrec); FOREVER { p_iowait(); if (keyStat!=E_FILE_PENDING) {/* Keypress received */ if (kbrec.keycode==E_KEY_ESCAPE) { CancelTimer(); b_led=0x00; p_iow(serH,P_FWRITE,&b_led); break; } else { /* Do nothing - requeue keypress */ QueueKeypress(&kbrec); continue; } } else if (timStat!=E_FILE_PENDING) {/* Timer finished */ if (i\r\n\t%x bytes\r\n",fbytes); p_print("Free Segments =>\r\n\t%d\r\n",p_sgfree()); p_getch(); } LOCAL_C VOID MemoryTest(VOID) { CheckMemory("OpenPort"); ClosePort(); CheckMemory("ClosedPort"); UnloadLdd(); CheckMemory("UnoadedLdd"); LoadLdd(); CheckMemory("LoadLdd"); OpenPort(); CheckMemory("OpenPort"); p_printf("End of Memory Test"); } GLDEF_C VOID main(VOID) /* */ { INT ret,set=0; PrintHeader(); LoadLdd(); OpenPort(); Start: PrintInstructions(); if ((ret=p_getch())=='0') AlternateFlash(); else if (ret=='1') AsynchRead(); else if (ret=='2') SensePort(); else if (ret=='3') { while (set>=0) set=SetPort(); set=0; } else if (ret=='4') MemoryTest(); else if (ret=='q') { ClosePort(); UnloadLdd(); p_exit(0); } else goto Start; goto Start; }