00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #include <isa/mouse.h>
00031 #include <isa/8259.h>
00032 #include <sys/idt.h>
00033 #include <sys/gdt.h>
00034 #include <sys/io.h>
00035 #include <lib/kprintf.h>
00036 #include <ubixos/types.h>
00037 
00038 static uInt8 kbdRead() {
00039   unsigned long Timeout;
00040   uInt8 Stat, Data;
00041 
00042   for (Timeout = 50000L; Timeout != 0; Timeout--) {
00043                 Stat = inportByte(0x64);
00044 
00045                 
00046                 if ((Stat & 0x01) != 0)
00047                 {
00048                         Data = inportByte(0x60);
00049 
00050                         
00051                         if((Stat & 0xC0) == 0)
00052                                 return Data;
00053                 }
00054         }
00055 
00056         return -1;
00057 }
00058 
00059 static void kbdWrite(uInt16 port,uInt8 data) {
00060         uInt32 timeout;
00061         uInt8 stat;
00062 
00063         for (timeout = 500000L; timeout != 0; timeout--)
00064         {
00065                 stat = inportByte(0x64);
00066 
00067                 if ((stat & 0x02) == 0)
00068                         break;
00069         }
00070 
00071         if (timeout != 0)
00072                 outportByte(port, data);
00073   }
00074 
00075 static uInt8 kbdWriteRead(uInt16 port,uInt8 data, const char* expect)
00076 {
00077         int RetVal;
00078 
00079         kbdWrite(port, data);
00080         for (; *expect; expect++)
00081         {
00082                 RetVal = kbdRead();
00083                 if ((uInt8) *expect != RetVal)
00084                 {
00085                         return RetVal;
00086                 }
00087         }
00088 
00089         return 0;
00090 }
00091 
00092 
00093 
00094 int mouseInit() {
00095   static uInt8 s1[] = { 0xF3, 0xC8, 0xF3, 0x64, 0xF3, 0x50, 0 };
00096   static uInt8 s2[] = { 0xF6, 0xE6, 0xF4, 0xF3, 0x64, 0xE8, 0x03, 0 };
00097   const  uInt8* ch;
00098   Int8 cmd = 0x0;
00099 
00100   kbdWrite(0x64,0xA8);
00101   for (ch = s1; *ch; ch++) {
00102     kbdWrite(0x64, 0xD4);
00103     kbdWriteRead(0x60, *ch,"\xFA");
00104     }
00105   for (ch = s2; *ch; ch++) {
00106     kbdWrite(0x64, 0xD4);
00107     kbdWriteRead(0x60, *ch,"\xFA");
00108     }
00109   kbdWrite(0x64,0xD4);
00110   if (kbdWriteRead(0x60,0xF2,"\xFA") != 0x0) {
00111     kprintf("Error With Mouse\n");
00112     }
00113   cmd = kbdRead();  
00114   kprintf("CMD: [0x%X]\n",cmd);
00115   kbdWrite(0x64, 0xD4);
00116   kbdWriteRead(0x60, 0xF4,"\xFA");
00117 
00118   setVector(&mouseISR, mVec+12, dPresent + dInt + dDpl3);
00119 
00120   outportByte(mPic, eoi);
00121   outportByte(sPic, eoi);
00122   irqEnable(12);
00123   outportByte(mPic, eoi);
00124   outportByte(sPic, eoi);
00125 
00126   kprintf("psm0 - Address: [0x%X]\n",&mouseISR);
00127 
00128   
00129   return(0x0);
00130   }
00131 
00132 asm(
00133   ".globl mouseISR \n"
00134   "mouseISR:       \n"
00135   "  pusha         \n" 
00136   "  call mouseHandler \n"
00137   "  popa          \n"
00138   "  iret          \n" 
00139   );
00140 
00141 void mouseHandler() {
00142   kprintf("MOUSE!!!\n");
00143 
00144   outportByte(mPic, eoi);
00145   outportByte(sPic, eoi);
00146   
00147   return;
00148   }
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172