X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FInput%2FPS2KbMouse%2Fpl050.c;h=6f82e51025525455e09387b6d99c1af94f5288a7;hb=90311ae923051afa0db6554679e7389d1c95e4f2;hp=f4b319864021650fc8ae11ee179409491768906e;hpb=f31fce99ba695db4d5b4509bfcf5d0c568d02af9;p=tpg%2Facess2.git diff --git a/Modules/Input/PS2KbMouse/pl050.c b/Modules/Input/PS2KbMouse/pl050.c index f4b31986..6f82e510 100644 --- a/Modules/Input/PS2KbMouse/pl050.c +++ b/Modules/Input/PS2KbMouse/pl050.c @@ -4,56 +4,58 @@ * * PL050 (or comaptible) Driver */ +#define DEBUG 1 + #include #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) @@ -64,41 +66,61 @@ 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]; }