00001 /******************* 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Description: driver use this port as gpio. 00004 * this driver does not support printer. 00005 * 00006 *File: lptport1.c (I want lpt1.c,but xp doesn't allow.) 00007 *Author: Book Chen 00008 *Date: 2010.01.01 00009 ******************** 00010 */ 00011 #include "includes.h" 00012 00013 #define Lpt1IdleState 0 00014 #define Lpt1LedOnState 1 00015 #define Lpt1LedOffState 2 00016 00017 LPT1_CONTROL Lpt1Ctrl; 00018 00019 void Lpt1Init(void){ 00020 PicIrqDisable(IRQ7_LPT1); //no use interrupt at begining 00021 Lpt1Ctrl.State=Lpt1LedOnState; 00022 Lpt1Ctrl.Data=0; 00023 Lpt1Ctrl.Status=0; 00024 Lpt1Ctrl.Control=LPT_CONTORL_DIR_READ|0xc0; //set data port read, 00025 //disable interrupt, 00026 //nSelectIn=1,nInit=1,nStrob=0,nAutoLF=0, 00027 Lpt1Ctrl.Timer=0; 00028 Lpt1ControlPortWrite(Lpt1Ctrl.Control); //set data port read,disable interrupt,nStrob=0,nAutoLF=0 00029 //InterruptIrqHandlerSet(IRQ7_LPT1,Lpt1Handler); //no use interrupt at begining 00030 //PicIrqEnable(IRQ7_LPT1); //no use interrupt at begining 00031 } 00032 00033 void Lpt1Handler(void){ 00034 // no operation function 00035 } 00036 00037 void Lpt1Svc(void){ 00038 switch(Lpt1Ctrl.State){ 00039 case Lpt1IdleState: 00040 break; 00041 case Lpt1LedOnState: 00042 Lpt1DataPortWrite(0x00); 00043 Lpt1Ctrl.State=Lpt1LedOffState; 00044 break; 00045 case Lpt1LedOffState: 00046 Lpt1DataPortWrite(0xff); 00047 Lpt1Ctrl.State=Lpt1LedOnState; 00048 break; 00049 default: 00050 break; 00051 } 00052 } 00053 00054 00055 U8 Lpt1DataPortRead(void){ 00056 if((Lpt1Ctrl.Control&LPT_CONTORL_DIR_READ)==0){ 00057 Lpt1DataPortSetInput(); 00058 } 00059 Lpt1Ctrl.Data=InByte(LPT1_DATA_PORT); 00060 return Lpt1Ctrl.Data; 00061 } 00062 00063 void Lpt1DataPortWrite(U8 Data){ 00064 if((Lpt1Ctrl.Control&LPT_CONTORL_DIR_READ)==LPT_CONTORL_DIR_READ){ 00065 Lpt1DataPortSetOutput(); 00066 } 00067 Lpt1Ctrl.Data=Data; 00068 return OutByte(LPT1_DATA_PORT,Data); 00069 } 00070 00071 void Lpt1DataPortSetOutput(void){ 00072 Lpt1Ctrl.Control=Lpt1Ctrl.Control&(~LPT_CONTORL_DIR_READ); //dir bit=0 for output 00073 OutByte(LPT1_CONTROL_PORT,Lpt1Ctrl.Control); 00074 } 00075 00076 void Lpt1DataPortSetInput(void){ 00077 Lpt1Ctrl.Control=Lpt1Ctrl.Control|LPT_CONTORL_DIR_READ; //dir bit=0 for output 00078 OutByte(LPT1_CONTROL_PORT,Lpt1Ctrl.Control); 00079 } 00080 00081 U8 Lpt1StatusPortRead(void){ 00082 Lpt1Ctrl.Status=InByte(LPT1_STATUS_PORT); 00083 } 00084 00085 void Lpt1ControlPortWrite(U8 Data){ 00086 Lpt1Ctrl.Control=Data; 00087 OutByte(LPT1_CONTROL_PORT,Lpt1Ctrl.Control); 00088 }
1.5.9