26#define OHCI_REG_BASE 0xBF801600
29#define dbg_printf(a...) printf("usbd: " a)
31#define dbg_printf(a...) (void)0
34#define READ_UINT16(a) (((u8 *)a)[0] | (((u8 *)a)[1] << 8))
48 int m_maxIsoTransfDesc;
50 int m_maxStaticDescSize;
53 int m_allocatedSize_unused;
59extern UsbdConfig_t usbConfig;
70typedef void (*TimerCallback)(
void *arg);
71typedef void (*InternCallback)(
struct _ioRequest *arg);
78 TimerCallback m_callbackProc;
93 InternCallback m_callbackProc;
95 u32 m_transferedBytes;
97 void *m_userCallbackArg;
100 void *m_userCallbackProc;
101 sceUsbdDoneCallback m_userCallbackProcRegular;
102 sceUsbdMultiIsochronousDoneCallback m_userCallbackProcMultiIsochronous;
117 u8 m_functionAddress;
118 u8 m_isLowSpeedDevice;
120 u32 m_magicPowerValue;
121 struct _device *m_childListStart;
122 struct _device *m_childListEnd;
124 u32 m_attachedToPortNo;
125 void *m_privDataField;
126 UsbdTimerCbStruct_t m_timer;
127 UsbdIoRequest_t m_ioRequest;
129 void *m_staticDeviceDescPtr;
130 void *m_staticDeviceDescEndPtr;
131 u32 m_fetchDescriptorCounter;
141 struct _hcTd *m_next;
169 UsbdHcTD_t *m_tdTail;
170 UsbdHcTD_t *m_tdHead;
171 struct _hcEd *m_next;
182 UsbdDevice_t *m_correspDevice;
183 UsbdIoRequest_t *m_ioReqListStart;
184 UsbdIoRequest_t *m_ioReqListEnd;
187 u32 m_isochronLastFrameNum;
188 UsbdTimerCbStruct_t m_timer;
190 u8 m_schedulingIndex;
193 u8 m_packetSizeForScheduling;
200 u32 m_curAllocatedCount;
202 UsbdEndpoint_t *m_controlEp;
203 UsbdEndpoint_t *m_statusChangeEp;
204 UsbdIoRequest_t m_controlIoReq;
205 UsbdIoRequest_t m_statusIoReq;
210 u32 m_numChildDevices;
212 u32 m_hubStatusCounter;
214 u16 m_hubStatusChange;
215 u32 m_portStatusChange;
216 u8 m_statusChangeInfo[8];
222 volatile UsbdHcED_t *InterruptTable[32];
223 volatile u16 FrameNumber;
225 volatile UsbdHcTD_t *DoneHead;
226 volatile u8 reserved[116];
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];
258 volatile OhciRegs *m_ohciRegs;
259 volatile HcCA *m_hcHCCA;
261 struct _hcEd *m_hcEdBuf;
263 struct _hcTd *m_freeHcTdList;
264 struct _hcTd *m_hcTdBuf;
265 struct _hcTd *m_hcTdBufEnd;
278 struct _device *m_deviceTreeBuf;
279 struct _device *m_freeDeviceListStart;
280 struct _device *m_freeDeviceListEnd;
289 u32 m_interruptBandwidthSchedulingValues[32];
291 int m_interruptCounters[9];
296 struct _device *m_deviceTreeRoot;
307} UsbdReportDescriptor_t;
316} UsbdKernelResources_t;
322#define TYPE_CONTROL 0x3F
323#define TYPE_BULK 0x40
324#define TYPE_ISOCHRON 0x41
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
334#define PORT_CONNECTION 0
336#define PORT_SUSPEND 2
337#define PORT_OVER_CURRENT 3
340#define PORT_LOW_SPEED 9
342#define C_HUB_LOCAL_POWER 0
343#define C_HUB_OVER_CURRENT 1
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
351#define BIT(x) (((u32)1) << (x))
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))
356#define HCED_DIR_OUT BIT(11)
357#define HCED_DIR_IN BIT(12)
358#define HCED_SPEED BIT(13)
359#define HCED_SKIP BIT(14)
360#define HCED_ISOC BIT(15)
361#define HCED_DIR_MASK (HCED_DIR_OUT | HCED_DIR_IN)
363#define ED_HALTED(a) ((u32)((a).m_tdHead) & 1)
364#define ED_SKIPPED(a) ((u32)((a).m_hcArea.stru.m_hcArea) & HCED_SKIP)
366#define TD_HCAREA(CC, T, DI, DP, R) (u32)((((CC) << 12) | ((T) << 8) | ((DI) << 5) | ((DP) << 3) | ((R) << 2)))
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)
382#define OHCI_COM_HCR BIT(0)
383#define OHCI_COM_CLF BIT(1)
384#define OHCI_COM_BLF BIT(2)
386#define OHCI_CTR_CBSR (3 << 0)
387#define OHCI_CTR_PLE BIT(2)
388#define OHCI_CTR_IE BIT(3)
389#define OHCI_CTR_CLE BIT(4)
390#define OHCI_CTR_BLE BIT(5)
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)
397extern void hubResetDevicePort(UsbdDevice_t *dev);
398extern int initHubDriver(
void);
399extern void deinitHubDriver(
void);
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);
417extern int addTimerCallback(UsbdTimerCbStruct_t *arg, TimerCallback func,
void *cbArg,
int delay);
418extern int cancelTimerCallback(UsbdTimerCbStruct_t *arg);
419extern void handleTimerList(
void);
422extern UsbdEndpoint_t *openDeviceEndpoint(UsbdDevice_t *dev,
const UsbEndpointDescriptor *endpDesc, u32 alignFlag);
423extern int removeEndpointFromDevice(UsbdDevice_t *dev, UsbdEndpoint_t *ep);
426extern void handleIoReqList(UsbdEndpoint_t *ep);
429extern void usbdRebootInner(
void);
430extern void hubResetDevice(UsbdDevice_t *dev);
431extern int checkDelayedResets(UsbdDevice_t *dev);
432extern void handleRhsc(
void);
435extern void processDoneQueue_GenTd(UsbdHcTD_t *arg);
436extern void processDoneQueue_IsoTd(UsbdHcIsoTD_t *arg);
439extern void hcdProcessIntr(
void);
440extern void PostIntrEnableFunction(
void);
441extern int initHcdStructs(
void);
442extern void deinitHcd(
void);
445extern void *AllocSysMemoryWrap(
int size);
446extern int FreeSysMemoryWrap(
void *ptr);
447extern int usbdLock(
void);
448extern int usbdUnlock(
void);
451extern void usbdReboot(
int ac);
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);
462extern int doUnregisterAutoLoader(
void);
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(
472 UsbdIoRequest_t *req,
480extern int hubTimedSetFuncAddress(UsbdDevice_t *dev);
481extern void flushPort(UsbdDevice_t *dev);
482extern int usbdInitInner(
void);
485extern UsbdMemoryPool_t *memPool;
486extern UsbdKernelResources_t usbKernelResources;
487extern UsbdIoRequest_t *cbListStart;
488extern UsbdIoRequest_t *cbListEnd;
489extern UsbdConfig_t usbConfig;
struct _UsbDriver sceUsbdLddOps