*
* PL050 (or comaptible) Driver
*/
+#define DEBUG 1
+
#include <acess.h>
#include "common.h"
-// TODO: Allow runtime/compile-time switching
-// Maybe PCI will have it?
-// Integrator-CP
-#if 0
-#define KEYBOARD_IRQ 3
-#define KEYBOARD_BASE 0x18000000
-#define MOUSE_IRQ 4
-#define MOUSE_BASE 0x19000000
-#endif
-// Realview
-#if 1
-#define KEYBOARD_IRQ 20
-#define KEYBOARD_BASE 0x10006000
-#define MOUSE_IRQ 21
-#define MOUSE_BASE 0x10007000
-#endif
-
+// === CONSTANTS ===
#define PL050_TXBUSY 0x20
// === PROTOTYPES ===
-void PL050_Init(void);
-void PL050_KeyboardHandler(int IRQ);
-void PL050_MouseHandler(int IRQ);
+void PL050_Init(Uint32 KeyboardBase, Uint8 KeyboardIRQ, Uint32 MouseBase, Uint8 MouseIRQ);
+void PL050_KeyboardHandler(int IRQ, void *Ptr);
+void PL050_MouseHandler(int IRQ, void *Ptr);
void PL050_EnableMouse(void);
static inline void PL050_WriteMouseData(Uint8 data);
static inline void PL050_WriteKeyboardData(Uint8 data);
static inline Uint8 PL050_ReadMouseData(void);
static inline Uint8 PL050_ReadKeyboardData(void);
+// === GLOBALS ===
+Uint32 *gpPL050_KeyboardBase;
+Uint32 *gpPL050_MouseBase;
+
// === CODE ===
-void PL050_Init(void)
+void PL050_Init(Uint32 KeyboardBase, Uint8 KeyboardIRQ, Uint32 MouseBase, Uint8 MouseIRQ)
{
- IRQ_AddHandler(KEYBOARD_IRQ, PL050_KeyboardHandler);
- IRQ_AddHandler(MOUSE_IRQ, PL050_MouseHandler); // Set IRQ
+ if( KeyboardBase ) {
+ LOG("KeyboardBase = 0x%x", KeyboardBase);
+ gpPL050_KeyboardBase = (void*)MM_MapHWPages(KeyboardBase, 1);
+ LOG("gpPL050_KeyboardBase = %p", gpPL050_KeyboardBase);
+ IRQ_AddHandler(KeyboardIRQ, PL050_KeyboardHandler, NULL);
+
+ gpPL050_KeyboardBase[0] = 0x10;
+ }
+ if( MouseBase ) {
+ gpPL050_MouseBase = (void*)MM_MapHWPages(MouseBase, 1);
+ IRQ_AddHandler(MouseIRQ, PL050_MouseHandler, NULL);
+
+ gpPL050_MouseBase[0] = 0x10;
+ }
}
-void PL050_KeyboardHandler(int IRQ)
+void PL050_KeyboardHandler(int IRQ, void *Ptr)
{
Uint8 scancode;
- scancode = PL050_ReadKeyboardData(0x60);
+ scancode = PL050_ReadKeyboardData();
KB_HandleScancode( scancode );
}
-void PL050_MouseHandler(int IRQ)
+void PL050_MouseHandler(int IRQ, void *Ptr)
{
- PS2Mouse_HandleInterrupt( PL050_ReadMouseData(0x60) );
+ PS2Mouse_HandleInterrupt( PL050_ReadMouseData() );
}
void PL050_SetLEDs(Uint8 leds)
void PL050_EnableMouse(void)
{
- Uint8 status;
- Log_Log("8042", "Enabling Mouse...");
-
+ Log_Log("PL050", "Enabling Mouse...");
//PL050_WriteMouseData(0xD4);
//PL050_WriteMouseData(0xF6); // Set Default Settings
PL050_WriteMouseData(0xD4);
PL050_WriteMouseData(0xF4); // Enable Packets
+ LOG("Done");
}
static inline void PL050_WriteMouseData(Uint8 Data)
{
int timeout = 10000;
- while( --timeout && *(Uint32*)(MOUSE_BASE+1) & PL050_TXBUSY );
+
+ if( !gpPL050_MouseBase ) {
+ Log_Error("PL050", "Mouse disabled (gpPL050_MouseBase = NULL)");
+ return ;
+ }
+
+ while( --timeout && gpPL050_MouseBase[1] & PL050_TXBUSY );
if(timeout)
- *(Uint32*)(MOUSE_BASE+2) = Data;
+ gpPL050_MouseBase[2] = Data;
else
Log_Error("PL050", "Write to mouse timed out");
}
static inline Uint8 PL050_ReadMouseData(void)
{
- return *(Uint32*)(MOUSE_BASE+2);
+ if( !gpPL050_MouseBase ) {
+ Log_Error("PL050", "Mouse disabled (gpPL050_MouseBase = NULL)");
+ return 0;
+ }
+ return gpPL050_MouseBase[2];
}
-static inline void PL050_WriteKeyboardData(Uint8 data)
+static inline void PL050_WriteKeyboardData(Uint8 Data)
{
int timeout = 10000;
- while( --timeout && *(Uint32*)(KEYBOARD_BASE+1) & PL050_TXBUSY );
+
+ if( !gpPL050_KeyboardBase ) {
+ Log_Error("PL050", "Keyboard disabled (gpPL050_KeyboardBase = NULL)");
+ return ;
+ }
+
+ while( --timeout && gpPL050_KeyboardBase[1] & PL050_TXBUSY );
if(timeout)
- *(Uint32*)(KEYBOARD_BASE+2) = Data;
+ gpPL050_KeyboardBase[2] = Data;
else
Log_Error("PL050", "Write to keyboard timed out");
}
static inline Uint8 PL050_ReadKeyboardData(void)
{
- return *(Uint32*)(MOUSE_BASE+2);
+ if( !gpPL050_KeyboardBase ) {
+ Log_Error("PL050", "Keyboard disabled (gpPL050_KeyboardBase = NULL)");
+ return 0;
+ }
+
+ return gpPL050_KeyboardBase[2];
}