243 lines
5.4 KiB
C
243 lines
5.4 KiB
C
/******************************************************************************/
|
|
/* */
|
|
/* File: ohci.h */
|
|
/* */
|
|
/* Details: Original File & Design: Thomas Frei */
|
|
/* (modifications for xbox openxdk by bkenwright) */
|
|
/* (bkenwright@xbdev.net) www.xbdev.net */
|
|
/* */
|
|
/******************************************************************************/
|
|
|
|
|
|
#ifndef __OHCI_X__
|
|
#define __OHCI_X__
|
|
|
|
#include "misc.h" // We only need this here, for the definitions of __u8, __u32 etc
|
|
// to be added in later (example):
|
|
|
|
|
|
// Example sippet of possible later improvment on structure aligment in vs
|
|
// __declspec(align(32)) struct Str1
|
|
// {
|
|
// int a, b, c, d, e;
|
|
// };
|
|
|
|
/*
|
|
typedef unsigned char __u8;
|
|
typedef char __s8;
|
|
typedef unsigned short __u16;
|
|
typedef short __s16;
|
|
typedef unsigned long __u32;
|
|
typedef int __s32;
|
|
|
|
#define NULL 0
|
|
*/
|
|
|
|
|
|
|
|
#define SIZEOF_HCCA 0x100
|
|
|
|
|
|
|
|
/*
|
|
* The HCCA (Host Controller Communications Area) is a 256 byte
|
|
* structure defined in the OHCI spec. that the host controller is
|
|
* told the base address of. It must be 256-byte aligned.
|
|
*/
|
|
|
|
#define NUM_INTS 32 /* part of the OHCI standard */
|
|
|
|
|
|
|
|
#pragma pack( push, 1 )
|
|
struct ohci_hcca
|
|
{
|
|
__u32 int_table[NUM_INTS]; /* Interrupt ED table */
|
|
__u16 frame_no; /* current frame number */
|
|
__u16 pad1; /* set to 0 on each frame_no change */
|
|
__u32 done_head; /* info returned for an interrupt */
|
|
__u8 reserved_for_hc[116];
|
|
};
|
|
#pragma pack( pop )
|
|
typedef struct ohci_hcca ohci_hcca_t;
|
|
|
|
|
|
/*
|
|
* Maximum number of root hub ports.
|
|
*/
|
|
|
|
#define MAX_ROOT_PORTS 15
|
|
|
|
|
|
#pragma pack(1)
|
|
volatile struct ohci_regs
|
|
{
|
|
/* control and status registers */
|
|
__u32 revision;
|
|
__u32 control;
|
|
__u32 cmdstatus;
|
|
__u32 intrstatus;
|
|
__u32 intrenable;
|
|
__u32 intrdisable;
|
|
/* memory pointers */
|
|
__u32 hcca;
|
|
__u32 ed_periodcurrent;
|
|
__u32 ed_controlhead;
|
|
__u32 ed_controlcurrent;
|
|
__u32 ed_bulkhead;
|
|
__u32 ed_bulkcurrent;
|
|
__u32 donehead;
|
|
/* frame counters */
|
|
__u32 fminterval;
|
|
__u32 fmremaining;
|
|
__u32 fmnumber;
|
|
__u32 periodicstart;
|
|
__u32 lsthresh;
|
|
/* Root hub ports */
|
|
volatile struct ohci_roothub_regs
|
|
{
|
|
__u32 a;
|
|
__u32 b;
|
|
__u32 status;
|
|
__u32 portstatus[MAX_ROOT_PORTS];
|
|
} roothub;
|
|
};
|
|
#pragma pack()
|
|
typedef struct ohci_regs ohci_regs_t;
|
|
|
|
|
|
|
|
|
|
#pragma pack(1)
|
|
typedef struct ohci
|
|
{
|
|
volatile struct ohci_hcca *hcca; /* hcca */
|
|
|
|
volatile struct ohci_regs * regs; /* OHCI controller's memory */
|
|
|
|
} ohci_t;
|
|
#pragma pack()
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
#define SKIP 0x4000L
|
|
#define OUTV 0x0800L
|
|
#define INV 0x1000L
|
|
#define AUTOIO 0x1800L
|
|
#define LOWS 0x2000L
|
|
|
|
|
|
|
|
//#pragma block (push,1)
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
__u32 Format;
|
|
__u32 Tailptr;
|
|
__u32 Headptr;
|
|
__u32 NextED;
|
|
} s_Endpointdescripor;
|
|
#pragma pack()
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
__u32 Format;
|
|
__u32 Buffer;
|
|
__u32 NextTD;
|
|
__u32 BufferEnd;
|
|
} s_Transferdescriptor;
|
|
#pragma pack()
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
__u8 Length;
|
|
__u8 DescriptorType;
|
|
__u16 USB;
|
|
__u8 DeviceClass;
|
|
__u8 DeviceSubClass;
|
|
__u8 DeviceProtocol;
|
|
__u8 MaxPacketSize;
|
|
__u16 Vendor;
|
|
__u16 ProductID;
|
|
__u16 Device;
|
|
__u8 Manufacturer;
|
|
__u8 ProductIndex;
|
|
__u8 SerialNumber;
|
|
__u8 ConfigNumber;
|
|
} s_USB_Devicedescriptor;
|
|
#pragma pack()
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
__u8 Length;
|
|
__u8 DescriptorType;
|
|
__u16 TotalLength;
|
|
__u8 NumberofInterfaces;
|
|
__u8 ConfigValue;
|
|
__u8 Configuration;
|
|
__u8 Attributes;
|
|
__u8 MaxPower;
|
|
} s_USB_Configurationdescriptor;
|
|
|
|
typedef struct {
|
|
__u8 Length;
|
|
__u8 DescriptorType;
|
|
__u8 Interfacenumber;
|
|
__u8 AlternateSetting;
|
|
__u8 NumberofEndpoints;
|
|
__u8 InterfaceClass;
|
|
__u8 InterfaceSubClass;
|
|
__u8 InterfaceProtocol;
|
|
__u8 InterfaceIndex;
|
|
} s_USB_Interfacedescriptor;
|
|
|
|
typedef struct {
|
|
__u8 Length;
|
|
__u8 DescriptorType;
|
|
__u8 EndpointAddress;
|
|
__u8 Attributes;
|
|
__u16 MaxPacketSize;
|
|
__u8 Interval;
|
|
} s_USB_Endpointdescriptor;
|
|
|
|
typedef struct {
|
|
__u8 Length;
|
|
__u8 DescriptorType;
|
|
__u16 *LANGID;
|
|
} s_USB_Languagedescriptor;
|
|
|
|
typedef struct {
|
|
__u8 Length;
|
|
__u8 DescriptorType;
|
|
__u8 *String;
|
|
} s_USB_Stringdescriptor;
|
|
//#pragma block (pop)
|
|
#pragma pack()
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
// Main Functions
|
|
int FindOHC(ohci_t * ohci, void *regbase);
|
|
int FindDev(ohci_t * ohci, int Port);
|
|
|
|
|
|
int ResetPort(ohci_t * ohci, int Port);
|
|
int SetAddres(ohci_t * ohci, int Port, __u8 AddrNew);
|
|
int SetConfigur(ohci_t * ohci, __u8 Addr, __u8 Config);
|
|
int GetDesc(ohci_t * ohci, __u8 Addr, __u8 DescrType, __u8 Index, __u8 Count, __u8 *DBuffer);
|
|
|
|
|
|
|
|
// Debug Functions
|
|
void DebugFile(ohci_t * ohci);
|
|
void DebugDescriptor( s_USB_Devicedescriptor * pDes );
|
|
void DebugConfigDescriptor( s_USB_Configurationdescriptor * pDes );
|
|
void DebugInterfaceDescriptor( s_USB_Interfacedescriptor * pDes );
|
|
void DebugEndPointDescriptor( s_USB_Endpointdescriptor * pDes );
|
|
|
|
|
|
|
|
#endif // __OHCI_X__
|