Difference between revisions of "/dev/usb/oh0"

From WiiBrew
< /dev‎ | usb
Jump to: navigation, search
(/dev/usb/oh0 (IOS57 and newer))
(/dev/usb/oh0/%x/%x)
Line 139: Line 139:
 
* in 1: u16 - Length
 
* in 1: u16 - Length
 
* io 0: array of length in[1] - Payload data
 
* io 0: array of length in[1] - Payload data
 
|-
 
| 5 (ioctl) || USBV0_IOCTL_SUSPENDDEV || ? || ? || Both
 
|
 
Unknown. According to libogc, this is used for suspending a device. (Is this a host or device request?) {{check}}
 
 
|-
 
| 6 (ioctl) || USBV0_IOCTL_RESUMEDEV || ? || ? || Both
 
|
 
Unknown. According to libogc, this is used for resuming a device. (Is this a host or device request?) {{check}}
 
  
 
|-
 
|-
Line 159: Line 149:
 
* io 0: u16* of size in[2] - Sizes of the isochronous packets
 
* io 0: u16* of size in[2] - Sizes of the isochronous packets
 
* io 1: array of length in[1] - Payload data
 
* io 1: array of length in[1] - Payload data
 +
 +
|-
 +
| 10 (ioctlv) || ? || ? || ? || OH0
 +
|
 +
???
 +
Handled by the same function as for bulk and interrupt transfers.
  
 
|-
 
|-

Revision as of 15:09, 21 December 2016

/dev/usb/oh0 is used to interact with the Wii's external USB bus. This interface is very similar to /dev/usb/oh1 and has two parts: the "root" or host device, and individual devices on which USB requests can be submitted.

/dev/usb/oh0 (IOS57 and newer)

In recent versions of IOS (after IOS 57), the OHCI0 module appears to implement a different interface and seems to only register this new interface of /dev/usb/oh0.

Only IOS_OPEN, IOS_CLOSE and IOS_IOCTL are valid commands. The other commands immediately return IPC_EINVAL (-4).

Additionally, /dev/usb/oh0 can only be opened from UID 0x11. Attempts to open OH0 with other UIDs will result in IPC_EACCES (-1).

Ioctl Name Input Output Notes
0 USBV2_IOCTL_GET_VERSION - 0x20 bytes Writes the version 0x20001 to the output buffer. This is very similar to the IOS58 version of /dev/usb/hid, which writes 0x50001 to the output buffer instead. It is also reminiscent of /dev/usb/ehc which does the same thing (but with an ioctlv).
1 ? ? ? ?
2 ? ? ? ?
3 ? 0x20 bytes ? ?
4 ? 0x20 bytes ? ?
5 ? 0x20 bytes ? ?
16 ? 0x20 bytes ? ?
17 ? 0x20 bytes ? ?
18 ? 0x20 bytes ? Handled by the same function as for ioctl 20.
19 ? 0x20 bytes ? ?
20 ? 0x20 bytes ? Handled by the same function as for ioctl 18.

/dev/usb/oh0

The OH1 module appears to be able to register itself as /dev/usb/oh0 and implements a similar set of requests.

Request Name Input Output OH0/OH1 Notes
12 (ioctlv) USBV0_IOCTL_GETDEVLIST 2 2 Both
  • in 0: u8 - number of descriptors to return
  • in 1: u8 - interface class
  • io 0: u8 - number of devices
  • io 1: u32* of size num_descriptors * 8 - device list
15 (ioctl) ? - 4 bytes Both Mentioned by comex in #dolphin-dev.
20 (ioctlv) ? 1 1 Both Unknown.
  • in 0: u8 - ???
  • io 0: u16 - ???
25 (ioctlv) ? 2 ? Both Unknown. Returns IPC_EINVAL if in_vectors[0] is greater than the least significant byte of (heap + 0x40). Possibly has to do with suspend/resume. [check]
  • in 0: u8 - ???
  • in 1: u16 - ???
27 (ioctlv) USBV0_IOCTL_DEVINSERTHOOK 2 0 OH0

Returns when a device with the requested VID/PID is plugged in, or immediately if the device is already inserted.

  • in 0: u16 - VID
  • in 1: u16 - PID
30 (ioctlv) USBV0_IOCTL_DEVINSERTHOOKID (RegisterInsertionNotifyWithId) 3 1 OH0

Returns when a device with the requested VID/PID is plugged in, or immediately if the device is already inserted.

It is similar to USBV0_IOCTL_DEVINSERTHOOK, but it has an additional in vector + io vector, possibly used for passing an "ID" (according the official name). Its purpose is unknown.

  • in 0: u16 - VID
  • in 1: u16 - PID
  • in 2: u8 - Unknown (00); some sort of ID?
  • io 0: u8* of size 4 - Unknown; some sort of ID?
31 (?) ? (IUSB_CancelInsertionNotify) ? ? OH0 ?

/dev/usb/oh0/%x/%x

These devices represent an individual USB device, based on its vendor ID and product ID (in hexadecimal format without leading zeroes). It is unclear how devices with the same VID/PID can be used at the same time.

Request Name Input Output OH0/OH1 Notes
0 (ioctlv) USBV0_IOCTL_CTRLMSG 6 1 Both

Submits a control transfer.

  • in 0: u8 - bmRequestType
  • in 1: u8 - bmRequest
  • in 2: u16 - wValue (swapped)
  • in 3: u16 - wIndex (swapped)
  • in 4: u16 - wLength (swapped)
  • in 5: u8 - Unknown (00)
  • io 0: array of length wLength - Request data
1 (ioctlv) USBV0_IOCTL_BLKMSG 2 1 Both

Submits a bulk transfer.

  • in 0: u8 - Endpoint
  • in 1: u16 - Length
  • io 0: array of length in[1] - Payload data
2 (ioctlv) USBV0_IOCTL_INTRMSG 2 1 Both

Submits an interrupt transfer.

  • in 0: u8 - Endpoint
  • in 1: u16 - Length
  • io 0: array of length in[1] - Payload data
9 (ioctlv) USBV0_IOCTL_ISOMSG 3 2 OH0

Submits an isochronous transfer.

  • in 0: u8 - Endpoint
  • in 1: u16 - Length
  • in 2: u8 - Number of isochronous packets
  • io 0: u16* of size in[2] - Sizes of the isochronous packets
  • io 1: array of length in[1] - Payload data
10 (ioctlv) ? ? ? OH0

??? Handled by the same function as for bulk and interrupt transfers.

26 (ioctlv) USBV0_IOCTL_DEVREMOVALHOOK 0 0 Both

Returns when the device is unplugged.

29 (ioctl) ? - - OH0

Unknown. Used by Wheel of Fortune on shutdown. This probably resets the device.

Known Devices

  • /dev/usb/oh0/0b95/7720: ASIX AX88772 USB2.0 to Fast Ethernet Adapter (referenced in IOS eth driver)
  • /dev/usb/oh0/57e/308: Nintendo Wii Speak (microphone)
  • /dev/usb/oh0/46d/a03: Logitech microphone

Errors

-4 (IPC_EINVAL): might be caused by an invalid device fd

-7003: STALL (according to gc-linux)

-7004: STALL (according to gc-linux)

-7005: NAK (according to gc-linux)

-7008

-7022