X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FUSB%2FHID%2Fmouse.c;h=6ca88a5dff7e41843633f3ef3729a19d15573e53;hb=b21ce7f2b5fda2b8eb6156b3073753296ee7296c;hp=d34ee2770941146768c8f66faeb8b92bc2a05f46;hpb=3d9c87713549b06c4505b15f37ef8e9785d0ab0d;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/USB/HID/mouse.c b/KernelLand/Modules/USB/HID/mouse.c index d34ee277..6ca88a5d 100644 --- a/KernelLand/Modules/USB/HID/mouse.c +++ b/KernelLand/Modules/USB/HID/mouse.c @@ -5,7 +5,7 @@ * mouse.c * - USB Mouse driver */ -#define DEBUG 1 +#define DEBUG 0 #include #include "hid_reports.h" #include @@ -119,10 +119,14 @@ tVFS_Node *HID_Mouse_Root_FindDir(tVFS_Node *Node, const char *Name) // Scan list, locate item Mutex_Acquire(&glHID_MouseListLock); for( mouse = gpHID_FirstMouse; mouse && ID --; mouse = mouse->Next ) ; - mouse->Node.ReferenceCount ++; + if( mouse ) + mouse->Node.ReferenceCount ++; Mutex_Release(&glHID_MouseListLock); - return &mouse->Node; + if( mouse ) + return &mouse->Node; + else + return NULL; } size_t HID_Mouse_Dev_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) @@ -136,15 +140,37 @@ size_t HID_Mouse_Dev_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Bu memcpy( Buffer, info->FileData + Offset, Length ); + VFS_MarkAvaliable( &info->Node, 0 ); + return Length; } static const char *csaDevIOCtls[] = {DRV_IOCTLNAMES, DRV_JOY_IOCTLNAMES, NULL}; int HID_Mouse_Dev_IOCtl(tVFS_Node *Node, int ID, void *Data) { + tJoystick_NumValue *numval = Data; + tHID_Mouse *info = Node->ImplPtr; switch(ID) { BASE_IOCTLS(DRV_TYPE_JOYSTICK, "USBMouse", 0x050, csaDevIOCtls); + + case JOY_IOCTL_GETSETAXISLIMIT: + if( !numval || !CheckMem(numval, sizeof(*numval)) ) + return -1; + if(numval->Num < 0 || numval->Num >= MAX_AXIES) + return 0; + if(numval->Value != -1) + info->AxisLimits[numval->Num] = numval->Value; + return info->AxisLimits[numval->Num]; + + case JOY_IOCTL_GETSETAXISPOSITION: + if( !numval || !CheckMem(numval, sizeof(*numval)) ) + return -1; + if(numval->Num < 0 || numval->Num >= MAX_AXIES) + return 0; + if(numval->Value != -1) + info->Axies[numval->Num].CursorPos = numval->Value; + return info->Axies[numval->Num].CursorPos; } return -1; } @@ -170,6 +196,7 @@ void HID_Mouse_Dev_Close(tVFS_Node *Node) Sint32 _ReadBits(void *Data, int Offset, int Length) { int dest_ofs = 0; + int rem = Length; Uint32 rv = 0; Uint8 *bytes = (Uint8*)Data + Offset / 8; @@ -188,23 +215,22 @@ Sint32 _ReadBits(void *Data, int Offset, int Length) rv = (*bytes >> Offset); dest_ofs = Offset & 7; - Length -= Offset & 7; + rem = Length - (Offset & 7); bytes ++; } // Body bytes - while( Length >= 8 ) + while( rem >= 8 ) { rv |= *bytes << dest_ofs; dest_ofs += 8; - Length -= 8; + rem -= 8; bytes ++; } - if( Length ) + if( rem ) { - rv |= (*bytes & ((1 << Length)-1)) << dest_ofs; - + rv |= (*bytes & ((1 << rem)-1)) << dest_ofs; } // Do sign extension @@ -225,8 +251,6 @@ void HID_Mouse_DataAvail(tUSBInterface *Dev, int EndPt, int Length, void *Data) info = USB_GetDeviceDataPtr(Dev); if( !info ) return ; - Log_Debug("USBMouse", "info = %p", info); - ofs = 0; for( int i = 0; i < info->nMappings; i ++ ) { @@ -237,6 +261,7 @@ void HID_Mouse_DataAvail(tUSBInterface *Dev, int EndPt, int Length, void *Data) return ; value = _ReadBits(Data, ofs, info->Mappings[i].BitSize); + LOG("%i+%i: value = %i", ofs, info->Mappings[i].BitSize, value); ofs += info->Mappings[i].BitSize; if( dest == 0xFF ) continue ; @@ -245,11 +270,13 @@ void HID_Mouse_DataAvail(tUSBInterface *Dev, int EndPt, int Length, void *Data) { // Axis info->Axies[ dest & 0x7F ].CurValue = value; + LOG("Axis %i = %i", dest & 0x7F, info->Axies[dest & 0x7F].CurValue); } else { // Button info->Buttons[ dest & 0x7F ] = (value == 0) ? 0 : 0xFF; + LOG("Button %i = %x", dest & 0x7F, info->Buttons[dest & 0x7F]); } } @@ -266,9 +293,10 @@ void HID_Mouse_DataAvail(tUSBInterface *Dev, int EndPt, int Length, void *Data) info->Axies[i].CursorPos = newpos; } - Log_Debug("USBMouse", "New Pos (%i,%i,%i)", - info->Axies[0].CursorPos, info->Axies[1].CursorPos, info->Axies[2].CursorPos - ); +// Log_Debug("USBMouse", "New Pos (%i,%i,%i)", +// info->Axies[0].CursorPos, info->Axies[1].CursorPos, info->Axies[2].CursorPos +// ); + VFS_MarkAvaliable( &info->Node, 1 ); } // ---------------------------------------------------------------------------- @@ -297,6 +325,14 @@ tHID_ReportCallbacks *HID_Mouse_Report_Collection( info->FileHeader = (void*)info->FileData; info->Axies = (void*)(info->FileHeader + 1); info->Buttons = (void*)(info->Axies + MAX_AXIES); + info->FileHeader->NAxies = MAX_AXIES; + info->FileHeader->NButtons = MAX_BUTTONS; + + for( int i = 0; i < MAX_AXIES; i ++ ) { + info->Axies[i].MinValue = -10; + info->Axies[i].MaxValue = 10; + } + LOG("Initialised new mouse at %p", info); @@ -366,6 +402,8 @@ void HID_int_AddInput(tUSBInterface *Dev, Uint32 Usage, Uint8 Size, Uint32 Min, default: tag = 0xFF; break; } + LOG("Usage = 0x%08x, tag = 0x%2x", Usage, tag); + // --- Add to list of mappings --- info->nMappings ++; info->Mappings = realloc(info->Mappings, info->nMappings * sizeof(info->Mappings[0])); @@ -392,11 +430,13 @@ void HID_Mouse_Report_Input( ) { Uint32 usage = 0; + LOG("Local->Usages.nItems = %i", Local->Usages.nItems); for( int i = 0; i < Global->ReportCount; i ++ ) { // - Update usage if( i < Local->Usages.nItems ) usage = Local->Usages.Items[i]; + LOG("%i: usage = %x", i, usage); // - Add to list HID_int_AddInput(Dev, usage, Global->ReportSize, Global->LogMin, Global->LogMax); }