Modules/USB - Working on USB support again
[tpg/acess2.git] / Modules / Input / PS2KbMouse / 8042.c
1 /*
2  * Acess2
3  * - By thePowersGang (John Hodge)
4  *
5  * 8042 (or comaptible) Driver
6  */
7 #include <acess.h>
8 #include "common.h"
9
10 // === PROTOTYPES ===
11 void    KBC8042_Init(void);
12 void    KBC8042_KeyboardHandler(int IRQ);
13 void    KBC8042_MouseHandler(int IRQ);
14 void    KBC8042_EnableMouse(void);
15 static inline void      KBC8042_SendDataAlt(Uint8 data);
16 static inline void      KBC8042_SendData(Uint8 data);
17 static inline Uint8     KBC8042_ReadData(void);
18 static void     KBC8042_SendMouseCommand(Uint8 cmd);
19
20 // === CODE ===
21 void KBC8042_Init(void)
22 {
23         IRQ_AddHandler(1, KBC8042_KeyboardHandler);
24         IRQ_AddHandler(12, KBC8042_MouseHandler);       // Set IRQ
25         
26         {
27                 Uint8   temp;
28                 // Attempt to get around a strange bug in Bochs/Qemu by toggling
29                 // the controller on and off
30                 temp = inb(0x61);
31                 outb(0x61, temp | 0x80);
32                 outb(0x61, temp & 0x7F);
33                 inb(0x60);      // Clear keyboard buffer
34         }
35 }
36
37 void KBC8042_KeyboardHandler(int IRQ)
38 {
39         Uint8   scancode;
40
41         scancode = inb(0x60);
42         KB_HandleScancode( scancode );
43 }
44
45 void KBC8042_MouseHandler(int IRQ)
46 {
47         PS2Mouse_HandleInterrupt( inb(0x60) );
48 }
49
50 void KBC8042_SetLEDs(Uint8 leds)
51 {
52         while( inb(0x64) & 2 ); // Wait for bit 2 to unset
53         outb(0x60, 0xED);       // Send update command
54
55         while( inb(0x64) & 2 ); // Wait for bit 2 to unset
56         outb(0x60, leds);
57 }
58
59 void KBC8042_EnableMouse(void)
60 {
61         Uint8   status;
62         Log_Log("8042", "Enabling Mouse...");
63         
64         // Enable AUX PS/2
65         KBC8042_SendDataAlt(0xA8);
66         
67         // Enable AUX PS/2 (Compaq Status Byte)
68         KBC8042_SendDataAlt(0x20);      // Send Command
69         status = KBC8042_ReadData();    // Get Status
70         status &= ~0x20;        // Clear "Disable Mouse Clock"
71         status |= 0x02;         // Set IRQ12 Enable
72         KBC8042_SendDataAlt(0x60);      // Send Command
73         KBC8042_SendData(status);       // Set Status
74         
75         //mouseSendCommand(0xF6);       // Set Default Settings
76         KBC8042_SendMouseCommand(0xF4); // Enable Packets
77 }
78
79 static inline void KBC8042_SendDataAlt(Uint8 data)
80 {
81         int timeout=100000;
82         while( timeout-- && inb(0x64) & 2 );    // Wait for Flag to clear
83         outb(0x64, data);       // Send Command
84 }
85 static inline void KBC8042_SendData(Uint8 data)
86 {
87         int timeout=100000;
88         while( timeout-- && inb(0x64) & 2 );    // Wait for Flag to clear
89         outb(0x60, data);       // Send Command
90 }
91 static inline Uint8 KBC8042_ReadData(void)
92 {
93         int timeout=100000;
94         while( timeout-- && (inb(0x64) & 1) == 0);      // Wait for Flag to set
95         return inb(0x60);
96 }
97 static inline void KBC8042_SendMouseCommand(Uint8 cmd)
98 {
99         KBC8042_SendDataAlt(0xD4);
100         KBC8042_SendData(cmd);
101 }
102

UCC git Repository :: git.ucc.asn.au