/*- * Copyright (c) 2002-2018 The UbixOS Project. * All rights reserved. * * This was developed by Christopher W. Olsen for the UbixOS Project. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, this list of * conditions, the following disclaimer and the list of authors. * 2) Redistributions in binary form must reproduce the above copyright notice, this list of * conditions, the following disclaimer and the list of authors in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <isa/mouse.h> #include <isa/8259.h> #include <sys/idt.h> #include <sys/gdt.h> #include <sys/io.h> #include <lib/kprintf.h> static uInt8 kbdRead() { unsigned long Timeout; uInt8 Stat, Data; for (Timeout = 50000L; Timeout != 0; Timeout--) { Stat = inportByte(0x64); /* loop until 8042 output buffer full */ if ((Stat & 0x01) != 0) { Data = inportByte(0x60); /* loop if parity error or receive timeout */ if ((Stat & 0xC0) == 0) return Data; } } return -1; } static void kbdWrite(uInt16 port, uInt8 data) { uInt32 timeout; uInt8 stat; for (timeout = 500000L; timeout != 0; timeout--) { stat = inportByte(0x64); if ((stat & 0x02) == 0) break; } if (timeout != 0) outportByte(port, data); } static uInt8 kbdWriteRead(uInt16 port, uInt8 data, const char* expect) { int RetVal; kbdWrite(port, data); for (; *expect; expect++) { RetVal = kbdRead(); if ((uInt8) *expect != RetVal) { return RetVal; } } return 0; } int mouseInit() { static uInt8 s1[] = { 0xF3, 0xC8, 0xF3, 0x64, 0xF3, 0x50, 0 }; static uInt8 s2[] = { 0xF6, 0xE6, 0xF4, 0xF3, 0x64, 0xE8, 0x03, 0 }; const uInt8* ch; Int8 cmd = 0x0; kbdWrite(0x64, 0xA8); for (ch = s1; *ch; ch++) { kbdWrite(0x64, 0xD4); kbdWriteRead(0x60, *ch, "\xFA"); } for (ch = s2; *ch; ch++) { kbdWrite(0x64, 0xD4); kbdWriteRead(0x60, *ch, "\xFA"); } kbdWrite(0x64, 0xD4); if (kbdWriteRead(0x60, 0xF2, "\xFA") != 0x0) { kprintf("Error With Mouse\n"); } cmd = kbdRead(); kprintf("CMD: [0x%X]\n", cmd); kbdWrite(0x64, 0xD4); kbdWriteRead(0x60, 0xF4, "\xFA"); setVector(&mouseISR, mVec + 12, dPresent + dInt + dDpl3); outportByte( mPic, eoi); outportByte( sPic, eoi); irqEnable(12); outportByte( mPic, eoi); outportByte( sPic, eoi); kprintf("psm0 - Address: [0x%X]\n", &mouseISR); /* Return so we know everything went well */ return (0x0); } asm( ".globl mouseISR \n" "mouseISR: \n" " pusha \n" /* Save all registers */ " call mouseHandler \n" " popa \n" " iret \n" /* Exit interrupt */ ); void mouseHandler() { kprintf("MOUSE!!!\n"); outportByte( mPic, eoi); outportByte( sPic, eoi); /* Return */ return; } /*** $Log: mouse.c,v $ Revision 1.1.1.1 2006/06/01 12:46:12 reddawg ubix2 Revision 1.2 2005/10/12 00:13:37 reddawg Removed Revision 1.1.1.1 2005/09/26 17:24:02 reddawg no message Revision 1.3 2004/09/07 21:54:38 reddawg ok reverted back to old scheduling for now.... Revision 1.2 2004/09/06 15:13:25 reddawg Last commit before FreeBSD 6.0 Revision 1.1 2004/06/04 10:20:53 reddawg mouse drive: fixed a few bugs works a bit better now END ***/