Changes

888 bytes added ,  13:49, 26 September 2021
no edit summary
Line 6: Line 6:     
Only IOS_OPEN, IOS_CLOSE, IOS_IOCTL and IOS_IOCTLV are valid commands. The other commands immediately return IPC_EINVAL (-4).
 
Only IOS_OPEN, IOS_CLOSE, IOS_IOCTL and IOS_IOCTLV are valid commands. The other commands immediately return IPC_EINVAL (-4).
 +
 +
Note: The device needs to be "resumed" (<code>ioctl 0x10</code> SuspendResume) before data can be sent/received, or even before <code>ioctl 3</code> GetDeviceInfo can be used (at least for <code>/dev/usb/hid</code>).
    
== Handles ==
 
== Handles ==
Line 38: Line 40:  
11-12: Number of alternate settings<br>
 
11-12: Number of alternate settings<br>
   −
| Set up a device insertion/removal callback. Returns the number of entries.
+
| Set up a device insertion/removal callback. Returns the number of entries.
 +
 
 +
When a callback is triggered, the manager is locked to the caller handle and will not trigger other callbacks until AttachFinish is called. Other handlers will receive an IOS_EINVAL when attempting to modify device information.
    
Note that this ioctl immediately returns on the first call.
 
Note that this ioctl immediately returns on the first call.
Line 58: Line 62:  
| 0xc0 bytes (memset to 0)
 
| 0xc0 bytes (memset to 0)
    +
0-4: Device ID<br>
 +
4-8: Unknown byte from <code>ioctl_2_out_buffer[5]</code><br>
 
20-40: Device descriptor<br>
 
20-40: Device descriptor<br>
 
40-52: Config descriptor<br>
 
40-52: Config descriptor<br>
Line 63: Line 69:  
64-72: Endpoint descriptors (interface.bNumEndpoints times)
 
64-72: Endpoint descriptors (interface.bNumEndpoints times)
   −
| Get USB descriptors for a device. Behind the scenes, calls /dev/usb/usb ioctl 2 (input: internal ID, output: descriptors) and copies information to the output buffer and the internal device struct.
+
| Get USB descriptors for a device. Behind the scenes, calls /dev/usb/usb ioctl 2 (input: internal ID, output: descriptors) and copies information to the output buffer and the internal device struct (must be called before a device can be used).
    
The descriptor structures match the ones used by libusb (with padding).  
 
The descriptor structures match the ones used by libusb (with padding).  
 
|-
 
|-
| 4 || ?
+
| 4 || Attach
 
| 0x20 bytes
 
| 0x20 bytes
   Line 73: Line 79:  
2-4: Device number
 
2-4: Device number
 
| None
 
| None
| ? (related to callbacks) {{check}}
+
| Attaches the provided device to the current handle.
 
|-
 
|-
| 5 || ?
+
| 5 || Release
 
| 0x20 bytes
 
| 0x20 bytes
   Line 81: Line 87:  
2-4: Device number
 
2-4: Device number
 
| None
 
| None
| ? (related to callbacks) {{check}}
+
| Releases the provided device from the current handle. IPC_EINVAL is returned if a device does not belong to the caller handle.
 
  −
The caller handle must match a stored ID (?)
      
May trigger change callbacks and reissue /dev/usb/usb ioctl 1 in some conditions.
 
May trigger change callbacks and reissue /dev/usb/usb ioctl 1 in some conditions.
 
|-
 
|-
 
| 6 || AttachFinish || None || None
 
| 6 || AttachFinish || None || None
| The caller handle must match a stored ID (?)
+
| Unlocks the manager from the current handle, triggers change callbacks for the other active handles and issues /dev/usb/usb ioctl 1 in some cases.
   −
If it does, IPC_SUCCESS is returned, change callbacks are triggered and /dev/usb/usb ioctl 1 is issued.
+
If the caller handle does not match the one that locked the manager, IOS_EINVAL is returned.
 
|-
 
|-
 
| 7 || SetAlternateSetting
 
| 7 || SetAlternateSetting
Line 97: Line 101:  
1-2: Device index<br>
 
