Modules/USB HID - Keyboard support!
[tpg/acess2.git] / KernelLand / Modules / USB / HID / mouse.c
index d34ee27..6ca88a5 100644 (file)
@@ -5,7 +5,7 @@
  * mouse.c
  * - USB Mouse driver
  */
-#define DEBUG  1
+#define DEBUG  0
 #include <acess.h>
 #include "hid_reports.h"
 #include <fs_devfs.h>
@@ -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);
        }

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