usbacc: Move usb driver structs and funcs to usbbus.h and clean-up some usbacc functions

This commit is contained in:
Joel16 2021-08-22 15:17:34 -04:00
parent b8bc07f5e6
commit f0153746cd
2 changed files with 190 additions and 138 deletions

170
include/usbbus.h Normal file
View File

@ -0,0 +1,170 @@
/* Copyright (C) The uOFW team
See the file COPYING for copying permission.
*/
/** @defgroup Chkreg Chkreg Module
* Region check and ConsoleId service.
* @{
*/
#ifndef USBBUS_H
#define USBBUS_H
#include "common_header.h"
/**
* USB driver endpoint
*/
struct UsbEndpoint {
/** Endpoint number (must be filled in sequentially) */
int endpnum;
/** Filled in by the bus driver */
int unk2;
/** Filled in by the bus driver */
int unk3;
};
/**
* USB Interface descriptor
*/
struct InterfaceDescriptor {
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bInterfaceNumber;
unsigned char bAlternateSetting;
unsigned char bNumEndpoints;
unsigned char bInterfaceClass;
unsigned char bInterfaceSubClass;
unsigned char bInterfaceProtocol;
unsigned char iInterface;
} __attribute__((packed));
/**
* USB driver interfaces structure
*/
struct UsbInterfaces {
/** Pointers to the individual interface descriptors */
struct InterfaceDescriptor *infp[2];
/** Number of interface descriptors */
unsigned int num;
};
/**
* USB string descriptor
*/
struct StringDescriptor {
unsigned char bLength;
unsigned char bDescriptorType;
short bString[32];
} __attribute__((packed));
/**
* USB EP0 Device Request
*/
struct DeviceRequest {
unsigned char bmRequestType;
unsigned char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
} __attribute__((packed));
/**
* USB driver structure used by ::sceUsbbdRegister and ::sceUsbbdUnregister
*/
struct UsbDriver {
/** Name of the USB driver */
const char *name;
/** Number of endpoints in this driver (including default control) */
int endpoints;
/** List of endpoint structures (used when calling other functions) */
struct UsbEndpoint *endp;
/** Interface list */
struct UsbInterface *intp;
/** Pointer to hi-speed device descriptor */
void *devp_hi;
/** Pointer to hi-speed device configuration */
void *confp_hi;
/** Pointer to full-speed device descriptor */
void *devp;
/** Pointer to full-speed device configuration */
void *confp;
/** Default String descriptor */
struct StringDescriptor *str;
/** Received a control request arg0 is endpoint, arg1 is possibly data arg2 is data buffer */
int (*recvctl)(int arg1, int arg2, struct DeviceRequest *req);
/** Unknown */
int (*func28)(int arg1, int arg2, int arg3);
/** Configuration set (attach) function */
int (*attach)(int speed, void *arg2, void *arg3);
/** Configuration unset (detach) function */
int (*detach)(int arg1, int arg2, int arg3);
/** Unknown set to 0 */
int unk34;
/** Function called when the driver is started */
int (*start_func)(int size, void *args);
/** Function called when the driver is stopped */
int (*stop_func)(int size, void *args);
/** Link to next USB driver in the chain, set to NULL */
struct UsbDriver *link;
};
/**
* USB device request, used by ::sceUsbbdReqSend and ::sceUsbbdReqRecv.
*/
struct UsbdDeviceReq {
/** Pointer to the endpoint to queue request on */
struct UsbEndpoint *endp;
/** Pointer to the data buffer to use in the request */
void *data;
/** Size of the data buffer (send == size of data, recv == size of max receive) */
int size;
/** Unknown */
int unkc;
/** Pointer to the function to call on completion */
void *func;
/** Resultant size (send == size of data sent, recv == size of data received) */
int recvsize;
/** Return code of the request, 0 == success, -3 == cancelled */
int retcode;
/** Unknown */
int unk1c;
/** A user specified pointer for the device request */
void *arg;
/** Link pointer to next request used by the driver, set it to NULL */
void *link;
};
/**
* Register a USB driver.
*
* @param drv - Pointer to a filled out USB driver
*
* @return 0 on success, < 0 on error.
*/
int sceUsbbdRegister(struct UsbDriver *drv);
/**
* Unregister a USB driver
*
* @param drv - Pointer to a filled out USB driver
*
* @return 0 on success, < 0 on error
*/
int sceUsbbdUnregister(struct UsbDriver *drv);
/**
* Queue a send request (IN from host pov)
*
* @param req - Pointer to a filled out UsbdDeviceReq structure.
*
* @return 0 on success, < 0 on error
*/
int sceUsbbdReqSend(struct UsbdDeviceReq *req);
int sceUsbBus_driver_8A3EB5D2(void);
#endif // USBBUS_H
/** @} */

View File