1-2: Device index<br>
 
2-4: Device number<br>
 
2-4: Device number<br>
8-12: Alternate setting
+
8-9: Alternate setting
 
| None
 
| None
 
| Set the active alternate setting for a device.
 
| Set the active alternate setting for a device.
   −
Internally, this issues /dev/usb/usb ioctl 2 to get descriptors, loops over all endpoints and calls /dev/usb/usb ioctl 5 if <code>(bmAttributes & 3) == 1</code>. If all ioctls succeed, VEN calls /dev/usb/usb ioctl 0x11 with the device ID, alt setting and bInterfaceNumber (+ other unknown values).  
+
Internally, this issues /dev/usb/usb ioctl 2 to get descriptors, loops over all endpoints and calls OHCI0/EHC ioctl 5 if <code>(bmAttributes & 3) == 1</code> (if this is an isochronous endpoint?). If all ioctls succeed, VEN calls OHCI0/EHC ioctl 0x11 with the device ID, alt setting and bInterfaceNumber (+ other unknown values).  
 
|-
 
|-
 
| 8 || ?
 
| 8 || ?
Line 120: Line 124:  
| Suspend or resume a device.
 
| Suspend or resume a device.
   −
Calls /dev/usb/usb ioctl 4. If the call was successful, updates the internal device struct to reflect the state change. The new state must not be the same as the current one; otherwise IPC_EINVAL will be returned.
+
Calls /dev/usb/usb ioctl 4. If the call was successful, updates the internal device struct to reflect the state change. The device must belong to the caller handle and the new state must not be the same as the current one; otherwise IPC_EINVAL will be returned.
 
|-
 
|-
 
| 0x11 || CancelEndpoint
 
| 0x11 || CancelEndpoint
Line 129: Line 133:  
8-9: Endpoint {{check}}
 
8-9: Endpoint {{check}}
 
| None
 
| None
| calls /dev/usb/usb ioctl 0x10
+
| calls USB backend (EHC or OHCI0) ioctl 0x10
 
|-
 
|-
 
| 0x12 (ioctlv) || CtrlTransfer ||colspan=2| 1 in / 1 io or 2 in / 0 io
 
| 0x12 (ioctlv) || CtrlTransfer ||colspan=2| 1 in / 1 io or 2 in / 0 io
 
| Submit a control transfer to a device.
 
| Submit a control transfer to a device.
   −
calls /dev/usb/usb ioctl 0x11
+
calls USB backend (EHC or OHCI0) ioctl 0x11
 
|-
 
|-
 
| 0x13 (ioctlv) || IntrTransfer ||colspan=2| 1 in / 1 io or 2 in / 0 io
 
| 0x13 (ioctlv) || IntrTransfer ||colspan=2| 1 in / 1 io or 2 in / 0 io
 
| Submit an interrupt transfer to a device.
 
| Submit an interrupt transfer to a device.
   −
calls /dev/usb/usb ioctl 0x12
+
calls USB backend (EHC or OHCI0) ioctl 0x12
 
|-
 
|-
 
| 0x14 (ioctlv) || IsoTransfer ||colspan=2| 2 in / 2 io or 3 in / 1 io
 
| 0x14 (ioctlv) || IsoTransfer ||colspan=2| 2 in / 2 io or 3 in / 1 io
 
| Submit an isochronous transfer to a device.
 
| Submit an isochronous transfer to a device.
   −
calls /dev/usb/usb ioctl 0x13
+
calls USB backend (EHC or OHCI0) ioctl 0x13
 
|-
 
|-
 
| 0x15 (ioctlv) || BulkTransfer ||colspan=2| ?
 
| 0x15 (ioctlv) || BulkTransfer ||colspan=2| ?
 
| Submit a bulk transfer to a device.
 
| Submit a bulk transfer to a device.
   −
calls /dev/usb/usb ioctl 0x14
+
calls USB backend (EHC or OHCI0) ioctl 0x14
 
|}
 
|}
    
[[Category:IOS API documentation]]
 
[[Category:IOS API documentation]]
17

edits