/*------------------- ADC_driver ----------------------------------- PURPOSE - Gives ten sensor readings over 10 seconds. COMPILE to binary st as below- gcc -o run_ADC ADC_driver.c RUN ./lp_tty_start ./ADC_driver*/#include <asm/io.h>#include <sys/time.h>//------- Parallel port data.static short lp_base_addr ; // save base addr of pp port.#define status_offset 1#define control_offset 2#define high 1#define low 0static char save_data ; // save of original values.static char save_control ;static char image_data ; // use image as master record of port.static char image_control ;int count; // used for clock data in or out//-------Parallel port pins-------------------------#define CS1 0x02 //pin 3#define SCLK1 0x01 //pin 2#define SCLK1_CS1 0x03#define all_low 0x00//-------Control Byte-------------------------------//int thermo1_DIN[8] = {1,0,0,0,1,0,1,0};//-------12 bit Output------------------------------int DOUT = 0;//=================== pp routines ================================//-------- lp_init() --------------------------------------------//// PURPOSE - given lp number 0-2, get lp base address,// save registers, disable interrupts.void lp_init(short lp_num) { switch ( lp_num) { case 2 : lp_base_addr = 0x3BC ; break ; case 1 : lp_base_addr = 0x278 ; break ; default: lp_base_addr = 0x378 ; break ; } image_data = save_data = inb( lp_base_addr) ; image_control = save_control = inb( lp_base_addr+2) ; outb( (image_control &= 0xEF), lp_base_addr + control_offset) ; }//--------- lp_restore() ----------------------------------------//// PURPOSE - restore lp port to previous state.void lp_restore(){ outb( save_data, lp_base_addr) ; outb( save_control, lp_base_addr + control_offset) ;}//---------check DOUT pin------------------------------//PURPOSE - check the SSTRB pin (pin 11 or S7)int check_DOUT_pin(){ if ( inb( lp_base_addr+status_offset) & 0x80) return(low); else return(high);}//---------two power of-----------------------------//PURPOSE - to output two to the power of (x) - 2^xint twopowerof(int x){ int tempPow = 0; int value = 1; while(x>tempPow) { value = 2*value; tempPow++; } return(value);}//---------Clock out signal-----------------------------//PURPOSE - once tconv is finished clock out the 12 bit// signal from ADCint clock_out_signal(){ int tempOut[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; for(count=1; count<=14; count++) { //-----begin clocking out out byte---- outb(0, lp_base_addr); //force pin2 SCLK to low //----rising edge------ if(count == 1 && check_DOUT_pin() != 0) { } if(count>=2 && count<=13) { if(check_DOUT_pin() == high) tempOut[count-2] = 1; else tempOut[count-2] = 0; } outb(SCLK1, lp_base_addr); //force pin2 SCLK to high } outb(0, lp_base_addr); //force pin2 SCLK to low int dec = 0; for(count=0; count<=11; count++) { dec = ((tempOut[11-count])*(twopowerof(count)))+dec; } return(dec);}//---------get thermistor sensor reading-----------------------//PURPOSE - to clock in thermistor sensor config and then clock out// the thermistor sensor reading as a integer.void get_thermo1_sensor_reading(){ //--- begin clocking in 8 bit command/ outb(CS1, lp_base_addr); //force CS (D2) high rest of the pins are low //---starting 8-bit command--- outb(all_low, lp_base_addr); //make all pins low// outb(DIN1, lp_base_addr); //input DIN START(high) bit// clock_in_8bits(thermo1_DIN); //clocking in the 8 bit command DOUT = clock_out_signal(); //clocking out 12 bit signal from ADC}//========== main ===============================================int main(void){ //====== inits. lp_init(0); //--- initialize primary time interval PTI timer. struct timespec sleep_time ; sleep_time.tv_sec = 0 ; sleep_time.tv_nsec = 0 ; // 10 ms PTI. //--- output the sensor reading every second x 10 times int i;// for(i=0; i<10; i++) for(i=0; i<2; i++) { get_thermo1_sensor_reading(); if(DOUT == 4095) printf("ERROR: No power or connection \n"); else printf("Voltage Reading: %d \n",DOUT); sleep(1); } printf("********************************************\n"); lp_restore(); return(0);}