sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
usbdpriv.h
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
16
17#ifndef __USBDPRIV_H__
18#define __USBDPRIV_H__
19
20#include "irx_imports.h"
21
22#include "defs.h"
23#include "types.h"
24#include "usbd.h"
25
26#define OHCI_REG_BASE 0xBF801600
27
28#ifdef DEBUG
29#define dbg_printf(a...) printf("usbd: " a)
30#else
31#define dbg_printf(a...) (void)0
32#endif
33
34#define READ_UINT16(a) (((u8 *)a)[0] | (((u8 *)a)[1] << 8))
35
36typedef struct _argOption
37{
38 const char *param;
39 int *value;
40 int *value2;
41} UsbdArgOption_t;
42
43typedef struct _usbdConfig
44{
45 int m_maxDevices;
46 int m_maxEndpoints;
47 int m_maxTransfDesc;
48 int m_maxIsoTransfDesc;
49 int m_maxIoReqs;
50 int m_maxStaticDescSize;
51 int m_maxHubDevices;
52 int m_maxPortsPerHub;
53 int m_allocatedSize_unused;
54 int m_hcdThreadPrio;
55 int m_cbThreadPrio;
56 int m_curDescNum;
57} UsbdConfig_t;
58
59extern UsbdConfig_t usbConfig;
60
61struct _device;
62struct _ioRequest;
63struct _hcTd;
64struct _hcIsoTd;
65struct _hcEd;
66struct _endpoint;
67struct _UsbDriver;
68struct _ioRequest;
69
70typedef void (*TimerCallback)(void *arg);
71typedef void (*InternCallback)(struct _ioRequest *arg);
72
73typedef struct _timerCbStruct
74{
75 u32 m_isActive;
76 struct _timerCbStruct *m_prev;
77 struct _timerCbStruct *m_next;
78 TimerCallback m_callbackProc;
79 void *m_callbackArg;
80 u32 m_delayCount;
81} UsbdTimerCbStruct_t;
82
83typedef struct _ioRequest
84{
85 u32 m_id;
86 u32 m_busyFlag;
87 struct _ioRequest *m_next;
88 struct _ioRequest *m_prev;
89 struct _endpoint *m_correspEndpoint;
90 UsbDeviceRequest m_devReq;
91 void *m_destPtr;
92 u32 m_length; // length of m_destPtr buffer
93 InternCallback m_callbackProc;
94 u32 m_resultCode;
95 u32 m_transferedBytes;
96 u32 m_waitFrames; // number of frames to wait for isochronous transfers
97 void *m_userCallbackArg;
98 union
99 {
100 void *m_userCallbackProc;
101 sceUsbdDoneCallback m_userCallbackProcRegular;
102 sceUsbdMultiIsochronousDoneCallback m_userCallbackProcMultiIsochronous;
103 };
104 void *m_gpSeg;
106} UsbdIoRequest_t;
107
108typedef struct _device
109{
110 u32 m_id;
111 struct _device *m_next;
112 struct _device *m_prev;
113 struct _endpoint *m_endpointListStart;
114 struct _endpoint *m_endpointListEnd;
115 sceUsbdLddOps *m_devDriver;
116 u8 m_deviceStatus;
117 u8 m_functionAddress;
118 u8 m_isLowSpeedDevice;
119 u8 m_resetFlag;
120 u32 m_magicPowerValue;
121 struct _device *m_childListStart;
122 struct _device *m_childListEnd;
123 struct _device *m_parent;
124 u32 m_attachedToPortNo;
125 void *m_privDataField;
126 UsbdTimerCbStruct_t m_timer;
127 UsbdIoRequest_t m_ioRequest;
128 u32 m_functionDelay;
129 void *m_staticDeviceDescPtr;
130 void *m_staticDeviceDescEndPtr;
131 u32 m_fetchDescriptorCounter;
132 struct _usbdReportDescriptor *m_reportDescriptorCurForFetch;
133 struct _usbdReportDescriptor *m_reportDescriptorStart;
134 struct _usbdReportDescriptor *m_reportDescriptorEnd;
135} UsbdDevice_t;
136
137typedef struct _hcTd
138{
139 u32 m_hcArea;
140 void *m_curBufPtr;
141 struct _hcTd *m_next;
142 void *m_bufferEnd;
143} UsbdHcTD_t;
144
145typedef struct _hcIsoTd
146{
147 u32 m_hcArea;
148 void *m_bufferPage0;
149 struct _hcIsoTd *m_next;
150 void *m_bufferEnd;
151 u16 m_psw[8];
152} UsbdHcIsoTD_t;
153
155{
156 u16 m_hcArea;
157 u16 m_maxPacketSize;
158};
159
161{
162 struct _hcEdHcArea stru;
163 u32 asu32;
164};
165
166typedef struct _hcEd
167{
168 union _hcEdHcAreaU m_hcArea;
169 UsbdHcTD_t *m_tdTail;
170 UsbdHcTD_t *m_tdHead;
171 struct _hcEd *m_next;
172} UsbdHcED_t;
173
174typedef struct _endpoint
175{
176 u32 m_id;
177 u32 m_inTdQueue;
178 struct _endpoint *m_next;
179 struct _endpoint *m_prev;
180 struct _endpoint *m_busyNext;
181 struct _endpoint *m_busyPrev;
182 UsbdDevice_t *m_correspDevice;
183 UsbdIoRequest_t *m_ioReqListStart;
184 UsbdIoRequest_t *m_ioReqListEnd;
185 UsbdHcED_t *m_hcEd;
186 u32 m_endpointType;
187 u32 m_isochronLastFrameNum; // 40
188 UsbdTimerCbStruct_t m_timer; // sizeof(UsbdTimerCbStruct_t) => 24 bytes
189 u32 m_alignFlag;
190 u8 m_schedulingIndex;
191 u8 m_waitHigh;
192 u8 m_waitLow;
193 u8 m_packetSizeForScheduling;
194} UsbdEndpoint_t;
195
196typedef struct _usbHub
197{
198 struct _usbHub *m_next;
199 u32 m_pad1[1];
200 u32 m_curAllocatedCount;
201 UsbdDevice_t *m_dev;
202 UsbdEndpoint_t *m_controlEp;
203 UsbdEndpoint_t *m_statusChangeEp;
204 UsbdIoRequest_t m_controlIoReq;
205 UsbdIoRequest_t m_statusIoReq;
206 u32 m_maxPower;
207 u32 m_isSelfPowered;
208 UsbHubDescriptor m_desc;
209 u32 m_pad2[6];
210 u32 m_numChildDevices;
211 u32 m_portCounter;
212 u32 m_hubStatusCounter;
213 u16 m_hubStatus;
214 u16 m_hubStatusChange; // unite to u32 to make it match portStatusChange
215 u32 m_portStatusChange;
216 u8 m_statusChangeInfo[8]; // depends on number of ports
217 u32 m_pad3[6];
218} UsbdUsbHub_t;
219
220typedef struct _hcCA
221{
222 volatile UsbdHcED_t *InterruptTable[32];
223 volatile u16 FrameNumber;
224 volatile u16 pad;
225 volatile UsbdHcTD_t *DoneHead;
226 volatile u8 reserved[116];
227 volatile u32 pad2; // expand struct to 256 bytes for alignment
228} HcCA;
229
230typedef struct _ohciRegs
231{
232 volatile u32 HcRevision;
233 volatile u32 HcControl;
234 volatile u32 HcCommandStatus;
235 volatile u32 HcInterruptStatus;
236 volatile u32 HcInterruptEnable;
237 volatile u32 HcInterruptDisable;
238 volatile HcCA *HcHCCA;
239 volatile UsbdHcED_t *HcPeriodCurrentEd;
240 volatile UsbdHcED_t *HcControlHeadEd;
241 volatile UsbdHcED_t *HcControlCurrentEd;
242 volatile UsbdHcED_t *HcBulkHeadEd;
243 volatile UsbdHcED_t *HcBulkCurrentEd;
244 volatile u32 HcDoneHead;
245 volatile u32 HcFmInterval;
246 volatile u32 HcFmRemaining;
247 volatile u32 HcFmNumber;
248 volatile u32 HcPeriodicStart;
249 volatile u32 HcLsThreshold;
250 volatile u32 HcRhDescriptorA;
251 volatile u32 HcRhDescriptorB;
252 volatile u32 HcRhStatus;
253 volatile u32 HcRhPortStatus[2];
254} OhciRegs;
255
256typedef struct _memPool
257{
258 volatile OhciRegs *m_ohciRegs;
259 volatile HcCA *m_hcHCCA;
260
261 struct _hcEd *m_hcEdBuf;
262
263 struct _hcTd *m_freeHcTdList;
264 struct _hcTd *m_hcTdBuf;
265 struct _hcTd *m_hcTdBufEnd;
266
267 struct _hcIsoTd *m_freeHcIsoTdList;
268 struct _hcIsoTd *m_hcIsoTdBuf;
269 struct _hcIsoTd *m_hcIsoTdBufEnd;
270
271 struct _ioRequest **m_hcTdToIoReqLUT;
272 struct _ioRequest **m_hcIsoTdToIoReqLUT;
273
274 struct _ioRequest *m_ioReqBufPtr;
275 struct _ioRequest *m_freeIoReqList;
276 struct _ioRequest *m_freeIoReqListEnd;
277
278 struct _device *m_deviceTreeBuf;
279 struct _device *m_freeDeviceListStart;
280 struct _device *m_freeDeviceListEnd;
281
282 struct _endpoint *m_endpointBuf;
283 struct _endpoint *m_freeEpListStart;
284 struct _endpoint *m_freeEpListEnd;
285
286 struct _endpoint *m_tdQueueStart;
287 struct _endpoint *m_tdQueueEnd;
288
289 u32 m_interruptBandwidthSchedulingValues[32];
290 u32 m_delayResets;
291 int m_interruptCounters[9];
292
293 struct _timerCbStruct *m_timerListStart;
294 struct _timerCbStruct *m_timerListEnd;
295
296 struct _device *m_deviceTreeRoot;
297} UsbdMemoryPool_t;
298
300{
301 struct _usbdReportDescriptor *m_next;
302 struct _usbdReportDescriptor *m_prev;
303 u32 m_cfgNum;
304 u32 m_ifNum;
305 u32 m_length;
306 u8 m_data[];
307} UsbdReportDescriptor_t;
308
310{
311 int m_usbdSema;
312 int m_hcdTid;
313 int m_hcdIrqEvent;
314 int m_callbackTid;
315 int m_callbackEvent;
316} UsbdKernelResources_t;
317
318#define NOTIN_QUEUE 0
319#define GENTD_QUEUE 1
320#define ISOTD_QUEUE 2
321
322#define TYPE_CONTROL 0x3F
323#define TYPE_BULK 0x40
324#define TYPE_ISOCHRON 0x41
325
326#define DEVICE_NOTCONNECTED 1
327#define DEVICE_CONNECTED 3
328#define DEVICE_RESETDELAYED 4
329#define DEVICE_RESETPENDING 5
330#define DEVICE_RESETCOMPLETE 6
331#define DEVICE_FETCHINGDESCRIPTOR 7
332#define DEVICE_READY 8
333
334#define PORT_CONNECTION 0
335#define PORT_ENABLE 1
336#define PORT_SUSPEND 2
337#define PORT_OVER_CURRENT 3
338#define PORT_RESET 4
339#define PORT_POWER 8
340#define PORT_LOW_SPEED 9
341
342#define C_HUB_LOCAL_POWER 0
343#define C_HUB_OVER_CURRENT 1
344
345#define C_PORT_CONNECTION 16
346#define C_PORT_ENABLE 17
347#define C_PORT_SUSPEND 18
348#define C_PORT_OVER_CURRENT 19
349#define C_PORT_RESET 20
350
351#define BIT(x) (((u32)1) << (x))
352
353#define C_PORT_FLAGS \
354 (BIT(C_PORT_CONNECTION) | BIT(C_PORT_ENABLE) | BIT(C_PORT_SUSPEND) | BIT(C_PORT_OVER_CURRENT) | BIT(C_PORT_RESET))
355
356#define HCED_DIR_OUT BIT(11) // Direction field
357#define HCED_DIR_IN BIT(12) // Direction field
358#define HCED_SPEED BIT(13) // Speed bit
359#define HCED_SKIP BIT(14) // Skip bit
360#define HCED_ISOC BIT(15) // Format bit
361#define HCED_DIR_MASK (HCED_DIR_OUT | HCED_DIR_IN)
362
363#define ED_HALTED(a) ((u32)((a).m_tdHead) & 1)
364#define ED_SKIPPED(a) ((u32)((a).m_hcArea.stru.m_hcArea) & HCED_SKIP)
365
366#define TD_HCAREA(CC, T, DI, DP, R) (u32)((((CC) << 12) | ((T) << 8) | ((DI) << 5) | ((DP) << 3) | ((R) << 2)))
367
368#define TD_SETUP 0
369#define TD_OUT 1
370#define TD_IN 2
371
372#define OHCI_INT_SO BIT(0)
373#define OHCI_INT_WDH BIT(1)
374#define OHCI_INT_SF BIT(2)
375#define OHCI_INT_RD BIT(3)
376#define OHCI_INT_UE BIT(4)
377#define OHCI_INT_FNO BIT(5)
378#define OHCI_INT_RHSC BIT(6)
379#define OHCI_INT_OC BIT(30)
380#define OHCI_INT_MIE BIT(31)
381
382#define OHCI_COM_HCR BIT(0)
383#define OHCI_COM_CLF BIT(1)
384#define OHCI_COM_BLF BIT(2)
385
386#define OHCI_CTR_CBSR (3 << 0) // Control / Bulk Service Ratio
387#define OHCI_CTR_PLE BIT(2) // Periodic List Enable
388#define OHCI_CTR_IE BIT(3) // Isochronous Enable
389#define OHCI_CTR_CLE BIT(4) // Control List Enable
390#define OHCI_CTR_BLE BIT(5) // Bulk List Enable
391#define OHCI_CTR_USB_RESET (0 << 6)
392#define OHCI_CTR_USB_RESUME (1 << 6)
393#define OHCI_CTR_USB_OPERATIONAL (2 << 6)
394#define OHCI_CTR_USB_SUSPEND (3 << 6)
395
396// The following is defined in hub.c
397extern void hubResetDevicePort(UsbdDevice_t *dev);
398extern int initHubDriver(void);
399extern void deinitHubDriver(void);
400
401// The following is defined in mem.c
402extern UsbdDevice_t *fetchDeviceById(int devId);
403extern UsbdEndpoint_t *fetchEndpointById(int id);
404extern UsbdDevice_t *getDeviceTreeRoot(void);
405extern UsbdDevice_t *attachChildDevice(UsbdDevice_t *parent, u32 portNum);
406extern void freeDevice(UsbdDevice_t *dev);
407extern UsbdIoRequest_t *allocIoRequest(void);
408extern void freeIoRequest(UsbdIoRequest_t *req);
409extern UsbdEndpoint_t *allocEndpointForDevice(UsbdDevice_t *dev, u32 align);
410extern int cleanUpFunc(UsbdDevice_t *dev, UsbdEndpoint_t *ep);
411extern UsbdHcTD_t *allocTd(void);
412extern void freeTd(UsbdHcTD_t *argTd);
413extern UsbdHcIsoTD_t *allocIsoTd(void);
414extern void freeIsoTd(UsbdHcIsoTD_t *argTd);
415
416// The following is defined in timer.c
417extern int addTimerCallback(UsbdTimerCbStruct_t *arg, TimerCallback func, void *cbArg, int delay);
418extern int cancelTimerCallback(UsbdTimerCbStruct_t *arg);
419extern void handleTimerList(void);
420
421// The following is defined in endpoint.c
422extern UsbdEndpoint_t *openDeviceEndpoint(UsbdDevice_t *dev, const UsbEndpointDescriptor *endpDesc, u32 alignFlag);
423extern int removeEndpointFromDevice(UsbdDevice_t *dev, UsbdEndpoint_t *ep);
424
425// The following is defined in io_request.c
426extern void handleIoReqList(UsbdEndpoint_t *ep);
427
428// The following is defined in hub_resets.c
429extern void usbdRebootInner(void);
430extern void hubResetDevice(UsbdDevice_t *dev);
431extern int checkDelayedResets(UsbdDevice_t *dev);
432extern void handleRhsc(void);
433
434// The following is defined in td_queue.c
435extern void processDoneQueue_GenTd(UsbdHcTD_t *arg);
436extern void processDoneQueue_IsoTd(UsbdHcIsoTD_t *arg);
437
438// The following is defined in hcd.c
439extern void hcdProcessIntr(void);
440extern void PostIntrEnableFunction(void);
441extern int initHcdStructs(void);
442extern void deinitHcd(void);
443
444// The following is defined in usbd_sys.c
445extern void *AllocSysMemoryWrap(int size);
446extern int FreeSysMemoryWrap(void *ptr);
447extern int usbdLock(void);
448extern int usbdUnlock(void);
449
450// The following is defined in usbd_main.c
451extern void usbdReboot(int ac);
452
453// The following is defined in report_descriptor_init.c
454extern int
455handleStaticDeviceDescriptor(UsbdDevice_t *dev, UsbDeviceDescriptor *devDescStart, UsbDeviceDescriptor *devDescEnd);
456
457// The following is defined in device_driver.c
458extern int callUsbDriverFunc(int (*func)(int devId), int devId, void *gpSeg);
459extern int doRegisterDriver(sceUsbdLddOps *drv, void *drvGpSeg);
460extern int doRegisterAutoLoader(sceUsbdLddOps *drv, void *drvGpSeg);
461extern int doUnregisterDriver(sceUsbdLddOps *drv);
462extern int doUnregisterAutoLoader(void);
463
464// The following is defined in device.c
465extern void *doGetDeviceStaticDescriptor(int devId, void *data, u8 type);
466extern int doGetDeviceLocation(UsbdDevice_t *dev, u8 *path);
467extern UsbdEndpoint_t *doOpenEndpoint(UsbdDevice_t *dev, const UsbEndpointDescriptor *endpDesc, u32 alignFlag);
468extern int doCloseEndpoint(UsbdEndpoint_t *ep);
469extern int attachIoReqToEndpoint(UsbdEndpoint_t *ep, UsbdIoRequest_t *req, void *destdata, u16 length, void *callback);
470extern int doControlTransfer(
471 UsbdEndpoint_t *ep,
472 UsbdIoRequest_t *req,
473 u8 requestType,
474 u8 request,
475 u16 value,
476 u16 index,
477 u16 length,
478 void *destdata,
479 void *callback);
480extern int hubTimedSetFuncAddress(UsbdDevice_t *dev);
481extern void flushPort(UsbdDevice_t *dev);
482extern int usbdInitInner(void);
483
484// The following is defined in usbd_main.c
485extern UsbdMemoryPool_t *memPool;
486extern UsbdKernelResources_t usbKernelResources;
487extern UsbdIoRequest_t *cbListStart;
488extern UsbdIoRequest_t *cbListEnd;
489extern UsbdConfig_t usbConfig;
490extern sceUsbdLddOps *drvListStart;
491extern sceUsbdLddOps *drvListEnd;
492extern sceUsbdLddOps *drvAutoLoader;
493
494#endif // __USBDPRIV_H__
struct _UsbDriver sceUsbdLddOps