/*============ serial_access.c ===================================== See serial_access.h for details. */ #include #include #include "serial_access.h" /*-------- serial_init() -------------------------------------------- PURPOSE - given serial number 0-4, get serial base address, save registers, disable interrupts. */ void serial_init(short tty_num) { switch ( tty_num) { case 3 : serial_base = 0x2E8 ; break ; case 2 : serial_base = 0x3E8 ; break ; case 1 : serial_base = 0x2F8 ; break ; default: serial_base = 0x3F8 ; break ; } image_LCR = save_LCR = inb( serial_base + LCR_offset) ; outb( ( image_LCR &= 0x7F), serial_base + LCR_offset) ; // DLAB low. image_IER = save_IER = inb( serial_base + IER_offset) ; outb( ( image_IER = 0x00), serial_base + IER_offset) ; // intr off. image_MCR = save_MCR = inb( serial_base + MCR_offset) ; outb( ( image_MCR &= 0x03), serial_base + MCR_offset) ; // loopback off. } /*--------- serial_restore() ------------------------------------ PURPOSE - restore serial port to previous state. */ void serial_restore() { outb( save_MCR, serial_base + MCR_offset) ; outb( save_LCR & 0x7F, serial_base + LCR_offset) ; // DLAB low. outb( save_IER, serial_base + IER_offset) ; outb( save_LCR, serial_base + LCR_offset) ; // DLAB as original. } /*--------- main : example code ------------------------------*/ /* int main(int argc, char *argv[]) { //--- save all registers and disable interrupts. serial_init( 0) ; //--- RTS=0 -V, DTR=1 +V, TX=1 +V. image_MCR = (image_MCR | MCR_DTR) & ~MCR_RTS ; outb( image_MCR , serial_base + MCR_offset) ; outb( (image_LCR |= LCR_TX0), serial_base + LCR_offset) ; printf("\n Signal/value/db-25 pin/db-9 pin.\n") ; printf(" Outputs : RTS/-V/4/7 DTR/+V/20/4 TX/+V/2/3.\n") ; //--- test state of DSR and RX. if ( inb( serial_base + MSR_offset) & MSR_DSR) printf(" Input DSR//6/6 high, +V.\n") ; else printf(" Input DSR//6/6 low, -V.\n") ; if ( inb( serial_base + LSR_offset) & LSR_RX0) printf(" Input RX//3/2 high, +V.\n") ; else printf(" Input RX//3/2 low, -V.\n") ; //--- pause till key pressed so can measure outputs. printf(" Press enter to continue ===> ") ; getchar() ; //--- restore cregisters and exit. serial_restore() ; exit(0) ; } */