Sorting source tree a bit
[tpg/acess2.git] / KernelLand / 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, void *Ptr);
13 void    KBC8042_MouseHandler(int IRQ, void *Ptr);
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, NULL);
24         IRQ_AddHandler(12, KBC8042_MouseHandler, NULL); // 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, void *Ptr)
38 {
39         Uint8   scancode;
40
41 //      Log("KBC8042_KeyboardHandler: (IRQ=%i, Ptr=%p)", IRQ, Ptr);
42
43         scancode = inb(0x60);
44         KB_HandleScancode( scancode );
45 }
46
47 void KBC8042_MouseHandler(int IRQ, void *Ptr)
48 {
49         PS2Mouse_HandleInterrupt( inb(0x60) );
50 }
51
52 void KBC8042_SetLEDs(Uint8 leds)
53 {
54         while( inb(0x64) & 2 ); // Wait for bit 2 to unset
55         outb(0x60, 0xED);       // Send update command
56
57         while( inb(0x64) & 2 ); // Wait for bit 2 to unset
58         outb(0x60, leds);
59 }
60
61 void KBC8042_EnableMouse(void)
62 {
63         Uint8   status;
64         Log_Log("8042", "Enabling Mouse...");
65         
66         // Enable AUX PS/2
67         KBC8042_SendDataAlt(0xA8);
68         
69         // Enable AUX PS/2 (Compaq Status Byte)
70         KBC8042_SendDataAlt(0x20);      // Send Command
71         status = KBC8042_ReadData();    // Get Status
72         status &= ~0x20;        // Clear "Disable Mouse Clock"
73         status |= 0x02;         // Set IRQ12 Enable
74         KBC8042_SendDataAlt(0x60);      // Send Command
75         KBC8042_SendData(status);       // Set Status
76         
77         //mouseSendCommand(0xF6);       // Set Default Settings
78         KBC8042_SendMouseCommand(0xF4); // Enable Packets
79 }
80
81 static inline void KBC8042_SendDataAlt(Uint8 data)
82 {
83         int timeout=100000;
84         while( timeout-- && inb(0x64) & 2 );    // Wait for Flag to clear
85         outb(0x64, data);       // Send Command
86 }
87 static inline void KBC8042_SendData(Uint8 data)
88 {
89         int timeout=100000;
90         while( timeout-- && inb(0x64) & 2 );    // Wait for Flag to clear
91         outb(0x60, data);       // Send Command
92 }
93 static inline Uint8 KBC8042_ReadData(void)
94 {
95         int timeout=100000;
96         while( timeout-- && (inb(0x64) & 1) == 0);      // Wait for Flag to set
97         return inb(0x60);
98 }
99 static inline void KBC8042_SendMouseCommand(Uint8 cmd)
100 {
101         KBC8042_SendDataAlt(0xD4);
102         KBC8042_SendData(cmd);
103 }
104

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