/dev/usb/oh0

From WiiBrew
< /dev‎ | usb
Jump to: navigation, search

/dev/usb/oh0 is used to interact with the Wii's external USB bus.

This interface is very similar to OH1. In recent versions of IOS (including IOS 57, 58 and 59), the OHCI0 module appears to implement a different interface.

/dev/usb/oh0 (IOS57 and newer)

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.
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

Ioctl Name Input Output Notes
12 (ioctlv) USBV0_IOCTL_GETDEVLIST 2 2
  • 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
27 (ioctlv) USBV0_IOCTL_DEVINSERTHOOK 2 0

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) ? 3 1

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

Its purpose is unknown, but it seems to be similar to USBV0_IOCTL_DEVINSERTHOOK.

  • in 0: u16 - VID
  • in 1: u16 - PID
  • in 2: u8 - Unknown (00)
  • io 0: u8* of size 4 - Unknown (seems to be game-dependant)

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

Ioctl Name Input Output Notes
0 (ioctlv) USBV0_IOCTL_CTRLMSG 5 1

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

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

Submits an interrupt transfer.

  • in 0: u8 - Endpoint
  • in 1: u16 - Length
  • io 0: array of length in[1] - Payload data
5 (ioctl) USBV0_IOCTL_SUSPENDDEV ? ?

Unknown. According to libogc, this is used for suspending a device.

6 (ioctl) USBV0_IOCTL_RESUMEDEV ? ?

Unknown. According to libogc, this is used for resuming a device.

9 (ioctlv) USBV0_IOCTL_ISOMSG 3 2

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
26 (ioctlv) USBV0_IOCTL_DEVREMOVALHOOK 0 0

Returns when the device is unplugged.

29 (ioctl) ? 0 0

Unknown. Used by Wheel of Fortune on shutdown.

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