/*============ serial_access.c =====================================

    See serial_access.h for details.
*/

#include <stdio.h>
#include <unistd.h>
#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) ;
}
*/
	     
