2.2 KiB
2.2 KiB
libSceUsbd technical debt
Silent stubs
- libSceUsbd passes the calls through to the host with libusb built from the
3rdparty/libusb-cmakesubmodule. Devices, handles and descriptors are libusb's own objects: the device, config, interface and endpoint descriptor layouts of FreeBSD 11.4 libusb match libusb's field for field, whichstatic_assertpins. Each one handed to the title is tracked, and a pointer this library did not return throws. Errors are libusb's codes mapped to0x80240000 - code, withLIBUSB_ERROR_OTHERat0x802400FF, following shadPS4; the null arguments FreeBSD libusb rejects (libusb10.c, libusb10_desc.c, libusb10_io.c) return0x80240002, andsceUsbdOpenandsceUsbdGetActiveConfigDescriptorthrow on a null device, which it dereferences. A submitted transfer is copied into a host transfer whose completion copies the status, actual length and iso packet results back and then calls the title's callback fromsceUsbdHandleEventsTimeout; transfer flags other than short-not-ok and add-zero-packet throw.sceUsbdAttachKernelDriverreturns 0 as FreeBSD's stub does,sceUsbdCheckConnectedreports a device gone when reading its configuration fails withLIBUSB_ERROR_NO_DEVICE(FreeBSD asks the kernel directly), andsceUsbdEventHandlingOkreturns 1. When the host has no USB access, initialization keeps the empty device list and event handling waits for its timeout. Opening, descriptors, string and control requests, interface claims and an asynchronous control transfer were checked against an Xbox 360 controller on Windows; the transfer layout, the argument lists, the error codes and isochronous transfers are unverified on PS5