@ -1,6 +1,7 @@
#include <common_imp.h> #include <common_imp.h>
#include <interruptman.h> #include <interruptman.h>
#include <sysmem_utils_kernel.h> #include <sysmem_utils_kernel.h>
#include <usbbus.h>
SCE_MODULE_INFO("sceUSB_Acc_Driver", SCE_MODULE_KERNEL | SCE_MODULE_ATTR_EXCLUSIVE_LOAD | SCE_MODULE_ATTR_EXCLUSIVE_START, 1, 3); SCE_MODULE_INFO("sceUSB_Acc_Driver", SCE_MODULE_KERNEL | SCE_MODULE_ATTR_EXCLUSIVE_LOAD | SCE_MODULE_ATTR_EXCLUSIVE_START, 1, 3);
SCE_SDK_VERSION(SDK_VERSION); SCE_SDK_VERSION(SDK_VERSION);
@ -10,146 +11,26 @@ SCE_SDK_VERSION(SDK_VERSION);
#define SCE_ERROR_USB_DRIVER_NOT_FOUND 0x80243005 #define SCE_ERROR_USB_DRIVER_NOT_FOUND 0x80243005
#define SCE_ERROR_USB_BUS_DRIVER_NOT_STARTED 0x80243007 #define SCE_ERROR_USB_BUS_DRIVER_NOT_STARTED 0x80243007
/** USB driver endpoint */
struct UsbEndpoint
{
/** Endpoint number (must be filled in sequentially) */
int endpnum;
/** Filled in by the bus driver */
int unk2;
/** Filled in by the bus driver */
int unk3;
};
/** USB Interface descriptor */
struct InterfaceDescriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bInterfaceNumber;
unsigned char bAlternateSetting;
unsigned char bNumEndpoints;
unsigned char bInterfaceClass;
unsigned char bInterfaceSubClass;
unsigned char bInterfaceProtocol;
unsigned char iInterface;
} __attribute__((packed));
/** USB driver interfaces structure */
struct UsbInterfaces
{
/** Pointers to the individual interface descriptors */
struct InterfaceDescriptor *infp[2];
/** Number of interface descriptors */
unsigned int num;
};
/** USB string descriptor */
struct StringDescriptor
{
unsigned char bLength;
unsigned char bDescriptorType;
short bString[32];
} __attribute__((packed));
/** USB EP0 Device Request */
struct DeviceRequest
{
unsigned char bmRequestType;
unsigned char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
} __attribute__((packed));
struct UsbDriver
{
/** Name of the USB driver */
const char *name;
/** Number of endpoints in this driver (including default control) */
int endpoints;
/** List of endpoint structures (used when calling other functions) */
struct UsbEndpoint *endp;
/** Interface list */
struct UsbInterface *intp;
/** Pointer to hi-speed device descriptor */
void *devp_hi;
/** Pointer to hi-speed device configuration */
void *confp_hi;
/** Pointer to full-speed device descriptor */
void *devp;
/** Pointer to full-speed device configuration */
void *confp;
/** Default String descriptor */
struct StringDescriptor *str;
/** Received a control request arg0 is endpoint, arg1 is possibly data arg2 is data buffer */
int (*recvctl)(int arg1, int arg2, struct DeviceRequest *req);
/** Unknown */
int (*func28)(int arg1, int arg2, int arg3);
/** Configuration set (attach) function */
int (*attach)(int speed, void *arg2, void *arg3);
/** Configuration unset (detach) function */
int (*detach)(int arg1, int arg2, int arg3);
/** Unknown set to 0 */
int unk34;
/** Function called when the driver is started */
int (*start_func)(int size, void *args);
/** Function called when the driver is stopped */
int (*stop_func)(int size, void *args);
/** Link to next USB driver in the chain, set to NULL */
struct UsbDriver *link;
};
/** USB device request, used by ::sceUsbbdReqSend and ::sceUsbbdReqRecv. */
struct UsbdDeviceReq
{
/** Pointer to the endpoint to queue request on */
struct UsbEndpoint *endp;
/** Pointer to the data buffer to use in the request */
void *data;
/** Size of the data buffer (send == size of data, recv == size of max receive) */
int size;
/** Unknown */
int unkc;
/** Pointer to the function to call on completion */
void *func;
/** Resultant size (send == size of data sent, recv == size of data received) */
int recvsize;
/** Return code of the request, 0 == success, -3 == cancelled */
int retcode;
/** Unknown */
int unk1c;
/** A user specified pointer for the device request */
void *arg;
/** Link pointer to next request used by the driver, set it to NULL */
void *link;
};
int sceUsbbdRegister(struct UsbDriver *drv); // sceUsbBus_driver_B1644BE7
int sceUsbbdUnregister(struct UsbDriver *drv); // sceUsbBus_driver_C1E2A540
int sceUsbbdReqSend(struct UsbdDeviceReq *req); // sceUsbBus_driver_23E51D8F
int sceUsbBus_driver_8A3EB5D2(void);
// Globals // Globals
struct UsbDriver g_drv; // 0x00000CC4 struct UsbDriver g_drv; // 0x00000CC4
u8 g_unk0; // 0x00000D53 u8 g_unk0; // 0x00000D53
u16 g_unk1; // 0x00000D50 u16 g_type; // 0x00000D50
u8 g_unk2; // 0x00000D52 u8 g_unk2; // 0x00000D52
u8 g_unk3; // 0x00000D53 struct UsbEndpoint g_endp; // 0x00000CAC
struct UsbdDeviceReq g_req; // 0x00000CAC
// Subroutine sceUsbAccGetAuthStat - Address 0x00000000 - Aliases: sceUsbAcc_79A1C743, sceUsbAcc_driver_79A1C743 -- Done // Subroutine sceUsbAccGetAuthStat - Address 0x00000000 - Aliases: sceUsbAcc_79A1C743, sceUsbAcc_driver_79A1C743 -- Done
// Exported in sceUsbAcc_internal, sceUsbAcc and sceUsbAcc_driver // Exported in sceUsbAcc_internal, sceUsbAcc and sceUsbAcc_driver
s32 sceUsbAccGetAuthStat(void) s32 sceUsbAccGetAuthStat(void)
{ {
int intr = sceKernelCpuSuspendIntr(); int intr = sceKernelCpuSuspendIntr();
s32 ret = SCE_ERROR_USB_BUS_DRIVER_NOT_STARTED; s32 ret = 0;
if (g_unk0) { if (g_unk0) {
ret = 0;
if (sceUsbBus_driver_8A3EB5D2() == 0) if (sceUsbBus_driver_8A3EB5D2() == 0)
ret = 0x80243701; ret = 0x80243701;
} }
else
ret = SCE_ERROR_USB_BUS_DRIVER_NOT_STARTED;
sceKernelCpuResumeIntr(intr); sceKernelCpuResumeIntr(intr);
return ret; return ret;
@ -164,18 +45,19 @@ s32 sceUsbAccGetInfo(void)
// Subroutine sceUsbAcc_internal_2A100C1F - Address 0x00000154 -- TODO: Verify // Subroutine sceUsbAcc_internal_2A100C1F - Address 0x00000154 -- TODO: Verify
// Exported in sceUsbAcc_internal // Exported in sceUsbAcc_internal
s32 sceUsbAcc_internal_2A100C1F(struct UsbdDeviceReq *arg) s32 sceUsbAcc_internal_2A100C1F(struct UsbdDeviceReq *req)
{ {
s32 ret = SCE_ERROR_USB_BUS_DRIVER_NOT_STARTED; s32 ret = SCE_ERROR_USB_BUS_DRIVER_NOT_STARTED;
u8 *data = req->data;
if (g_unk3) { if (g_unk0) {
ret = SCE_ERROR_USB_INVALID_ARGUMENT; ret = SCE_ERROR_USB_INVALID_ARGUMENT;
if (*(u8 *)(&arg[1] + 3) < 0x3D) { if ((data[3]) < 0x3D) {
sceKernelDcacheWritebackRange(&arg[1], sizeof(arg[2])); sceKernelDcacheWritebackRange(data, req->size);
arg[0] = g_req; req->endp = &g_endp;
arg[2] = *((&arg[1] + 3) + 4); req->size = data[3] + 4;
ret = sceUsbbdReqSend(arg); ret = sceUsbbdReqSend(req);
} }
} }
@ -188,9 +70,9 @@ s32 sceUsbAccRegisterType(u16 type)
{ {
s32 error = SCE_ERROR_USB_DRIVER_NOT_FOUND; s32 error = SCE_ERROR_USB_DRIVER_NOT_FOUND;
if ((g_unk1 & type) == 0) { if ((g_type & type) == 0) {
error = 0; error = 0;
g_unk1 = g_unk1 | type; g_type = g_type | type;
} }
return error; return error;
@ -202,9 +84,9 @@ s32 sceUsbAccUnregisterType(u16 type)
{ {
s32 error = SCE_ERROR_USB_DRIVER_NOT_FOUND; s32 error = SCE_ERROR_USB_DRIVER_NOT_FOUND;
if ((g_unk1 & type) != 0) { if ((g_type & type) != 0) {
error = 0; error = 0;
g_unk1 = g_unk1 & ~type; g_type = g_type & ~type;
} }
return error; return error;
@ -215,7 +97,7 @@ s32 module_start(SceSize args __attribute__((unused)), void *argp __attribute__(
{ {
s32 ret = 0; s32 ret = 0;
if ((ret = sceUsbbdRegister(&g_drv)) >= 0) { if ((ret = sceUsbbdRegister(&g_drv)) >= 0) {
g_unk1 = 0; g_type = 0;
g_unk2 = 0; g_unk2 = 0;
} }