mirror of https://github.com/PCSX2/pcsx2.git
USB: remove initial references for merge
This commit is contained in:
parent
3442ba7483
commit
9dd0ef681d
|
@ -44,8 +44,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "3rdparty\zlib\zlib.
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LilyPad", "plugins\LilyPad\LilyPad.vcxproj", "{E4081455-398C-4610-A87C-90A8A7D72DC3}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LilyPad", "plugins\LilyPad\LilyPad.vcxproj", "{E4081455-398C-4610-A87C-90A8A7D72DC3}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "USBnull", "plugins\USBnull\Windows\USBnull.vcxproj", "{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x86emitter", "common\build\x86emitter\x86emitter.vcxproj", "{A51123F5-9505-4EAE-85E7-D320290A272C}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x86emitter", "common\build\x86emitter\x86emitter.vcxproj", "{A51123F5-9505-4EAE-85E7-D320290A272C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utilities", "common\build\Utilities\utilities.vcxproj", "{4639972E-424E-4E13-8B07-CA403C481346}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utilities", "common\build\Utilities\utilities.vcxproj", "{4639972E-424E-4E13-8B07-CA403C481346}"
|
||||||
|
@ -192,26 +190,6 @@ Global
|
||||||
{E4081455-398C-4610-A87C-90A8A7D72DC3}.Release|Win32.Build.0 = Release|Win32
|
{E4081455-398C-4610-A87C-90A8A7D72DC3}.Release|Win32.Build.0 = Release|Win32
|
||||||
{E4081455-398C-4610-A87C-90A8A7D72DC3}.Release|x64.ActiveCfg = Release|x64
|
{E4081455-398C-4610-A87C-90A8A7D72DC3}.Release|x64.ActiveCfg = Release|x64
|
||||||
{E4081455-398C-4610-A87C-90A8A7D72DC3}.Release|x64.Build.0 = Release|x64
|
{E4081455-398C-4610-A87C-90A8A7D72DC3}.Release|x64.Build.0 = Release|x64
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Devel|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Devel|Win32.Build.0 = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Devel|x64.ActiveCfg = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Devel|x64.Build.0 = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release AVX2|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release AVX2|Win32.Build.0 = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release AVX2|x64.ActiveCfg = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release AVX2|x64.Build.0 = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release SSE4|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release SSE4|Win32.Build.0 = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release SSE4|x64.ActiveCfg = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release SSE4|x64.Build.0 = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}.Release|x64.Build.0 = Release|x64
|
|
||||||
{A51123F5-9505-4EAE-85E7-D320290A272C}.Debug|Win32.ActiveCfg = Debug|Win32
|
{A51123F5-9505-4EAE-85E7-D320290A272C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
{A51123F5-9505-4EAE-85E7-D320290A272C}.Debug|Win32.Build.0 = Debug|Win32
|
{A51123F5-9505-4EAE-85E7-D320290A272C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{A51123F5-9505-4EAE-85E7-D320290A272C}.Debug|x64.ActiveCfg = Debug|x64
|
{A51123F5-9505-4EAE-85E7-D320290A272C}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
@ -524,7 +502,6 @@ Global
|
||||||
{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
|
{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
|
||||||
{2F6C0388-20CB-4242-9F6C-A6EBB6A83F47} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
|
{2F6C0388-20CB-4242-9F6C-A6EBB6A83F47} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
|
||||||
{E4081455-398C-4610-A87C-90A8A7D72DC3} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
|
{E4081455-398C-4610-A87C-90A8A7D72DC3} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
|
||||||
{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70} = {E1828E40-2FBB-48FE-AE7F-5587755DCE0E}
|
|
||||||
{A51123F5-9505-4EAE-85E7-D320290A272C} = {88F517F9-CE1C-4005-9BDF-4481FEB55053}
|
{A51123F5-9505-4EAE-85E7-D320290A272C} = {88F517F9-CE1C-4005-9BDF-4481FEB55053}
|
||||||
{4639972E-424E-4E13-8B07-CA403C481346} = {88F517F9-CE1C-4005-9BDF-4481FEB55053}
|
{4639972E-424E-4E13-8B07-CA403C481346} = {88F517F9-CE1C-4005-9BDF-4481FEB55053}
|
||||||
{677B7D11-D5E1-40B3-88B1-9A4DF83D2213} = {2D6F0A62-A247-4CCF-947F-FCD54BE16103}
|
{677B7D11-D5E1-40B3-88B1-9A4DF83D2213} = {2D6F0A62-A247-4CCF-947F-FCD54BE16103}
|
||||||
|
|
|
@ -155,11 +155,4 @@ else()
|
||||||
endif()
|
endif()
|
||||||
#---------------------------------------
|
#---------------------------------------
|
||||||
|
|
||||||
#---------------------------------------
|
|
||||||
# USBnull
|
|
||||||
#---------------------------------------
|
|
||||||
if(GTKn_FOUND)
|
|
||||||
set(USBnull TRUE)
|
|
||||||
endif()
|
|
||||||
#---------------------------------------
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
|
@ -73,21 +73,18 @@ typedef struct _keyEvent
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#if defined(GSdefs) || defined(PADdefs) || defined(SIOdefs) || \
|
#if defined(GSdefs) || defined(PADdefs) || defined(SIOdefs)
|
||||||
defined(USBdefs)
|
|
||||||
#define COMMONdefs
|
#define COMMONdefs
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// PS2EgetLibType returns (may be OR'd)
|
// PS2EgetLibType returns (may be OR'd)
|
||||||
#define PS2E_LT_GS 0x01
|
#define PS2E_LT_GS 0x01
|
||||||
#define PS2E_LT_PAD 0x02 // -=[ OBSOLETE ]=-
|
#define PS2E_LT_PAD 0x02 // -=[ OBSOLETE ]=-
|
||||||
#define PS2E_LT_USB 0x20
|
|
||||||
#define PS2E_LT_SIO 0x80
|
#define PS2E_LT_SIO 0x80
|
||||||
|
|
||||||
// PS2EgetLibVersion2 (high 16 bits)
|
// PS2EgetLibVersion2 (high 16 bits)
|
||||||
#define PS2E_GS_VERSION 0x0006
|
#define PS2E_GS_VERSION 0x0006
|
||||||
#define PS2E_PAD_VERSION 0x0002 // -=[ OBSOLETE ]=-
|
#define PS2E_PAD_VERSION 0x0002 // -=[ OBSOLETE ]=-
|
||||||
#define PS2E_USB_VERSION 0x0003
|
|
||||||
#define PS2E_SIO_VERSION 0x0001
|
#define PS2E_SIO_VERSION 0x0001
|
||||||
#ifdef COMMONdefs
|
#ifdef COMMONdefs
|
||||||
|
|
||||||
|
@ -122,9 +119,6 @@ typedef char __keyEvent_Size__[(sizeof(keyEvent) == 8) ? 1 : -1];
|
||||||
|
|
||||||
typedef int(CALLBACK *SIOchangeSlotCB)(int slot);
|
typedef int(CALLBACK *SIOchangeSlotCB)(int slot);
|
||||||
|
|
||||||
typedef void (*USBcallback)(int cycles);
|
|
||||||
typedef int (*USBhandler)(void);
|
|
||||||
|
|
||||||
typedef struct _GSdriverInfo
|
typedef struct _GSdriverInfo
|
||||||
{
|
{
|
||||||
char name[8];
|
char name[8];
|
||||||
|
@ -240,44 +234,6 @@ s32 CALLBACK PADtest();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* USB plugin API */
|
|
||||||
|
|
||||||
// if this file is included with this define
|
|
||||||
// the next api will not be skipped by the compiler
|
|
||||||
#if defined(USBdefs) || defined(BUILTIN_USB_PLUGIN)
|
|
||||||
|
|
||||||
// basic funcs
|
|
||||||
|
|
||||||
s32 CALLBACK USBinit();
|
|
||||||
s32 CALLBACK USBopen(void *pDsp);
|
|
||||||
void CALLBACK USBclose();
|
|
||||||
void CALLBACK USBshutdown();
|
|
||||||
void CALLBACK USBsetSettingsDir(const char *dir);
|
|
||||||
void CALLBACK USBsetLogDir(const char *dir);
|
|
||||||
|
|
||||||
u8 CALLBACK USBread8(u32 addr);
|
|
||||||
u16 CALLBACK USBread16(u32 addr);
|
|
||||||
u32 CALLBACK USBread32(u32 addr);
|
|
||||||
void CALLBACK USBwrite8(u32 addr, u8 value);
|
|
||||||
void CALLBACK USBwrite16(u32 addr, u16 value);
|
|
||||||
void CALLBACK USBwrite32(u32 addr, u32 value);
|
|
||||||
void CALLBACK USBasync(u32 cycles);
|
|
||||||
|
|
||||||
// cycles = IOP cycles before calling callback,
|
|
||||||
// if callback returns 1 the irq is triggered, else not
|
|
||||||
void CALLBACK USBirqCallback(USBcallback callback);
|
|
||||||
USBhandler CALLBACK USBirqHandler(void);
|
|
||||||
void CALLBACK USBsetRAM(void *mem);
|
|
||||||
|
|
||||||
// extended funcs
|
|
||||||
|
|
||||||
s32 CALLBACK USBfreeze(int mode, freezeData *data);
|
|
||||||
void CALLBACK USBconfigure();
|
|
||||||
void CALLBACK USBabout();
|
|
||||||
s32 CALLBACK USBtest();
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// might be useful for emulators
|
// might be useful for emulators
|
||||||
#ifdef PLUGINtypedefs
|
#ifdef PLUGINtypedefs
|
||||||
|
|
||||||
|
@ -330,23 +286,6 @@ typedef s32(CALLBACK *_PADsetSlot)(u8 port, u8 slot);
|
||||||
typedef s32(CALLBACK *_PADqueryMtap)(u8 port);
|
typedef s32(CALLBACK *_PADqueryMtap)(u8 port);
|
||||||
typedef void(CALLBACK *_PADWriteEvent)(keyEvent &evt);
|
typedef void(CALLBACK *_PADWriteEvent)(keyEvent &evt);
|
||||||
|
|
||||||
// USB
|
|
||||||
// NOTE: The read/write functions CANNOT use XMM/MMX regs
|
|
||||||
// If you want to use them, need to save and restore current ones
|
|
||||||
typedef s32(CALLBACK *_USBopen)(void *pDsp);
|
|
||||||
typedef u8(CALLBACK *_USBread8)(u32 mem);
|
|
||||||
typedef u16(CALLBACK *_USBread16)(u32 mem);
|
|
||||||
typedef u32(CALLBACK *_USBread32)(u32 mem);
|
|
||||||
typedef void(CALLBACK *_USBwrite8)(u32 mem, u8 value);
|
|
||||||
typedef void(CALLBACK *_USBwrite16)(u32 mem, u16 value);
|
|
||||||
typedef void(CALLBACK *_USBwrite32)(u32 mem, u32 value);
|
|
||||||
typedef void(CALLBACK *_USBasync)(u32 cycles);
|
|
||||||
|
|
||||||
typedef void(CALLBACK *_USBirqCallback)(USBcallback callback);
|
|
||||||
typedef USBhandler(CALLBACK *_USBirqHandler)(void);
|
|
||||||
typedef void(CALLBACK *_USBsetRAM)(void *mem);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PLUGINfuncs
|
#ifdef PLUGINfuncs
|
||||||
|
|
||||||
// GS
|
// GS
|
||||||
|
@ -394,22 +333,6 @@ extern _PADqueryMtap PADqueryMtap;
|
||||||
extern _PADWriteEvent PADWriteEvent;
|
extern _PADWriteEvent PADWriteEvent;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// USB
|
|
||||||
#ifndef BUILTIN_USB_PLUGIN
|
|
||||||
extern _USBopen USBopen;
|
|
||||||
extern _USBread8 USBread8;
|
|
||||||
extern _USBread16 USBread16;
|
|
||||||
extern _USBread32 USBread32;
|
|
||||||
extern _USBwrite8 USBwrite8;
|
|
||||||
extern _USBwrite16 USBwrite16;
|
|
||||||
extern _USBwrite32 USBwrite32;
|
|
||||||
extern _USBasync USBasync;
|
|
||||||
|
|
||||||
extern _USBirqCallback USBirqCallback;
|
|
||||||
extern _USBirqHandler USBirqHandler;
|
|
||||||
extern _USBsetRAM USBsetRAM;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -177,7 +177,6 @@ extern "C" {
|
||||||
enum PS2E_ComponentTypes {
|
enum PS2E_ComponentTypes {
|
||||||
PS2E_TYPE_GS = 0,
|
PS2E_TYPE_GS = 0,
|
||||||
PS2E_TYPE_PAD,
|
PS2E_TYPE_PAD,
|
||||||
PS2E_TYPE_USB,
|
|
||||||
PS2E_TYPE_SIO,
|
PS2E_TYPE_SIO,
|
||||||
PS2E_TYPE_Mcd,
|
PS2E_TYPE_Mcd,
|
||||||
};
|
};
|
||||||
|
@ -185,7 +184,6 @@ enum PS2E_ComponentTypes {
|
||||||
enum PluginLibVersion {
|
enum PluginLibVersion {
|
||||||
PS2E_VER_GS = 0x1000,
|
PS2E_VER_GS = 0x1000,
|
||||||
PS2E_VER_PAD = 0x1000,
|
PS2E_VER_PAD = 0x1000,
|
||||||
PS2E_VER_USB = 0x1000,
|
|
||||||
PS2E_VER_SIO = 0x1000
|
PS2E_VER_SIO = 0x1000
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ enum PluginsEnum_t
|
||||||
{
|
{
|
||||||
PluginId_GS = 0,
|
PluginId_GS = 0,
|
||||||
PluginId_PAD,
|
PluginId_PAD,
|
||||||
PluginId_USB,
|
|
||||||
PluginId_Count,
|
PluginId_Count,
|
||||||
|
|
||||||
// Memorycard plugin support is preliminary, and is only hacked/hardcoded in at this
|
// Memorycard plugin support is preliminary, and is only hacked/hardcoded in at this
|
||||||
|
|
|
@ -81,7 +81,6 @@ const PluginInfo tbl_PluginInfo[] =
|
||||||
{
|
{
|
||||||
{ "GS", PluginId_GS, PS2E_LT_GS, PS2E_GS_VERSION },
|
{ "GS", PluginId_GS, PS2E_LT_GS, PS2E_GS_VERSION },
|
||||||
{ "PAD", PluginId_PAD, PS2E_LT_PAD, PS2E_PAD_VERSION },
|
{ "PAD", PluginId_PAD, PS2E_LT_PAD, PS2E_PAD_VERSION },
|
||||||
{ "USB", PluginId_USB, PS2E_LT_USB, PS2E_USB_VERSION },
|
|
||||||
|
|
||||||
{ NULL },
|
{ NULL },
|
||||||
|
|
||||||
|
@ -272,23 +271,6 @@ _PADWriteEvent PADWriteEvent;
|
||||||
|
|
||||||
static void PAD_update( u32 padslot ) { }
|
static void PAD_update( u32 padslot ) { }
|
||||||
|
|
||||||
// USB
|
|
||||||
#ifndef BUILTIN_USB_PLUGIN
|
|
||||||
_USBopen USBopen;
|
|
||||||
_USBread8 USBread8;
|
|
||||||
_USBread16 USBread16;
|
|
||||||
_USBread32 USBread32;
|
|
||||||
_USBwrite8 USBwrite8;
|
|
||||||
_USBwrite16 USBwrite16;
|
|
||||||
_USBwrite32 USBwrite32;
|
|
||||||
_USBasync USBasync;
|
|
||||||
|
|
||||||
_USBirqCallback USBirqCallback;
|
|
||||||
_USBirqHandler USBirqHandler;
|
|
||||||
_USBsetRAM USBsetRAM;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
USBhandler usbHandler;
|
|
||||||
uptr pDsp[2];
|
uptr pDsp[2];
|
||||||
|
|
||||||
static s32 CALLBACK _hack_PADinit()
|
static s32 CALLBACK _hack_PADinit()
|
||||||
|
@ -390,42 +372,16 @@ static const LegacyApi_OptMethod s_MethMessOpt_PAD[] =
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// USB Mess!
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
static const LegacyApi_ReqMethod s_MethMessReq_USB[] =
|
|
||||||
{
|
|
||||||
{ "USBopen", (vMeth**)&USBopen, NULL },
|
|
||||||
{ "USBread8", (vMeth**)&USBread8, NULL },
|
|
||||||
{ "USBread16", (vMeth**)&USBread16, NULL },
|
|
||||||
{ "USBread32", (vMeth**)&USBread32, NULL },
|
|
||||||
{ "USBwrite8", (vMeth**)&USBwrite8, NULL },
|
|
||||||
{ "USBwrite16", (vMeth**)&USBwrite16, NULL },
|
|
||||||
{ "USBwrite32", (vMeth**)&USBwrite32, NULL },
|
|
||||||
{ "USBirqCallback", (vMeth**)&USBirqCallback, NULL },
|
|
||||||
{ "USBirqHandler", (vMeth**)&USBirqHandler, NULL },
|
|
||||||
{ NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const LegacyApi_OptMethod s_MethMessOpt_USB[] =
|
|
||||||
{
|
|
||||||
{ "USBasync", (vMeth**)&USBasync },
|
|
||||||
{ "USBsetRAM", (vMeth**)&USBsetRAM },
|
|
||||||
{ NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const LegacyApi_ReqMethod* const s_MethMessReq[] =
|
static const LegacyApi_ReqMethod* const s_MethMessReq[] =
|
||||||
{
|
{
|
||||||
s_MethMessReq_GS,
|
s_MethMessReq_GS,
|
||||||
s_MethMessReq_PAD,
|
s_MethMessReq_PAD,
|
||||||
s_MethMessReq_USB,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const LegacyApi_OptMethod* const s_MethMessOpt[] =
|
static const LegacyApi_OptMethod* const s_MethMessOpt[] =
|
||||||
{
|
{
|
||||||
s_MethMessOpt_GS,
|
s_MethMessOpt_GS,
|
||||||
s_MethMessOpt_PAD,
|
s_MethMessOpt_PAD,
|
||||||
s_MethMessOpt_USB,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SysCorePlugins *g_plugins = NULL;
|
SysCorePlugins *g_plugins = NULL;
|
||||||
|
@ -588,10 +544,6 @@ void* StaticLibrary::GetSymbol(const wxString &name)
|
||||||
#ifdef BUILTIN_PAD_PLUGIN
|
#ifdef BUILTIN_PAD_PLUGIN
|
||||||
RETURN_COMMON_SYMBOL(PAD);
|
RETURN_COMMON_SYMBOL(PAD);
|
||||||
#endif
|
#endif
|
||||||
#ifdef BUILTIN_USB_PLUGIN
|
|
||||||
RETURN_COMMON_SYMBOL(USB);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#undef RETURN_COMMON_SYMBOL
|
#undef RETURN_COMMON_SYMBOL
|
||||||
#undef RETURN_SYMBOL
|
#undef RETURN_SYMBOL
|
||||||
|
@ -645,9 +597,6 @@ SysCorePlugins::PluginStatus_t::PluginStatus_t( PluginsEnum_t _pid, const wxStri
|
||||||
#endif
|
#endif
|
||||||
#ifdef BUILTIN_PAD_PLUGIN
|
#ifdef BUILTIN_PAD_PLUGIN
|
||||||
case PluginId_PAD:
|
case PluginId_PAD:
|
||||||
#endif
|
|
||||||
#ifdef BUILTIN_USB_PLUGIN
|
|
||||||
case PluginId_USB:
|
|
||||||
#endif
|
#endif
|
||||||
case PluginId_Count:
|
case PluginId_Count:
|
||||||
IsStatic = true;
|
IsStatic = true;
|
||||||
|
@ -915,19 +864,6 @@ bool SysCorePlugins::OpenPlugin_PAD()
|
||||||
return !PADopen( (void*)pDsp );
|
return !PADopen( (void*)pDsp );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SysCorePlugins::OpenPlugin_USB()
|
|
||||||
{
|
|
||||||
usbHandler = NULL;
|
|
||||||
|
|
||||||
if( USBopen((void*)pDsp) ) return false;
|
|
||||||
USBirqCallback( usbIrq );
|
|
||||||
usbHandler = USBirqHandler();
|
|
||||||
// iopMem is not initialized yet. Moved elsewhere
|
|
||||||
//if( USBsetRAM != NULL )
|
|
||||||
// USBsetRAM(iopMem->Main);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SysCorePlugins::OpenPlugin_Mcd()
|
bool SysCorePlugins::OpenPlugin_Mcd()
|
||||||
{
|
{
|
||||||
ScopedLock lock( m_mtx_PluginStatus );
|
ScopedLock lock( m_mtx_PluginStatus );
|
||||||
|
@ -953,7 +889,6 @@ void SysCorePlugins::Open( PluginsEnum_t pid )
|
||||||
{
|
{
|
||||||
case PluginId_GS: result = OpenPlugin_GS(); break;
|
case PluginId_GS: result = OpenPlugin_GS(); break;
|
||||||
case PluginId_PAD: result = OpenPlugin_PAD(); break;
|
case PluginId_PAD: result = OpenPlugin_PAD(); break;
|
||||||
case PluginId_USB: result = OpenPlugin_USB(); break;
|
|
||||||
|
|
||||||
jNO_DEFAULT;
|
jNO_DEFAULT;
|
||||||
}
|
}
|
||||||
|
@ -1025,11 +960,6 @@ void SysCorePlugins::ClosePlugin_PAD()
|
||||||
_generalclose( PluginId_PAD );
|
_generalclose( PluginId_PAD );
|
||||||
}
|
}
|
||||||
|
|
||||||
void SysCorePlugins::ClosePlugin_USB()
|
|
||||||
{
|
|
||||||
_generalclose( PluginId_USB );
|
|
||||||
}
|
|
||||||
|
|
||||||
void SysCorePlugins::ClosePlugin_Mcd()
|
void SysCorePlugins::ClosePlugin_Mcd()
|
||||||
{
|
{
|
||||||
ScopedLock lock( m_mtx_PluginStatus );
|
ScopedLock lock( m_mtx_PluginStatus );
|
||||||
|
@ -1049,7 +979,6 @@ void SysCorePlugins::Close( PluginsEnum_t pid )
|
||||||
{
|
{
|
||||||
case PluginId_GS: ClosePlugin_GS(); break;
|
case PluginId_GS: ClosePlugin_GS(); break;
|
||||||
case PluginId_PAD: ClosePlugin_PAD(); break;
|
case PluginId_PAD: ClosePlugin_PAD(); break;
|
||||||
case PluginId_USB: ClosePlugin_USB(); break;
|
|
||||||
case PluginId_Mcd: ClosePlugin_Mcd(); break;
|
case PluginId_Mcd: ClosePlugin_Mcd(); break;
|
||||||
|
|
||||||
jNO_DEFAULT;
|
jNO_DEFAULT;
|
||||||
|
|
|
@ -402,14 +402,12 @@ protected:
|
||||||
|
|
||||||
virtual bool OpenPlugin_GS();
|
virtual bool OpenPlugin_GS();
|
||||||
virtual bool OpenPlugin_PAD();
|
virtual bool OpenPlugin_PAD();
|
||||||
virtual bool OpenPlugin_USB();
|
|
||||||
virtual bool OpenPlugin_Mcd();
|
virtual bool OpenPlugin_Mcd();
|
||||||
|
|
||||||
void _generalclose( PluginsEnum_t pid );
|
void _generalclose( PluginsEnum_t pid );
|
||||||
|
|
||||||
virtual void ClosePlugin_GS();
|
virtual void ClosePlugin_GS();
|
||||||
virtual void ClosePlugin_PAD();
|
virtual void ClosePlugin_PAD();
|
||||||
virtual void ClosePlugin_USB();
|
|
||||||
virtual void ClosePlugin_Mcd();
|
virtual void ClosePlugin_Mcd();
|
||||||
|
|
||||||
friend class SysMtgsThread;
|
friend class SysMtgsThread;
|
||||||
|
|
|
@ -446,7 +446,6 @@ void MainEmuFrame::CreateConfigMenu()
|
||||||
|
|
||||||
m_menuConfig.Append(MenuId_Config_GS, _("&Video (GS)"), m_PluginMenuPacks[PluginId_GS]);
|
m_menuConfig.Append(MenuId_Config_GS, _("&Video (GS)"), m_PluginMenuPacks[PluginId_GS]);
|
||||||
m_menuConfig.Append(MenuId_Config_PAD, _("&Controllers (PAD)"), m_PluginMenuPacks[PluginId_PAD]);
|
m_menuConfig.Append(MenuId_Config_PAD, _("&Controllers (PAD)"), m_PluginMenuPacks[PluginId_PAD]);
|
||||||
m_menuConfig.Append(MenuId_Config_USB, _("&USB"), m_PluginMenuPacks[PluginId_USB]);
|
|
||||||
|
|
||||||
m_menuConfig.AppendSeparator();
|
m_menuConfig.AppendSeparator();
|
||||||
m_menuConfig.Append(MenuId_Config_Multitap0Toggle, _("Multitap &1"), wxEmptyString, wxITEM_CHECK);
|
m_menuConfig.Append(MenuId_Config_Multitap0Toggle, _("Multitap &1"), wxEmptyString, wxITEM_CHECK);
|
||||||
|
|
|
@ -289,7 +289,6 @@ static const std::unique_ptr<BaseSavestateEntry> SavestateEntries[] = {
|
||||||
|
|
||||||
std::unique_ptr<BaseSavestateEntry>(new PluginSavestateEntry(PluginId_GS)),
|
std::unique_ptr<BaseSavestateEntry>(new PluginSavestateEntry(PluginId_GS)),
|
||||||
std::unique_ptr<BaseSavestateEntry>(new PluginSavestateEntry(PluginId_PAD)),
|
std::unique_ptr<BaseSavestateEntry>(new PluginSavestateEntry(PluginId_PAD)),
|
||||||
std::unique_ptr<BaseSavestateEntry>(new PluginSavestateEntry(PluginId_USB)),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// It's bad mojo to have savestates trying to read and write from the same file at the
|
// It's bad mojo to have savestates trying to read and write from the same file at the
|
||||||
|
|
|
@ -29,7 +29,3 @@ endif()
|
||||||
if(EXISTS "${CMAKE_SOURCE_DIR}/plugins/PadNull" AND PadNull)
|
if(EXISTS "${CMAKE_SOURCE_DIR}/plugins/PadNull" AND PadNull)
|
||||||
add_subdirectory(PadNull)
|
add_subdirectory(PadNull)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(EXISTS "${CMAKE_SOURCE_DIR}/plugins/USBnull" AND USBnull)
|
|
||||||
add_subdirectory(USBnull)
|
|
||||||
endif()
|
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
# Check that people use the good file
|
|
||||||
if(NOT TOP_CMAKE_WAS_SOURCED)
|
|
||||||
message(FATAL_ERROR "
|
|
||||||
You did not 'cmake' the good CMakeLists.txt file. Use the one in the top dir.
|
|
||||||
It is advice to delete all wrongly generated cmake stuff => CMakeFiles & CMakeCache.txt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
# plugin name
|
|
||||||
set(Output USBnull-0.7.0)
|
|
||||||
|
|
||||||
set(USBnullFinalFlags
|
|
||||||
-fvisibility=hidden
|
|
||||||
-Wall
|
|
||||||
-Wno-parentheses
|
|
||||||
)
|
|
||||||
|
|
||||||
# USBnull sources
|
|
||||||
set(USBnullSources
|
|
||||||
USB.cpp)
|
|
||||||
|
|
||||||
# USBnull headers
|
|
||||||
set(USBnullHeaders
|
|
||||||
USB.h)
|
|
||||||
|
|
||||||
# USBnull Linux sources
|
|
||||||
set(USBnullLinuxSources
|
|
||||||
)
|
|
||||||
|
|
||||||
# USBnull Linux headers
|
|
||||||
set(USBnullLinuxHeaders
|
|
||||||
)
|
|
||||||
|
|
||||||
# USBnull Windows sources
|
|
||||||
set(USBnullWindowsSources
|
|
||||||
Windows/USBnull.def
|
|
||||||
)
|
|
||||||
|
|
||||||
# USBnull Windows headers
|
|
||||||
set(USBnullWindowsHeaders
|
|
||||||
)
|
|
||||||
|
|
||||||
set(USBnullFinalSources
|
|
||||||
${USBnullSources}
|
|
||||||
${USBnullHeaders}
|
|
||||||
${USBnullLinuxSources}
|
|
||||||
${USBnullLinuxHeaders}
|
|
||||||
)
|
|
||||||
|
|
||||||
set(USBnullFinalLibs
|
|
||||||
${GTK2_LIBRARIES}
|
|
||||||
${wxWidgets_LIBRARIES}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(BUILTIN_USB)
|
|
||||||
add_pcsx2_lib(${Output} "${USBnullFinalSources}" "${USBnullFinalLibs}" "${USBnullFinalFlags}")
|
|
||||||
else()
|
|
||||||
add_pcsx2_plugin(${Output} "${USBnullFinalSources}" "${USBnullFinalLibs}" "${USBnullFinalFlags}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_features(${Output} PRIVATE cxx_std_17)
|
|
|
@ -1,342 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
||||||
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
USBnull v0.4
|
|
||||||
-------------
|
|
||||||
|
|
||||||
This is an extension to use with play station2 emulators
|
|
||||||
as PCSX2 (only one right now).
|
|
||||||
The plugin is free open source code.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
-----
|
|
||||||
Place the file "usbnull.dll" (win32) or usbnull.dll (win64)
|
|
||||||
at the Plugin directory of the Emulator to use it.
|
|
||||||
|
|
||||||
Changes:
|
|
||||||
-------
|
|
||||||
v0.4:
|
|
||||||
*project files for vs2005 beta1 .64bit dll should work okay (not tested!)
|
|
||||||
|
|
||||||
v0.3:
|
|
||||||
*up to pcsx2 specs 0.5.5
|
|
||||||
*added ini and option for logging
|
|
||||||
*small adds around..
|
|
||||||
|
|
||||||
v0.2:
|
|
||||||
* First Release
|
|
||||||
* Tested with Pcsx2
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
-------
|
|
||||||
|
|
||||||
shadow <shadow@pcsx2.net>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,296 +0,0 @@
|
||||||
/* USBnull
|
|
||||||
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
|
||||||
*
|
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
||||||
* ation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
||||||
* If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string>
|
|
||||||
#include "svnrev.h"
|
|
||||||
#include "USB.h"
|
|
||||||
#include "null/config.inl"
|
|
||||||
|
|
||||||
std::string s_strIniPath = "inis";
|
|
||||||
std::string s_strLogPath = "logs";
|
|
||||||
|
|
||||||
const unsigned char version = PS2E_USB_VERSION;
|
|
||||||
const unsigned char revision = 0;
|
|
||||||
const unsigned char build = 7; // increase that with each version
|
|
||||||
|
|
||||||
static char libraryName[256];
|
|
||||||
|
|
||||||
USBcallback USBirq;
|
|
||||||
|
|
||||||
s8 *usbregs, *ram;
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBconfigure()
|
|
||||||
{
|
|
||||||
const std::string ini_path = s_strIniPath + "/USBnull.ini";
|
|
||||||
LoadConfig(ini_path);
|
|
||||||
ConfigureLogging();
|
|
||||||
SaveConfig(ini_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LogInit()
|
|
||||||
{
|
|
||||||
const std::string LogFile(s_strLogPath + "/USBnull.log");
|
|
||||||
g_plugin_log.Open(LogFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBsetLogDir(const char *dir)
|
|
||||||
{
|
|
||||||
// Get the path to the log directory.
|
|
||||||
s_strLogPath = (dir == NULL) ? "logs" : dir;
|
|
||||||
|
|
||||||
// Reload the log file after updated the path
|
|
||||||
g_plugin_log.Close();
|
|
||||||
LogInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(u32)
|
|
||||||
PS2EgetLibType()
|
|
||||||
{
|
|
||||||
return PS2E_LT_USB;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(const char *)
|
|
||||||
PS2EgetLibName()
|
|
||||||
{
|
|
||||||
snprintf(libraryName, 255, "USBnull Driver %lld%s", SVN_REV, SVN_MODS ? "m" : "");
|
|
||||||
return libraryName;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(u32)
|
|
||||||
PS2EgetLibVersion2(u32 type)
|
|
||||||
{
|
|
||||||
return (version << 16) | (revision << 8) | build;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(s32)
|
|
||||||
USBinit()
|
|
||||||
{
|
|
||||||
LoadConfig(s_strIniPath + "/USBnull.ini");
|
|
||||||
LogInit();
|
|
||||||
g_plugin_log.WriteLn("USBnull plugin version %d,%d", revision, build);
|
|
||||||
g_plugin_log.WriteLn("Initializing USBnull");
|
|
||||||
|
|
||||||
// Initialize memory structures here.
|
|
||||||
usbregs = (s8 *)calloc(0x10000, 1);
|
|
||||||
|
|
||||||
if (usbregs == NULL) {
|
|
||||||
g_plugin_log.Message("Error allocating memory");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBshutdown()
|
|
||||||
{
|
|
||||||
// Yes, we close things in the Shutdown routine, and
|
|
||||||
// don't do anything in the close routine.
|
|
||||||
g_plugin_log.Close();
|
|
||||||
|
|
||||||
free(usbregs);
|
|
||||||
usbregs = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(s32)
|
|
||||||
USBopen(void *pDsp)
|
|
||||||
{
|
|
||||||
g_plugin_log.WriteLn("Opening USBnull.");
|
|
||||||
|
|
||||||
// Take care of anything else we need on opening, other then initialization.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBclose()
|
|
||||||
{
|
|
||||||
g_plugin_log.WriteLn("Closing USBnull.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: actually uncommenting the read/write functions I provided here
|
|
||||||
// caused uLauncher.elf to hang on startup, so careful when experimenting.
|
|
||||||
EXPORT_C_(u8)
|
|
||||||
USBread8(u32 addr)
|
|
||||||
{
|
|
||||||
u8 value = 0;
|
|
||||||
|
|
||||||
switch (addr) {
|
|
||||||
// Handle any appropriate addresses here.
|
|
||||||
case 0x1f801600:
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 8 bit read at address %lx", addr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//value = usbRu8(addr);
|
|
||||||
g_plugin_log.WriteLn("*(USBnull) 8 bit read at address %lx", addr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(u16)
|
|
||||||
USBread16(u32 addr)
|
|
||||||
{
|
|
||||||
u16 value = 0;
|
|
||||||
|
|
||||||
switch (addr) {
|
|
||||||
// Handle any appropriate addresses here.
|
|
||||||
case 0x1f801600:
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 16 bit read at address %lx", addr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//value = usbRu16(addr);
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 16 bit read at address %lx", addr);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(u32)
|
|
||||||
USBread32(u32 addr)
|
|
||||||
{
|
|
||||||
u32 value = 0;
|
|
||||||
|
|
||||||
switch (addr) {
|
|
||||||
// Handle any appropriate addresses here.
|
|
||||||
case 0x1f801600:
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 32 bit read at address %lx", addr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//value = usbRu32(addr);
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 32 bit read at address %lx", addr);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBwrite8(u32 addr, u8 value)
|
|
||||||
{
|
|
||||||
switch (addr) {
|
|
||||||
// Handle any appropriate addresses here.
|
|
||||||
case 0x1f801600:
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 8 bit write at address %lx value %x", addr, value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//usbRu8(addr) = value;
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 8 bit write at address %lx value %x", addr, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBwrite16(u32 addr, u16 value)
|
|
||||||
{
|
|
||||||
switch (addr) {
|
|
||||||
// Handle any appropriate addresses here.
|
|
||||||
case 0x1f801600:
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 16 bit write at address %lx value %x", addr, value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//usbRu16(addr) = value;
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 16 bit write at address %lx value %x", addr, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBwrite32(u32 addr, u32 value)
|
|
||||||
{
|
|
||||||
switch (addr) {
|
|
||||||
// Handle any appropriate addresses here.
|
|
||||||
case 0x1f801600:
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 16 bit write at address %lx value %x", addr, value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
//usbRu32(addr) = value;
|
|
||||||
g_plugin_log.WriteLn("(USBnull) 32 bit write at address %lx value %x", addr, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBirqCallback(USBcallback callback)
|
|
||||||
{
|
|
||||||
// Register USBirq, so we can trigger an interrupt with it later.
|
|
||||||
// It will be called as USBirq(cycles); where cycles is the number
|
|
||||||
// of cycles before the irq is triggered.
|
|
||||||
USBirq = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(int)
|
|
||||||
_USBirqHandler(void)
|
|
||||||
{
|
|
||||||
// This is our USB irq handler, so if an interrupt gets triggered,
|
|
||||||
// deal with it here.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(USBhandler)
|
|
||||||
USBirqHandler(void)
|
|
||||||
{
|
|
||||||
// Pass our handler to pcsx2.
|
|
||||||
return (USBhandler)_USBirqHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBsetRAM(void *mem)
|
|
||||||
{
|
|
||||||
ram = (s8 *)mem;
|
|
||||||
g_plugin_log.WriteLn("*Setting ram.");
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_C_(void)
|
|
||||||
USBsetSettingsDir(const char *dir)
|
|
||||||
{
|
|
||||||
// Get the path to the ini directory.
|
|
||||||
s_strIniPath = (dir == NULL) ? "inis" : dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
// extended funcs
|
|
||||||
|
|
||||||
EXPORT_C_(s32)
|
|
||||||
USBfreeze(int mode, freezeData *data)
|
|
||||||
{
|
|
||||||
// This should store or retrieve any information, for if emulation
|
|
||||||
// gets suspended, or for savestates.
|
|
||||||
switch (mode) {
|
|
||||||
case FREEZE_LOAD:
|
|
||||||
// Load previously saved data.
|
|
||||||
break;
|
|
||||||
case FREEZE_SAVE:
|
|
||||||
// Save data.
|
|
||||||
break;
|
|
||||||
case FREEZE_SIZE:
|
|
||||||
// return the size of the data.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*EXPORT_C_(void) USBasync(u32 cycles)
|
|
||||||
{
|
|
||||||
// Optional function: Called in IopCounter.cpp.
|
|
||||||
}*/
|
|
||||||
|
|
||||||
EXPORT_C_(s32)
|
|
||||||
USBtest()
|
|
||||||
{
|
|
||||||
// 0 if the plugin works, non-0 if it doesn't.
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/* USBnull
|
|
||||||
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
|
||||||
*
|
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
||||||
* ation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
||||||
* If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __USB_H__
|
|
||||||
#define __USB_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define USBdefs
|
|
||||||
#include "PS2Edefs.h"
|
|
||||||
#include "PS2Eext.h"
|
|
||||||
|
|
||||||
extern USBcallback USBirq;
|
|
||||||
|
|
||||||
// Previous USB plugins have needed this in ohci.
|
|
||||||
static const s64 PSXCLK = 36864000; /* 36.864 Mhz */
|
|
||||||
|
|
||||||
extern s8 *usbregs, *ram;
|
|
||||||
|
|
||||||
#define usbRs8(mem) usbregs[(mem)&0xffff]
|
|
||||||
#define usbRs16(mem) (*(s16 *)&usbregs[(mem)&0xffff])
|
|
||||||
#define usbRs32(mem) (*(s32 *)&usbregs[(mem)&0xffff])
|
|
||||||
#define usbRu8(mem) (*(u8 *)&usbregs[(mem)&0xffff])
|
|
||||||
#define usbRu16(mem) (*(u16 *)&usbregs[(mem)&0xffff])
|
|
||||||
#define usbRu32(mem) (*(u32 *)&usbregs[(mem)&0xffff])
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,15 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Label="UserMacros">
|
|
||||||
<SvnRootDir>$(ProjectRootDir)\..\..</SvnRootDir>
|
|
||||||
<SvnCommonDir>$(SvnRootDir)\common</SvnCommonDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<BuildMacro Include="SvnRootDir">
|
|
||||||
<Value>$(SvnRootDir)</Value>
|
|
||||||
</BuildMacro>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,29 +0,0 @@
|
||||||
; USBlinuz.def : Declares the module parameters for the DLL.
|
|
||||||
|
|
||||||
;LIBRARY "USBnull"
|
|
||||||
;DESCRIPTION 'USBnull Driver'
|
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
; Explicit exports can go here
|
|
||||||
PS2EgetLibType @2
|
|
||||||
PS2EgetLibName @3
|
|
||||||
PS2EgetLibVersion2 @4
|
|
||||||
USBinit @5
|
|
||||||
USBshutdown @6
|
|
||||||
USBopen @7
|
|
||||||
USBclose @8
|
|
||||||
USBread8 @9
|
|
||||||
USBread16 @10
|
|
||||||
USBread32 @11
|
|
||||||
USBwrite8 @12
|
|
||||||
USBwrite16 @13
|
|
||||||
USBwrite32 @14
|
|
||||||
USBirqCallback @15
|
|
||||||
USBirqHandler @16
|
|
||||||
USBsetRAM @17
|
|
||||||
|
|
||||||
USBconfigure @18
|
|
||||||
USBtest @19
|
|
||||||
|
|
||||||
USBsetSettingsDir
|
|
||||||
USBsetLogDir
|
|
|
@ -1,69 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(SolutionDir)common\vsprops\WinSDK.props" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{BF7B81A5-E348-4F7C-A69F-F74C8EEEAD70}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="..\..\..\common\vsprops\plugin_svnroot.props" />
|
|
||||||
<Import Project="ProjectRootDir.props" />
|
|
||||||
<Import Project="..\..\..\common\vsprops\BaseProperties.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\..\common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\..\common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\..\common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<Link>
|
|
||||||
<ModuleDefinitionFile>USBnull.def</ModuleDefinitionFile>
|
|
||||||
<TargetMachine Condition="'$(Platform)'=='Win32'">MachineX86</TargetMachine>
|
|
||||||
<TargetMachine Condition="'$(Platform)'=='x64'">MachineX64</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\USB.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\USB.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="USBnull.def" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ResourceCompile Include="..\..\..\common\include\null\null.rc" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{94a66e11-75eb-4a79-a044-b78e97a6ccc3}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{2790b344-7a1a-45ef-9a16-0dd847d6de56}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{bf432076-1764-488d-84b7-82e00f408011}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\USB.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\USB.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="USBnull.def">
|
|
||||||
<Filter>Resource Files</Filter>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ResourceCompile Include="..\..\..\common\include\null\null.rc">
|
|
||||||
<Filter>Resource Files</Filter>
|
|
||||||
</ResourceCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU USB emulation
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
|
@ -1,342 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
||||||
|
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
USBlinuz v0.1
|
|
||||||
-------------
|
|
||||||
|
|
||||||
This is an extension to use with play station2 emulators
|
|
||||||
as PCSX2 (only one right now).
|
|
||||||
The plugin is free open source code.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
-----
|
|
||||||
Place the file "usblinuz.dll" (win32) or usblinuz_64.dll (win64)
|
|
||||||
at the Plugin directory of the Emulator to use it.
|
|
||||||
|
|
||||||
Changes:
|
|
||||||
-------
|
|
||||||
v0.1 (gigaherz)
|
|
||||||
* First Release
|
|
||||||
* Tested with Pcsx2 32 and 64bit
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
-------
|
|
||||||
|
|
||||||
linuzappz <linuzappz@hotmail.com>
|
|
||||||
shadow <shadowpcsx2@yahoo.gr>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,369 +0,0 @@
|
||||||
/* USBqemu
|
|
||||||
* Copyright (C) 2002-2011 PCSX2 Team
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu-usb/USBinternal.h"
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# include "svnrev.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const unsigned char version = PS2E_USB_VERSION;
|
|
||||||
const unsigned char revision = 0;
|
|
||||||
const unsigned char build = 1; // increase that with each version
|
|
||||||
|
|
||||||
// PCSX2 expects ASNI, not unicode, so this MUST always be char...
|
|
||||||
static char libraryName[256];
|
|
||||||
|
|
||||||
OHCIState *qemu_ohci;
|
|
||||||
|
|
||||||
Config conf;
|
|
||||||
|
|
||||||
HWND gsWindowHandle=NULL;
|
|
||||||
|
|
||||||
u8 *ram;
|
|
||||||
USBcallback _USBirq;
|
|
||||||
FILE *usbLog;
|
|
||||||
int64_t usb_frame_time=0;
|
|
||||||
int64_t usb_bit_time=0;
|
|
||||||
|
|
||||||
s64 clocks=0;
|
|
||||||
s64 remaining=0;
|
|
||||||
|
|
||||||
int64_t get_ticks_per_sec()
|
|
||||||
{
|
|
||||||
return PSXCLK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __Log(char *fmt, ...) {
|
|
||||||
va_list list;
|
|
||||||
|
|
||||||
if (!conf.Log) return;
|
|
||||||
|
|
||||||
va_start(list, fmt);
|
|
||||||
vfprintf(usbLog, fmt, list);
|
|
||||||
va_end(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InitLibraryName()
|
|
||||||
{
|
|
||||||
#ifdef USBQEMU_PUBLIC_RELEASE
|
|
||||||
|
|
||||||
// Public Release!
|
|
||||||
// Output a simplified string that's just our name:
|
|
||||||
|
|
||||||
strcpy( libraryName, "USBqemu" );
|
|
||||||
|
|
||||||
#else
|
|
||||||
#ifdef SVN_REV_UNKNOWN
|
|
||||||
|
|
||||||
// Unknown revision.
|
|
||||||
// Output a name that includes devbuild status but not
|
|
||||||
// subversion revision tags:
|
|
||||||
|
|
||||||
strcpy( libraryName, "USBqemu"
|
|
||||||
#ifdef DEBUG_FAST
|
|
||||||
"-Debug"
|
|
||||||
#elif defined( PCSX2_DEBUG )
|
|
||||||
"-Debug/Strict" // strict debugging is slow!
|
|
||||||
#elif defined( PCSX2_DEVBUILD )
|
|
||||||
"-Dev"
|
|
||||||
#else
|
|
||||||
""
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Use TortoiseSVN's SubWCRev utility's output
|
|
||||||
// to label the specific revision:
|
|
||||||
|
|
||||||
sprintf_s( libraryName, "USBqemu %lld%s"
|
|
||||||
#ifdef DEBUG_FAST
|
|
||||||
"-Debug"
|
|
||||||
#elif defined( PCSX2_DEBUG )
|
|
||||||
"-Debug/Strict" // strict debugging is slow!
|
|
||||||
#elif defined( PCSX2_DEVBUILD )
|
|
||||||
"-Dev"
|
|
||||||
#else
|
|
||||||
""
|
|
||||||
#endif
|
|
||||||
,SVN_REV,SVN_MODS ? "m" : ""
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 CALLBACK PS2EgetLibType() {
|
|
||||||
return PS2E_LT_USB;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* CALLBACK PS2EgetLibName()
|
|
||||||
{
|
|
||||||
InitLibraryName();
|
|
||||||
return libraryName;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 CALLBACK PS2EgetLibVersion2(u32 type) {
|
|
||||||
return (version<<16) | (revision<<8) | build;
|
|
||||||
}
|
|
||||||
|
|
||||||
void USBirq(int cycles)
|
|
||||||
{
|
|
||||||
USB_LOG("USBirq.\n");
|
|
||||||
|
|
||||||
_USBirq(cycles);
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 CALLBACK USBinit() {
|
|
||||||
LoadConfig();
|
|
||||||
if (conf.Log)
|
|
||||||
{
|
|
||||||
usbLog = fopen("logs/usbLog.txt", "w");
|
|
||||||
setvbuf(usbLog, NULL, _IONBF, 0);
|
|
||||||
USB_LOG("USBqemu plugin version %d,%d\n",revision,build);
|
|
||||||
USB_LOG("USBinit\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_ohci = ohci_create(0x1f801600,2);
|
|
||||||
qemu_ohci->rhport[0].port.dev = usb_keyboard_init();
|
|
||||||
qemu_ohci->rhport[0].port.ops->attach(&(qemu_ohci->rhport[0].port));
|
|
||||||
|
|
||||||
clocks = 0;
|
|
||||||
remaining = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBshutdown() {
|
|
||||||
|
|
||||||
USBDevice* device = qemu_ohci->rhport[0].port.dev;
|
|
||||||
|
|
||||||
qemu_ohci->rhport[0].port.ops->detach(&(qemu_ohci->rhport[0].port));
|
|
||||||
device->info->handle_destroy(qemu_ohci->rhport[0].port.dev);
|
|
||||||
|
|
||||||
free(qemu_ohci);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
if(usbLog)
|
|
||||||
fclose(usbLog);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 CALLBACK USBopen(void *pDsp) {
|
|
||||||
USB_LOG("USBopen\n");
|
|
||||||
|
|
||||||
HWND hWnd=(HWND)pDsp;
|
|
||||||
|
|
||||||
if (!IsWindow (hWnd) && !IsBadReadPtr ((u32*)hWnd, 4))
|
|
||||||
hWnd = *(HWND*)hWnd;
|
|
||||||
if (!IsWindow (hWnd))
|
|
||||||
hWnd = NULL;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (GetWindowLong (hWnd, GWL_STYLE) & WS_CHILD)
|
|
||||||
hWnd = GetParent (hWnd);
|
|
||||||
}
|
|
||||||
gsWindowHandle = hWnd;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBclose() {
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 CALLBACK USBread8(u32 addr) {
|
|
||||||
USB_LOG("* Invalid 8bit read at address %lx\n", addr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u16 CALLBACK USBread16(u32 addr) {
|
|
||||||
USB_LOG("* Invalid 16bit read at address %lx\n", addr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 CALLBACK USBread32(u32 addr) {
|
|
||||||
u32 hard;
|
|
||||||
|
|
||||||
hard=ohci_mem_read(qemu_ohci,addr - qemu_ohci->mem);
|
|
||||||
|
|
||||||
USB_LOG("* Known 32bit read at address %lx: %lx\n", addr, hard);
|
|
||||||
|
|
||||||
return hard;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBwrite8(u32 addr, u8 value) {
|
|
||||||
USB_LOG("* Invalid 8bit write at address %lx value %x\n", addr, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBwrite16(u32 addr, u16 value) {
|
|
||||||
USB_LOG("* Invalid 16bit write at address %lx value %x\n", addr, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBwrite32(u32 addr, u32 value) {
|
|
||||||
USB_LOG("* Known 32bit write at address %lx value %lx\n", addr, value);
|
|
||||||
ohci_mem_write(qemu_ohci,addr - qemu_ohci->mem, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBirqCallback(USBcallback callback) {
|
|
||||||
_USBirq = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern u32 bits;
|
|
||||||
|
|
||||||
int CALLBACK _USBirqHandler(void)
|
|
||||||
{
|
|
||||||
//fprintf(stderr," * USB: IRQ Acknowledged.\n");
|
|
||||||
//qemu_ohci->intr_status&=~bits;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
USBhandler CALLBACK USBirqHandler(void) {
|
|
||||||
return (USBhandler)_USBirqHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBsetRAM(void *mem) {
|
|
||||||
ram = (u8*)mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
// extended funcs
|
|
||||||
|
|
||||||
char USBfreezeID[] = "USBqemu01";
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char freezeID[10];
|
|
||||||
int cycles;
|
|
||||||
int remaining;
|
|
||||||
OHCIState t;
|
|
||||||
int extraData; // for future expansion with the device state
|
|
||||||
} USBfreezeData;
|
|
||||||
|
|
||||||
s32 CALLBACK USBfreeze(int mode, freezeData *data) {
|
|
||||||
USBfreezeData usbd;
|
|
||||||
|
|
||||||
if (mode == FREEZE_LOAD)
|
|
||||||
{
|
|
||||||
if(data->size < sizeof(USBfreezeData))
|
|
||||||
{
|
|
||||||
SysMessage("ERROR: Unable to load freeze data! Got %d bytes, expected >= %d.", data->size, sizeof(USBfreezeData));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
usbd = *(USBfreezeData*)data->data;
|
|
||||||
usbd.freezeID[9] = 0;
|
|
||||||
usbd.cycles = static_cast<int>(clocks);
|
|
||||||
usbd.remaining = static_cast<int>(remaining);
|
|
||||||
|
|
||||||
if( strcmp(usbd.freezeID, USBfreezeID) != 0)
|
|
||||||
{
|
|
||||||
SysMessage("ERROR: Unable to load freeze data! Found ID '%s', expected ID '%s'.", usbd.freezeID, USBfreezeID);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->size != sizeof(USBfreezeData))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for(int i=0; i< qemu_ohci->num_ports; i++)
|
|
||||||
{
|
|
||||||
usbd.t.rhport[i].port.opaque = qemu_ohci;
|
|
||||||
usbd.t.rhport[i].port.ops = qemu_ohci->rhport[i].port.ops;
|
|
||||||
usbd.t.rhport[i].port.dev = qemu_ohci->rhport[i].port.dev; // pointers
|
|
||||||
}
|
|
||||||
*qemu_ohci = usbd.t;
|
|
||||||
|
|
||||||
// WARNING: TODO: Load the state of the attached devices!
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (mode == FREEZE_SAVE)
|
|
||||||
{
|
|
||||||
data->size = sizeof(USBfreezeData);
|
|
||||||
data->data = (s8*)malloc(data->size);
|
|
||||||
if (data->data == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
|
|
||||||
strcpy(usbd.freezeID, USBfreezeID);
|
|
||||||
usbd.t = *qemu_ohci;
|
|
||||||
for(int i=0; i< qemu_ohci->num_ports; i++)
|
|
||||||
{
|
|
||||||
usbd.t.rhport[i].port.ops = NULL; // pointers
|
|
||||||
usbd.t.rhport[i].port.opaque = NULL; // pointers
|
|
||||||
usbd.t.rhport[i].port.dev = NULL; // pointers
|
|
||||||
}
|
|
||||||
|
|
||||||
clocks = usbd.cycles;
|
|
||||||
remaining = usbd.remaining;
|
|
||||||
|
|
||||||
// WARNING: TODO: Save the state of the attached devices!
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBasync(u32 _cycles)
|
|
||||||
{
|
|
||||||
remaining += _cycles;
|
|
||||||
clocks += remaining;
|
|
||||||
if(qemu_ohci->eof_timer>0)
|
|
||||||
{
|
|
||||||
while(remaining>=qemu_ohci->eof_timer)
|
|
||||||
{
|
|
||||||
remaining-=qemu_ohci->eof_timer;
|
|
||||||
qemu_ohci->eof_timer=0;
|
|
||||||
ohci_frame_boundary(qemu_ohci);
|
|
||||||
}
|
|
||||||
if((remaining>0)&&(qemu_ohci->eof_timer>0))
|
|
||||||
{
|
|
||||||
s64 m = qemu_ohci->eof_timer;
|
|
||||||
if(remaining < m)
|
|
||||||
m = remaining;
|
|
||||||
qemu_ohci->eof_timer -= m;
|
|
||||||
remaining -= m;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if(qemu_ohci->eof_timer <= 0)
|
|
||||||
//{
|
|
||||||
// ohci_frame_boundary(qemu_ohci);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 CALLBACK USBtest() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpu_physical_memory_rw(u32 addr, u8 *buf,
|
|
||||||
int len, int is_write)
|
|
||||||
{
|
|
||||||
if(is_write)
|
|
||||||
memcpy(&(ram[addr]),buf,len);
|
|
||||||
else
|
|
||||||
memcpy(buf,&(ram[addr]),len);
|
|
||||||
}
|
|
||||||
|
|
||||||
s64 get_clock()
|
|
||||||
{
|
|
||||||
return clocks;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *qemu_mallocz(uint32_t size)
|
|
||||||
{
|
|
||||||
void *m=malloc(size);
|
|
||||||
if(!m) return NULL;
|
|
||||||
memset(m,0,size);
|
|
||||||
return m;
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
/* USBqemu
|
|
||||||
* Copyright (C) 2002-2011 PCSX2 Team
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifndef __USB_H__
|
|
||||||
#define __USB_H__
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define USBdefs
|
|
||||||
#include "PS2Edefs.h"
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# include <windows.h>
|
|
||||||
# include <windowsx.h>
|
|
||||||
#else
|
|
||||||
# include <gtk/gtk.h>
|
|
||||||
# define __inline inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#define USB_LOG __Log
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
bool Log;
|
|
||||||
} Config;
|
|
||||||
|
|
||||||
extern Config conf;
|
|
||||||
|
|
||||||
#define PSXCLK 36864000 /* 36.864 Mhz */
|
|
||||||
|
|
||||||
void USBirq(int);
|
|
||||||
|
|
||||||
void SaveConfig();
|
|
||||||
void LoadConfig();
|
|
||||||
|
|
||||||
extern FILE *usbLog;
|
|
||||||
void __Log(char *fmt, ...);
|
|
||||||
|
|
||||||
extern void SysMessage(const char *fmt, ...);
|
|
||||||
extern void SysMessage(const wchar_t *fmt, ...);
|
|
||||||
|
|
||||||
extern HWND gsWindowHandle;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,159 +0,0 @@
|
||||||
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
|
|
||||||
* Developed and maintained by the Pcsx2 Development Team.
|
|
||||||
*
|
|
||||||
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]
|
|
||||||
*
|
|
||||||
* SPU2-X is free software: you can redistribute it and/or modify it under the terms
|
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
||||||
* ation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* SPU2-X is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with SPU2-X. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include "../USB.h"
|
|
||||||
|
|
||||||
void SysMessage(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list list;
|
|
||||||
char tmp[512];
|
|
||||||
wchar_t wtmp[512];
|
|
||||||
|
|
||||||
va_start(list,fmt);
|
|
||||||
vsprintf_s(tmp,fmt,list);
|
|
||||||
va_end(list);
|
|
||||||
swprintf_s(wtmp, L"%S", tmp);
|
|
||||||
MessageBox( (!!gsWindowHandle) ? (HWND)gsWindowHandle : GetActiveWindow(), wtmp,
|
|
||||||
L"USBqemu System Message", MB_OK | MB_SETFOREGROUND);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SysMessage(const wchar_t *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list list;
|
|
||||||
wchar_t tmp[512];
|
|
||||||
|
|
||||||
va_start(list,fmt);
|
|
||||||
vswprintf_s(tmp,fmt,list);
|
|
||||||
va_end(list);
|
|
||||||
|
|
||||||
MessageBox( (!!gsWindowHandle) ? (HWND)gsWindowHandle : GetActiveWindow(), tmp,
|
|
||||||
L"USBqemu System Message", MB_OK | MB_SETFOREGROUND);
|
|
||||||
}
|
|
||||||
|
|
||||||
//////
|
|
||||||
|
|
||||||
static TCHAR CfgFile[260] = L"inis/USBqemu.ini";
|
|
||||||
|
|
||||||
void CfgSetSettingsDir( const char* dir )
|
|
||||||
{
|
|
||||||
if(dir == NULL)
|
|
||||||
{
|
|
||||||
wcscpy(CfgFile, L"inis/USBqemu.ini");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
swprintf_s(CfgFile, L"%S", dir);
|
|
||||||
TCHAR term = CfgFile[wcslen(CfgFile)-1];
|
|
||||||
if(term != L'\\' && term != L'/')
|
|
||||||
wcscat(CfgFile, L"\\");
|
|
||||||
wcscat(CfgFile, L"USBQemu.ini" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*¯| Config File Format: |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*\
|
|
||||||
+--+---------------------+------------------------+
|
|
||||||
| |
|
|
||||||
| Option=Value |
|
|
||||||
| |
|
|
||||||
| |
|
|
||||||
| Boolean Values: TRUE,YES,1,T,Y mean 'true', |
|
|
||||||
| everything else means 'false'. |
|
|
||||||
| |
|
|
||||||
| All Values are limited to 255 chars. |
|
|
||||||
| |
|
|
||||||
+-------------------------------------------------+
|
|
||||||
\*______________________________________________*/
|
|
||||||
|
|
||||||
|
|
||||||
void CfgWriteBool(const TCHAR* Section, const TCHAR* Name, bool Value)
|
|
||||||
{
|
|
||||||
const TCHAR *Data = Value ? L"TRUE" : L"FALSE";
|
|
||||||
WritePrivateProfileString( Section, Name, Data, CfgFile );
|
|
||||||
}
|
|
||||||
|
|
||||||
void CfgWriteInt(const TCHAR* Section, const TCHAR* Name, int Value)
|
|
||||||
{
|
|
||||||
TCHAR Data[32];
|
|
||||||
_itow( Value, Data, 10 );
|
|
||||||
WritePrivateProfileString(Section,Name,Data,CfgFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CfgWriteStr(const TCHAR* Section, const TCHAR* Name, const TCHAR *Data)
|
|
||||||
{
|
|
||||||
WritePrivateProfileString( Section, Name, Data, CfgFile );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
bool CfgReadBool(const TCHAR *Section,const TCHAR* Name, bool Default)
|
|
||||||
{
|
|
||||||
TCHAR Data[255] = {0};
|
|
||||||
|
|
||||||
GetPrivateProfileString( Section, Name, L"", Data, 255, CfgFile );
|
|
||||||
Data[254]=0;
|
|
||||||
if(wcslen(Data)==0) {
|
|
||||||
CfgWriteBool(Section,Name,Default);
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(wcscmp(Data,L"1")==0) return true;
|
|
||||||
if(wcscmp(Data,L"Y")==0) return true;
|
|
||||||
if(wcscmp(Data,L"T")==0) return true;
|
|
||||||
if(wcscmp(Data,L"YES")==0) return true;
|
|
||||||
if(wcscmp(Data,L"TRUE")==0) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int CfgReadInt(const TCHAR* Section, const TCHAR* Name,int Default)
|
|
||||||
{
|
|
||||||
TCHAR Data[255]={0};
|
|
||||||
GetPrivateProfileString(Section,Name,L"",Data,255,CfgFile);
|
|
||||||
Data[254]=0;
|
|
||||||
|
|
||||||
if(wcslen(Data)==0) {
|
|
||||||
CfgWriteInt(Section,Name,Default);
|
|
||||||
return Default;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _wtoi(Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CfgReadStr(const TCHAR* Section, const TCHAR* Name, TCHAR* Data, int DataSize, const TCHAR* Default)
|
|
||||||
{
|
|
||||||
int chars = GetPrivateProfileString(Section,Name,L"",Data,DataSize,CfgFile);
|
|
||||||
|
|
||||||
if(!chars)
|
|
||||||
{
|
|
||||||
wcscpy(Data, Default);
|
|
||||||
CfgWriteStr( Section, Name, Default );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tries to read the requested value.
|
|
||||||
// Returns FALSE if the value isn't found.
|
|
||||||
bool CfgFindName( const TCHAR *Section, const TCHAR* Name)
|
|
||||||
{
|
|
||||||
// Only load 24 characters. No need to load more.
|
|
||||||
TCHAR Data[24]={0};
|
|
||||||
GetPrivateProfileString(Section,Name,L"",Data,24,CfgFile);
|
|
||||||
Data[23]=0;
|
|
||||||
|
|
||||||
if(wcslen(Data)==0) return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <tchar.h>
|
|
||||||
|
|
||||||
extern void CfgSetSettingsDir( const char* dir );
|
|
||||||
|
|
||||||
extern bool CfgFindName( const TCHAR *Section, const TCHAR* Name);
|
|
||||||
|
|
||||||
extern void CfgWriteBool(const TCHAR* Section, const TCHAR* Name, bool Value);
|
|
||||||
extern void CfgWriteInt(const TCHAR* Section, const TCHAR* Name, int Value);
|
|
||||||
extern void CfgWriteStr(const TCHAR* Section, const TCHAR* Name, const TCHAR *Data);
|
|
||||||
|
|
||||||
extern bool CfgReadBool(const TCHAR *Section,const TCHAR* Name, bool Default);
|
|
||||||
extern void CfgReadStr(const TCHAR* Section, const TCHAR* Name, TCHAR* Data, int DataSize, const TCHAR* Default);
|
|
||||||
extern int CfgReadInt(const TCHAR* Section, const TCHAR* Name,int Default);
|
|
|
@ -1,21 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "../USB.h"
|
|
||||||
|
|
||||||
#include "CfgHelpers.h"
|
|
||||||
|
|
||||||
void CALLBACK USBsetSettingsDir( const char* dir )
|
|
||||||
{
|
|
||||||
CfgSetSettingsDir(dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaveConfig()
|
|
||||||
{
|
|
||||||
CfgWriteBool(L"Interface", L"Logging", conf.Log);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoadConfig()
|
|
||||||
{
|
|
||||||
conf.Log = CfgReadBool(L"Interface", L"Logging", false);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Label="UserMacros">
|
|
||||||
<ProjectRootDir>$(ProjectDir)..</ProjectRootDir>
|
|
||||||
<SvnRootDir>$(ProjectRootDir)\..\..</SvnRootDir>
|
|
||||||
<SvnCommonDir>$(SvnRootDir)\common</SvnCommonDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<BuildMacro Include="SvnRootDir">
|
|
||||||
<Value>$(SvnRootDir)</Value>
|
|
||||||
</BuildMacro>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,24 +0,0 @@
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
; Explicit exports can go here
|
|
||||||
PS2EgetLibType @2
|
|
||||||
PS2EgetLibName @3
|
|
||||||
PS2EgetLibVersion2 @4
|
|
||||||
USBinit @5
|
|
||||||
USBshutdown @6
|
|
||||||
USBopen @7
|
|
||||||
USBclose @8
|
|
||||||
USBread8 @9
|
|
||||||
USBread16 @10
|
|
||||||
USBread32 @11
|
|
||||||
USBwrite8 @12
|
|
||||||
USBwrite16 @13
|
|
||||||
USBwrite32 @14
|
|
||||||
USBirqCallback @15
|
|
||||||
USBirqHandler @16
|
|
||||||
USBsetRAM @17
|
|
||||||
USBasync @18
|
|
||||||
|
|
||||||
USBconfigure @19
|
|
||||||
USBtest @20
|
|
||||||
USBabout @21
|
|
|
@ -1,159 +0,0 @@
|
||||||
// Microsoft Visual C++ generated resource script.
|
|
||||||
//
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
#define APSTUDIO_READONLY_SYMBOLS
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 2 resource.
|
|
||||||
//
|
|
||||||
#define APSTUDIO_HIDDEN_SYMBOLS
|
|
||||||
#include "windows.h"
|
|
||||||
#undef APSTUDIO_HIDDEN_SYMBOLS
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Spanish (Argentina) resources
|
|
||||||
|
|
||||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESS)
|
|
||||||
#ifdef _WIN32
|
|
||||||
LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA
|
|
||||||
#pragma code_page(1252)
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// TEXTINCLUDE
|
|
||||||
//
|
|
||||||
|
|
||||||
1 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"resource.h\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
2 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
|
||||||
"#include ""windows.h""\r\n"
|
|
||||||
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
3 TEXTINCLUDE
|
|
||||||
BEGIN
|
|
||||||
"\r\n"
|
|
||||||
"\0"
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // APSTUDIO_INVOKED
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Dialog
|
|
||||||
//
|
|
||||||
|
|
||||||
IDD_CONFIG DIALOGEX 0, 0, 212, 121
|
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "USBconfigure"
|
|
||||||
FONT 8, "MS Sans Serif", 0, 0, 0x0
|
|
||||||
BEGIN
|
|
||||||
DEFPUSHBUTTON "OK",IDOK,48,100,50,14
|
|
||||||
PUSHBUTTON "Cancel",IDCANCEL,113,100,50,14
|
|
||||||
CONTROL "Enable Logging (for develop use only)",IDC_LOGGING,
|
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,144,15
|
|
||||||
COMBOBOX IDC_COMBO1,7,38,138,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
|
||||||
LTEXT "Device in Port 1:",IDC_STATIC,8,30,54,8
|
|
||||||
COMBOBOX IDC_COMBO2,7,63,138,51,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
|
||||||
LTEXT "Device in Port 2:",IDC_STATIC,8,55,54,8
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_ABOUT DIALOGEX 0, 0, 177, 106
|
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
|
||||||
CAPTION "USBabout"
|
|
||||||
FONT 8, "MS Sans Serif", 0, 0, 0x0
|
|
||||||
BEGIN
|
|
||||||
DEFPUSHBUTTON "OK",IDOK,65,85,50,14
|
|
||||||
LTEXT "USBqemu Driver",IDC_NAME,70,10,54,8
|
|
||||||
GROUPBOX "",IDC_STATIC,5,35,170,40
|
|
||||||
LTEXT "Author: gigaherz <gigaherz@pcsx2.net>",IDC_STATIC,20,20,141,10
|
|
||||||
LTEXT "Parts of this code were originally from the QEMU project.",IDC_STATIC,14,44,149,26
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// DESIGNINFO
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
GUIDELINES DESIGNINFO
|
|
||||||
BEGIN
|
|
||||||
IDD_CONFIG, DIALOG
|
|
||||||
BEGIN
|
|
||||||
LEFTMARGIN, 7
|
|
||||||
RIGHTMARGIN, 205
|
|
||||||
TOPMARGIN, 7
|
|
||||||
BOTTOMMARGIN, 114
|
|
||||||
END
|
|
||||||
|
|
||||||
IDD_ABOUT, DIALOG
|
|
||||||
BEGIN
|
|
||||||
LEFTMARGIN, 7
|
|
||||||
RIGHTMARGIN, 170
|
|
||||||
TOPMARGIN, 7
|
|
||||||
BOTTOMMARGIN, 99
|
|
||||||
END
|
|
||||||
END
|
|
||||||
#endif // APSTUDIO_INVOKED
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Dialog Info
|
|
||||||
//
|
|
||||||
|
|
||||||
IDD_CONFIG DLGINIT
|
|
||||||
BEGIN
|
|
||||||
IDC_COMBO1, 0x403, 10, 0
|
|
||||||
0x6f4e, 0x4420, 0x7665, 0x6369, 0x0065,
|
|
||||||
IDC_COMBO1, 0x403, 9, 0
|
|
||||||
0x654b, 0x6279, 0x616f, 0x6472, "\000"
|
|
||||||
IDC_COMBO1, 0x403, 6, 0
|
|
||||||
0x6f4d, 0x7375, 0x0065,
|
|
||||||
IDC_COMBO1, 0x403, 14, 0
|
|
||||||
0x7945, 0x7465, 0x796f, 0x4320, 0x6d61, 0x7265, 0x0061,
|
|
||||||
IDC_COMBO1, 0x403, 20, 0
|
|
||||||
0x6953, 0x676e, 0x7473, 0x7261, 0x4d20, 0x6369, 0x6f72, 0x6870, 0x6e6f,
|
|
||||||
0x0065,
|
|
||||||
IDC_COMBO2, 0x403, 10, 0
|
|
||||||
0x6f4e, 0x4420, 0x7665, 0x6369, 0x0065,
|
|
||||||
IDC_COMBO2, 0x403, 9, 0
|
|
||||||
0x654b, 0x6279, 0x616f, 0x6472, "\000"
|
|
||||||
IDC_COMBO2, 0x403, 6, 0
|
|
||||||
0x6f4d, 0x7375, 0x0065,
|
|
||||||
IDC_COMBO2, 0x403, 14, 0
|
|
||||||
0x7945, 0x7465, 0x796f, 0x4320, 0x6d61, 0x7265, 0x0061,
|
|
||||||
IDC_COMBO2, 0x403, 20, 0
|
|
||||||
0x6953, 0x676e, 0x7473, 0x7261, 0x4d20, 0x6369, 0x6f72, 0x6870, 0x6e6f,
|
|
||||||
0x0065,
|
|
||||||
0
|
|
||||||
END
|
|
||||||
|
|
||||||
#endif // Spanish (Argentina) resources
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef APSTUDIO_INVOKED
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Generated from the TEXTINCLUDE 3 resource.
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
#endif // not APSTUDIO_INVOKED
|
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Devel|Win32">
|
|
||||||
<Configuration>Devel</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Devel|x64">
|
|
||||||
<Configuration>Devel</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{E613DA9F-41B4-4613-9911-E418EF5533BC}</ProjectGuid>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Label="Configuration">
|
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
|
||||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
|
||||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
|
||||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings" />
|
|
||||||
<ImportGroup Label="PropertySheets">
|
|
||||||
<Import Project="..\..\..\common\vsprops\plugin_svnroot.props" />
|
|
||||||
<Import Project="ProjectRootDir.props" />
|
|
||||||
<Import Project="..\..\..\common\vsprops\BaseProperties.props" />
|
|
||||||
<Import Project="..\..\..\common\vsprops\3rdpartyDeps.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\..\common\vsprops\CodeGen_Debug.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Devel))" Project="..\..\..\common\vsprops\CodeGen_Devel.props" />
|
|
||||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\..\common\vsprops\CodeGen_Release.props" />
|
|
||||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\..\common\vsprops\IncrementalLinking.props" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup>
|
|
||||||
<Link>
|
|
||||||
<ModuleDefinitionFile>USBqemu.def</ModuleDefinitionFile>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<TargetMachine Condition="'$(Platform)'=='Win32'">MachineX86</TargetMachine>
|
|
||||||
<TargetMachine Condition="'$(Platform)'=='x64'">MachineX64</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-msd.cpp">
|
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="CfgHelpers.cpp" />
|
|
||||||
<ClCompile Include="Config.cpp" />
|
|
||||||
<ClCompile Include="..\USB.cpp" />
|
|
||||||
<ClCompile Include="Win32.cpp" />
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-base.cpp" />
|
|
||||||
<ClCompile Include="..\usb-eyetoy\usb-eyetoy.cpp">
|
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-hid.cpp">
|
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-hub.cpp">
|
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-kbd.cpp" />
|
|
||||||
<ClCompile Include="..\usb-mic\usb-mic-dummy.cpp">
|
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-ohci.cpp" />
|
|
||||||
<ClCompile Include="..\qemu-usb\vl.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="USBqemu.def" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\qemu-usb\qemu-queue.h" />
|
|
||||||
<ClInclude Include="..\qemu-usb\USBinternal.h" />
|
|
||||||
<ClInclude Include="CfgHelpers.h" />
|
|
||||||
<ClInclude Include="resource.h" />
|
|
||||||
<ClInclude Include="..\USB.h" />
|
|
||||||
<ClInclude Include="..\qemu-usb\usb.h" />
|
|
||||||
<ClInclude Include="..\qemu-usb\vl.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ResourceCompile Include="USBqemu.rc" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
|
||||||
</Project>
|
|
|
@ -1,97 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{dfc571b5-5df6-405b-9920-d273ad48d332}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Source Files\qemu-usb">
|
|
||||||
<UniqueIdentifier>{fe40e0a3-a73a-44b8-a8ee-3d9591f91f0b}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{2f1d0e2b-ba2b-4bd2-8bbd-63b3e4909ff3}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files\qemu-usb">
|
|
||||||
<UniqueIdentifier>{d1b11b29-e230-4fb1-84e1-795a3aafe8dd}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Resource Files">
|
|
||||||
<UniqueIdentifier>{5468eb4e-6580-45d9-9432-a8ac8083abf9}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="Config.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\USB.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Win32.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-base.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\usb-eyetoy\usb-eyetoy.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-hid.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-hub.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-kbd.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\usb-mic\usb-mic-dummy.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-ohci.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\vl.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="CfgHelpers.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\qemu-usb\usb-msd.cpp">
|
|
||||||
<Filter>Source Files\qemu-usb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="USBqemu.def">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="resource.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\USB.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\qemu-usb\usb.h">
|
|
||||||
<Filter>Header Files\qemu-usb</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\qemu-usb\vl.h">
|
|
||||||
<Filter>Header Files\qemu-usb</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\qemu-usb\qemu-queue.h">
|
|
||||||
<Filter>Header Files\qemu-usb</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="CfgHelpers.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\qemu-usb\USBinternal.h">
|
|
||||||
<Filter>Header Files\qemu-usb</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ResourceCompile Include="USBqemu.rc">
|
|
||||||
<Filter>Resource Files</Filter>
|
|
||||||
</ResourceCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,80 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#include <windowsx.h>
|
|
||||||
|
|
||||||
#include "../USB.h"
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
HINSTANCE hInst;
|
|
||||||
|
|
||||||
void SysMessage(TCHAR *fmt, ...) {
|
|
||||||
va_list list;
|
|
||||||
TCHAR tmp[512];
|
|
||||||
|
|
||||||
va_start(list,fmt);
|
|
||||||
_vswprintf(tmp,fmt,list);
|
|
||||||
va_end(list);
|
|
||||||
MessageBox(0, tmp, L"USBqemu Msg", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CALLBACK ConfigureDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
||||||
|
|
||||||
switch(uMsg) {
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
LoadConfig();
|
|
||||||
if (conf.Log) CheckDlgButton(hW, IDC_LOGGING, TRUE);
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
case WM_COMMAND:
|
|
||||||
switch(LOWORD(wParam)) {
|
|
||||||
case IDCANCEL:
|
|
||||||
EndDialog(hW, TRUE);
|
|
||||||
return TRUE;
|
|
||||||
case IDOK:
|
|
||||||
if (IsDlgButtonChecked(hW, IDC_LOGGING))
|
|
||||||
conf.Log = 1;
|
|
||||||
else conf.Log = 0;
|
|
||||||
SaveConfig();
|
|
||||||
EndDialog(hW, FALSE);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL CALLBACK AboutDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
||||||
switch(uMsg) {
|
|
||||||
case WM_INITDIALOG:
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
case WM_COMMAND:
|
|
||||||
switch(LOWORD(wParam)) {
|
|
||||||
case IDOK:
|
|
||||||
EndDialog(hW, FALSE);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBconfigure() {
|
|
||||||
DialogBox(hInst,
|
|
||||||
MAKEINTRESOURCE(IDD_CONFIG),
|
|
||||||
GetActiveWindow(),
|
|
||||||
(DLGPROC)ConfigureDlgProc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALLBACK USBabout() {
|
|
||||||
DialogBox(hInst,
|
|
||||||
MAKEINTRESOURCE(IDD_ABOUT),
|
|
||||||
GetActiveWindow(),
|
|
||||||
(DLGPROC)AboutDlgProc);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL APIENTRY DllMain(HANDLE hModule, // DLL INIT
|
|
||||||
DWORD dwReason,
|
|
||||||
LPVOID lpReserved) {
|
|
||||||
hInst = (HINSTANCE)hModule;
|
|
||||||
return TRUE; // very quick :)
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
//{{NO_DEPENDENCIES}}
|
|
||||||
// Microsoft Visual C++ generated include file.
|
|
||||||
// Used by USBqemu.rc
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef IDC_STATIC
|
|
||||||
#define IDC_STATIC -1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IDD_CONFDLG 101
|
|
||||||
#define IDD_CONFIG 101
|
|
||||||
#define IDD_ABOUT 103
|
|
||||||
#define IDC_NAME 1000
|
|
||||||
#define IDC_CHECK1 1007
|
|
||||||
#define IDC_LOGGING 1007
|
|
||||||
#define IDC_COMBO1 1008
|
|
||||||
#define IDC_COMBO2 1009
|
|
||||||
|
|
||||||
// Next default values for new objects
|
|
||||||
//
|
|
||||||
#ifdef APSTUDIO_INVOKED
|
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 106
|
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1009
|
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -1,289 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "../USB.h"
|
|
||||||
#include "vl.h"
|
|
||||||
|
|
||||||
#ifdef PCSX2_DEVBUILD
|
|
||||||
# define DEBUG_OHCI
|
|
||||||
#endif
|
|
||||||
/* Dump packet contents. */
|
|
||||||
//#define DEBUG_PACKET
|
|
||||||
/* This causes frames to occur 1000x slower */
|
|
||||||
//#define OHCI_TIME_WARP 1
|
|
||||||
|
|
||||||
/* Number of Downstream Ports on the root hub. */
|
|
||||||
|
|
||||||
#define OHCI_MAX_PORTS 2
|
|
||||||
|
|
||||||
extern int64_t usb_frame_time;
|
|
||||||
extern int64_t usb_bit_time;
|
|
||||||
|
|
||||||
typedef struct OHCIPort {
|
|
||||||
USBPort port;
|
|
||||||
uint32_t ctrl;
|
|
||||||
} OHCIPort;
|
|
||||||
|
|
||||||
typedef uint32_t target_phys_addr_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
//USBBus bus;
|
|
||||||
//qemu_irq irq;
|
|
||||||
int mem;
|
|
||||||
int num_ports;
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
//QEMUTimer *eof_timer;
|
|
||||||
int64_t eof_timer;
|
|
||||||
int64_t sof_time;
|
|
||||||
|
|
||||||
/* OHCI state */
|
|
||||||
/* Control partition */
|
|
||||||
uint32_t ctl, status;
|
|
||||||
uint32_t intr_status;
|
|
||||||
uint32_t intr;
|
|
||||||
|
|
||||||
/* memory pointer partition */
|
|
||||||
uint32_t hcca;
|
|
||||||
uint32_t ctrl_head, ctrl_cur;
|
|
||||||
uint32_t bulk_head, bulk_cur;
|
|
||||||
uint32_t per_cur;
|
|
||||||
uint32_t done;
|
|
||||||
int done_count;
|
|
||||||
|
|
||||||
/* Frame counter partition */
|
|
||||||
uint32_t fsmps:15;
|
|
||||||
uint32_t fit:1;
|
|
||||||
uint32_t fi:14;
|
|
||||||
uint32_t frt:1;
|
|
||||||
uint16_t frame_number;
|
|
||||||
uint16_t padding;
|
|
||||||
uint32_t pstart;
|
|
||||||
uint32_t lst;
|
|
||||||
|
|
||||||
/* Root Hub partition */
|
|
||||||
uint32_t rhdesc_a, rhdesc_b;
|
|
||||||
uint32_t rhstatus;
|
|
||||||
OHCIPort rhport[OHCI_MAX_PORTS];
|
|
||||||
|
|
||||||
/* PXA27x Non-OHCI events */
|
|
||||||
uint32_t hstatus;
|
|
||||||
uint32_t hmask;
|
|
||||||
uint32_t hreset;
|
|
||||||
uint32_t htest;
|
|
||||||
|
|
||||||
/* SM501 local memory offset */
|
|
||||||
target_phys_addr_t localmem_base;
|
|
||||||
|
|
||||||
/* Active packets. */
|
|
||||||
uint32_t old_ctl;
|
|
||||||
USBPacket usb_packet;
|
|
||||||
uint8_t usb_buf[8192];
|
|
||||||
uint32_t async_td;
|
|
||||||
int async_complete;
|
|
||||||
|
|
||||||
} OHCIState;
|
|
||||||
|
|
||||||
/* Host Controller Communications Area */
|
|
||||||
struct ohci_hcca {
|
|
||||||
uint32_t intr[32];
|
|
||||||
uint16_t frame, pad;
|
|
||||||
uint32_t done;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ohci_bus_stop(OHCIState *ohci);
|
|
||||||
static void ohci_async_cancel_device(OHCIState *ohci, USBDevice *dev);
|
|
||||||
|
|
||||||
/* Bitfields for the first word of an Endpoint Desciptor. */
|
|
||||||
#define OHCI_ED_FA_SHIFT 0
|
|
||||||
#define OHCI_ED_FA_MASK (0x7f<<OHCI_ED_FA_SHIFT)
|
|
||||||
#define OHCI_ED_EN_SHIFT 7
|
|
||||||
#define OHCI_ED_EN_MASK (0xf<<OHCI_ED_EN_SHIFT)
|
|
||||||
#define OHCI_ED_D_SHIFT 11
|
|
||||||
#define OHCI_ED_D_MASK (3<<OHCI_ED_D_SHIFT)
|
|
||||||
#define OHCI_ED_S (1<<13)
|
|
||||||
#define OHCI_ED_K (1<<14)
|
|
||||||
#define OHCI_ED_F (1<<15)
|
|
||||||
#define OHCI_ED_MPS_SHIFT 16
|
|
||||||
#define OHCI_ED_MPS_MASK (0x7ff<<OHCI_ED_MPS_SHIFT)
|
|
||||||
|
|
||||||
/* Flags in the head field of an Endpoint Desciptor. */
|
|
||||||
#define OHCI_ED_H 1
|
|
||||||
#define OHCI_ED_C 2
|
|
||||||
|
|
||||||
/* Bitfields for the first word of a Transfer Desciptor. */
|
|
||||||
#define OHCI_TD_R (1<<18)
|
|
||||||
#define OHCI_TD_DP_SHIFT 19
|
|
||||||
#define OHCI_TD_DP_MASK (3<<OHCI_TD_DP_SHIFT)
|
|
||||||
#define OHCI_TD_DI_SHIFT 21
|
|
||||||
#define OHCI_TD_DI_MASK (7<<OHCI_TD_DI_SHIFT)
|
|
||||||
#define OHCI_TD_T0 (1<<24)
|
|
||||||
#define OHCI_TD_T1 (1<<24)
|
|
||||||
#define OHCI_TD_EC_SHIFT 26
|
|
||||||
#define OHCI_TD_EC_MASK (3<<OHCI_TD_EC_SHIFT)
|
|
||||||
#define OHCI_TD_CC_SHIFT 28
|
|
||||||
#define OHCI_TD_CC_MASK (0xf<<OHCI_TD_CC_SHIFT)
|
|
||||||
|
|
||||||
/* Bitfields for the first word of an Isochronous Transfer Desciptor. */
|
|
||||||
/* CC & DI - same as in the General Transfer Desciptor */
|
|
||||||
#define OHCI_TD_SF_SHIFT 0
|
|
||||||
#define OHCI_TD_SF_MASK (0xffff<<OHCI_TD_SF_SHIFT)
|
|
||||||
#define OHCI_TD_FC_SHIFT 24
|
|
||||||
#define OHCI_TD_FC_MASK (7<<OHCI_TD_FC_SHIFT)
|
|
||||||
|
|
||||||
/* Isochronous Transfer Desciptor - Offset / PacketStatusWord */
|
|
||||||
#define OHCI_TD_PSW_CC_SHIFT 12
|
|
||||||
#define OHCI_TD_PSW_CC_MASK (0xf<<OHCI_TD_PSW_CC_SHIFT)
|
|
||||||
#define OHCI_TD_PSW_SIZE_SHIFT 0
|
|
||||||
#define OHCI_TD_PSW_SIZE_MASK (0xfff<<OHCI_TD_PSW_SIZE_SHIFT)
|
|
||||||
|
|
||||||
#define OHCI_PAGE_MASK 0xfffff000
|
|
||||||
#define OHCI_OFFSET_MASK 0xfff
|
|
||||||
|
|
||||||
#define OHCI_DPTR_MASK 0xfffffff0
|
|
||||||
|
|
||||||
#define OHCI_BM(val, field) \
|
|
||||||
(((val) & OHCI_##field##_MASK) >> OHCI_##field##_SHIFT)
|
|
||||||
|
|
||||||
#define OHCI_SET_BM(val, field, newval) do { \
|
|
||||||
val &= ~OHCI_##field##_MASK; \
|
|
||||||
val |= ((newval) << OHCI_##field##_SHIFT) & OHCI_##field##_MASK; \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
/* endpoint descriptor */
|
|
||||||
struct ohci_ed {
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t tail;
|
|
||||||
uint32_t head;
|
|
||||||
uint32_t next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* General transfer descriptor */
|
|
||||||
struct ohci_td {
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t cbp;
|
|
||||||
uint32_t next;
|
|
||||||
uint32_t be;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Isochronous transfer descriptor */
|
|
||||||
struct ohci_iso_td {
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t bp;
|
|
||||||
uint32_t next;
|
|
||||||
uint32_t be;
|
|
||||||
uint16_t offset[8];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define USB_HZ 12000000
|
|
||||||
|
|
||||||
/* OHCI Local stuff */
|
|
||||||
#define OHCI_CTL_CBSR ((1<<0)|(1<<1))
|
|
||||||
#define OHCI_CTL_PLE (1<<2)
|
|
||||||
#define OHCI_CTL_IE (1<<3)
|
|
||||||
#define OHCI_CTL_CLE (1<<4)
|
|
||||||
#define OHCI_CTL_BLE (1<<5)
|
|
||||||
#define OHCI_CTL_HCFS ((1<<6)|(1<<7))
|
|
||||||
#define OHCI_USB_RESET 0x00
|
|
||||||
#define OHCI_USB_RESUME 0x40
|
|
||||||
#define OHCI_USB_OPERATIONAL 0x80
|
|
||||||
#define OHCI_USB_SUSPEND 0xc0
|
|
||||||
#define OHCI_CTL_IR (1<<8)
|
|
||||||
#define OHCI_CTL_RWC (1<<9)
|
|
||||||
#define OHCI_CTL_RWE (1<<10)
|
|
||||||
|
|
||||||
#define OHCI_STATUS_HCR (1<<0)
|
|
||||||
#define OHCI_STATUS_CLF (1<<1)
|
|
||||||
#define OHCI_STATUS_BLF (1<<2)
|
|
||||||
#define OHCI_STATUS_OCR (1<<3)
|
|
||||||
#define OHCI_STATUS_SOC ((1<<6)|(1<<7))
|
|
||||||
|
|
||||||
#define OHCI_INTR_SO (1<<0) /* Scheduling overrun */
|
|
||||||
#define OHCI_INTR_WD (1<<1) /* HcDoneHead writeback */
|
|
||||||
#define OHCI_INTR_SF (1<<2) /* Start of frame */
|
|
||||||
#define OHCI_INTR_RD (1<<3) /* Resume detect */
|
|
||||||
#define OHCI_INTR_UE (1<<4) /* Unrecoverable error */
|
|
||||||
#define OHCI_INTR_FNO (1<<5) /* Frame number overflow */
|
|
||||||
#define OHCI_INTR_RHSC (1<<6) /* Root hub status change */
|
|
||||||
#define OHCI_INTR_OC (1<<30) /* Ownership change */
|
|
||||||
#define OHCI_INTR_MIE (1<<31) /* Master Interrupt Enable */
|
|
||||||
|
|
||||||
#define OHCI_HCCA_SIZE 0x100
|
|
||||||
#define OHCI_HCCA_MASK 0xffffff00
|
|
||||||
|
|
||||||
#define OHCI_EDPTR_MASK 0xfffffff0
|
|
||||||
|
|
||||||
#define OHCI_FMI_FI 0x00003fff
|
|
||||||
#define OHCI_FMI_FSMPS 0xffff0000
|
|
||||||
#define OHCI_FMI_FIT 0x80000000
|
|
||||||
|
|
||||||
#define OHCI_FR_RT (1<<31)
|
|
||||||
|
|
||||||
#define OHCI_LS_THRESH 0x628
|
|
||||||
|
|
||||||
#define OHCI_RHA_RW_MASK 0x00000000 /* Mask of supported features. */
|
|
||||||
#define OHCI_RHA_PSM (1<<8)
|
|
||||||
#define OHCI_RHA_NPS (1<<9)
|
|
||||||
#define OHCI_RHA_DT (1<<10)
|
|
||||||
#define OHCI_RHA_OCPM (1<<11)
|
|
||||||
#define OHCI_RHA_NOCP (1<<12)
|
|
||||||
#define OHCI_RHA_POTPGT_MASK 0xff000000
|
|
||||||
|
|
||||||
#define OHCI_RHS_LPS (1<<0)
|
|
||||||
#define OHCI_RHS_OCI (1<<1)
|
|
||||||
#define OHCI_RHS_DRWE (1<<15)
|
|
||||||
#define OHCI_RHS_LPSC (1<<16)
|
|
||||||
#define OHCI_RHS_OCIC (1<<17)
|
|
||||||
#define OHCI_RHS_CRWE (1<<31)
|
|
||||||
|
|
||||||
#define OHCI_PORT_CCS (1<<0)
|
|
||||||
#define OHCI_PORT_PES (1<<1)
|
|
||||||
#define OHCI_PORT_PSS (1<<2)
|
|
||||||
#define OHCI_PORT_POCI (1<<3)
|
|
||||||
#define OHCI_PORT_PRS (1<<4)
|
|
||||||
#define OHCI_PORT_PPS (1<<8)
|
|
||||||
#define OHCI_PORT_LSDA (1<<9)
|
|
||||||
#define OHCI_PORT_CSC (1<<16)
|
|
||||||
#define OHCI_PORT_PESC (1<<17)
|
|
||||||
#define OHCI_PORT_PSSC (1<<18)
|
|
||||||
#define OHCI_PORT_OCIC (1<<19)
|
|
||||||
#define OHCI_PORT_PRSC (1<<20)
|
|
||||||
#define OHCI_PORT_WTC (OHCI_PORT_CSC|OHCI_PORT_PESC|OHCI_PORT_PSSC \
|
|
||||||
|OHCI_PORT_OCIC|OHCI_PORT_PRSC)
|
|
||||||
|
|
||||||
#define OHCI_TD_DIR_SETUP 0x0
|
|
||||||
#define OHCI_TD_DIR_OUT 0x1
|
|
||||||
#define OHCI_TD_DIR_IN 0x2
|
|
||||||
#define OHCI_TD_DIR_RESERVED 0x3
|
|
||||||
|
|
||||||
#define OHCI_CC_NOERROR 0x0
|
|
||||||
#define OHCI_CC_CRC 0x1
|
|
||||||
#define OHCI_CC_BITSTUFFING 0x2
|
|
||||||
#define OHCI_CC_DATATOGGLEMISMATCH 0x3
|
|
||||||
#define OHCI_CC_STALL 0x4
|
|
||||||
#define OHCI_CC_DEVICENOTRESPONDING 0x5
|
|
||||||
#define OHCI_CC_PIDCHECKFAILURE 0x6
|
|
||||||
#define OHCI_CC_UNDEXPETEDPID 0x7
|
|
||||||
#define OHCI_CC_DATAOVERRUN 0x8
|
|
||||||
#define OHCI_CC_DATAUNDERRUN 0x9
|
|
||||||
#define OHCI_CC_BUFFEROVERRUN 0xc
|
|
||||||
#define OHCI_CC_BUFFERUNDERRUN 0xd
|
|
||||||
|
|
||||||
#define OHCI_HRESET_FSBIR (1 << 0)
|
|
||||||
|
|
||||||
int64_t get_ticks_per_sec();
|
|
||||||
|
|
||||||
int64_t get_clock();
|
|
||||||
|
|
||||||
OHCIState *ohci_create(uint32_t base, int ports);
|
|
||||||
|
|
||||||
uint32_t ohci_mem_read(void *ptr, target_phys_addr_t addr);
|
|
||||||
void ohci_mem_write(void *ptr, target_phys_addr_t addr, uint32_t val);
|
|
||||||
void ohci_frame_boundary(void *opaque);
|
|
||||||
|
|
||||||
int ohci_bus_start(OHCIState *ohci);
|
|
||||||
void ohci_bus_stop(OHCIState *ohci);
|
|
||||||
|
|
||||||
USBDevice *usb_hub_init(int nb_ports);
|
|
||||||
USBDevice *usb_msd_init(const char *filename);
|
|
||||||
USBDevice *eyetoy_init(void);
|
|
||||||
USBDevice *usb_mouse_init(void);
|
|
|
@ -1,449 +0,0 @@
|
||||||
/* $NetBSD: queue.h,v 1.52 2009/04/20 09:56:08 mschuett Exp $ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Qemu version: Copy from netbsd, removed debug code, removed some of
|
|
||||||
* the implementations. Left in lists, simple queues, tail queues and
|
|
||||||
* circular queues.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 1991, 1993
|
|
||||||
* The Regents of the University of California. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* @(#)queue.h 8.5 (Berkeley) 8/20/94
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef QEMU_SYS_QUEUE_H_
|
|
||||||
#define QEMU_SYS_QUEUE_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file defines four types of data structures:
|
|
||||||
* lists, simple queues, tail queues, and circular queues.
|
|
||||||
*
|
|
||||||
* A list is headed by a single forward pointer (or an array of forward
|
|
||||||
* pointers for a hash table header). The elements are doubly linked
|
|
||||||
* so that an arbitrary element can be removed without a need to
|
|
||||||
* traverse the list. New elements can be added to the list before
|
|
||||||
* or after an existing element or at the head of the list. A list
|
|
||||||
* may only be traversed in the forward direction.
|
|
||||||
*
|
|
||||||
* A simple queue is headed by a pair of pointers, one the head of the
|
|
||||||
* list and the other to the tail of the list. The elements are singly
|
|
||||||
* linked to save space, so elements can only be removed from the
|
|
||||||
* head of the list. New elements can be added to the list after
|
|
||||||
* an existing element, at the head of the list, or at the end of the
|
|
||||||
* list. A simple queue may only be traversed in the forward direction.
|
|
||||||
*
|
|
||||||
* A tail queue is headed by a pair of pointers, one to the head of the
|
|
||||||
* list and the other to the tail of the list. The elements are doubly
|
|
||||||
* linked so that an arbitrary element can be removed without a need to
|
|
||||||
* traverse the list. New elements can be added to the list before or
|
|
||||||
* after an existing element, at the head of the list, or at the end of
|
|
||||||
* the list. A tail queue may be traversed in either direction.
|
|
||||||
*
|
|
||||||
* A circle queue is headed by a pair of pointers, one to the head of the
|
|
||||||
* list and the other to the tail of the list. The elements are doubly
|
|
||||||
* linked so that an arbitrary element can be removed without a need to
|
|
||||||
* traverse the list. New elements can be added to the list before or after
|
|
||||||
* an existing element, at the head of the list, or at the end of the list.
|
|
||||||
* A circle queue may be traversed in either direction, but has a more
|
|
||||||
* complex end of list detection.
|
|
||||||
*
|
|
||||||
* For details on the use of these macros, see the queue(3) manual page.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* List definitions.
|
|
||||||
*/
|
|
||||||
#define QLIST_HEAD(name, type) \
|
|
||||||
struct name { \
|
|
||||||
struct type *lh_first; /* first element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define QLIST_HEAD_INITIALIZER(head) \
|
|
||||||
{ NULL }
|
|
||||||
|
|
||||||
#define QLIST_ENTRY(type) \
|
|
||||||
struct { \
|
|
||||||
struct type *le_next; /* next element */ \
|
|
||||||
struct type **le_prev; /* address of previous next element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* List functions.
|
|
||||||
*/
|
|
||||||
#define QLIST_INIT(head) do { \
|
|
||||||
(head)->lh_first = NULL; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QLIST_INSERT_AFTER(listelm, elm, field) do { \
|
|
||||||
if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
|
|
||||||
(listelm)->field.le_next->field.le_prev = \
|
|
||||||
&(elm)->field.le_next; \
|
|
||||||
(listelm)->field.le_next = (elm); \
|
|
||||||
(elm)->field.le_prev = &(listelm)->field.le_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QLIST_INSERT_BEFORE(listelm, elm, field) do { \
|
|
||||||
(elm)->field.le_prev = (listelm)->field.le_prev; \
|
|
||||||
(elm)->field.le_next = (listelm); \
|
|
||||||
*(listelm)->field.le_prev = (elm); \
|
|
||||||
(listelm)->field.le_prev = &(elm)->field.le_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QLIST_INSERT_HEAD(head, elm, field) do { \
|
|
||||||
if (((elm)->field.le_next = (head)->lh_first) != NULL) \
|
|
||||||
(head)->lh_first->field.le_prev = &(elm)->field.le_next;\
|
|
||||||
(head)->lh_first = (elm); \
|
|
||||||
(elm)->field.le_prev = &(head)->lh_first; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QLIST_REMOVE(elm, field) do { \
|
|
||||||
if ((elm)->field.le_next != NULL) \
|
|
||||||
(elm)->field.le_next->field.le_prev = \
|
|
||||||
(elm)->field.le_prev; \
|
|
||||||
*(elm)->field.le_prev = (elm)->field.le_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QLIST_FOREACH(var, head, field) \
|
|
||||||
for ((var) = ((head)->lh_first); \
|
|
||||||
(var); \
|
|
||||||
(var) = ((var)->field.le_next))
|
|
||||||
|
|
||||||
#define QLIST_FOREACH_SAFE(var, head, field, next_var) \
|
|
||||||
for ((var) = ((head)->lh_first); \
|
|
||||||
(var) && ((next_var) = ((var)->field.le_next), 1); \
|
|
||||||
(var) = (next_var))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* List access methods.
|
|
||||||
*/
|
|
||||||
#define QLIST_EMPTY(head) ((head)->lh_first == NULL)
|
|
||||||
#define QLIST_FIRST(head) ((head)->lh_first)
|
|
||||||
#define QLIST_NEXT(elm, field) ((elm)->field.le_next)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Simple queue definitions.
|
|
||||||
*/
|
|
||||||
#define QSIMPLEQ_HEAD(name, type) \
|
|
||||||
struct name { \
|
|
||||||
struct type *sqh_first; /* first element */ \
|
|
||||||
struct type **sqh_last; /* addr of last next element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define QSIMPLEQ_HEAD_INITIALIZER(head) \
|
|
||||||
{ NULL, &(head).sqh_first }
|
|
||||||
|
|
||||||
#define QSIMPLEQ_ENTRY(type) \
|
|
||||||
struct { \
|
|
||||||
struct type *sqe_next; /* next element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Simple queue functions.
|
|
||||||
*/
|
|
||||||
#define QSIMPLEQ_INIT(head) do { \
|
|
||||||
(head)->sqh_first = NULL; \
|
|
||||||
(head)->sqh_last = &(head)->sqh_first; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_INSERT_HEAD(head, elm, field) do { \
|
|
||||||
if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \
|
|
||||||
(head)->sqh_last = &(elm)->field.sqe_next; \
|
|
||||||
(head)->sqh_first = (elm); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_INSERT_TAIL(head, elm, field) do { \
|
|
||||||
(elm)->field.sqe_next = NULL; \
|
|
||||||
*(head)->sqh_last = (elm); \
|
|
||||||
(head)->sqh_last = &(elm)->field.sqe_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
|
|
||||||
if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \
|
|
||||||
(head)->sqh_last = &(elm)->field.sqe_next; \
|
|
||||||
(listelm)->field.sqe_next = (elm); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_REMOVE_HEAD(head, field) do { \
|
|
||||||
if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL)\
|
|
||||||
(head)->sqh_last = &(head)->sqh_first; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_REMOVE(head, elm, type, field) do { \
|
|
||||||
if ((head)->sqh_first == (elm)) { \
|
|
||||||
QSIMPLEQ_REMOVE_HEAD((head), field); \
|
|
||||||
} else { \
|
|
||||||
struct type *curelm = (head)->sqh_first; \
|
|
||||||
while (curelm->field.sqe_next != (elm)) \
|
|
||||||
curelm = curelm->field.sqe_next; \
|
|
||||||
if ((curelm->field.sqe_next = \
|
|
||||||
curelm->field.sqe_next->field.sqe_next) == NULL) \
|
|
||||||
(head)->sqh_last = &(curelm)->field.sqe_next; \
|
|
||||||
} \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_FOREACH(var, head, field) \
|
|
||||||
for ((var) = ((head)->sqh_first); \
|
|
||||||
(var); \
|
|
||||||
(var) = ((var)->field.sqe_next))
|
|
||||||
|
|
||||||
#define QSIMPLEQ_FOREACH_SAFE(var, head, field, next) \
|
|
||||||
for ((var) = ((head)->sqh_first); \
|
|
||||||
(var) && ((next = ((var)->field.sqe_next)), 1); \
|
|
||||||
(var) = (next))
|
|
||||||
|
|
||||||
#define QSIMPLEQ_CONCAT(head1, head2) do { \
|
|
||||||
if (!QSIMPLEQ_EMPTY((head2))) { \
|
|
||||||
*(head1)->sqh_last = (head2)->sqh_first; \
|
|
||||||
(head1)->sqh_last = (head2)->sqh_last; \
|
|
||||||
QSIMPLEQ_INIT((head2)); \
|
|
||||||
} \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QSIMPLEQ_LAST(head, type, field) \
|
|
||||||
(QSIMPLEQ_EMPTY((head)) ? \
|
|
||||||
NULL : \
|
|
||||||
((struct type *)(void *) \
|
|
||||||
((char *)((head)->sqh_last) - offsetof(struct type, field))))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Simple queue access methods.
|
|
||||||
*/
|
|
||||||
#define QSIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL)
|
|
||||||
#define QSIMPLEQ_FIRST(head) ((head)->sqh_first)
|
|
||||||
#define QSIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tail queue definitions.
|
|
||||||
*/
|
|
||||||
#define Q_TAILQ_HEAD(name, type, qual) \
|
|
||||||
struct name { \
|
|
||||||
qual type *tqh_first; /* first element */ \
|
|
||||||
qual type *qual *tqh_last; /* addr of last next element */ \
|
|
||||||
}
|
|
||||||
#define QTAILQ_HEAD(name, type) Q_TAILQ_HEAD(name, struct type,)
|
|
||||||
|
|
||||||
#define QTAILQ_HEAD_INITIALIZER(head) \
|
|
||||||
{ NULL, &(head).tqh_first }
|
|
||||||
|
|
||||||
#define Q_TAILQ_ENTRY(type, qual) \
|
|
||||||
struct { \
|
|
||||||
qual type *tqe_next; /* next element */ \
|
|
||||||
qual type *qual *tqe_prev; /* address of previous next element */\
|
|
||||||
}
|
|
||||||
#define QTAILQ_ENTRY(type) Q_TAILQ_ENTRY(struct type,)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tail queue functions.
|
|
||||||
*/
|
|
||||||
#define QTAILQ_INIT(head) do { \
|
|
||||||
(head)->tqh_first = NULL; \
|
|
||||||
(head)->tqh_last = &(head)->tqh_first; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QTAILQ_INSERT_HEAD(head, elm, field) do { \
|
|
||||||
if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
|
|
||||||
(head)->tqh_first->field.tqe_prev = \
|
|
||||||
&(elm)->field.tqe_next; \
|
|
||||||
else \
|
|
||||||
(head)->tqh_last = &(elm)->field.tqe_next; \
|
|
||||||
(head)->tqh_first = (elm); \
|
|
||||||
(elm)->field.tqe_prev = &(head)->tqh_first; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QTAILQ_INSERT_TAIL(head, elm, field) do { \
|
|
||||||
(elm)->field.tqe_next = NULL; \
|
|
||||||
(elm)->field.tqe_prev = (head)->tqh_last; \
|
|
||||||
*(head)->tqh_last = (elm); \
|
|
||||||
(head)->tqh_last = &(elm)->field.tqe_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
|
|
||||||
if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
|
|
||||||
(elm)->field.tqe_next->field.tqe_prev = \
|
|
||||||
&(elm)->field.tqe_next; \
|
|
||||||
else \
|
|
||||||
(head)->tqh_last = &(elm)->field.tqe_next; \
|
|
||||||
(listelm)->field.tqe_next = (elm); \
|
|
||||||
(elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { \
|
|
||||||
(elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
|
|
||||||
(elm)->field.tqe_next = (listelm); \
|
|
||||||
*(listelm)->field.tqe_prev = (elm); \
|
|
||||||
(listelm)->field.tqe_prev = &(elm)->field.tqe_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QTAILQ_REMOVE(head, elm, field) do { \
|
|
||||||
if (((elm)->field.tqe_next) != NULL) \
|
|
||||||
(elm)->field.tqe_next->field.tqe_prev = \
|
|
||||||
(elm)->field.tqe_prev; \
|
|
||||||
else \
|
|
||||||
(head)->tqh_last = (elm)->field.tqe_prev; \
|
|
||||||
*(elm)->field.tqe_prev = (elm)->field.tqe_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QTAILQ_FOREACH(var, head, field) \
|
|
||||||
for ((var) = ((head)->tqh_first); \
|
|
||||||
(var); \
|
|
||||||
(var) = ((var)->field.tqe_next))
|
|
||||||
|
|
||||||
#define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \
|
|
||||||
for ((var) = ((head)->tqh_first); \
|
|
||||||
(var) && ((next_var) = ((var)->field.tqe_next), 1); \
|
|
||||||
(var) = (next_var))
|
|
||||||
|
|
||||||
#define QTAILQ_FOREACH_REVERSE(var, head, headname, field) \
|
|
||||||
for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \
|
|
||||||
(var); \
|
|
||||||
(var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Tail queue access methods.
|
|
||||||
*/
|
|
||||||
#define QTAILQ_EMPTY(head) ((head)->tqh_first == NULL)
|
|
||||||
#define QTAILQ_FIRST(head) ((head)->tqh_first)
|
|
||||||
#define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
|
|
||||||
|
|
||||||
#define QTAILQ_LAST(head, headname) \
|
|
||||||
(*(((struct headname *)((head)->tqh_last))->tqh_last))
|
|
||||||
#define QTAILQ_PREV(elm, headname, field) \
|
|
||||||
(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Circular queue definitions.
|
|
||||||
*/
|
|
||||||
#define QCIRCLEQ_HEAD(name, type) \
|
|
||||||
struct name { \
|
|
||||||
struct type *cqh_first; /* first element */ \
|
|
||||||
struct type *cqh_last; /* last element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define QCIRCLEQ_HEAD_INITIALIZER(head) \
|
|
||||||
{ (void *)&head, (void *)&head }
|
|
||||||
|
|
||||||
#define QCIRCLEQ_ENTRY(type) \
|
|
||||||
struct { \
|
|
||||||
struct type *cqe_next; /* next element */ \
|
|
||||||
struct type *cqe_prev; /* previous element */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Circular queue functions.
|
|
||||||
*/
|
|
||||||
#define QCIRCLEQ_INIT(head) do { \
|
|
||||||
(head)->cqh_first = (void *)(head); \
|
|
||||||
(head)->cqh_last = (void *)(head); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
|
|
||||||
(elm)->field.cqe_next = (listelm)->field.cqe_next; \
|
|
||||||
(elm)->field.cqe_prev = (listelm); \
|
|
||||||
if ((listelm)->field.cqe_next == (void *)(head)) \
|
|
||||||
(head)->cqh_last = (elm); \
|
|
||||||
else \
|
|
||||||
(listelm)->field.cqe_next->field.cqe_prev = (elm); \
|
|
||||||
(listelm)->field.cqe_next = (elm); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
|
|
||||||
(elm)->field.cqe_next = (listelm); \
|
|
||||||
(elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
|
|
||||||
if ((listelm)->field.cqe_prev == (void *)(head)) \
|
|
||||||
(head)->cqh_first = (elm); \
|
|
||||||
else \
|
|
||||||
(listelm)->field.cqe_prev->field.cqe_next = (elm); \
|
|
||||||
(listelm)->field.cqe_prev = (elm); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_INSERT_HEAD(head, elm, field) do { \
|
|
||||||
(elm)->field.cqe_next = (head)->cqh_first; \
|
|
||||||
(elm)->field.cqe_prev = (void *)(head); \
|
|
||||||
if ((head)->cqh_last == (void *)(head)) \
|
|
||||||
(head)->cqh_last = (elm); \
|
|
||||||
else \
|
|
||||||
(head)->cqh_first->field.cqe_prev = (elm); \
|
|
||||||
(head)->cqh_first = (elm); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_INSERT_TAIL(head, elm, field) do { \
|
|
||||||
(elm)->field.cqe_next = (void *)(head); \
|
|
||||||
(elm)->field.cqe_prev = (head)->cqh_last; \
|
|
||||||
if ((head)->cqh_first == (void *)(head)) \
|
|
||||||
(head)->cqh_first = (elm); \
|
|
||||||
else \
|
|
||||||
(head)->cqh_last->field.cqe_next = (elm); \
|
|
||||||
(head)->cqh_last = (elm); \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_REMOVE(head, elm, field) do { \
|
|
||||||
if ((elm)->field.cqe_next == (void *)(head)) \
|
|
||||||
(head)->cqh_last = (elm)->field.cqe_prev; \
|
|
||||||
else \
|
|
||||||
(elm)->field.cqe_next->field.cqe_prev = \
|
|
||||||
(elm)->field.cqe_prev; \
|
|
||||||
if ((elm)->field.cqe_prev == (void *)(head)) \
|
|
||||||
(head)->cqh_first = (elm)->field.cqe_next; \
|
|
||||||
else \
|
|
||||||
(elm)->field.cqe_prev->field.cqe_next = \
|
|
||||||
(elm)->field.cqe_next; \
|
|
||||||
} while (/*CONSTCOND*/0)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_FOREACH(var, head, field) \
|
|
||||||
for ((var) = ((head)->cqh_first); \
|
|
||||||
(var) != (const void *)(head); \
|
|
||||||
(var) = ((var)->field.cqe_next))
|
|
||||||
|
|
||||||
#define QCIRCLEQ_FOREACH_REVERSE(var, head, field) \
|
|
||||||
for ((var) = ((head)->cqh_last); \
|
|
||||||
(var) != (const void *)(head); \
|
|
||||||
(var) = ((var)->field.cqe_prev))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Circular queue access methods.
|
|
||||||
*/
|
|
||||||
#define QCIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head))
|
|
||||||
#define QCIRCLEQ_FIRST(head) ((head)->cqh_first)
|
|
||||||
#define QCIRCLEQ_LAST(head) ((head)->cqh_last)
|
|
||||||
#define QCIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next)
|
|
||||||
#define QCIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev)
|
|
||||||
|
|
||||||
#define QCIRCLEQ_LOOP_NEXT(head, elm, field) \
|
|
||||||
(((elm)->field.cqe_next == (void *)(head)) \
|
|
||||||
? ((head)->cqh_first) \
|
|
||||||
: (elm->field.cqe_next))
|
|
||||||
#define QCIRCLEQ_LOOP_PREV(head, elm, field) \
|
|
||||||
(((elm)->field.cqe_prev == (void *)(head)) \
|
|
||||||
? ((head)->cqh_last) \
|
|
||||||
: (elm->field.cqe_prev))
|
|
||||||
|
|
||||||
#endif /* !QEMU_SYS_QUEUE_H_ */
|
|
|
@ -1,351 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU USB emulation
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* 2008 Generic packet handler rewrite by Max Krasnyansky
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include "USBinternal.h"
|
|
||||||
//#include "usb.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
void usb_attach(USBPort *port, USBDevice *dev)
|
|
||||||
{
|
|
||||||
if (dev != NULL) {
|
|
||||||
/* attach */
|
|
||||||
if (port->dev) {
|
|
||||||
usb_attach(port, NULL);
|
|
||||||
}
|
|
||||||
dev->port = port;
|
|
||||||
port->dev = dev;
|
|
||||||
port->ops->attach(port);
|
|
||||||
usb_send_msg(dev, USB_MSG_ATTACH);
|
|
||||||
} else {
|
|
||||||
/* detach */
|
|
||||||
dev = port->dev;
|
|
||||||
assert(dev);
|
|
||||||
port->ops->detach(port);
|
|
||||||
usb_send_msg(dev, USB_MSG_DETACH);
|
|
||||||
dev->port = NULL;
|
|
||||||
port->dev = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void usb_wakeup(USBDevice *dev)
|
|
||||||
{
|
|
||||||
if (dev->remote_wakeup && dev->port && dev->port->ops->wakeup) {
|
|
||||||
dev->port->ops->wakeup(dev->port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************/
|
|
||||||
|
|
||||||
/* generic USB device helpers (you are not forced to use them when
|
|
||||||
writing your USB device driver, but they help handling the
|
|
||||||
protocol)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SETUP_STATE_IDLE 0
|
|
||||||
#define SETUP_STATE_SETUP 1
|
|
||||||
#define SETUP_STATE_DATA 2
|
|
||||||
#define SETUP_STATE_ACK 3
|
|
||||||
|
|
||||||
static int do_token_setup(USBDevice *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
int request, value, index;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (p->len != 8)
|
|
||||||
return USB_RET_STALL;
|
|
||||||
|
|
||||||
memcpy(s->setup_buf, p->data, 8);
|
|
||||||
s->setup_len = (s->setup_buf[7] << 8) | s->setup_buf[6];
|
|
||||||
s->setup_index = 0;
|
|
||||||
|
|
||||||
request = (s->setup_buf[0] << 8) | s->setup_buf[1];
|
|
||||||
value = (s->setup_buf[3] << 8) | s->setup_buf[2];
|
|
||||||
index = (s->setup_buf[5] << 8) | s->setup_buf[4];
|
|
||||||
|
|
||||||
if (s->setup_buf[0] & USB_DIR_IN) {
|
|
||||||
ret = s->info->handle_control(s, p, request, value, index,
|
|
||||||
s->setup_len, s->data_buf);
|
|
||||||
if (ret == USB_RET_ASYNC) {
|
|
||||||
s->setup_state = SETUP_STATE_SETUP;
|
|
||||||
return USB_RET_ASYNC;
|
|
||||||
}
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (ret < s->setup_len)
|
|
||||||
s->setup_len = ret;
|
|
||||||
s->setup_state = SETUP_STATE_DATA;
|
|
||||||
} else {
|
|
||||||
if (s->setup_len > sizeof(s->data_buf)) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"usb_generic_handle_packet: ctrl buffer too small (%d > %zu)\n",
|
|
||||||
s->setup_len, sizeof(s->data_buf));
|
|
||||||
return USB_RET_STALL;
|
|
||||||
}
|
|
||||||
if (s->setup_len == 0)
|
|
||||||
s->setup_state = SETUP_STATE_ACK;
|
|
||||||
else
|
|
||||||
s->setup_state = SETUP_STATE_DATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int do_token_in(USBDevice *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
int request, value, index;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (p->devep != 0)
|
|
||||||
return s->info->handle_data(s, p);
|
|
||||||
|
|
||||||
request = (s->setup_buf[0] << 8) | s->setup_buf[1];
|
|
||||||
value = (s->setup_buf[3] << 8) | s->setup_buf[2];
|
|
||||||
index = (s->setup_buf[5] << 8) | s->setup_buf[4];
|
|
||||||
|
|
||||||
switch(s->setup_state) {
|
|
||||||
case SETUP_STATE_ACK:
|
|
||||||
if (!(s->setup_buf[0] & USB_DIR_IN)) {
|
|
||||||
ret = s->info->handle_control(s, p, request, value, index,
|
|
||||||
s->setup_len, s->data_buf);
|
|
||||||
if (ret == USB_RET_ASYNC) {
|
|
||||||
return USB_RET_ASYNC;
|
|
||||||
}
|
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
|
||||||
if (ret > 0)
|
|
||||||
return 0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return 0 byte */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case SETUP_STATE_DATA:
|
|
||||||
if (s->setup_buf[0] & USB_DIR_IN) {
|
|
||||||
int len = s->setup_len - s->setup_index;
|
|
||||||
if (len > p->len)
|
|
||||||
len = p->len;
|
|
||||||
memcpy(p->data, s->data_buf + s->setup_index, len);
|
|
||||||
s->setup_index += len;
|
|
||||||
if (s->setup_index >= s->setup_len)
|
|
||||||
s->setup_state = SETUP_STATE_ACK;
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
|
||||||
return USB_RET_STALL;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return USB_RET_STALL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int do_token_out(USBDevice *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
if (p->devep != 0)
|
|
||||||
return s->info->handle_data(s, p);
|
|
||||||
|
|
||||||
switch(s->setup_state) {
|
|
||||||
case SETUP_STATE_ACK:
|
|
||||||
if (s->setup_buf[0] & USB_DIR_IN) {
|
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
|
||||||
/* transfer OK */
|
|
||||||
} else {
|
|
||||||
/* ignore additional output */
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case SETUP_STATE_DATA:
|
|
||||||
if (!(s->setup_buf[0] & USB_DIR_IN)) {
|
|
||||||
int len = s->setup_len - s->setup_index;
|
|
||||||
if (len > p->len)
|
|
||||||
len = p->len;
|
|
||||||
memcpy(s->data_buf + s->setup_index, p->data, len);
|
|
||||||
s->setup_index += len;
|
|
||||||
if (s->setup_index >= s->setup_len)
|
|
||||||
s->setup_state = SETUP_STATE_ACK;
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
|
||||||
return USB_RET_STALL;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return USB_RET_STALL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Generic packet handler.
|
|
||||||
* Called by the HC (host controller).
|
|
||||||
*
|
|
||||||
* Returns length of the transaction or one of the USB_RET_XXX codes.
|
|
||||||
*/
|
|
||||||
int usb_generic_handle_packet(USBDevice *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
switch(p->pid) {
|
|
||||||
case USB_MSG_ATTACH:
|
|
||||||
s->state = USB_STATE_ATTACHED;
|
|
||||||
if (s->info->handle_attach) {
|
|
||||||
s->info->handle_attach(s);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case USB_MSG_DETACH:
|
|
||||||
s->state = USB_STATE_NOTATTACHED;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case USB_MSG_RESET:
|
|
||||||
s->remote_wakeup = 0;
|
|
||||||
s->addr = 0;
|
|
||||||
s->state = USB_STATE_DEFAULT;
|
|
||||||
if (s->info->handle_reset) {
|
|
||||||
s->info->handle_reset(s);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Rest of the PIDs must match our address */
|
|
||||||
if (s->state < USB_STATE_DEFAULT || p->devaddr != s->addr)
|
|
||||||
return USB_RET_NODEV;
|
|
||||||
|
|
||||||
switch (p->pid) {
|
|
||||||
case USB_TOKEN_SETUP:
|
|
||||||
return do_token_setup(s, p);
|
|
||||||
|
|
||||||
case USB_TOKEN_IN:
|
|
||||||
return do_token_in(s, p);
|
|
||||||
|
|
||||||
case USB_TOKEN_OUT:
|
|
||||||
return do_token_out(s, p);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return USB_RET_STALL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ctrl complete function for devices which use usb_generic_handle_packet and
|
|
||||||
may return USB_RET_ASYNC from their handle_control callback. Device code
|
|
||||||
which does this *must* call this function instead of the normal
|
|
||||||
usb_packet_complete to complete their async control packets. */
|
|
||||||
void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
if (p->len < 0) {
|
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (s->setup_state) {
|
|
||||||
case SETUP_STATE_SETUP:
|
|
||||||
if (p->len < s->setup_len) {
|
|
||||||
s->setup_len = p->len;
|
|
||||||
}
|
|
||||||
s->setup_state = SETUP_STATE_DATA;
|
|
||||||
p->len = 8;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SETUP_STATE_ACK:
|
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
|
||||||
p->len = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
usb_packet_complete(s, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX: fix overflow */
|
|
||||||
int set_usb_string(uint8_t *buf, const char *str)
|
|
||||||
{
|
|
||||||
int len, i;
|
|
||||||
uint8_t *q;
|
|
||||||
|
|
||||||
q = buf;
|
|
||||||
len = strlen(str);
|
|
||||||
*q++ = 2 * len + 2;
|
|
||||||
*q++ = 3;
|
|
||||||
for(i = 0; i < len; i++) {
|
|
||||||
*q++ = str[i];
|
|
||||||
*q++ = 0;
|
|
||||||
}
|
|
||||||
return q - buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send an internal message to a USB device. */
|
|
||||||
void usb_send_msg(USBDevice *dev, int msg)
|
|
||||||
{
|
|
||||||
USBPacket p;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
memset(&p, 0, sizeof(p));
|
|
||||||
p.pid = msg;
|
|
||||||
ret = usb_handle_packet(dev, &p);
|
|
||||||
/* This _must_ be synchronous */
|
|
||||||
assert(ret != USB_RET_ASYNC);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hand over a packet to a device for processing. Return value
|
|
||||||
USB_RET_ASYNC indicates the processing isn't finished yet, the
|
|
||||||
driver will call usb_packet_complete() when done processing it. */
|
|
||||||
int usb_handle_packet(USBDevice *dev, USBPacket *p)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
assert(p->owner == NULL);
|
|
||||||
ret = dev->info->handle_packet(dev, p);
|
|
||||||
if (ret == USB_RET_ASYNC) {
|
|
||||||
if (p->owner == NULL) {
|
|
||||||
p->owner = dev;
|
|
||||||
} else {
|
|
||||||
/* We'll end up here when usb_handle_packet is called
|
|
||||||
* recursively due to a hub being in the chain. Nothing
|
|
||||||
* to do. Leave p->owner pointing to the device, not the
|
|
||||||
* hub. */;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Notify the controller that an async packet is complete. This should only
|
|
||||||
be called for packets previously deferred by returning USB_RET_ASYNC from
|
|
||||||
handle_packet. */
|
|
||||||
void usb_packet_complete(USBDevice *dev, USBPacket *p)
|
|
||||||
{
|
|
||||||
/* Note: p->owner != dev is possible in case dev is a hub */
|
|
||||||
assert(p->owner != NULL);
|
|
||||||
dev->port->ops->complete(dev->port, p);
|
|
||||||
p->owner = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cancel an active packet. The packed must have been deferred by
|
|
||||||
returning USB_RET_ASYNC from handle_packet, and not yet
|
|
||||||
completed. */
|
|
||||||
void usb_cancel_packet(USBPacket * p)
|
|
||||||
{
|
|
||||||
assert(p->owner != NULL);
|
|
||||||
p->owner->info->cancel_packet(p->owner, p);
|
|
||||||
p->owner = NULL;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,547 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU USB HUB emulation
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include "USBinternal.h"
|
|
||||||
|
|
||||||
//#define DEBUG
|
|
||||||
|
|
||||||
#define NUM_PORTS 8
|
|
||||||
|
|
||||||
typedef struct USBHubPort {
|
|
||||||
USBPort port;
|
|
||||||
uint16_t wPortStatus;
|
|
||||||
uint16_t wPortChange;
|
|
||||||
} USBHubPort;
|
|
||||||
|
|
||||||
typedef struct USBHubState {
|
|
||||||
USBDevice dev;
|
|
||||||
USBHubPort ports[NUM_PORTS];
|
|
||||||
} USBHubState;
|
|
||||||
|
|
||||||
#define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE)
|
|
||||||
#define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE)
|
|
||||||
#define GetHubDescriptor (0xa000 | USB_REQ_GET_DESCRIPTOR)
|
|
||||||
#define GetHubStatus (0xa000 | USB_REQ_GET_STATUS)
|
|
||||||
#define GetPortStatus (0xa300 | USB_REQ_GET_STATUS)
|
|
||||||
#define SetHubFeature (0x2000 | USB_REQ_SET_FEATURE)
|
|
||||||
#define SetPortFeature (0x2300 | USB_REQ_SET_FEATURE)
|
|
||||||
|
|
||||||
#define PORT_STAT_CONNECTION 0x0001
|
|
||||||
#define PORT_STAT_ENABLE 0x0002
|
|
||||||
#define PORT_STAT_SUSPEND 0x0004
|
|
||||||
#define PORT_STAT_OVERCURRENT 0x0008
|
|
||||||
#define PORT_STAT_RESET 0x0010
|
|
||||||
#define PORT_STAT_POWER 0x0100
|
|
||||||
#define PORT_STAT_LOW_SPEED 0x0200
|
|
||||||
#define PORT_STAT_HIGH_SPEED 0x0400
|
|
||||||
#define PORT_STAT_TEST 0x0800
|
|
||||||
#define PORT_STAT_INDICATOR 0x1000
|
|
||||||
|
|
||||||
#define PORT_STAT_C_CONNECTION 0x0001
|
|
||||||
#define PORT_STAT_C_ENABLE 0x0002
|
|
||||||
#define PORT_STAT_C_SUSPEND 0x0004
|
|
||||||
#define PORT_STAT_C_OVERCURRENT 0x0008
|
|
||||||
#define PORT_STAT_C_RESET 0x0010
|
|
||||||
|
|
||||||
#define PORT_CONNECTION 0
|
|
||||||
#define PORT_ENABLE 1
|
|
||||||
#define PORT_SUSPEND 2
|
|
||||||
#define PORT_OVERCURRENT 3
|
|
||||||
#define PORT_RESET 4
|
|
||||||
#define PORT_POWER 8
|
|
||||||
#define PORT_LOWSPEED 9
|
|
||||||
#define PORT_HIGHSPEED 10
|
|
||||||
#define PORT_C_CONNECTION 16
|
|
||||||
#define PORT_C_ENABLE 17
|
|
||||||
#define PORT_C_SUSPEND 18
|
|
||||||
#define PORT_C_OVERCURRENT 19
|
|
||||||
#define PORT_C_RESET 20
|
|
||||||
#define PORT_TEST 21
|
|
||||||
#define PORT_INDICATOR 22
|
|
||||||
|
|
||||||
/* same as Linux kernel root hubs */
|
|
||||||
|
|
||||||
enum {
|
|
||||||
STR_MANUFACTURER = 1,
|
|
||||||
STR_PRODUCT,
|
|
||||||
STR_SERIALNUMBER,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescStrings desc_strings = {
|
|
||||||
[STR_MANUFACTURER] = "QEMU " QEMU_VERSION,
|
|
||||||
[STR_PRODUCT] = "QEMU USB Hub",
|
|
||||||
[STR_SERIALNUMBER] = "314159",
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescIface desc_iface_hub = {
|
|
||||||
.bInterfaceNumber = 0,
|
|
||||||
.bNumEndpoints = 1,
|
|
||||||
.bInterfaceClass = USB_CLASS_HUB,
|
|
||||||
.eps = (USBDescEndpoint[]) {
|
|
||||||
{
|
|
||||||
.bEndpointAddress = USB_DIR_IN | 0x01,
|
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_INT,
|
|
||||||
.wMaxPacketSize = 1 + (NUM_PORTS + 7) / 8,
|
|
||||||
.bInterval = 0xff,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescDevice desc_device_hub = {
|
|
||||||
.bcdUSB = 0x0110,
|
|
||||||
.bDeviceClass = USB_CLASS_HUB,
|
|
||||||
.bMaxPacketSize0 = 8,
|
|
||||||
.bNumConfigurations = 1,
|
|
||||||
.confs = (USBDescConfig[]) {
|
|
||||||
{
|
|
||||||
.bNumInterfaces = 1,
|
|
||||||
.bConfigurationValue = 1,
|
|
||||||
.bmAttributes = 0xe0,
|
|
||||||
.nif = 1,
|
|
||||||
.ifs = &desc_iface_hub,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDesc desc_hub = {
|
|
||||||
.id = {
|
|
||||||
.idVendor = 0,
|
|
||||||
.idProduct = 0,
|
|
||||||
.bcdDevice = 0x0101,
|
|
||||||
.iManufacturer = STR_MANUFACTURER,
|
|
||||||
.iProduct = STR_PRODUCT,
|
|
||||||
.iSerialNumber = STR_SERIALNUMBER,
|
|
||||||
},
|
|
||||||
.full = &desc_device_hub,
|
|
||||||
.str = desc_strings,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t qemu_hub_hub_descriptor[] =
|
|
||||||
{
|
|
||||||
0x00, /* u8 bLength; patched in later */
|
|
||||||
0x29, /* u8 bDescriptorType; Hub-descriptor */
|
|
||||||
0x00, /* u8 bNbrPorts; (patched later) */
|
|
||||||
0x0a, /* u16 wHubCharacteristics; */
|
|
||||||
0x00, /* (per-port OC, no power switching) */
|
|
||||||
0x01, /* u8 bPwrOn2pwrGood; 2ms */
|
|
||||||
0x00 /* u8 bHubContrCurrent; 0 mA */
|
|
||||||
|
|
||||||
/* DeviceRemovable and PortPwrCtrlMask patched in later */
|
|
||||||
};
|
|
||||||
|
|
||||||
static void usb_hub_attach(USBPort *port1)
|
|
||||||
{
|
|
||||||
USBHubState *s = port1->opaque;
|
|
||||||
USBHubPort *port = &s->ports[port1->index];
|
|
||||||
|
|
||||||
port->wPortStatus |= PORT_STAT_CONNECTION;
|
|
||||||
port->wPortChange |= PORT_STAT_C_CONNECTION;
|
|
||||||
if (port->port.dev->speed == USB_SPEED_LOW) {
|
|
||||||
port->wPortStatus |= PORT_STAT_LOW_SPEED;
|
|
||||||
} else {
|
|
||||||
port->wPortStatus &= ~PORT_STAT_LOW_SPEED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_detach(USBPort *port1)
|
|
||||||
{
|
|
||||||
USBHubState *s = port1->opaque;
|
|
||||||
USBHubPort *port = &s->ports[port1->index];
|
|
||||||
|
|
||||||
/* Let upstream know the device on this port is gone */
|
|
||||||
s->dev.port->ops->child_detach(s->dev.port, port1->dev);
|
|
||||||
|
|
||||||
port->wPortStatus &= ~PORT_STAT_CONNECTION;
|
|
||||||
port->wPortChange |= PORT_STAT_C_CONNECTION;
|
|
||||||
if (port->wPortStatus & PORT_STAT_ENABLE) {
|
|
||||||
port->wPortStatus &= ~PORT_STAT_ENABLE;
|
|
||||||
port->wPortChange |= PORT_STAT_C_ENABLE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_child_detach(USBPort *port1, USBDevice *child)
|
|
||||||
{
|
|
||||||
USBHubState *s = port1->opaque;
|
|
||||||
|
|
||||||
/* Pass along upstream */
|
|
||||||
s->dev.port->ops->child_detach(s->dev.port, child);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_wakeup(USBPort *port1)
|
|
||||||
{
|
|
||||||
USBHubState *s = port1->opaque;
|
|
||||||
USBHubPort *port = &s->ports[port1->index];
|
|
||||||
|
|
||||||
if (port->wPortStatus & PORT_STAT_SUSPEND) {
|
|
||||||
port->wPortChange |= PORT_STAT_C_SUSPEND;
|
|
||||||
usb_wakeup(&s->dev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_complete(USBPort *port, USBPacket *packet)
|
|
||||||
{
|
|
||||||
USBHubState *s = port->opaque;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Just pass it along upstream for now.
|
|
||||||
*
|
|
||||||
* If we ever inplement usb 2.0 split transactions this will
|
|
||||||
* become a little more complicated ...
|
|
||||||
*/
|
|
||||||
usb_packet_complete(&s->dev, packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_handle_attach(USBDevice *dev)
|
|
||||||
{
|
|
||||||
USBHubState *s = DO_UPCAST(USBHubState, dev, dev);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_PORTS; i++) {
|
|
||||||
usb_port_location(&s->ports[i].port, dev->port, i+1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_handle_reset(USBDevice *dev)
|
|
||||||
{
|
|
||||||
/* XXX: do it */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_hub_handle_control(USBDevice *dev, USBPacket *p,
|
|
||||||
int request, int value, int index, int length, uint8_t *data)
|
|
||||||
{
|
|
||||||
USBHubState *s = (USBHubState *)dev;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
|
||||||
if (ret >= 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(request) {
|
|
||||||
case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
|
|
||||||
if (value == 0 && index != 0x81) { /* clear ep halt */
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_INTERFACE:
|
|
||||||
data[0] = 0;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_INTERFACE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
/* usb specific requests */
|
|
||||||
case GetHubStatus:
|
|
||||||
data[0] = 0;
|
|
||||||
data[1] = 0;
|
|
||||||
data[2] = 0;
|
|
||||||
data[3] = 0;
|
|
||||||
ret = 4;
|
|
||||||
break;
|
|
||||||
case GetPortStatus:
|
|
||||||
{
|
|
||||||
unsigned int n = index - 1;
|
|
||||||
USBHubPort *port;
|
|
||||||
if (n >= NUM_PORTS) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
port = &s->ports[n];
|
|
||||||
data[0] = port->wPortStatus;
|
|
||||||
data[1] = port->wPortStatus >> 8;
|
|
||||||
data[2] = port->wPortChange;
|
|
||||||
data[3] = port->wPortChange >> 8;
|
|
||||||
ret = 4;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SetHubFeature:
|
|
||||||
case ClearHubFeature:
|
|
||||||
if (value == 0 || value == 1) {
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case SetPortFeature:
|
|
||||||
{
|
|
||||||
unsigned int n = index - 1;
|
|
||||||
USBHubPort *port;
|
|
||||||
USBDevice *dev;
|
|
||||||
if (n >= NUM_PORTS) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
port = &s->ports[n];
|
|
||||||
dev = port->port.dev;
|
|
||||||
switch(value) {
|
|
||||||
case PORT_SUSPEND:
|
|
||||||
port->wPortStatus |= PORT_STAT_SUSPEND;
|
|
||||||
break;
|
|
||||||
case PORT_RESET:
|
|
||||||
if (dev) {
|
|
||||||
usb_send_msg(dev, USB_MSG_RESET);
|
|
||||||
port->wPortChange |= PORT_STAT_C_RESET;
|
|
||||||
/* set enable bit */
|
|
||||||
port->wPortStatus |= PORT_STAT_ENABLE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PORT_POWER:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ClearPortFeature:
|
|
||||||
{
|
|
||||||
unsigned int n = index - 1;
|
|
||||||
USBHubPort *port;
|
|
||||||
|
|
||||||
if (n >= NUM_PORTS) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
port = &s->ports[n];
|
|
||||||
switch(value) {
|
|
||||||
case PORT_ENABLE:
|
|
||||||
port->wPortStatus &= ~PORT_STAT_ENABLE;
|
|
||||||
break;
|
|
||||||
case PORT_C_ENABLE:
|
|
||||||
port->wPortChange &= ~PORT_STAT_C_ENABLE;
|
|
||||||
break;
|
|
||||||
case PORT_SUSPEND:
|
|
||||||
port->wPortStatus &= ~PORT_STAT_SUSPEND;
|
|
||||||
break;
|
|
||||||
case PORT_C_SUSPEND:
|
|
||||||
port->wPortChange &= ~PORT_STAT_C_SUSPEND;
|
|
||||||
break;
|
|
||||||
case PORT_C_CONNECTION:
|
|
||||||
port->wPortChange &= ~PORT_STAT_C_CONNECTION;
|
|
||||||
break;
|
|
||||||
case PORT_C_OVERCURRENT:
|
|
||||||
port->wPortChange &= ~PORT_STAT_C_OVERCURRENT;
|
|
||||||
break;
|
|
||||||
case PORT_C_RESET:
|
|
||||||
port->wPortChange &= ~PORT_STAT_C_RESET;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GetHubDescriptor:
|
|
||||||
{
|
|
||||||
unsigned int n, limit, var_hub_size = 0;
|
|
||||||
memcpy(data, qemu_hub_hub_descriptor,
|
|
||||||
sizeof(qemu_hub_hub_descriptor));
|
|
||||||
data[2] = NUM_PORTS;
|
|
||||||
|
|
||||||
/* fill DeviceRemovable bits */
|
|
||||||
limit = ((NUM_PORTS + 1 + 7) / 8) + 7;
|
|
||||||
for (n = 7; n < limit; n++) {
|
|
||||||
data[n] = 0x00;
|
|
||||||
var_hub_size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fill PortPwrCtrlMask bits */
|
|
||||||
limit = limit + ((NUM_PORTS + 7) / 8);
|
|
||||||
for (;n < limit; n++) {
|
|
||||||
data[n] = 0xff;
|
|
||||||
var_hub_size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = sizeof(qemu_hub_hub_descriptor) + var_hub_size;
|
|
||||||
data[0] = ret;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_hub_handle_data(USBDevice *dev, USBPacket *p)
|
|
||||||
{
|
|
||||||
USBHubState *s = (USBHubState *)dev;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
switch(p->pid) {
|
|
||||||
case USB_TOKEN_IN:
|
|
||||||
if (p->devep == 1) {
|
|
||||||
USBHubPort *port;
|
|
||||||
unsigned int status;
|
|
||||||
int i, n;
|
|
||||||
n = (NUM_PORTS + 1 + 7) / 8;
|
|
||||||
if (p->len == 1) { /* FreeBSD workaround */
|
|
||||||
n = 1;
|
|
||||||
} else if (n > p->len) {
|
|
||||||
return USB_RET_BABBLE;
|
|
||||||
}
|
|
||||||
status = 0;
|
|
||||||
for(i = 0; i < NUM_PORTS; i++) {
|
|
||||||
port = &s->ports[i];
|
|
||||||
if (port->wPortChange)
|
|
||||||
status |= (1 << (i + 1));
|
|
||||||
}
|
|
||||||
if (status != 0) {
|
|
||||||
for(i = 0; i < n; i++) {
|
|
||||||
p->data[i] = status >> (8 * i);
|
|
||||||
}
|
|
||||||
ret = n;
|
|
||||||
} else {
|
|
||||||
ret = USB_RET_NAK; /* usb11 11.13.1 */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case USB_TOKEN_OUT:
|
|
||||||
default:
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_hub_broadcast_packet(USBHubState *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
USBHubPort *port;
|
|
||||||
USBDevice *dev;
|
|
||||||
int i, ret;
|
|
||||||
|
|
||||||
for(i = 0; i < NUM_PORTS; i++) {
|
|
||||||
port = &s->ports[i];
|
|
||||||
dev = port->port.dev;
|
|
||||||
if (dev && (port->wPortStatus & PORT_STAT_ENABLE)) {
|
|
||||||
ret = usb_handle_packet(dev, p);
|
|
||||||
if (ret != USB_RET_NODEV) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return USB_RET_NODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_hub_handle_packet(USBDevice *dev, USBPacket *p)
|
|
||||||
{
|
|
||||||
USBHubState *s = (USBHubState *)dev;
|
|
||||||
|
|
||||||
#if defined(DEBUG) && 0
|
|
||||||
printf("usb_hub: pid=0x%x\n", pid);
|
|
||||||
#endif
|
|
||||||
if (dev->state == USB_STATE_DEFAULT &&
|
|
||||||
dev->addr != 0 &&
|
|
||||||
p->devaddr != dev->addr &&
|
|
||||||
(p->pid == USB_TOKEN_SETUP ||
|
|
||||||
p->pid == USB_TOKEN_OUT ||
|
|
||||||
p->pid == USB_TOKEN_IN)) {
|
|
||||||
/* broadcast the packet to the devices */
|
|
||||||
return usb_hub_broadcast_packet(s, p);
|
|
||||||
}
|
|
||||||
return usb_generic_handle_packet(dev, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_hub_handle_destroy(USBDevice *dev)
|
|
||||||
{
|
|
||||||
USBHubState *s = (USBHubState *)dev;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_PORTS; i++) {
|
|
||||||
usb_unregister_port(usb_bus_from_device(dev),
|
|
||||||
&s->ports[i].port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static USBPortOps usb_hub_port_ops = {
|
|
||||||
.attach = usb_hub_attach,
|
|
||||||
.detach = usb_hub_detach,
|
|
||||||
.child_detach = usb_hub_child_detach,
|
|
||||||
.wakeup = usb_hub_wakeup,
|
|
||||||
.complete = usb_hub_complete,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int usb_hub_initfn(USBDevice *dev)
|
|
||||||
{
|
|
||||||
USBHubState *s = DO_UPCAST(USBHubState, dev, dev);
|
|
||||||
USBHubPort *port;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
usb_desc_init(dev);
|
|
||||||
for (i = 0; i < NUM_PORTS; i++) {
|
|
||||||
port = &s->ports[i];
|
|
||||||
usb_register_port(usb_bus_from_device(dev),
|
|
||||||
&port->port, s, i, &usb_hub_port_ops,
|
|
||||||
USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
|
|
||||||
port->wPortStatus = PORT_STAT_POWER;
|
|
||||||
port->wPortChange = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_usb_hub_port = {
|
|
||||||
.name = "usb-hub-port",
|
|
||||||
.version_id = 1,
|
|
||||||
.minimum_version_id = 1,
|
|
||||||
.fields = (VMStateField []) {
|
|
||||||
VMSTATE_UINT16(wPortStatus, USBHubPort),
|
|
||||||
VMSTATE_UINT16(wPortChange, USBHubPort),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_usb_hub = {
|
|
||||||
.name = "usb-hub",
|
|
||||||
.version_id = 1,
|
|
||||||
.minimum_version_id = 1,
|
|
||||||
.fields = (VMStateField []) {
|
|
||||||
VMSTATE_USB_DEVICE(dev, USBHubState),
|
|
||||||
VMSTATE_STRUCT_ARRAY(ports, USBHubState, NUM_PORTS, 0,
|
|
||||||
vmstate_usb_hub_port, USBHubPort),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct USBDeviceInfo hub_info = {
|
|
||||||
.product_desc = "QEMU USB Hub",
|
|
||||||
.qdev.name = "usb-hub",
|
|
||||||
.qdev.fw_name = "hub",
|
|
||||||
.qdev.size = sizeof(USBHubState),
|
|
||||||
.qdev.vmsd = &vmstate_usb_hub,
|
|
||||||
.usb_desc = &desc_hub,
|
|
||||||
.init = usb_hub_initfn,
|
|
||||||
.handle_packet = usb_hub_handle_packet,
|
|
||||||
.handle_attach = usb_hub_handle_attach,
|
|
||||||
.handle_reset = usb_hub_handle_reset,
|
|
||||||
.handle_control = usb_hub_handle_control,
|
|
||||||
.handle_data = usb_hub_handle_data,
|
|
||||||
.handle_destroy = usb_hub_handle_destroy,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void usb_hub_register_devices(void)
|
|
||||||
{
|
|
||||||
usb_qdev_register(&hub_info);
|
|
||||||
}
|
|
||||||
device_init(usb_hub_register_devices)
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,646 +0,0 @@
|
||||||
/*
|
|
||||||
* USB Mass Storage Device emulation
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 CodeSourcery.
|
|
||||||
* Written by Paul Brook
|
|
||||||
*
|
|
||||||
* This code is licensed under the LGPL.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu-common.h"
|
|
||||||
#include "qemu-option.h"
|
|
||||||
#include "qemu-config.h"
|
|
||||||
#include "usb.h"
|
|
||||||
#include "usb-desc.h"
|
|
||||||
#include "scsi.h"
|
|
||||||
#include "console.h"
|
|
||||||
#include "monitor.h"
|
|
||||||
#include "sysemu.h"
|
|
||||||
#include "blockdev.h"
|
|
||||||
|
|
||||||
//#define DEBUG_MSD
|
|
||||||
|
|
||||||
#ifdef DEBUG_MSD
|
|
||||||
#define DPRINTF(fmt, ...) \
|
|
||||||
do { printf("usb-msd: " fmt , ## __VA_ARGS__); } while (0)
|
|
||||||
#else
|
|
||||||
#define DPRINTF(fmt, ...) do {} while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* USB requests. */
|
|
||||||
#define MassStorageReset 0xff
|
|
||||||
#define GetMaxLun 0xfe
|
|
||||||
|
|
||||||
enum USBMSDMode {
|
|
||||||
USB_MSDM_CBW, /* Command Block. */
|
|
||||||
USB_MSDM_DATAOUT, /* Transfer data to device. */
|
|
||||||
USB_MSDM_DATAIN, /* Transfer data from device. */
|
|
||||||
USB_MSDM_CSW /* Command Status. */
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
USBDevice dev;
|
|
||||||
enum USBMSDMode mode;
|
|
||||||
uint32_t scsi_len;
|
|
||||||
uint8_t *scsi_buf;
|
|
||||||
uint32_t usb_len;
|
|
||||||
uint8_t *usb_buf;
|
|
||||||
uint32_t data_len;
|
|
||||||
uint32_t residue;
|
|
||||||
uint32_t tag;
|
|
||||||
SCSIRequest *req;
|
|
||||||
SCSIBus bus;
|
|
||||||
BlockConf conf;
|
|
||||||
char *serial;
|
|
||||||
SCSIDevice *scsi_dev;
|
|
||||||
uint32_t removable;
|
|
||||||
int result;
|
|
||||||
/* For async completion. */
|
|
||||||
USBPacket *packet;
|
|
||||||
} MSDState;
|
|
||||||
|
|
||||||
struct usb_msd_cbw {
|
|
||||||
uint32_t sig;
|
|
||||||
uint32_t tag;
|
|
||||||
uint32_t data_len;
|
|
||||||
uint8_t flags;
|
|
||||||
uint8_t lun;
|
|
||||||
uint8_t cmd_len;
|
|
||||||
uint8_t cmd[16];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct usb_msd_csw {
|
|
||||||
uint32_t sig;
|
|
||||||
uint32_t tag;
|
|
||||||
uint32_t residue;
|
|
||||||
uint8_t status;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
STR_MANUFACTURER = 1,
|
|
||||||
STR_PRODUCT,
|
|
||||||
STR_SERIALNUMBER,
|
|
||||||
STR_CONFIG_FULL,
|
|
||||||
STR_CONFIG_HIGH,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescStrings desc_strings = {
|
|
||||||
[STR_MANUFACTURER] = "QEMU " QEMU_VERSION,
|
|
||||||
[STR_PRODUCT] = "QEMU USB HARDDRIVE",
|
|
||||||
[STR_SERIALNUMBER] = "1",
|
|
||||||
[STR_CONFIG_FULL] = "Full speed config (usb 1.1)",
|
|
||||||
[STR_CONFIG_HIGH] = "High speed config (usb 2.0)",
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescIface desc_iface_full = {
|
|
||||||
.bInterfaceNumber = 0,
|
|
||||||
.bNumEndpoints = 2,
|
|
||||||
.bInterfaceClass = USB_CLASS_MASS_STORAGE,
|
|
||||||
.bInterfaceSubClass = 0x06, /* SCSI */
|
|
||||||
.bInterfaceProtocol = 0x50, /* Bulk */
|
|
||||||
.eps = (USBDescEndpoint[]) {
|
|
||||||
{
|
|
||||||
.bEndpointAddress = USB_DIR_IN | 0x01,
|
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
|
||||||
.wMaxPacketSize = 64,
|
|
||||||
},{
|
|
||||||
.bEndpointAddress = USB_DIR_OUT | 0x02,
|
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
|
||||||
.wMaxPacketSize = 64,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescDevice desc_device_full = {
|
|
||||||
.bcdUSB = 0x0200,
|
|
||||||
.bMaxPacketSize0 = 8,
|
|
||||||
.bNumConfigurations = 1,
|
|
||||||
.confs = (USBDescConfig[]) {
|
|
||||||
{
|
|
||||||
.bNumInterfaces = 1,
|
|
||||||
.bConfigurationValue = 1,
|
|
||||||
.iConfiguration = STR_CONFIG_FULL,
|
|
||||||
.bmAttributes = 0xc0,
|
|
||||||
.nif = 1,
|
|
||||||
.ifs = &desc_iface_full,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescIface desc_iface_high = {
|
|
||||||
.bInterfaceNumber = 0,
|
|
||||||
.bNumEndpoints = 2,
|
|
||||||
.bInterfaceClass = USB_CLASS_MASS_STORAGE,
|
|
||||||
.bInterfaceSubClass = 0x06, /* SCSI */
|
|
||||||
.bInterfaceProtocol = 0x50, /* Bulk */
|
|
||||||
.eps = (USBDescEndpoint[]) {
|
|
||||||
{
|
|
||||||
.bEndpointAddress = USB_DIR_IN | 0x01,
|
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
|
||||||
.wMaxPacketSize = 512,
|
|
||||||
},{
|
|
||||||
.bEndpointAddress = USB_DIR_OUT | 0x02,
|
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
|
||||||
.wMaxPacketSize = 512,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDescDevice desc_device_high = {
|
|
||||||
.bcdUSB = 0x0200,
|
|
||||||
.bMaxPacketSize0 = 64,
|
|
||||||
.bNumConfigurations = 1,
|
|
||||||
.confs = (USBDescConfig[]) {
|
|
||||||
{
|
|
||||||
.bNumInterfaces = 1,
|
|
||||||
.bConfigurationValue = 1,
|
|
||||||
.iConfiguration = STR_CONFIG_HIGH,
|
|
||||||
.bmAttributes = 0xc0,
|
|
||||||
.nif = 1,
|
|
||||||
.ifs = &desc_iface_high,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const USBDesc desc = {
|
|
||||||
.id = {
|
|
||||||
.idVendor = 0,
|
|
||||||
.idProduct = 0,
|
|
||||||
.bcdDevice = 0,
|
|
||||||
.iManufacturer = STR_MANUFACTURER,
|
|
||||||
.iProduct = STR_PRODUCT,
|
|
||||||
.iSerialNumber = STR_SERIALNUMBER,
|
|
||||||
},
|
|
||||||
.full = &desc_device_full,
|
|
||||||
.high = &desc_device_high,
|
|
||||||
.str = desc_strings,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void usb_msd_copy_data(MSDState *s)
|
|
||||||
{
|
|
||||||
uint32_t len;
|
|
||||||
len = s->usb_len;
|
|
||||||
if (len > s->scsi_len)
|
|
||||||
len = s->scsi_len;
|
|
||||||
if (s->mode == USB_MSDM_DATAIN) {
|
|
||||||
memcpy(s->usb_buf, s->scsi_buf, len);
|
|
||||||
} else {
|
|
||||||
memcpy(s->scsi_buf, s->usb_buf, len);
|
|
||||||
}
|
|
||||||
s->usb_len -= len;
|
|
||||||
s->scsi_len -= len;
|
|
||||||
s->usb_buf += len;
|
|
||||||
s->scsi_buf += len;
|
|
||||||
s->data_len -= len;
|
|
||||||
if (s->scsi_len == 0 || s->data_len == 0) {
|
|
||||||
scsi_req_continue(s->req);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_send_status(MSDState *s, USBPacket *p)
|
|
||||||
{
|
|
||||||
struct usb_msd_csw csw;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
csw.sig = cpu_to_le32(0x53425355);
|
|
||||||
csw.tag = cpu_to_le32(s->tag);
|
|
||||||
csw.residue = s->residue;
|
|
||||||
csw.status = s->result;
|
|
||||||
|
|
||||||
len = MIN(sizeof(csw), p->len);
|
|
||||||
memcpy(p->data, &csw, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len)
|
|
||||||
{
|
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
|
|
||||||
USBPacket *p = s->packet;
|
|
||||||
|
|
||||||
assert((s->mode == USB_MSDM_DATAOUT) == (req->cmd.mode == SCSI_XFER_TO_DEV));
|
|
||||||
s->scsi_len = len;
|
|
||||||
s->scsi_buf = scsi_req_get_buf(req);
|
|
||||||
if (p) {
|
|
||||||
usb_msd_copy_data(s);
|
|
||||||
if (s->packet && s->usb_len == 0) {
|
|
||||||
/* Set s->packet to NULL before calling usb_packet_complete
|
|
||||||
because another request may be issued before
|
|
||||||
usb_packet_complete returns. */
|
|
||||||
DPRINTF("Packet complete %p\n", p);
|
|
||||||
s->packet = NULL;
|
|
||||||
usb_packet_complete(&s->dev, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_command_complete(SCSIRequest *req, uint32_t status)
|
|
||||||
{
|
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
|
|
||||||
USBPacket *p = s->packet;
|
|
||||||
|
|
||||||
DPRINTF("Command complete %d\n", status);
|
|
||||||
s->residue = s->data_len;
|
|
||||||
s->result = status != 0;
|
|
||||||
if (s->packet) {
|
|
||||||
if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) {
|
|
||||||
/* A deferred packet with no write data remaining must be
|
|
||||||
the status read packet. */
|
|
||||||
usb_msd_send_status(s, p);
|
|
||||||
s->mode = USB_MSDM_CBW;
|
|
||||||
} else {
|
|
||||||
if (s->data_len) {
|
|
||||||
s->data_len -= s->usb_len;
|
|
||||||
if (s->mode == USB_MSDM_DATAIN) {
|
|
||||||
memset(s->usb_buf, 0, s->usb_len);
|
|
||||||
}
|
|
||||||
s->usb_len = 0;
|
|
||||||
}
|
|
||||||
if (s->data_len == 0) {
|
|
||||||
s->mode = USB_MSDM_CSW;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s->packet = NULL;
|
|
||||||
usb_packet_complete(&s->dev, p);
|
|
||||||
} else if (s->data_len == 0) {
|
|
||||||
s->mode = USB_MSDM_CSW;
|
|
||||||
}
|
|
||||||
scsi_req_unref(req);
|
|
||||||
s->req = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_request_cancelled(SCSIRequest *req)
|
|
||||||
{
|
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
|
|
||||||
|
|
||||||
if (req == s->req) {
|
|
||||||
scsi_req_unref(s->req);
|
|
||||||
s->req = NULL;
|
|
||||||
s->packet = NULL;
|
|
||||||
s->scsi_len = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_handle_reset(USBDevice *dev)
|
|
||||||
{
|
|
||||||
MSDState *s = (MSDState *)dev;
|
|
||||||
|
|
||||||
DPRINTF("Reset\n");
|
|
||||||
s->mode = USB_MSDM_CBW;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_msd_handle_control(USBDevice *dev, USBPacket *p,
|
|
||||||
int request, int value, int index, int length, uint8_t *data)
|
|
||||||
{
|
|
||||||
MSDState *s = (MSDState *)dev;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
|
||||||
if (ret >= 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
switch (request) {
|
|
||||||
case DeviceRequest | USB_REQ_GET_INTERFACE:
|
|
||||||
data[0] = 0;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_INTERFACE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
/* Class specific requests. */
|
|
||||||
case ClassInterfaceOutRequest | MassStorageReset:
|
|
||||||
/* Reset state ready for the next CBW. */
|
|
||||||
s->mode = USB_MSDM_CBW;
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case ClassInterfaceRequest | GetMaxLun:
|
|
||||||
data[0] = 0;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_cancel_io(USBDevice *dev, USBPacket *p)
|
|
||||||
{
|
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
|
||||||
scsi_req_cancel(s->req);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
|
|
||||||
{
|
|
||||||
MSDState *s = (MSDState *)dev;
|
|
||||||
int ret = 0;
|
|
||||||
struct usb_msd_cbw cbw;
|
|
||||||
uint8_t devep = p->devep;
|
|
||||||
uint8_t *data = p->data;
|
|
||||||
int len = p->len;
|
|
||||||
|
|
||||||
switch (p->pid) {
|
|
||||||
case USB_TOKEN_OUT:
|
|
||||||
if (devep != 2)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
switch (s->mode) {
|
|
||||||
case USB_MSDM_CBW:
|
|
||||||
if (len != 31) {
|
|
||||||
fprintf(stderr, "usb-msd: Bad CBW size");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
memcpy(&cbw, data, 31);
|
|
||||||
if (le32_to_cpu(cbw.sig) != 0x43425355) {
|
|
||||||
fprintf(stderr, "usb-msd: Bad signature %08x\n",
|
|
||||||
le32_to_cpu(cbw.sig));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
DPRINTF("Command on LUN %d\n", cbw.lun);
|
|
||||||
if (cbw.lun != 0) {
|
|
||||||
fprintf(stderr, "usb-msd: Bad LUN %d\n", cbw.lun);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
s->tag = le32_to_cpu(cbw.tag);
|
|
||||||
s->data_len = le32_to_cpu(cbw.data_len);
|
|
||||||
if (s->data_len == 0) {
|
|
||||||
s->mode = USB_MSDM_CSW;
|
|
||||||
} else if (cbw.flags & 0x80) {
|
|
||||||
s->mode = USB_MSDM_DATAIN;
|
|
||||||
} else {
|
|
||||||
s->mode = USB_MSDM_DATAOUT;
|
|
||||||
}
|
|
||||||
DPRINTF("Command tag 0x%x flags %08x len %d data %d\n",
|
|
||||||
s->tag, cbw.flags, cbw.cmd_len, s->data_len);
|
|
||||||
s->residue = 0;
|
|
||||||
s->scsi_len = 0;
|
|
||||||
s->req = scsi_req_new(s->scsi_dev, s->tag, 0, NULL);
|
|
||||||
scsi_req_enqueue(s->req, cbw.cmd);
|
|
||||||
/* ??? Should check that USB and SCSI data transfer
|
|
||||||
directions match. */
|
|
||||||
if (s->mode != USB_MSDM_CSW && s->residue == 0) {
|
|
||||||
scsi_req_continue(s->req);
|
|
||||||
}
|
|
||||||
ret = len;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_MSDM_DATAOUT:
|
|
||||||
DPRINTF("Data out %d/%d\n", len, s->data_len);
|
|
||||||
if (len > s->data_len)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
s->usb_buf = data;
|
|
||||||
s->usb_len = len;
|
|
||||||
if (s->scsi_len) {
|
|
||||||
usb_msd_copy_data(s);
|
|
||||||
}
|
|
||||||
if (s->residue && s->usb_len) {
|
|
||||||
s->data_len -= s->usb_len;
|
|
||||||
if (s->data_len == 0)
|
|
||||||
s->mode = USB_MSDM_CSW;
|
|
||||||
s->usb_len = 0;
|
|
||||||
}
|
|
||||||
if (s->usb_len) {
|
|
||||||
DPRINTF("Deferring packet %p\n", p);
|
|
||||||
s->packet = p;
|
|
||||||
ret = USB_RET_ASYNC;
|
|
||||||
} else {
|
|
||||||
ret = len;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DPRINTF("Unexpected write (len %d)\n", len);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_TOKEN_IN:
|
|
||||||
if (devep != 1)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
switch (s->mode) {
|
|
||||||
case USB_MSDM_DATAOUT:
|
|
||||||
if (s->data_len != 0 || len < 13)
|
|
||||||
goto fail;
|
|
||||||
/* Waiting for SCSI write to complete. */
|
|
||||||
s->packet = p;
|
|
||||||
ret = USB_RET_ASYNC;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_MSDM_CSW:
|
|
||||||
DPRINTF("Command status %d tag 0x%x, len %d\n",
|
|
||||||
s->result, s->tag, len);
|
|
||||||
if (len < 13)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
usb_msd_send_status(s, p);
|
|
||||||
s->mode = USB_MSDM_CBW;
|
|
||||||
ret = 13;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_MSDM_DATAIN:
|
|
||||||
DPRINTF("Data in %d/%d, scsi_len %d\n", len, s->data_len, s->scsi_len);
|
|
||||||
if (len > s->data_len)
|
|
||||||
len = s->data_len;
|
|
||||||
s->usb_buf = data;
|
|
||||||
s->usb_len = len;
|
|
||||||
if (s->scsi_len) {
|
|
||||||
usb_msd_copy_data(s);
|
|
||||||
}
|
|
||||||
if (s->residue && s->usb_len) {
|
|
||||||
s->data_len -= s->usb_len;
|
|
||||||
memset(s->usb_buf, 0, s->usb_len);
|
|
||||||
if (s->data_len == 0)
|
|
||||||
s->mode = USB_MSDM_CSW;
|
|
||||||
s->usb_len = 0;
|
|
||||||
}
|
|
||||||
if (s->usb_len) {
|
|
||||||
DPRINTF("Deferring packet %p\n", p);
|
|
||||||
s->packet = p;
|
|
||||||
ret = USB_RET_ASYNC;
|
|
||||||
} else {
|
|
||||||
ret = len;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DPRINTF("Unexpected read (len %d)\n", len);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DPRINTF("Bad token\n");
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_msd_password_cb(void *opaque, int err)
|
|
||||||
{
|
|
||||||
MSDState *s = opaque;
|
|
||||||
|
|
||||||
if (!err)
|
|
||||||
err = usb_device_attach(&s->dev);
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
qdev_unplug(&s->dev.qdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct SCSIBusOps usb_msd_scsi_ops = {
|
|
||||||
.transfer_data = usb_msd_transfer_data,
|
|
||||||
.complete = usb_msd_command_complete,
|
|
||||||
.cancel = usb_msd_request_cancelled
|
|
||||||
};
|
|
||||||
|
|
||||||
static int usb_msd_initfn(USBDevice *dev)
|
|
||||||
{
|
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
|
||||||
BlockDriverState *bs = s->conf.bs;
|
|
||||||
DriveInfo *dinfo;
|
|
||||||
|
|
||||||
if (!bs) {
|
|
||||||
error_report("usb-msd: drive property not set");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hack alert: this pretends to be a block device, but it's really
|
|
||||||
* a SCSI bus that can serve only a single device, which it
|
|
||||||
* creates automatically. But first it needs to detach from its
|
|
||||||
* blockdev, or else scsi_bus_legacy_add_drive() dies when it
|
|
||||||
* attaches again.
|
|
||||||
*
|
|
||||||
* The hack is probably a bad idea.
|
|
||||||
*/
|
|
||||||
bdrv_detach(bs, &s->dev.qdev);
|
|
||||||
s->conf.bs = NULL;
|
|
||||||
|
|
||||||
if (!s->serial) {
|
|
||||||
/* try to fall back to value set with legacy -drive serial=... */
|
|
||||||
dinfo = drive_get_by_blockdev(bs);
|
|
||||||
if (*dinfo->serial) {
|
|
||||||
s->serial = strdup(dinfo->serial);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (s->serial) {
|
|
||||||
usb_desc_set_string(dev, STR_SERIALNUMBER, s->serial);
|
|
||||||
}
|
|
||||||
|
|
||||||
usb_desc_init(dev);
|
|
||||||
scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, &usb_msd_scsi_ops);
|
|
||||||
s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable);
|
|
||||||
if (!s->scsi_dev) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
s->bus.qbus.allow_hotplug = 0;
|
|
||||||
usb_msd_handle_reset(dev);
|
|
||||||
|
|
||||||
if (bdrv_key_required(bs)) {
|
|
||||||
if (cur_mon) {
|
|
||||||
monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb, s);
|
|
||||||
s->dev.auto_attach = 0;
|
|
||||||
} else {
|
|
||||||
autostart = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
add_boot_device_path(s->conf.bootindex, &dev->qdev, "/disk@0,0");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static USBDevice *usb_msd_init(const char *filename)
|
|
||||||
{
|
|
||||||
static int nr=0;
|
|
||||||
char id[8];
|
|
||||||
QemuOpts *opts;
|
|
||||||
DriveInfo *dinfo;
|
|
||||||
USBDevice *dev;
|
|
||||||
const char *p1;
|
|
||||||
char fmt[32];
|
|
||||||
|
|
||||||
/* parse -usbdevice disk: syntax into drive opts */
|
|
||||||
snprintf(id, sizeof(id), "usb%d", nr++);
|
|
||||||
opts = qemu_opts_create(qemu_find_opts("drive"), id, 0);
|
|
||||||
|
|
||||||
p1 = strchr(filename, ':');
|
|
||||||
if (p1++) {
|
|
||||||
const char *p2;
|
|
||||||
|
|
||||||
if (strstart(filename, "format=", &p2)) {
|
|
||||||
int len = MIN(p1 - p2, sizeof(fmt));
|
|
||||||
pstrcpy(fmt, len, p2);
|
|
||||||
qemu_opt_set(opts, "format", fmt);
|
|
||||||
} else if (*filename != ':') {
|
|
||||||
printf("unrecognized USB mass-storage option %s\n", filename);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
filename = p1;
|
|
||||||
}
|
|
||||||
if (!*filename) {
|
|
||||||
printf("block device specification needed\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
qemu_opt_set(opts, "file", filename);
|
|
||||||
qemu_opt_set(opts, "if", "none");
|
|
||||||
|
|
||||||
/* create host drive */
|
|
||||||
dinfo = drive_init(opts, 0);
|
|
||||||
if (!dinfo) {
|
|
||||||
qemu_opts_del(opts);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create guest device */
|
|
||||||
dev = usb_create(NULL /* FIXME */, "usb-storage");
|
|
||||||
if (!dev) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) {
|
|
||||||
qdev_free(&dev->qdev);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (qdev_init(&dev->qdev) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct USBDeviceInfo msd_info = {
|
|
||||||
.product_desc = "QEMU USB MSD",
|
|
||||||
.qdev.name = "usb-storage",
|
|
||||||
.qdev.fw_name = "storage",
|
|
||||||
.qdev.size = sizeof(MSDState),
|
|
||||||
.usb_desc = &desc,
|
|
||||||
.init = usb_msd_initfn,
|
|
||||||
.handle_packet = usb_generic_handle_packet,
|
|
||||||
.cancel_packet = usb_msd_cancel_io,
|
|
||||||
.handle_attach = usb_desc_attach,
|
|
||||||
.handle_reset = usb_msd_handle_reset,
|
|
||||||
.handle_control = usb_msd_handle_control,
|
|
||||||
.handle_data = usb_msd_handle_data,
|
|
||||||
.usbdevice_name = "disk",
|
|
||||||
.usbdevice_init = usb_msd_init,
|
|
||||||
.qdev.props = (Property[]) {
|
|
||||||
DEFINE_BLOCK_PROPERTIES(MSDState, conf),
|
|
||||||
DEFINE_PROP_STRING("serial", MSDState, serial),
|
|
||||||
DEFINE_PROP_BIT("removable", MSDState, removable, 0, false),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void usb_msd_register_devices(void)
|
|
||||||
{
|
|
||||||
usb_qdev_register(&msd_info);
|
|
||||||
}
|
|
||||||
device_init(usb_msd_register_devices)
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,382 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU USB API
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu-queue.h"
|
|
||||||
|
|
||||||
/* Constants related to the USB / PCI interaction */
|
|
||||||
#define USB_SBRN 0x60 /* Serial Bus Release Number Register */
|
|
||||||
#define USB_RELEASE_1 0x10 /* USB 1.0 */
|
|
||||||
#define USB_RELEASE_2 0x20 /* USB 2.0 */
|
|
||||||
#define USB_RELEASE_3 0x30 /* USB 3.0 */
|
|
||||||
|
|
||||||
#define USB_TOKEN_SETUP 0x2d
|
|
||||||
#define USB_TOKEN_IN 0x69 /* device -> host */
|
|
||||||
#define USB_TOKEN_OUT 0xe1 /* host -> device */
|
|
||||||
|
|
||||||
/* specific usb messages, also sent in the 'pid' parameter */
|
|
||||||
#define USB_MSG_ATTACH 0x100
|
|
||||||
#define USB_MSG_DETACH 0x101
|
|
||||||
#define USB_MSG_RESET 0x102
|
|
||||||
|
|
||||||
#define USB_RET_NODEV (-1)
|
|
||||||
#define USB_RET_NAK (-2)
|
|
||||||
#define USB_RET_STALL (-3)
|
|
||||||
#define USB_RET_BABBLE (-4)
|
|
||||||
#define USB_RET_ASYNC (-5)
|
|
||||||
|
|
||||||
#define USB_SPEED_LOW 0
|
|
||||||
#define USB_SPEED_FULL 1
|
|
||||||
#define USB_SPEED_HIGH 2
|
|
||||||
#define USB_SPEED_SUPER 3
|
|
||||||
|
|
||||||
#define USB_SPEED_MASK_LOW (1 << USB_SPEED_LOW)
|
|
||||||
#define USB_SPEED_MASK_FULL (1 << USB_SPEED_FULL)
|
|
||||||
#define USB_SPEED_MASK_HIGH (1 << USB_SPEED_HIGH)
|
|
||||||
#define USB_SPEED_MASK_SUPER (1 << USB_SPEED_SUPER)
|
|
||||||
|
|
||||||
#define USB_STATE_NOTATTACHED 0
|
|
||||||
#define USB_STATE_ATTACHED 1
|
|
||||||
//#define USB_STATE_POWERED 2
|
|
||||||
#define USB_STATE_DEFAULT 3
|
|
||||||
//#define USB_STATE_ADDRESS 4
|
|
||||||
//#define USB_STATE_CONFIGURED 5
|
|
||||||
#define USB_STATE_SUSPENDED 6
|
|
||||||
|
|
||||||
#define USB_CLASS_AUDIO 1
|
|
||||||
#define USB_CLASS_COMM 2
|
|
||||||
#define USB_CLASS_HID 3
|
|
||||||
#define USB_CLASS_PHYSICAL 5
|
|
||||||
#define USB_CLASS_STILL_IMAGE 6
|
|
||||||
#define USB_CLASS_PRINTER 7
|
|
||||||
#define USB_CLASS_MASS_STORAGE 8
|
|
||||||
#define USB_CLASS_HUB 9
|
|
||||||
#define USB_CLASS_CDC_DATA 0x0a
|
|
||||||
#define USB_CLASS_CSCID 0x0b
|
|
||||||
#define USB_CLASS_CONTENT_SEC 0x0d
|
|
||||||
#define USB_CLASS_APP_SPEC 0xfe
|
|
||||||
#define USB_CLASS_VENDOR_SPEC 0xff
|
|
||||||
|
|
||||||
#define USB_DIR_OUT 0
|
|
||||||
#define USB_DIR_IN 0x80
|
|
||||||
|
|
||||||
#define USB_TYPE_MASK (0x03 << 5)
|
|
||||||
#define USB_TYPE_STANDARD (0x00 << 5)
|
|
||||||
#define USB_TYPE_CLASS (0x01 << 5)
|
|
||||||
#define USB_TYPE_VENDOR (0x02 << 5)
|
|
||||||
#define USB_TYPE_RESERVED (0x03 << 5)
|
|
||||||
|
|
||||||
#define USB_RECIP_MASK 0x1f
|
|
||||||
#define USB_RECIP_DEVICE 0x00
|
|
||||||
#define USB_RECIP_INTERFACE 0x01
|
|
||||||
#define USB_RECIP_ENDPOINT 0x02
|
|
||||||
#define USB_RECIP_OTHER 0x03
|
|
||||||
|
|
||||||
#define DeviceRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
|
|
||||||
#define DeviceOutRequest ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
|
|
||||||
#define InterfaceRequest \
|
|
||||||
((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
|
|
||||||
#define InterfaceOutRequest \
|
|
||||||
((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
|
|
||||||
#define EndpointRequest ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
|
|
||||||
#define EndpointOutRequest \
|
|
||||||
((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
|
|
||||||
#define ClassInterfaceRequest \
|
|
||||||
((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8)
|
|
||||||
#define ClassInterfaceOutRequest \
|
|
||||||
((USB_DIR_OUT|USB_TYPE_CLASS|USB_RECIP_INTERFACE)<<8)
|
|
||||||
|
|
||||||
#define USB_REQ_GET_STATUS 0x00
|
|
||||||
#define USB_REQ_CLEAR_FEATURE 0x01
|
|
||||||
#define USB_REQ_SET_FEATURE 0x03
|
|
||||||
#define USB_REQ_SET_ADDRESS 0x05
|
|
||||||
#define USB_REQ_GET_DESCRIPTOR 0x06
|
|
||||||
#define USB_REQ_SET_DESCRIPTOR 0x07
|
|
||||||
#define USB_REQ_GET_CONFIGURATION 0x08
|
|
||||||
#define USB_REQ_SET_CONFIGURATION 0x09
|
|
||||||
#define USB_REQ_GET_INTERFACE 0x0A
|
|
||||||
#define USB_REQ_SET_INTERFACE 0x0B
|
|
||||||
#define USB_REQ_SYNCH_FRAME 0x0C
|
|
||||||
|
|
||||||
#define USB_DEVICE_SELF_POWERED 0
|
|
||||||
#define USB_DEVICE_REMOTE_WAKEUP 1
|
|
||||||
|
|
||||||
#define USB_DT_DEVICE 0x01
|
|
||||||
#define USB_DT_CONFIG 0x02
|
|
||||||
#define USB_DT_STRING 0x03
|
|
||||||
#define USB_DT_INTERFACE 0x04
|
|
||||||
#define USB_DT_ENDPOINT 0x05
|
|
||||||
#define USB_DT_DEVICE_QUALIFIER 0x06
|
|
||||||
#define USB_DT_OTHER_SPEED_CONFIG 0x07
|
|
||||||
#define USB_DT_DEBUG 0x0A
|
|
||||||
#define USB_DT_INTERFACE_ASSOC 0x0B
|
|
||||||
|
|
||||||
#define USB_ENDPOINT_XFER_CONTROL 0
|
|
||||||
#define USB_ENDPOINT_XFER_ISOC 1
|
|
||||||
#define USB_ENDPOINT_XFER_BULK 2
|
|
||||||
#define USB_ENDPOINT_XFER_INT 3
|
|
||||||
|
|
||||||
typedef struct USBBus USBBus;
|
|
||||||
typedef struct USBBusOps USBBusOps;
|
|
||||||
typedef struct USBPort USBPort;
|
|
||||||
typedef struct USBDevice USBDevice;
|
|
||||||
typedef struct USBDeviceInfo USBDeviceInfo;
|
|
||||||
typedef struct USBPacket USBPacket;
|
|
||||||
|
|
||||||
typedef struct USBDesc USBDesc;
|
|
||||||
typedef struct USBDescID USBDescID;
|
|
||||||
typedef struct USBDescDevice USBDescDevice;
|
|
||||||
typedef struct USBDescConfig USBDescConfig;
|
|
||||||
typedef struct USBDescIfaceAssoc USBDescIfaceAssoc;
|
|
||||||
typedef struct USBDescIface USBDescIface;
|
|
||||||
typedef struct USBDescEndpoint USBDescEndpoint;
|
|
||||||
typedef struct USBDescOther USBDescOther;
|
|
||||||
typedef struct USBDescString USBDescString;
|
|
||||||
|
|
||||||
struct USBDescString {
|
|
||||||
uint8_t index;
|
|
||||||
char *str;
|
|
||||||
QLIST_ENTRY(USBDescString) next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* definition of a USB device */
|
|
||||||
struct USBDevice {
|
|
||||||
//DeviceState qdev;
|
|
||||||
USBDeviceInfo *info;
|
|
||||||
USBPort *port;
|
|
||||||
char *port_path;
|
|
||||||
void *opaque;
|
|
||||||
|
|
||||||
/* Actual connected speed */
|
|
||||||
int speed;
|
|
||||||
/* Supported speeds, not in info because it may be variable (hostdevs) */
|
|
||||||
int speedmask;
|
|
||||||
uint8_t addr;
|
|
||||||
char product_desc[32];
|
|
||||||
int auto_attach;
|
|
||||||
int attached;
|
|
||||||
|
|
||||||
int32_t state;
|
|
||||||
uint8_t setup_buf[8];
|
|
||||||
uint8_t data_buf[4096];
|
|
||||||
int32_t remote_wakeup;
|
|
||||||
int32_t setup_state;
|
|
||||||
int32_t setup_len;
|
|
||||||
int32_t setup_index;
|
|
||||||
|
|
||||||
QLIST_HEAD(, USBDescString) strings;
|
|
||||||
const USBDescDevice *device;
|
|
||||||
const USBDescConfig *config;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBDeviceInfo {
|
|
||||||
//DeviceInfo qdev;
|
|
||||||
int (*init)(USBDevice *dev);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process USB packet.
|
|
||||||
* Called by the HC (Host Controller).
|
|
||||||
*
|
|
||||||
* Returns length of the transaction
|
|
||||||
* or one of the USB_RET_XXX codes.
|
|
||||||
*/
|
|
||||||
int (*handle_packet)(USBDevice *dev, USBPacket *p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called when a packet is canceled.
|
|
||||||
*/
|
|
||||||
void (*cancel_packet)(USBDevice *dev, USBPacket *p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called when device is destroyed.
|
|
||||||
*/
|
|
||||||
void (*handle_destroy)(USBDevice *dev);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Attach the device
|
|
||||||
*/
|
|
||||||
void (*handle_attach)(USBDevice *dev);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reset the device
|
|
||||||
*/
|
|
||||||
void (*handle_reset)(USBDevice *dev);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process control request.
|
|
||||||
* Called from handle_packet().
|
|
||||||
*
|
|
||||||
* Returns length or one of the USB_RET_ codes.
|
|
||||||
*/
|
|
||||||
int (*handle_control)(USBDevice *dev, USBPacket *p, int request, int value,
|
|
||||||
int index, int length, uint8_t *data);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process data transfers (both BULK and ISOC).
|
|
||||||
* Called from handle_packet().
|
|
||||||
*
|
|
||||||
* Returns length or one of the USB_RET_ codes.
|
|
||||||
*/
|
|
||||||
int (*handle_data)(USBDevice *dev, USBPacket *p);
|
|
||||||
|
|
||||||
const char *product_desc;
|
|
||||||
const USBDesc *usb_desc;
|
|
||||||
|
|
||||||
/* handle legacy -usbdevice command line options */
|
|
||||||
const char *usbdevice_name;
|
|
||||||
USBDevice *(*usbdevice_init)(const char *params);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct USBPortOps {
|
|
||||||
void (*attach)(USBPort *port);
|
|
||||||
void (*detach)(USBPort *port);
|
|
||||||
/*
|
|
||||||
* This gets called when a device downstream from the device attached to
|
|
||||||
* the port (iow attached through a hub) gets detached.
|
|
||||||
*/
|
|
||||||
void (*child_detach)(USBPort *port, USBDevice *child);
|
|
||||||
void (*wakeup)(USBPort *port);
|
|
||||||
/*
|
|
||||||
* Note that port->dev will be different then the device from which
|
|
||||||
* the packet originated when a hub is involved, if you want the orginating
|
|
||||||
* device use p->owner
|
|
||||||
*/
|
|
||||||
void (*complete)(USBPort *port, USBPacket *p);
|
|
||||||
} USBPortOps;
|
|
||||||
|
|
||||||
/* USB port on which a device can be connected */
|
|
||||||
struct USBPort {
|
|
||||||
USBDevice *dev;
|
|
||||||
int speedmask;
|
|
||||||
char path[16];
|
|
||||||
USBPortOps *ops;
|
|
||||||
void *opaque;
|
|
||||||
int index; /* internal port index, may be used with the opaque */
|
|
||||||
QTAILQ_ENTRY(USBPort) next;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef void USBCallback(USBPacket * packet, void *opaque);
|
|
||||||
|
|
||||||
/* Structure used to hold information about an active USB packet. */
|
|
||||||
struct USBPacket {
|
|
||||||
/* Data fields for use by the driver. */
|
|
||||||
int pid;
|
|
||||||
uint8_t devaddr;
|
|
||||||
uint8_t devep;
|
|
||||||
uint8_t *data;
|
|
||||||
int len;
|
|
||||||
/* Internal use by the USB layer. */
|
|
||||||
USBDevice *owner;
|
|
||||||
};
|
|
||||||
|
|
||||||
int usb_handle_packet(USBDevice *dev, USBPacket *p);
|
|
||||||
void usb_packet_complete(USBDevice *dev, USBPacket *p);
|
|
||||||
void usb_cancel_packet(USBPacket * p);
|
|
||||||
|
|
||||||
void usb_attach(USBPort *port, USBDevice *dev);
|
|
||||||
void usb_wakeup(USBDevice *dev);
|
|
||||||
int usb_generic_handle_packet(USBDevice *s, USBPacket *p);
|
|
||||||
void usb_generic_async_ctrl_complete(USBDevice *s, USBPacket *p);
|
|
||||||
int set_usb_string(uint8_t *buf, const char *str);
|
|
||||||
void usb_send_msg(USBDevice *dev, int msg);
|
|
||||||
|
|
||||||
/* usb-linux.c */
|
|
||||||
//USBDevice *usb_host_device_open(const char *devname);
|
|
||||||
//int usb_host_device_close(const char *devname);
|
|
||||||
//void usb_host_info(Monitor *mon);
|
|
||||||
|
|
||||||
/* usb-hid.c */
|
|
||||||
void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
|
|
||||||
|
|
||||||
/* usb-bt.c */
|
|
||||||
//USBDevice *usb_bt_init(HCIInfo *hci);
|
|
||||||
|
|
||||||
/* usb ports of the VM */
|
|
||||||
|
|
||||||
#define VM_USB_HUB_SIZE 8
|
|
||||||
|
|
||||||
/* usb-musb.c */
|
|
||||||
enum musb_irq_source_e {
|
|
||||||
musb_irq_suspend = 0,
|
|
||||||
musb_irq_resume,
|
|
||||||
musb_irq_rst_babble,
|
|
||||||
musb_irq_sof,
|
|
||||||
musb_irq_connect,
|
|
||||||
musb_irq_disconnect,
|
|
||||||
musb_irq_vbus_request,
|
|
||||||
musb_irq_vbus_error,
|
|
||||||
musb_irq_rx,
|
|
||||||
musb_irq_tx,
|
|
||||||
musb_set_vbus,
|
|
||||||
musb_set_session,
|
|
||||||
__musb_irq_max,
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct MUSBState MUSBState;
|
|
||||||
//MUSBState *musb_init(qemu_irq *irqs);
|
|
||||||
uint32_t musb_core_intr_get(MUSBState *s);
|
|
||||||
void musb_core_intr_clear(MUSBState *s, uint32_t mask);
|
|
||||||
void musb_set_size(MUSBState *s, int epnum, int size, int is_tx);
|
|
||||||
|
|
||||||
/* usb-bus.c */
|
|
||||||
|
|
||||||
struct USBBus {
|
|
||||||
//BusState qbus;
|
|
||||||
USBBusOps *ops;
|
|
||||||
int busnr;
|
|
||||||
int nfree;
|
|
||||||
int nused;
|
|
||||||
QTAILQ_HEAD(, USBPort) free;
|
|
||||||
QTAILQ_HEAD(, USBPort) used;
|
|
||||||
QTAILQ_ENTRY(USBBus) next;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct USBBusOps {
|
|
||||||
int (*register_companion)(USBBus *bus, USBPort *ports[],
|
|
||||||
uint32_t portcount, uint32_t firstport);
|
|
||||||
};
|
|
||||||
|
|
||||||
//void usb_bus_new(USBBus *bus, USBBusOps *ops, DeviceState *host);
|
|
||||||
USBBus *usb_bus_find(int busnr);
|
|
||||||
void usb_qdev_register(USBDeviceInfo *info);
|
|
||||||
void usb_qdev_register_many(USBDeviceInfo *info);
|
|
||||||
USBDevice *usb_create(USBBus *bus, const char *name);
|
|
||||||
USBDevice *usb_create_simple(USBBus *bus, const char *name);
|
|
||||||
USBDevice *usbdevice_create(const char *cmdline);
|
|
||||||
void usb_register_port(USBBus *bus, USBPort *port, void *opaque, int index,
|
|
||||||
USBPortOps *ops, int speedmask);
|
|
||||||
int usb_register_companion(const char *masterbus, USBPort *ports[],
|
|
||||||
uint32_t portcount, uint32_t firstport,
|
|
||||||
void *opaque, USBPortOps *ops, int speedmask);
|
|
||||||
void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr);
|
|
||||||
void usb_unregister_port(USBBus *bus, USBPort *port);
|
|
||||||
int usb_device_attach(USBDevice *dev);
|
|
||||||
int usb_device_detach(USBDevice *dev);
|
|
||||||
int usb_device_delete_addr(int busnr, int addr);
|
|
||||||
//
|
|
||||||
//static inline USBBus *usb_bus_from_device(USBDevice *d)
|
|
||||||
//{
|
|
||||||
// return DO_UPCAST(USBBus, qbus, d->qdev.parent_bus);
|
|
||||||
//}
|
|
||||||
|
|
||||||
USBDevice *usb_keyboard_init(void);
|
|
|
@ -1,31 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <memory.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#include "vl.h"
|
|
||||||
|
|
||||||
void cpu_physical_memory_rw(uint32_t addr, uint8_t *buf,
|
|
||||||
int len, int is_write);
|
|
||||||
|
|
||||||
/* compute with 96 bit intermediate result: (a*b)/c */
|
|
||||||
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
|
|
||||||
{
|
|
||||||
union {
|
|
||||||
uint64_t ll;
|
|
||||||
struct {
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
uint32_t high, low;
|
|
||||||
#else
|
|
||||||
uint32_t low, high;
|
|
||||||
#endif
|
|
||||||
} l;
|
|
||||||
} u, res;
|
|
||||||
uint64_t rl, rh;
|
|
||||||
|
|
||||||
u.ll = a;
|
|
||||||
rl = (uint64_t)u.l.low * (uint64_t)b;
|
|
||||||
rh = (uint64_t)u.l.high * (uint64_t)b;
|
|
||||||
rh += (rl >> 32);
|
|
||||||
res.l.high = static_cast<uint32_t>(rh / c);
|
|
||||||
res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
|
|
||||||
return res.ll;
|
|
||||||
}
|
|
|
@ -1,110 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU System Emulator header
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#ifndef VL_H
|
|
||||||
#define VL_H
|
|
||||||
|
|
||||||
/* we put basic includes here to avoid repeating them in device drivers */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef signed __int8 int8_t;
|
|
||||||
typedef signed __int16 int16_t;
|
|
||||||
typedef signed __int32 int32_t;
|
|
||||||
typedef signed __int64 int64_t;
|
|
||||||
typedef unsigned __int8 uint8_t;
|
|
||||||
typedef unsigned __int16 uint16_t;
|
|
||||||
typedef unsigned __int32 uint32_t;
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#define inline __inline
|
|
||||||
|
|
||||||
#ifndef O_LARGEFILE
|
|
||||||
#define O_LARGEFILE 0
|
|
||||||
#endif
|
|
||||||
#ifndef O_BINARY
|
|
||||||
#define O_BINARY 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#define fsync _commit
|
|
||||||
//#define lseek _lseeki64
|
|
||||||
//#define ENOTSUP 4096
|
|
||||||
extern int qemu_ftruncate64(int, int64_t);
|
|
||||||
#define ftruncate qemu_ftruncate64
|
|
||||||
|
|
||||||
|
|
||||||
static inline char *realpath(const char *path, char *resolved_path)
|
|
||||||
{
|
|
||||||
_fullpath(resolved_path, path, _MAX_PATH);
|
|
||||||
return resolved_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PRId64 "I64d"
|
|
||||||
#define PRIx64 "I64x"
|
|
||||||
#define PRIu64 "I64u"
|
|
||||||
#define PRIo64 "I64o"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "usb.h"
|
|
||||||
|
|
||||||
#ifndef glue
|
|
||||||
#define xglue(x, y) x ## y
|
|
||||||
#define glue(x, y) xglue(x, y)
|
|
||||||
#define stringify(s) tostring(s)
|
|
||||||
#define tostring(s) #s
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
||||||
#endif
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* vl.c */
|
|
||||||
uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c);
|
|
||||||
void cpu_physical_memory_rw(uint32_t addr, uint8_t *buf, int len, int is_write);
|
|
||||||
static inline void cpu_physical_memory_read(uint32_t addr, uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
cpu_physical_memory_rw(addr, buf, len, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpu_physical_memory_write(uint32_t addr, const uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
cpu_physical_memory_rw(addr, (uint8_t *)buf, len, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *qemu_mallocz(uint32_t size);
|
|
||||||
|
|
||||||
#endif /* VL_H */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,30 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: ADCUSER.H
|
|
||||||
* Purpose: Audio Device Class Custom User Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __ADCUSER_H__
|
|
||||||
#define __ADCUSER_H__
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Device Class Requests Callback Functions */
|
|
||||||
extern BOOL ADC_IF_GetRequest (void);
|
|
||||||
extern BOOL ADC_IF_SetRequest (void);
|
|
||||||
extern BOOL ADC_EP_GetRequest (void);
|
|
||||||
extern BOOL ADC_EP_SetRequest (void);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __ADCUSER_H__ */
|
|
|
@ -1,372 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: AUDIO.H
|
|
||||||
* Purpose: USB Audio Device Class Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __AUDIO_H__
|
|
||||||
#define __AUDIO_H__
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Interface Subclass Codes */
|
|
||||||
#define AUDIO_SUBCLASS_UNDEFINED 0x00
|
|
||||||
#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
|
|
||||||
#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
|
|
||||||
#define AUDIO_SUBCLASS_MIDISTREAMING 0x03
|
|
||||||
|
|
||||||
/* Audio Interface Protocol Codes */
|
|
||||||
#define AUDIO_PROTOCOL_UNDEFINED 0x00
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Descriptor Types */
|
|
||||||
#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20
|
|
||||||
#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21
|
|
||||||
#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22
|
|
||||||
#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23
|
|
||||||
#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
|
|
||||||
#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Control Interface Descriptor Subtypes */
|
|
||||||
#define AUDIO_CONTROL_UNDEFINED 0x00
|
|
||||||
#define AUDIO_CONTROL_HEADER 0x01
|
|
||||||
#define AUDIO_CONTROL_INPUT_TERMINAL 0x02
|
|
||||||
#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03
|
|
||||||
#define AUDIO_CONTROL_MIXER_UNIT 0x04
|
|
||||||
#define AUDIO_CONTROL_SELECTOR_UNIT 0x05
|
|
||||||
#define AUDIO_CONTROL_FEATURE_UNIT 0x06
|
|
||||||
#define AUDIO_CONTROL_PROCESSING_UNIT 0x07
|
|
||||||
#define AUDIO_CONTROL_EXTENSION_UNIT 0x08
|
|
||||||
|
|
||||||
/* Audio Streaming Interface Descriptor Subtypes */
|
|
||||||
#define AUDIO_STREAMING_UNDEFINED 0x00
|
|
||||||
#define AUDIO_STREAMING_GENERAL 0x01
|
|
||||||
#define AUDIO_STREAMING_FORMAT_TYPE 0x02
|
|
||||||
#define AUDIO_STREAMING_FORMAT_SPECIFIC 0x03
|
|
||||||
|
|
||||||
/* Audio Endpoint Descriptor Subtypes */
|
|
||||||
#define AUDIO_ENDPOINT_UNDEFINED 0x00
|
|
||||||
#define AUDIO_ENDPOINT_GENERAL 0x01
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Descriptor Sizes */
|
|
||||||
#define AUDIO_CONTROL_INTERFACE_DESC_SZ(n) 0x08+n
|
|
||||||
#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07
|
|
||||||
#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C
|
|
||||||
#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09
|
|
||||||
#define AUDIO_MIXER_UNIT_DESC_SZ(p,n) 0x0A+p+n
|
|
||||||
#define AUDIO_SELECTOR_UNIT_DESC_SZ(p) 0x06+p
|
|
||||||
#define AUDIO_FEATURE_UNIT_DESC_SZ(ch,n) 0x07+(ch+1)*n
|
|
||||||
#define AUDIO_PROCESSING_UNIT_DESC_SZ(p,n,x) 0x0D+p+n+x
|
|
||||||
#define AUDIO_EXTENSION_UNIT_DESC_SZ(p,n) 0x0D+p+n
|
|
||||||
#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09
|
|
||||||
#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Processing Unit Process Types */
|
|
||||||
#define AUDIO_UNDEFINED_PROCESS 0x00
|
|
||||||
#define AUDIO_UP_DOWN_MIX_PROCESS 0x01
|
|
||||||
#define AUDIO_DOLBY_PROLOGIC_PROCESS 0x02
|
|
||||||
#define AUDIO_3D_STEREO_PROCESS 0x03
|
|
||||||
#define AUDIO_REVERBERATION_PROCESS 0x04
|
|
||||||
#define AUDIO_CHORUS_PROCESS 0x05
|
|
||||||
#define AUDIO_DYN_RANGE_COMP_PROCESS 0x06
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Request Codes */
|
|
||||||
#define AUDIO_REQUEST_UNDEFINED 0x00
|
|
||||||
#define AUDIO_REQUEST_SET_CUR 0x01
|
|
||||||
#define AUDIO_REQUEST_GET_CUR 0x81
|
|
||||||
#define AUDIO_REQUEST_SET_MIN 0x02
|
|
||||||
#define AUDIO_REQUEST_GET_MIN 0x82
|
|
||||||
#define AUDIO_REQUEST_SET_MAX 0x03
|
|
||||||
#define AUDIO_REQUEST_GET_MAX 0x83
|
|
||||||
#define AUDIO_REQUEST_SET_RES 0x04
|
|
||||||
#define AUDIO_REQUEST_GET_RES 0x84
|
|
||||||
#define AUDIO_REQUEST_SET_MEM 0x05
|
|
||||||
#define AUDIO_REQUEST_GET_MEM 0x85
|
|
||||||
#define AUDIO_REQUEST_GET_STAT 0xFF
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Control Selector Codes */
|
|
||||||
#define AUDIO_CONTROL_UNDEFINED 0x00 /* Common Selector */
|
|
||||||
|
|
||||||
/* Terminal Control Selectors */
|
|
||||||
#define AUDIO_COPY_PROTECT_CONTROL 0x01
|
|
||||||
|
|
||||||
/* Feature Unit Control Selectors */
|
|
||||||
#define AUDIO_MUTE_CONTROL 0x01
|
|
||||||
#define AUDIO_VOLUME_CONTROL 0x02
|
|
||||||
#define AUDIO_BASS_CONTROL 0x03
|
|
||||||
#define AUDIO_MID_CONTROL 0x04
|
|
||||||
#define AUDIO_TREBLE_CONTROL 0x05
|
|
||||||
#define AUDIO_GRAPHIC_EQUALIZER_CONTROL 0x06
|
|
||||||
#define AUDIO_AUTOMATIC_GAIN_CONTROL 0x07
|
|
||||||
#define AUDIO_DELAY_CONTROL 0x08
|
|
||||||
#define AUDIO_BASS_BOOST_CONTROL 0x09
|
|
||||||
#define AUDIO_LOUDNESS_CONTROL 0x0A
|
|
||||||
|
|
||||||
/* Processing Unit Control Selectors: */
|
|
||||||
#define AUDIO_ENABLE_CONTROL 0x01 /* Common Selector */
|
|
||||||
#define AUDIO_MODE_SELECT_CONTROL 0x02 /* Common Selector */
|
|
||||||
|
|
||||||
/* - Up/Down-mix Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
/* AUDIO_MODE_SELECT_CONTROL 0x02 Common Selector */
|
|
||||||
|
|
||||||
/* - Dolby Prologic Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
/* AUDIO_MODE_SELECT_CONTROL 0x02 Common Selector */
|
|
||||||
|
|
||||||
/* - 3D Stereo Extender Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
#define AUDIO_SPACIOUSNESS_CONTROL 0x02
|
|
||||||
|
|
||||||
/* - Reverberation Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
#define AUDIO_REVERB_LEVEL_CONTROL 0x02
|
|
||||||
#define AUDIO_REVERB_TIME_CONTROL 0x03
|
|
||||||
#define AUDIO_REVERB_FEEDBACK_CONTROL 0x04
|
|
||||||
|
|
||||||
/* - Chorus Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
#define AUDIO_CHORUS_LEVEL_CONTROL 0x02
|
|
||||||
#define AUDIO_SHORUS_RATE_CONTROL 0x03
|
|
||||||
#define AUDIO_CHORUS_DEPTH_CONTROL 0x04
|
|
||||||
|
|
||||||
/* - Dynamic Range Compressor Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
#define AUDIO_COMPRESSION_RATE_CONTROL 0x02
|
|
||||||
#define AUDIO_MAX_AMPL_CONTROL 0x03
|
|
||||||
#define AUDIO_THRESHOLD_CONTROL 0x04
|
|
||||||
#define AUDIO_ATTACK_TIME_CONTROL 0x05
|
|
||||||
#define AUDIO_RELEASE_TIME_CONTROL 0x06
|
|
||||||
|
|
||||||
/* Extension Unit Control Selectors */
|
|
||||||
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
|
|
||||||
|
|
||||||
/* Endpoint Control Selectors */
|
|
||||||
#define AUDIO_SAMPLING_FREQ_CONTROL 0x01
|
|
||||||
#define AUDIO_PITCH_CONTROL 0x02
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Format Specific Control Selectors */
|
|
||||||
|
|
||||||
/* MPEG Control Selectors */
|
|
||||||
#define AUDIO_MPEG_CONTROL_UNDEFINED 0x00
|
|
||||||
#define AUDIO_MPEG_DUAL_CHANNEL_CONTROL 0x01
|
|
||||||
#define AUDIO_MPEG_SECOND_STEREO_CONTROL 0x02
|
|
||||||
#define AUDIO_MPEG_MULTILINGUAL_CONTROL 0x03
|
|
||||||
#define AUDIO_MPEG_DYN_RANGE_CONTROL 0x04
|
|
||||||
#define AUDIO_MPEG_SCALING_CONTROL 0x05
|
|
||||||
#define AUDIO_MPEG_HILO_SCALING_CONTROL 0x06
|
|
||||||
|
|
||||||
/* AC-3 Control Selectors */
|
|
||||||
#define AUDIO_AC3_CONTROL_UNDEFINED 0x00
|
|
||||||
#define AUDIO_AC3_MODE_CONTROL 0x01
|
|
||||||
#define AUDIO_AC3_DYN_RANGE_CONTROL 0x02
|
|
||||||
#define AUDIO_AC3_SCALING_CONTROL 0x03
|
|
||||||
#define AUDIO_AC3_HILO_SCALING_CONTROL 0x04
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Format Types */
|
|
||||||
#define AUDIO_FORMAT_TYPE_UNDEFINED 0x00
|
|
||||||
#define AUDIO_FORMAT_TYPE_I 0x01
|
|
||||||
#define AUDIO_FORMAT_TYPE_II 0x02
|
|
||||||
#define AUDIO_FORMAT_TYPE_III 0x03
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Format Type Descriptor Sizes */
|
|
||||||
#define AUDIO_FORMAT_TYPE_I_DESC_SZ(n) 0x08+(n*3)
|
|
||||||
#define AUDIO_FORMAT_TYPE_II_DESC_SZ(n) 0x09+(n*3)
|
|
||||||
#define AUDIO_FORMAT_TYPE_III_DESC_SZ(n) 0x08+(n*3)
|
|
||||||
#define AUDIO_FORMAT_MPEG_DESC_SIZE 0x09
|
|
||||||
#define AUDIO_FORMAT_AC3_DESC_SIZE 0x0A
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Data Format Codes */
|
|
||||||
|
|
||||||
/* Audio Data Format Type I Codes */
|
|
||||||
#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000
|
|
||||||
#define AUDIO_FORMAT_PCM 0x0001
|
|
||||||
#define AUDIO_FORMAT_PCM8 0x0002
|
|
||||||
#define AUDIO_FORMAT_IEEE_FLOAT 0x0003
|
|
||||||
#define AUDIO_FORMAT_ALAW 0x0004
|
|
||||||
#define AUDIO_FORMAT_MULAW 0x0005
|
|
||||||
|
|
||||||
/* Audio Data Format Type II Codes */
|
|
||||||
#define AUDIO_FORMAT_TYPE_II_UNDEFINED 0x1000
|
|
||||||
#define AUDIO_FORMAT_MPEG 0x1001
|
|
||||||
#define AUDIO_FORMAT_AC3 0x1002
|
|
||||||
|
|
||||||
/* Audio Data Format Type III Codes */
|
|
||||||
#define AUDIO_FORMAT_TYPE_III_UNDEFINED 0x2000
|
|
||||||
#define AUDIO_FORMAT_IEC1937_AC3 0x2001
|
|
||||||
#define AUDIO_FORMAT_IEC1937_MPEG1_L1 0x2002
|
|
||||||
#define AUDIO_FORMAT_IEC1937_MPEG1_L2_3 0x2003
|
|
||||||
#define AUDIO_FORMAT_IEC1937_MPEG2_NOEXT 0x2003
|
|
||||||
#define AUDIO_FORMAT_IEC1937_MPEG2_EXT 0x2004
|
|
||||||
#define AUDIO_FORMAT_IEC1937_MPEG2_L1_LS 0x2005
|
|
||||||
#define AUDIO_FORMAT_IEC1937_MPEG2_L2_3 0x2006
|
|
||||||
|
|
||||||
|
|
||||||
/* Predefined Audio Channel Configuration Bits */
|
|
||||||
#define AUDIO_CHANNEL_M 0x0000 /* Mono */
|
|
||||||
#define AUDIO_CHANNEL_L 0x0001 /* Left Front */
|
|
||||||
#define AUDIO_CHANNEL_R 0x0002 /* Right Front */
|
|
||||||
#define AUDIO_CHANNEL_C 0x0004 /* Center Front */
|
|
||||||
#define AUDIO_CHANNEL_LFE 0x0008 /* Low Freq. Enhance. */
|
|
||||||
#define AUDIO_CHANNEL_LS 0x0010 /* Left Surround */
|
|
||||||
#define AUDIO_CHANNEL_RS 0x0020 /* Right Surround */
|
|
||||||
#define AUDIO_CHANNEL_LC 0x0040 /* Left of Center */
|
|
||||||
#define AUDIO_CHANNEL_RC 0x0080 /* Right of Center */
|
|
||||||
#define AUDIO_CHANNEL_S 0x0100 /* Surround */
|
|
||||||
#define AUDIO_CHANNEL_SL 0x0200 /* Side Left */
|
|
||||||
#define AUDIO_CHANNEL_SR 0x0400 /* Side Right */
|
|
||||||
#define AUDIO_CHANNEL_T 0x0800 /* Top */
|
|
||||||
|
|
||||||
|
|
||||||
/* Feature Unit Control Bits */
|
|
||||||
#define AUDIO_CONTROL_MUTE 0x0001
|
|
||||||
#define AUDIO_CONTROL_VOLUME 0x0002
|
|
||||||
#define AUDIO_CONTROL_BASS 0x0004
|
|
||||||
#define AUDIO_CONTROL_MID 0x0008
|
|
||||||
#define AUDIO_CONTROL_TREBLE 0x0010
|
|
||||||
#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020
|
|
||||||
#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040
|
|
||||||
#define AUDIO_CONTROL_DEALY 0x0080
|
|
||||||
#define AUDIO_CONTROL_BASS_BOOST 0x0100
|
|
||||||
#define AUDIO_CONTROL_LOUDNESS 0x0200
|
|
||||||
|
|
||||||
/* Processing Unit Control Bits: */
|
|
||||||
#define AUDIO_CONTROL_ENABLE 0x0001 /* Common Bit */
|
|
||||||
#define AUDIO_CONTROL_MODE_SELECT 0x0002 /* Common Bit */
|
|
||||||
|
|
||||||
/* - Up/Down-mix Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
/* AUDIO_CONTROL_MODE_SELECT 0x0002 Common Bit */
|
|
||||||
|
|
||||||
/* - Dolby Prologic Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
/* AUDIO_CONTROL_MODE_SELECT 0x0002 Common Bit */
|
|
||||||
|
|
||||||
/* - 3D Stereo Extender Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
#define AUDIO_CONTROL_SPACIOUSNESS 0x0002
|
|
||||||
|
|
||||||
/* - Reverberation Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
#define AUDIO_CONTROL_REVERB_TYPE 0x0002
|
|
||||||
#define AUDIO_CONTROL_REVERB_LEVEL 0x0004
|
|
||||||
#define AUDIO_CONTROL_REVERB_TIME 0x0008
|
|
||||||
#define AUDIO_CONTROL_REVERB_FEEDBACK 0x0010
|
|
||||||
|
|
||||||
/* - Chorus Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
#define AUDIO_CONTROL_CHORUS_LEVEL 0x0002
|
|
||||||
#define AUDIO_CONTROL_SHORUS_RATE 0x0004
|
|
||||||
#define AUDIO_CONTROL_CHORUS_DEPTH 0x0008
|
|
||||||
|
|
||||||
/* - Dynamic Range Compressor Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
#define AUDIO_CONTROL_COMPRESSION_RATE 0x0002
|
|
||||||
#define AUDIO_CONTROL_MAX_AMPL 0x0004
|
|
||||||
#define AUDIO_CONTROL_THRESHOLD 0x0008
|
|
||||||
#define AUDIO_CONTROL_ATTACK_TIME 0x0010
|
|
||||||
#define AUDIO_CONTROL_RELEASE_TIME 0x0020
|
|
||||||
|
|
||||||
/* Extension Unit Control Bits */
|
|
||||||
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
|
|
||||||
|
|
||||||
/* Endpoint Control Bits */
|
|
||||||
#define AUDIO_CONTROL_SAMPLING_FREQ 0x01
|
|
||||||
#define AUDIO_CONTROL_PITCH 0x02
|
|
||||||
#define AUDIO_MAX_PACKETS_ONLY 0x80
|
|
||||||
|
|
||||||
|
|
||||||
/* Audio Terminal Types */
|
|
||||||
|
|
||||||
/* USB Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_USB_UNDEFINED 0x0100
|
|
||||||
#define AUDIO_TERMINAL_USB_STREAMING 0x0101
|
|
||||||
#define AUDIO_TERMINAL_USB_VENDOR_SPECIFIC 0x01FF
|
|
||||||
|
|
||||||
/* Input Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_INPUT_UNDEFINED 0x0200
|
|
||||||
#define AUDIO_TERMINAL_MICROPHONE 0x0201
|
|
||||||
#define AUDIO_TERMINAL_DESKTOP_MICROPHONE 0x0202
|
|
||||||
#define AUDIO_TERMINAL_PERSONAL_MICROPHONE 0x0203
|
|
||||||
#define AUDIO_TERMINAL_OMNI_DIR_MICROPHONE 0x0204
|
|
||||||
#define AUDIO_TERMINAL_MICROPHONE_ARRAY 0x0205
|
|
||||||
#define AUDIO_TERMINAL_PROCESSING_MIC_ARRAY 0x0206
|
|
||||||
|
|
||||||
/* Output Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_OUTPUT_UNDEFINED 0x0300
|
|
||||||
#define AUDIO_TERMINAL_SPEAKER 0x0301
|
|
||||||
#define AUDIO_TERMINAL_HEADPHONES 0x0302
|
|
||||||
#define AUDIO_TERMINAL_HEAD_MOUNTED_AUDIO 0x0303
|
|
||||||
#define AUDIO_TERMINAL_DESKTOP_SPEAKER 0x0304
|
|
||||||
#define AUDIO_TERMINAL_ROOM_SPEAKER 0x0305
|
|
||||||
#define AUDIO_TERMINAL_COMMUNICATION_SPEAKER 0x0306
|
|
||||||
#define AUDIO_TERMINAL_LOW_FREQ_SPEAKER 0x0307
|
|
||||||
|
|
||||||
/* Bi-directional Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED 0x0400
|
|
||||||
#define AUDIO_TERMINAL_HANDSET 0x0401
|
|
||||||
#define AUDIO_TERMINAL_HEAD_MOUNTED_HANDSET 0x0402
|
|
||||||
#define AUDIO_TERMINAL_SPEAKERPHONE 0x0403
|
|
||||||
#define AUDIO_TERMINAL_SPEAKERPHONE_ECHOSUPRESS 0x0404
|
|
||||||
#define AUDIO_TERMINAL_SPEAKERPHONE_ECHOCANCEL 0x0405
|
|
||||||
|
|
||||||
/* Telephony Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_TELEPHONY_UNDEFINED 0x0500
|
|
||||||
#define AUDIO_TERMINAL_PHONE_LINE 0x0501
|
|
||||||
#define AUDIO_TERMINAL_TELEPHONE 0x0502
|
|
||||||
#define AUDIO_TERMINAL_DOWN_LINE_PHONE 0x0503
|
|
||||||
|
|
||||||
/* External Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_EXTERNAL_UNDEFINED 0x0600
|
|
||||||
#define AUDIO_TERMINAL_ANALOG_CONNECTOR 0x0601
|
|
||||||
#define AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE 0x0602
|
|
||||||
#define AUDIO_TERMINAL_LINE_CONNECTOR 0x0603
|
|
||||||
#define AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR 0x0604
|
|
||||||
#define AUDIO_TERMINAL_SPDIF_INTERFACE 0x0605
|
|
||||||
#define AUDIO_TERMINAL_1394_DA_STREAM 0x0606
|
|
||||||
#define AUDIO_TERMINAL_1394_DA_STREAM_TRACK 0x0607
|
|
||||||
|
|
||||||
/* Embedded Function Terminal Types */
|
|
||||||
#define AUDIO_TERMINAL_EMBEDDED_UNDEFINED 0x0700
|
|
||||||
#define AUDIO_TERMINAL_CALIBRATION_NOISE 0x0701
|
|
||||||
#define AUDIO_TERMINAL_EQUALIZATION_NOISE 0x0702
|
|
||||||
#define AUDIO_TERMINAL_CD_PLAYER 0x0703
|
|
||||||
#define AUDIO_TERMINAL_DAT 0x0704
|
|
||||||
#define AUDIO_TERMINAL_DCC 0x0705
|
|
||||||
#define AUDIO_TERMINAL_MINI_DISK 0x0706
|
|
||||||
#define AUDIO_TERMINAL_ANALOG_TAPE 0x0707
|
|
||||||
#define AUDIO_TERMINAL_PHONOGRAPH 0x0708
|
|
||||||
#define AUDIO_TERMINAL_VCR_AUDIO 0x0709
|
|
||||||
#define AUDIO_TERMINAL_VIDEO_DISC_AUDIO 0x070A
|
|
||||||
#define AUDIO_TERMINAL_DVD_AUDIO 0x070B
|
|
||||||
#define AUDIO_TERMINAL_TV_TUNER_AUDIO 0x070C
|
|
||||||
#define AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO 0x070D
|
|
||||||
#define AUDIO_TERMINAL_CABLE_TUNER_AUDIO 0x070E
|
|
||||||
#define AUDIO_TERMINAL_DSS_AUDIO 0x070F
|
|
||||||
#define AUDIO_TERMINAL_RADIO_RECEIVER 0x0710
|
|
||||||
#define AUDIO_TERMINAL_RADIO_TRANSMITTER 0x0711
|
|
||||||
#define AUDIO_TERMINAL_MULTI_TRACK_RECORDER 0x0712
|
|
||||||
#define AUDIO_TERMINAL_SYNTHESIZER 0x0713
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __AUDIO_H__ */
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* Name: DEMO.H
|
|
||||||
* Purpose: USB Audio Demo Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Clock Definitions */
|
|
||||||
#define CPU_CLOCK 60000000 /* CPU Clock */
|
|
||||||
#define VPB_CLOCK (CPU_CLOCK/1) /* VPB Clock */
|
|
||||||
|
|
||||||
/* Audio Definitions */
|
|
||||||
#define DATA_FREQ 32000 /* Audio Data Frequency */
|
|
||||||
#define P_S 32 /* Packet Size */
|
|
||||||
#if USB_DMA
|
|
||||||
#define P_C 4 /* Packet Count */
|
|
||||||
#else
|
|
||||||
#define P_C 1 /* Packet Count */
|
|
||||||
#endif
|
|
||||||
#define B_S (8*P_C*P_S) /* Buffer Size */
|
|
||||||
|
|
||||||
/* Push Button Definitions */
|
|
||||||
#define PBINT 0x00004000 /* P0.14 */
|
|
||||||
|
|
||||||
/* LED Definitions */
|
|
||||||
#define LEDMSK 0x00FF0000 /* P1.16..23 */
|
|
||||||
|
|
||||||
/* Audio Demo Variables */
|
|
||||||
extern BYTE Mute; /* Mute State */
|
|
||||||
extern DWORD Volume; /* Volume Level */
|
|
||||||
extern WORD VolCur; /* Volume Current Value */
|
|
||||||
extern DWORD InfoBuf[P_C]; /* Packet Info Buffer */
|
|
||||||
extern short DataBuf[B_S]; /* Data Buffer */
|
|
||||||
extern WORD DataOut; /* Data Out Index */
|
|
||||||
extern WORD DataIn; /* Data In Index */
|
|
||||||
extern BYTE DataRun; /* Data Stream Run State */
|
|
|
@ -1,22 +0,0 @@
|
||||||
|
|
||||||
#ifndef __TYPE_H__
|
|
||||||
#define __TYPE_H__
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL ((void *)0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE (1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef unsigned char BYTE;
|
|
||||||
typedef unsigned short WORD;
|
|
||||||
typedef unsigned long DWORD;
|
|
||||||
//typedef unsigned int BOOL;
|
|
||||||
|
|
||||||
#endif /* __TYPE_H__ */
|
|
|
@ -1,431 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU USB HID devices
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include "../qemu-usb/vl.h"
|
|
||||||
|
|
||||||
/* HID interface requests */
|
|
||||||
#define GET_REPORT 0xa101
|
|
||||||
#define GET_IDLE 0xa102
|
|
||||||
#define GET_PROTOCOL 0xa103
|
|
||||||
#define SET_IDLE 0x210a
|
|
||||||
#define SET_PROTOCOL 0x210b
|
|
||||||
|
|
||||||
#define USB_MOUSE 1
|
|
||||||
#define USB_TABLET 2
|
|
||||||
|
|
||||||
#include "type.h"
|
|
||||||
|
|
||||||
#include "usb.h"
|
|
||||||
#include "audio.h"
|
|
||||||
#include "usbcfg.h"
|
|
||||||
#include "usbdesc.h"
|
|
||||||
|
|
||||||
typedef struct SINGSTARMICState {
|
|
||||||
USBDevice dev;
|
|
||||||
//nothing yet
|
|
||||||
} SINGSTARMICState;
|
|
||||||
|
|
||||||
/* descriptor dumped from a real singstar MIC adapter */
|
|
||||||
static const uint8_t singstar_mic_dev_descriptor[] = {
|
|
||||||
/* bLength */ 0x12, //(18)
|
|
||||||
/* bDescriptorType */ 0x01, //(1)
|
|
||||||
/* bcdUSB */ WBVAL(0x0110), //(272)
|
|
||||||
/* bDeviceClass */ 0x00, //(0)
|
|
||||||
/* bDeviceSubClass */ 0x00, //(0)
|
|
||||||
/* bDeviceProtocol */ 0x00, //(0)
|
|
||||||
/* bMaxPacketSize0 */ 0x08, //(8)
|
|
||||||
/* idVendor */ WBVAL(0x1415), //(5141)
|
|
||||||
/* idProduct */ WBVAL(0x0000), //(0)
|
|
||||||
/* bcdDevice */ WBVAL(0x0001), //(1)
|
|
||||||
/* iManufacturer */ 0x01, //(1)
|
|
||||||
/* iProduct */ 0x02, //(2)
|
|
||||||
/* iSerialNumber */ 0x00, //(0)
|
|
||||||
/* bNumConfigurations */ 0x01, //(1)
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t singstar_mic_config_descriptor[] = {
|
|
||||||
|
|
||||||
/* Configuration 1 */
|
|
||||||
0x09, /* bLength */
|
|
||||||
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
WBVAL(0x00b1), /* wTotalLength */
|
|
||||||
0x02, /* bNumInterfaces */
|
|
||||||
0x01, /* bConfigurationValue */
|
|
||||||
0x00, /* iConfiguration */
|
|
||||||
USB_CONFIG_BUS_POWERED, /* bmAttributes */
|
|
||||||
USB_CONFIG_POWER_MA(90), /* bMaxPower */
|
|
||||||
|
|
||||||
/* Interface 0, Alternate Setting 0, Audio Control */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x00, /* bInterfaceNumber */
|
|
||||||
0x00, /* bAlternateSetting */
|
|
||||||
0x00, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
|
|
||||||
/* Audio Control Interface */
|
|
||||||
AUDIO_CONTROL_INTERFACE_DESC_SZ(1), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */
|
|
||||||
WBVAL(0x0100), /* 1.00 */ /* bcdADC */
|
|
||||||
WBVAL(0x0028), /* wTotalLength */
|
|
||||||
0x01, /* bInCollection */
|
|
||||||
0x01, /* baInterfaceNr */
|
|
||||||
|
|
||||||
/* Audio Input Terminal */
|
|
||||||
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */
|
|
||||||
0x01, /* bTerminalID */
|
|
||||||
WBVAL(AUDIO_TERMINAL_MICROPHONE), /* wTerminalType */
|
|
||||||
0x02, /* bAssocTerminal */
|
|
||||||
0x02, /* bNrChannels */
|
|
||||||
WBVAL(AUDIO_CHANNEL_L
|
|
||||||
|AUDIO_CHANNEL_R), /* wChannelConfig */
|
|
||||||
0x00, /* iChannelNames */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
|
|
||||||
/* Audio Output Terminal */
|
|
||||||
AUDIO_OUTPUT_TERMINAL_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */
|
|
||||||
0x02, /* bTerminalID */
|
|
||||||
WBVAL(AUDIO_TERMINAL_USB_STREAMING), /* wTerminalType */
|
|
||||||
0x01, /* bAssocTerminal */
|
|
||||||
0x03, /* bSourceID */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
|
|
||||||
/* Audio Feature Unit */
|
|
||||||
AUDIO_FEATURE_UNIT_DESC_SZ(2,1), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */
|
|
||||||
0x03, /* bUnitID */
|
|
||||||
0x01, /* bSourceID */
|
|
||||||
0x01, /* bControlSize */
|
|
||||||
0x01, /* bmaControls(0) */
|
|
||||||
0x02, /* bmaControls(1) */
|
|
||||||
0x02, /* bmaControls(2) */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
|
|
||||||
/* Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x00, /* bAlternateSetting */
|
|
||||||
0x00, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
|
|
||||||
/* Interface 1, Alternate Setting 1, Audio Streaming - Operational */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x01, /* bAlternateSetting */
|
|
||||||
0x01, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
|
|
||||||
/* Audio Streaming Interface */
|
|
||||||
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */
|
|
||||||
0x02, /* bTerminalLink */
|
|
||||||
0x01, /* bDelay */
|
|
||||||
WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag */
|
|
||||||
|
|
||||||
/* Audio Type I Format */
|
|
||||||
AUDIO_FORMAT_TYPE_I_DESC_SZ(5), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */
|
|
||||||
AUDIO_FORMAT_TYPE_I, /* bFormatType */
|
|
||||||
0x01, /* bNrChannels */
|
|
||||||
0x02, /* bSubFrameSize */
|
|
||||||
0x10, /* bBitResolution */
|
|
||||||
0x05, /* bSamFreqType */
|
|
||||||
B3VAL(8000), /* tSamFreq 1 */
|
|
||||||
B3VAL(11025), /* tSamFreq 2 */
|
|
||||||
B3VAL(22050), /* tSamFreq 3 */
|
|
||||||
B3VAL(44100), /* tSamFreq 4 */
|
|
||||||
B3VAL(48000), /* tSamFreq 5 */
|
|
||||||
|
|
||||||
/* Endpoint - Standard Descriptor */
|
|
||||||
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
USB_ENDPOINT_OUT(0x81), /* bEndpointAddress */
|
|
||||||
USB_ENDPOINT_TYPE_ISOCHRONOUS
|
|
||||||
| USB_ENDPOINT_SYNC_ASYNCHRONOUS, /* bmAttributes */
|
|
||||||
WBVAL(0x0064), /* wMaxPacketSize */
|
|
||||||
0x01, /* bInterval */
|
|
||||||
0x00, /* bRefresh */
|
|
||||||
0x00, /* bSynchAddress */
|
|
||||||
|
|
||||||
/* Endpoint - Audio Streaming */
|
|
||||||
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_ENDPOINT_GENERAL, /* bDescriptor */
|
|
||||||
0x01, /* bmAttributes */
|
|
||||||
0x00, /* bLockDelayUnits */
|
|
||||||
WBVAL(0x0000), /* wLockDelay */
|
|
||||||
|
|
||||||
/* Interface 1, Alternate Setting 2, Audio Streaming - ? */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x02, /* bAlternateSetting */
|
|
||||||
0x01, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
|
|
||||||
/* Audio Streaming Interface */
|
|
||||||
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */
|
|
||||||
0x02, /* bTerminalLink */
|
|
||||||
0x01, /* bDelay */
|
|
||||||
WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag */
|
|
||||||
|
|
||||||
/* Audio Type I Format */
|
|
||||||
AUDIO_FORMAT_TYPE_I_DESC_SZ(5), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */
|
|
||||||
AUDIO_FORMAT_TYPE_I, /* bFormatType */
|
|
||||||
0x02, /* bNrChannels */
|
|
||||||
0x02, /* bSubFrameSize */
|
|
||||||
0x10, /* bBitResolution */
|
|
||||||
0x05, /* bSamFreqType */
|
|
||||||
B3VAL(8000), /* tSamFreq 1 */
|
|
||||||
B3VAL(11025), /* tSamFreq 2 */
|
|
||||||
B3VAL(22050), /* tSamFreq 3 */
|
|
||||||
B3VAL(44100), /* tSamFreq 4 */
|
|
||||||
B3VAL(48000), /* tSamFreq 5 */
|
|
||||||
|
|
||||||
/* Endpoint - Standard Descriptor */
|
|
||||||
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
USB_ENDPOINT_OUT(0x81), /* bEndpointAddress */
|
|
||||||
USB_ENDPOINT_TYPE_ISOCHRONOUS
|
|
||||||
| USB_ENDPOINT_SYNC_ASYNCHRONOUS, /* bmAttributes */
|
|
||||||
WBVAL(0x00c8), /* wMaxPacketSize */
|
|
||||||
0x01, /* bInterval */
|
|
||||||
0x00, /* bRefresh */
|
|
||||||
0x00, /* bSynchAddress */
|
|
||||||
|
|
||||||
/* Endpoint - Audio Streaming */
|
|
||||||
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_ENDPOINT_GENERAL, /* bDescriptor */
|
|
||||||
0x01, /* bmAttributes */
|
|
||||||
0x00, /* bLockDelayUnits */
|
|
||||||
WBVAL(0x0000), /* wLockDelay */
|
|
||||||
|
|
||||||
/* Terminator */
|
|
||||||
0 /* bLength */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void singstar_mic_handle_reset(USBDevice *dev)
|
|
||||||
{
|
|
||||||
/* XXX: do it */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int singstar_mic_handle_control(USBDevice *dev, int request, int value,
|
|
||||||
int index, int length, uint8_t *data)
|
|
||||||
{
|
|
||||||
SINGSTARMICState *s = (SINGSTARMICState *)dev;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
switch(request) {
|
|
||||||
case DeviceRequest | USB_REQ_GET_STATUS:
|
|
||||||
data[0] = (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
|
|
||||||
data[1] = 0x00;
|
|
||||||
ret = 2;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
|
|
||||||
if (value == USB_DEVICE_REMOTE_WAKEUP) {
|
|
||||||
dev->remote_wakeup = 0;
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_FEATURE:
|
|
||||||
if (value == USB_DEVICE_REMOTE_WAKEUP) {
|
|
||||||
dev->remote_wakeup = 1;
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_ADDRESS:
|
|
||||||
dev->addr = value;
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
|
|
||||||
switch(value >> 8) {
|
|
||||||
case USB_DT_DEVICE:
|
|
||||||
memcpy(data, singstar_mic_dev_descriptor,
|
|
||||||
sizeof(singstar_mic_dev_descriptor));
|
|
||||||
ret = sizeof(singstar_mic_dev_descriptor);
|
|
||||||
break;
|
|
||||||
case USB_DT_CONFIG:
|
|
||||||
memcpy(data, singstar_mic_config_descriptor,
|
|
||||||
sizeof(singstar_mic_config_descriptor));
|
|
||||||
ret = sizeof(singstar_mic_config_descriptor);
|
|
||||||
break;
|
|
||||||
case USB_DT_STRING:
|
|
||||||
switch(value & 0xff) {
|
|
||||||
case 0:
|
|
||||||
/* language ids */
|
|
||||||
data[0] = 4;
|
|
||||||
data[1] = 3;
|
|
||||||
data[2] = 0x09;
|
|
||||||
data[3] = 0x04;
|
|
||||||
ret = 4;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
/* serial number */
|
|
||||||
ret = set_usb_string(data, "3X0420811");
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
/* product description */
|
|
||||||
ret = set_usb_string(data, "EyeToy USB camera Namtai");
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
/* vendor description */
|
|
||||||
ret = set_usb_string(data, "PCSX2/QEMU");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_CONFIGURATION:
|
|
||||||
data[0] = 1;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_INTERFACE:
|
|
||||||
data[0] = 0;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_INTERFACE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
/* hid specific requests */
|
|
||||||
case InterfaceRequest | USB_REQ_GET_DESCRIPTOR:
|
|
||||||
//switch(value >> 8) {
|
|
||||||
//((case 0x22:
|
|
||||||
// memcpy(data, qemu_mouse_hid_report_descriptor,
|
|
||||||
// sizeof(qemu_mouse_hid_report_descriptor));
|
|
||||||
// ret = sizeof(qemu_mouse_hid_report_descriptor);
|
|
||||||
// break;
|
|
||||||
//default:
|
|
||||||
goto fail;
|
|
||||||
//}
|
|
||||||
break;
|
|
||||||
case GET_REPORT:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case SET_IDLE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int singstar_mic_handle_data(USBDevice *dev, int pid,
|
|
||||||
uint8_t devep, uint8_t *data, int len)
|
|
||||||
{
|
|
||||||
SINGSTARMICState *s = (SINGSTARMICState *)dev;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
switch(pid) {
|
|
||||||
case USB_TOKEN_IN:
|
|
||||||
if (devep == 1) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case USB_TOKEN_OUT:
|
|
||||||
default:
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void singstar_mic_handle_destroy(USBDevice *dev)
|
|
||||||
{
|
|
||||||
SINGSTARMICState *s = (SINGSTARMICState *)dev;
|
|
||||||
|
|
||||||
free(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
int singstar_mic_handle_packet(USBDevice *s, int pid,
|
|
||||||
uint8_t devaddr, uint8_t devep,
|
|
||||||
uint8_t *data, int len)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"usb-singstar_mic: packet received with pid=%x, devaddr=%x, devep=%x and len=%x\n",pid,devaddr,devep,len);
|
|
||||||
return usb_generic_handle_packet(s,pid,devaddr,devep,data,len);
|
|
||||||
}
|
|
||||||
|
|
||||||
USBDevice *singstar_mic_init()
|
|
||||||
{
|
|
||||||
SINGSTARMICState *s;
|
|
||||||
|
|
||||||
s = (SINGSTARMICState *)qemu_mallocz(sizeof(SINGSTARMICState));
|
|
||||||
if (!s)
|
|
||||||
return NULL;
|
|
||||||
s->dev.speed = USB_SPEED_FULL;
|
|
||||||
s->dev.handle_packet = singstar_mic_handle_packet;
|
|
||||||
s->dev.handle_reset = singstar_mic_handle_reset;
|
|
||||||
s->dev.handle_control = singstar_mic_handle_control;
|
|
||||||
s->dev.handle_data = singstar_mic_handle_data;
|
|
||||||
s->dev.handle_destroy = singstar_mic_handle_destroy;
|
|
||||||
|
|
||||||
strncpy(s->dev.devname, "EyeToy USB camera Namtai", sizeof(s->dev.devname));
|
|
||||||
|
|
||||||
return (USBDevice *)s;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,626 +0,0 @@
|
||||||
/*
|
|
||||||
* QEMU USB HID devices
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
#include "vl.h"
|
|
||||||
|
|
||||||
/* HID interface requests */
|
|
||||||
#define GET_REPORT 0xa101
|
|
||||||
#define GET_IDLE 0xa102
|
|
||||||
#define GET_PROTOCOL 0xa103
|
|
||||||
#define SET_IDLE 0x210a
|
|
||||||
#define SET_PROTOCOL 0x210b
|
|
||||||
|
|
||||||
#define USB_MOUSE 1
|
|
||||||
#define USB_TABLET 2
|
|
||||||
|
|
||||||
#include "type.h"
|
|
||||||
|
|
||||||
#include "usb.h"
|
|
||||||
#include "audio.h"
|
|
||||||
#include "usbcfg.h"
|
|
||||||
#include "usbdesc.h"
|
|
||||||
|
|
||||||
/* mostly the same values as the Bochs USB Mouse device */
|
|
||||||
static const uint8_t qemu_mic_dev_descriptor[] = {
|
|
||||||
sizeof(qemu_mic_dev_descriptor), /* bLength */
|
|
||||||
1, /* bDescriptorType */
|
|
||||||
WBVAL(0x0110), /* 1.10 */ /* bcdUSB */
|
|
||||||
0x00, /* bDeviceClass */
|
|
||||||
0x00, /* bDeviceSubClass */
|
|
||||||
0x00, /* bDeviceProtocol */
|
|
||||||
USB_MAX_PACKET0, /* bMaxPacketSize0 */
|
|
||||||
WBVAL(0xC251), /* idVendor */
|
|
||||||
WBVAL(0x1304), /* idProduct */
|
|
||||||
WBVAL(0x0100), /* 1.00 */ /* bcdDevice */
|
|
||||||
0x04, /* iManufacturer */
|
|
||||||
0x20, /* iProduct */
|
|
||||||
0x4A, /* iSerialNumber */
|
|
||||||
0x01 /* bNumConfigurations */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t qemu_mic_config_descriptor[] = {
|
|
||||||
/* Configuration 1 */
|
|
||||||
sizeof(qemu_mic_config_descriptor), /* bLength */
|
|
||||||
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
WBVAL( /* wTotalLength */
|
|
||||||
USB_CONFIGUARTION_DESC_SIZE +
|
|
||||||
USB_INTERFACE_DESC_SIZE +
|
|
||||||
AUDIO_CONTROL_INTERFACE_DESC_SZ(1) +
|
|
||||||
AUDIO_INPUT_TERMINAL_DESC_SIZE +
|
|
||||||
AUDIO_FEATURE_UNIT_DESC_SZ(1,1) +
|
|
||||||
AUDIO_OUTPUT_TERMINAL_DESC_SIZE +
|
|
||||||
USB_INTERFACE_DESC_SIZE +
|
|
||||||
USB_INTERFACE_DESC_SIZE +
|
|
||||||
AUDIO_STREAMING_INTERFACE_DESC_SIZE +
|
|
||||||
AUDIO_FORMAT_TYPE_I_DESC_SZ(1) +
|
|
||||||
AUDIO_STANDARD_ENDPOINT_DESC_SIZE +
|
|
||||||
AUDIO_STREAMING_ENDPOINT_DESC_SIZE
|
|
||||||
),
|
|
||||||
0x02, /* bNumInterfaces */
|
|
||||||
0x01, /* bConfigurationValue */
|
|
||||||
0x00, /* iConfiguration */
|
|
||||||
USB_CONFIG_BUS_POWERED, /* bmAttributes */
|
|
||||||
USB_CONFIG_POWER_MA(100), /* bMaxPower */
|
|
||||||
/* Interface 0, Alternate Setting 0, Audio Control */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x00, /* bInterfaceNumber */
|
|
||||||
0x00, /* bAlternateSetting */
|
|
||||||
0x00, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
/* Audio Control Interface */
|
|
||||||
AUDIO_CONTROL_INTERFACE_DESC_SZ(1), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */
|
|
||||||
WBVAL(0x0100), /* 1.00 */ /* bcdADC */
|
|
||||||
WBVAL( /* wTotalLength */
|
|
||||||
AUDIO_CONTROL_INTERFACE_DESC_SZ(1) +
|
|
||||||
AUDIO_INPUT_TERMINAL_DESC_SIZE +
|
|
||||||
AUDIO_FEATURE_UNIT_DESC_SZ(1,1) +
|
|
||||||
AUDIO_OUTPUT_TERMINAL_DESC_SIZE
|
|
||||||
),
|
|
||||||
0x01, /* bInCollection */
|
|
||||||
0x01, /* baInterfaceNr */
|
|
||||||
/* Audio Input Terminal */
|
|
||||||
AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */
|
|
||||||
0x01, /* bTerminalID */
|
|
||||||
WBVAL(AUDIO_TERMINAL_USB_STREAMING), /* wTerminalType */
|
|
||||||
0x00, /* bAssocTerminal */
|
|
||||||
0x01, /* bNrChannels */
|
|
||||||
WBVAL(AUDIO_CHANNEL_M), /* wChannelConfig */
|
|
||||||
0x00, /* iChannelNames */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
/* Audio Feature Unit */
|
|
||||||
AUDIO_FEATURE_UNIT_DESC_SZ(1,1), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */
|
|
||||||
0x02, /* bUnitID */
|
|
||||||
0x01, /* bSourceID */
|
|
||||||
0x01, /* bControlSize */
|
|
||||||
AUDIO_CONTROL_MUTE |
|
|
||||||
AUDIO_CONTROL_VOLUME, /* bmaControls(0) */
|
|
||||||
0x00, /* bmaControls(1) */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
/* Audio Output Terminal */
|
|
||||||
AUDIO_OUTPUT_TERMINAL_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */
|
|
||||||
0x03, /* bTerminalID */
|
|
||||||
WBVAL(AUDIO_TERMINAL_SPEAKER), /* wTerminalType */
|
|
||||||
0x00, /* bAssocTerminal */
|
|
||||||
0x02, /* bSourceID */
|
|
||||||
0x00, /* iTerminal */
|
|
||||||
/* Interface 1, Alternate Setting 0, Audio Streaming - Zero Bandwith */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x00, /* bAlternateSetting */
|
|
||||||
0x00, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
/* Interface 1, Alternate Setting 1, Audio Streaming - Operational */
|
|
||||||
USB_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
0x01, /* bInterfaceNumber */
|
|
||||||
0x01, /* bAlternateSetting */
|
|
||||||
0x01, /* bNumEndpoints */
|
|
||||||
USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */
|
|
||||||
AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */
|
|
||||||
AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */
|
|
||||||
0x00, /* iInterface */
|
|
||||||
/* Audio Streaming Interface */
|
|
||||||
AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */
|
|
||||||
0x01, /* bTerminalLink */
|
|
||||||
0x01, /* bDelay */
|
|
||||||
WBVAL(AUDIO_FORMAT_PCM), /* wFormatTag */
|
|
||||||
/* Audio Type I Format */
|
|
||||||
AUDIO_FORMAT_TYPE_I_DESC_SZ(1), /* bLength */
|
|
||||||
AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */
|
|
||||||
AUDIO_FORMAT_TYPE_I, /* bFormatType */
|
|
||||||
0x01, /* bNrChannels */
|
|
||||||
0x02, /* bSubFrameSize */
|
|
||||||
16, /* bBitResolution */
|
|
||||||
0x01, /* bSamFreqType */
|
|
||||||
B3VAL(32000), /* tSamFreq */
|
|
||||||
/* Endpoint - Standard Descriptor */
|
|
||||||
AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
USB_ENDPOINT_OUT(3), /* bEndpointAddress */
|
|
||||||
USB_ENDPOINT_TYPE_ISOCHRONOUS, /* bmAttributes */
|
|
||||||
WBVAL(64), /* wMaxPacketSize */
|
|
||||||
0x01, /* bInterval */
|
|
||||||
0x00, /* bRefresh */
|
|
||||||
0x00, /* bSynchAddress */
|
|
||||||
/* Endpoint - Audio Streaming */
|
|
||||||
AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */
|
|
||||||
AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
|
||||||
AUDIO_ENDPOINT_GENERAL, /* bDescriptor */
|
|
||||||
0x00, /* bmAttributes */
|
|
||||||
0x00, /* bLockDelayUnits */
|
|
||||||
WBVAL(0x0000), /* wLockDelay */
|
|
||||||
/* Terminator */
|
|
||||||
0 /* bLength */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t qemu_tablet_config_descriptor[] = {
|
|
||||||
/* one configuration */
|
|
||||||
0x09, /* u8 bLength; */
|
|
||||||
0x02, /* u8 bDescriptorType; Configuration */
|
|
||||||
0x22, 0x00, /* u16 wTotalLength; */
|
|
||||||
0x01, /* u8 bNumInterfaces; (1) */
|
|
||||||
0x01, /* u8 bConfigurationValue; */
|
|
||||||
0x04, /* u8 iConfiguration; */
|
|
||||||
0xa0, /* u8 bmAttributes;
|
|
||||||
Bit 7: must be set,
|
|
||||||
6: Self-powered,
|
|
||||||
5: Remote wakeup,
|
|
||||||
4..0: resvd */
|
|
||||||
50, /* u8 MaxPower; */
|
|
||||||
|
|
||||||
/* USB 1.1:
|
|
||||||
* USB 2.0, single TT organization (mandatory):
|
|
||||||
* one interface, protocol 0
|
|
||||||
*
|
|
||||||
* USB 2.0, multiple TT organization (optional):
|
|
||||||
* two interfaces, protocols 1 (like single TT)
|
|
||||||
* and 2 (multiple TT mode) ... config is
|
|
||||||
* sometimes settable
|
|
||||||
* NOT IMPLEMENTED
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* one interface */
|
|
||||||
0x09, /* u8 if_bLength; */
|
|
||||||
0x04, /* u8 if_bDescriptorType; Interface */
|
|
||||||
0x00, /* u8 if_bInterfaceNumber; */
|
|
||||||
0x00, /* u8 if_bAlternateSetting; */
|
|
||||||
0x01, /* u8 if_bNumEndpoints; */
|
|
||||||
0x03, /* u8 if_bInterfaceClass; */
|
|
||||||
0x01, /* u8 if_bInterfaceSubClass; */
|
|
||||||
0x02, /* u8 if_bInterfaceProtocol; [usb1.1 or single tt] */
|
|
||||||
0x05, /* u8 if_iInterface; */
|
|
||||||
|
|
||||||
/* HID descriptor */
|
|
||||||
0x09, /* u8 bLength; */
|
|
||||||
0x21, /* u8 bDescriptorType; */
|
|
||||||
0x01, 0x00, /* u16 HID_class */
|
|
||||||
0x00, /* u8 country_code */
|
|
||||||
0x01, /* u8 num_descriptors */
|
|
||||||
0x22, /* u8 type; Report */
|
|
||||||
74, 0, /* u16 len */
|
|
||||||
|
|
||||||
/* one endpoint (status change endpoint) */
|
|
||||||
0x07, /* u8 ep_bLength; */
|
|
||||||
0x05, /* u8 ep_bDescriptorType; Endpoint */
|
|
||||||
0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
|
|
||||||
0x03, /* u8 ep_bmAttributes; Interrupt */
|
|
||||||
0x08, 0x00, /* u16 ep_wMaxPacketSize; */
|
|
||||||
0x03, /* u8 ep_bInterval; (255ms -- usb 2.0 spec) */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t qemu_mouse_hid_report_descriptor[] = {
|
|
||||||
0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01,
|
|
||||||
0xA1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03,
|
|
||||||
0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01,
|
|
||||||
0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x01,
|
|
||||||
0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x15, 0x81,
|
|
||||||
0x25, 0x7F, 0x75, 0x08, 0x95, 0x02, 0x81, 0x06,
|
|
||||||
0xC0, 0xC0,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t qemu_tablet_hid_report_descriptor[] = {
|
|
||||||
0x05, 0x01, /* Usage Page Generic Desktop */
|
|
||||||
0x09, 0x01, /* Usage Mouse */
|
|
||||||
0xA1, 0x01, /* Collection Application */
|
|
||||||
0x09, 0x01, /* Usage Pointer */
|
|
||||||
0xA1, 0x00, /* Collection Physical */
|
|
||||||
0x05, 0x09, /* Usage Page Button */
|
|
||||||
0x19, 0x01, /* Usage Minimum Button 1 */
|
|
||||||
0x29, 0x03, /* Usage Maximum Button 3 */
|
|
||||||
0x15, 0x00, /* Logical Minimum 0 */
|
|
||||||
0x25, 0x01, /* Logical Maximum 1 */
|
|
||||||
0x95, 0x03, /* Report Count 3 */
|
|
||||||
0x75, 0x01, /* Report Size 1 */
|
|
||||||
0x81, 0x02, /* Input (Data, Var, Abs) */
|
|
||||||
0x95, 0x01, /* Report Count 1 */
|
|
||||||
0x75, 0x05, /* Report Size 5 */
|
|
||||||
0x81, 0x01, /* Input (Cnst, Var, Abs) */
|
|
||||||
0x05, 0x01, /* Usage Page Generic Desktop */
|
|
||||||
0x09, 0x30, /* Usage X */
|
|
||||||
0x09, 0x31, /* Usage Y */
|
|
||||||
0x15, 0x00, /* Logical Minimum 0 */
|
|
||||||
0x26, 0xFF, 0x7F, /* Logical Maximum 0x7fff */
|
|
||||||
0x35, 0x00, /* Physical Minimum 0 */
|
|
||||||
0x46, 0xFE, 0x7F, /* Physical Maximum 0x7fff */
|
|
||||||
0x75, 0x10, /* Report Size 16 */
|
|
||||||
0x95, 0x02, /* Report Count 2 */
|
|
||||||
0x81, 0x02, /* Input (Data, Var, Abs) */
|
|
||||||
0x05, 0x01, /* Usage Page Generic Desktop */
|
|
||||||
0x09, 0x38, /* Usage Wheel */
|
|
||||||
0x15, 0x81, /* Logical Minimum -127 */
|
|
||||||
0x25, 0x7F, /* Logical Maximum 127 */
|
|
||||||
0x35, 0x00, /* Physical Minimum 0 (same as logical) */
|
|
||||||
0x45, 0x00, /* Physical Maximum 0 (same as logical) */
|
|
||||||
0x75, 0x08, /* Report Size 8 */
|
|
||||||
0x95, 0x01, /* Report Count 1 */
|
|
||||||
0x81, 0x02, /* Input (Data, Var, Rel) */
|
|
||||||
0xC0, /* End Collection */
|
|
||||||
0xC0, /* End Collection */
|
|
||||||
};
|
|
||||||
|
|
||||||
static void usb_mouse_event(void *opaque,
|
|
||||||
int dx1, int dy1, int dz1, int buttons_state)
|
|
||||||
{
|
|
||||||
USBMouseState *s = opaque;
|
|
||||||
|
|
||||||
s->dx += dx1;
|
|
||||||
s->dy += dy1;
|
|
||||||
s->dz += dz1;
|
|
||||||
s->buttons_state = buttons_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_tablet_event(void *opaque,
|
|
||||||
int x, int y, int dz, int buttons_state)
|
|
||||||
{
|
|
||||||
USBMouseState *s = opaque;
|
|
||||||
|
|
||||||
s->x = x;
|
|
||||||
s->y = y;
|
|
||||||
s->dz += dz;
|
|
||||||
s->buttons_state = buttons_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int int_clamp(int val, int vmin, int vmax)
|
|
||||||
{
|
|
||||||
if (val < vmin)
|
|
||||||
return vmin;
|
|
||||||
else if (val > vmax)
|
|
||||||
return vmax;
|
|
||||||
else
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_mouse_poll(USBMouseState *s, uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
int dx, dy, dz, b, l;
|
|
||||||
|
|
||||||
if (!s->mouse_grabbed) {
|
|
||||||
qemu_add_mouse_event_handler(usb_mouse_event, s, 0);
|
|
||||||
s->mouse_grabbed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dx = int_clamp(s->dx, -128, 127);
|
|
||||||
dy = int_clamp(s->dy, -128, 127);
|
|
||||||
dz = int_clamp(s->dz, -128, 127);
|
|
||||||
|
|
||||||
s->dx -= dx;
|
|
||||||
s->dy -= dy;
|
|
||||||
s->dz -= dz;
|
|
||||||
|
|
||||||
b = 0;
|
|
||||||
if (s->buttons_state & MOUSE_EVENT_LBUTTON)
|
|
||||||
b |= 0x01;
|
|
||||||
if (s->buttons_state & MOUSE_EVENT_RBUTTON)
|
|
||||||
b |= 0x02;
|
|
||||||
if (s->buttons_state & MOUSE_EVENT_MBUTTON)
|
|
||||||
b |= 0x04;
|
|
||||||
|
|
||||||
buf[0] = b;
|
|
||||||
buf[1] = dx;
|
|
||||||
buf[2] = dy;
|
|
||||||
l = 3;
|
|
||||||
if (len >= 4) {
|
|
||||||
buf[3] = dz;
|
|
||||||
l = 4;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_tablet_poll(USBMouseState *s, uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
int dz, b, l;
|
|
||||||
|
|
||||||
if (!s->mouse_grabbed) {
|
|
||||||
qemu_add_mouse_event_handler(usb_tablet_event, s, 1);
|
|
||||||
s->mouse_grabbed = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dz = int_clamp(s->dz, -128, 127);
|
|
||||||
s->dz -= dz;
|
|
||||||
|
|
||||||
/* Appears we have to invert the wheel direction */
|
|
||||||
dz = 0 - dz;
|
|
||||||
b = 0;
|
|
||||||
if (s->buttons_state & MOUSE_EVENT_LBUTTON)
|
|
||||||
b |= 0x01;
|
|
||||||
if (s->buttons_state & MOUSE_EVENT_RBUTTON)
|
|
||||||
b |= 0x02;
|
|
||||||
if (s->buttons_state & MOUSE_EVENT_MBUTTON)
|
|
||||||
b |= 0x04;
|
|
||||||
|
|
||||||
buf[0] = b;
|
|
||||||
buf[1] = s->x & 0xff;
|
|
||||||
buf[2] = s->x >> 8;
|
|
||||||
buf[3] = s->y & 0xff;
|
|
||||||
buf[4] = s->y >> 8;
|
|
||||||
buf[5] = dz;
|
|
||||||
l = 6;
|
|
||||||
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_mouse_handle_reset(USBDevice *dev)
|
|
||||||
{
|
|
||||||
USBMouseState *s = (USBMouseState *)dev;
|
|
||||||
|
|
||||||
s->dx = 0;
|
|
||||||
s->dy = 0;
|
|
||||||
s->dz = 0;
|
|
||||||
s->x = 0;
|
|
||||||
s->y = 0;
|
|
||||||
s->buttons_state = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_mouse_handle_control(USBDevice *dev, int request, int value,
|
|
||||||
int index, int length, uint8_t *data)
|
|
||||||
{
|
|
||||||
USBMouseState *s = (USBMouseState *)dev;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
switch(request) {
|
|
||||||
case DeviceRequest | USB_REQ_GET_STATUS:
|
|
||||||
data[0] = (1 << USB_DEVICE_SELF_POWERED) |
|
|
||||||
(dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
|
|
||||||
data[1] = 0x00;
|
|
||||||
ret = 2;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
|
|
||||||
if (value == USB_DEVICE_REMOTE_WAKEUP) {
|
|
||||||
dev->remote_wakeup = 0;
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_FEATURE:
|
|
||||||
if (value == USB_DEVICE_REMOTE_WAKEUP) {
|
|
||||||
dev->remote_wakeup = 1;
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_ADDRESS:
|
|
||||||
dev->addr = value;
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
|
|
||||||
switch(value >> 8) {
|
|
||||||
case USB_DT_DEVICE:
|
|
||||||
memcpy(data, qemu_mouse_dev_descriptor,
|
|
||||||
sizeof(qemu_mouse_dev_descriptor));
|
|
||||||
ret = sizeof(qemu_mouse_dev_descriptor);
|
|
||||||
break;
|
|
||||||
case USB_DT_CONFIG:
|
|
||||||
if (s->kind == USB_MOUSE) {
|
|
||||||
memcpy(data, qemu_mouse_config_descriptor,
|
|
||||||
sizeof(qemu_mouse_config_descriptor));
|
|
||||||
ret = sizeof(qemu_mouse_config_descriptor);
|
|
||||||
} else if (s->kind == USB_TABLET) {
|
|
||||||
memcpy(data, qemu_tablet_config_descriptor,
|
|
||||||
sizeof(qemu_tablet_config_descriptor));
|
|
||||||
ret = sizeof(qemu_tablet_config_descriptor);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case USB_DT_STRING:
|
|
||||||
switch(value & 0xff) {
|
|
||||||
case 0:
|
|
||||||
/* language ids */
|
|
||||||
data[0] = 4;
|
|
||||||
data[1] = 3;
|
|
||||||
data[2] = 0x09;
|
|
||||||
data[3] = 0x04;
|
|
||||||
ret = 4;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
/* serial number */
|
|
||||||
ret = set_usb_string(data, "1");
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
/* product description */
|
|
||||||
if (s->kind == USB_MOUSE)
|
|
||||||
ret = set_usb_string(data, "QEMU USB Mouse");
|
|
||||||
else if (s->kind == USB_TABLET)
|
|
||||||
ret = set_usb_string(data, "QEMU USB Tablet");
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
/* vendor description */
|
|
||||||
ret = set_usb_string(data, "PCSX2/QEMU");
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
ret = set_usb_string(data, "HID Mouse");
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
ret = set_usb_string(data, "Endpoint1 Interrupt Pipe");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_CONFIGURATION:
|
|
||||||
data[0] = 1;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
case DeviceRequest | USB_REQ_GET_INTERFACE:
|
|
||||||
data[0] = 0;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
case DeviceOutRequest | USB_REQ_SET_INTERFACE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
/* hid specific requests */
|
|
||||||
case InterfaceRequest | USB_REQ_GET_DESCRIPTOR:
|
|
||||||
switch(value >> 8) {
|
|
||||||
case 0x22:
|
|
||||||
if (s->kind == USB_MOUSE) {
|
|
||||||
memcpy(data, qemu_mouse_hid_report_descriptor,
|
|
||||||
sizeof(qemu_mouse_hid_report_descriptor));
|
|
||||||
ret = sizeof(qemu_mouse_hid_report_descriptor);
|
|
||||||
} else if (s->kind == USB_TABLET) {
|
|
||||||
memcpy(data, qemu_tablet_hid_report_descriptor,
|
|
||||||
sizeof(qemu_tablet_hid_report_descriptor));
|
|
||||||
ret = sizeof(qemu_tablet_hid_report_descriptor);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GET_REPORT:
|
|
||||||
if (s->kind == USB_MOUSE)
|
|
||||||
ret = usb_mouse_poll(s, data, length);
|
|
||||||
else if (s->kind == USB_TABLET)
|
|
||||||
ret = usb_tablet_poll(s, data, length);
|
|
||||||
break;
|
|
||||||
case SET_IDLE:
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_mouse_handle_data(USBDevice *dev, int pid,
|
|
||||||
uint8_t devep, uint8_t *data, int len)
|
|
||||||
{
|
|
||||||
USBMouseState *s = (USBMouseState *)dev;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
switch(pid) {
|
|
||||||
case USB_TOKEN_IN:
|
|
||||||
if (devep == 1) {
|
|
||||||
if (s->kind == USB_MOUSE)
|
|
||||||
ret = usb_mouse_poll(s, data, len);
|
|
||||||
else if (s->kind == USB_TABLET)
|
|
||||||
ret = usb_tablet_poll(s, data, len);
|
|
||||||
} else {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case USB_TOKEN_OUT:
|
|
||||||
default:
|
|
||||||
fail:
|
|
||||||
ret = USB_RET_STALL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_mouse_handle_destroy(USBDevice *dev)
|
|
||||||
{
|
|
||||||
USBMouseState *s = (USBMouseState *)dev;
|
|
||||||
|
|
||||||
qemu_add_mouse_event_handler(NULL, NULL, 0);
|
|
||||||
free(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
USBDevice *usb_tablet_init(void)
|
|
||||||
{
|
|
||||||
USBMouseState *s;
|
|
||||||
|
|
||||||
s = qemu_mallocz(sizeof(USBMouseState));
|
|
||||||
if (!s)
|
|
||||||
return NULL;
|
|
||||||
s->dev.speed = USB_SPEED_FULL;
|
|
||||||
s->dev.handle_packet = usb_generic_handle_packet;
|
|
||||||
|
|
||||||
s->dev.handle_reset = usb_mouse_handle_reset;
|
|
||||||
s->dev.handle_control = usb_mouse_handle_control;
|
|
||||||
s->dev.handle_data = usb_mouse_handle_data;
|
|
||||||
s->dev.handle_destroy = usb_mouse_handle_destroy;
|
|
||||||
s->kind = USB_TABLET;
|
|
||||||
|
|
||||||
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
|
|
||||||
|
|
||||||
return (USBDevice *)s;
|
|
||||||
}
|
|
||||||
|
|
||||||
USBDevice *usb_mouse_init(void)
|
|
||||||
{
|
|
||||||
USBMouseState *s;
|
|
||||||
|
|
||||||
s = qemu_mallocz(sizeof(USBMouseState));
|
|
||||||
if (!s)
|
|
||||||
return NULL;
|
|
||||||
s->dev.speed = USB_SPEED_FULL;
|
|
||||||
s->dev.handle_packet = usb_generic_handle_packet;
|
|
||||||
|
|
||||||
s->dev.handle_reset = usb_mouse_handle_reset;
|
|
||||||
s->dev.handle_control = usb_mouse_handle_control;
|
|
||||||
s->dev.handle_data = usb_mouse_handle_data;
|
|
||||||
s->dev.handle_destroy = usb_mouse_handle_destroy;
|
|
||||||
s->kind = USB_MOUSE;
|
|
||||||
|
|
||||||
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
|
|
||||||
|
|
||||||
return (USBDevice *)s;
|
|
||||||
}
|
|
|
@ -1,230 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: USB.H
|
|
||||||
* Purpose: USB Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USB_H__
|
|
||||||
#define __USB_H__
|
|
||||||
|
|
||||||
|
|
||||||
#pragma pack(1)
|
|
||||||
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
WORD W;
|
|
||||||
struct {
|
|
||||||
BYTE L;
|
|
||||||
BYTE H;
|
|
||||||
} WB;
|
|
||||||
} WORD_BYTE;
|
|
||||||
|
|
||||||
|
|
||||||
/* bmRequestType.Dir */
|
|
||||||
#define REQUEST_HOST_TO_DEVICE 0
|
|
||||||
#define REQUEST_DEVICE_TO_HOST 1
|
|
||||||
|
|
||||||
/* bmRequestType.Type */
|
|
||||||
#define REQUEST_STANDARD 0
|
|
||||||
#define REQUEST_CLASS 1
|
|
||||||
#define REQUEST_VENDOR 2
|
|
||||||
#define REQUEST_RESERVED 3
|
|
||||||
|
|
||||||
/* bmRequestType.Recipient */
|
|
||||||
#define REQUEST_TO_DEVICE 0
|
|
||||||
#define REQUEST_TO_INTERFACE 1
|
|
||||||
#define REQUEST_TO_ENDPOINT 2
|
|
||||||
#define REQUEST_TO_OTHER 3
|
|
||||||
|
|
||||||
/* bmRequestType Definition */
|
|
||||||
typedef union _REQUEST_TYPE {
|
|
||||||
struct _BM {
|
|
||||||
BYTE Recipient : 5;
|
|
||||||
BYTE Type : 2;
|
|
||||||
BYTE Dir : 1;
|
|
||||||
} BM;
|
|
||||||
BYTE B;
|
|
||||||
} REQUEST_TYPE;
|
|
||||||
|
|
||||||
/* USB Standard Request Codes */
|
|
||||||
#define USB_REQUEST_GET_STATUS 0
|
|
||||||
#define USB_REQUEST_CLEAR_FEATURE 1
|
|
||||||
#define USB_REQUEST_SET_FEATURE 3
|
|
||||||
#define USB_REQUEST_SET_ADDRESS 5
|
|
||||||
#define USB_REQUEST_GET_DESCRIPTOR 6
|
|
||||||
#define USB_REQUEST_SET_DESCRIPTOR 7
|
|
||||||
#define USB_REQUEST_GET_CONFIGURATION 8
|
|
||||||
#define USB_REQUEST_SET_CONFIGURATION 9
|
|
||||||
#define USB_REQUEST_GET_INTERFACE 10
|
|
||||||
#define USB_REQUEST_SET_INTERFACE 11
|
|
||||||
#define USB_REQUEST_SYNC_FRAME 12
|
|
||||||
|
|
||||||
/* USB GET_STATUS Bit Values */
|
|
||||||
#define USB_GETSTATUS_SELF_POWERED 0x01
|
|
||||||
#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
|
|
||||||
#define USB_GETSTATUS_ENDPOINT_STALL 0x01
|
|
||||||
|
|
||||||
/* USB Standard Feature selectors */
|
|
||||||
#define USB_FEATURE_ENDPOINT_STALL 0
|
|
||||||
#define USB_FEATURE_REMOTE_WAKEUP 1
|
|
||||||
|
|
||||||
/* USB Default Control Pipe Setup Packet */
|
|
||||||
typedef struct _USB_SETUP_PACKET {
|
|
||||||
REQUEST_TYPE bmRequestType;
|
|
||||||
BYTE bRequest;
|
|
||||||
WORD_BYTE wValue;
|
|
||||||
WORD_BYTE wIndex;
|
|
||||||
WORD wLength;
|
|
||||||
} USB_SETUP_PACKET;
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Descriptor Types */
|
|
||||||
#define USB_DEVICE_DESCRIPTOR_TYPE 1
|
|
||||||
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
|
|
||||||
#define USB_STRING_DESCRIPTOR_TYPE 3
|
|
||||||
#define USB_INTERFACE_DESCRIPTOR_TYPE 4
|
|
||||||
#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
|
|
||||||
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6
|
|
||||||
#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
|
|
||||||
#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8
|
|
||||||
|
|
||||||
/* USB Device Classes */
|
|
||||||
#define USB_DEVICE_CLASS_RESERVED 0x00
|
|
||||||
#define USB_DEVICE_CLASS_AUDIO 0x01
|
|
||||||
#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
|
|
||||||
#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
|
|
||||||
#define USB_DEVICE_CLASS_MONITOR 0x04
|
|
||||||
#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
|
|
||||||
#define USB_DEVICE_CLASS_POWER 0x06
|
|
||||||
#define USB_DEVICE_CLASS_PRINTER 0x07
|
|
||||||
#define USB_DEVICE_CLASS_STORAGE 0x08
|
|
||||||
#define USB_DEVICE_CLASS_HUB 0x09
|
|
||||||
#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
|
|
||||||
|
|
||||||
/* bmAttributes in Configuration Descriptor */
|
|
||||||
#define USB_CONFIG_POWERED_MASK 0xC0
|
|
||||||
#define USB_CONFIG_BUS_POWERED 0x80
|
|
||||||
#define USB_CONFIG_SELF_POWERED 0x40
|
|
||||||
#define USB_CONFIG_REMOTE_WAKEUP 0x20
|
|
||||||
|
|
||||||
/* bMaxPower in Configuration Descriptor */
|
|
||||||
#define USB_CONFIG_POWER_MA(mA) ((mA)/2)
|
|
||||||
|
|
||||||
/* bEndpointAddress in Endpoint Descriptor */
|
|
||||||
#define USB_ENDPOINT_DIRECTION_MASK 0x80
|
|
||||||
#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
|
|
||||||
#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
|
|
||||||
|
|
||||||
/* bmAttributes in Endpoint Descriptor */
|
|
||||||
#define USB_ENDPOINT_TYPE_MASK 0x03
|
|
||||||
#define USB_ENDPOINT_TYPE_CONTROL 0x00
|
|
||||||
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
|
|
||||||
#define USB_ENDPOINT_TYPE_BULK 0x02
|
|
||||||
#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
|
|
||||||
#define USB_ENDPOINT_SYNC_MASK 0x0C
|
|
||||||
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00
|
|
||||||
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04
|
|
||||||
#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08
|
|
||||||
#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C
|
|
||||||
#define USB_ENDPOINT_USAGE_MASK 0x30
|
|
||||||
#define USB_ENDPOINT_USAGE_DATA 0x00
|
|
||||||
#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
|
|
||||||
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20
|
|
||||||
#define USB_ENDPOINT_USAGE_RESERVED 0x30
|
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
|
||||||
typedef struct _USB_DEVICE_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
WORD bcdUSB;
|
|
||||||
BYTE bDeviceClass;
|
|
||||||
BYTE bDeviceSubClass;
|
|
||||||
BYTE bDeviceProtocol;
|
|
||||||
BYTE bMaxPacketSize0;
|
|
||||||
WORD idVendor;
|
|
||||||
WORD idProduct;
|
|
||||||
WORD bcdDevice;
|
|
||||||
BYTE iManufacturer;
|
|
||||||
BYTE iProduct;
|
|
||||||
BYTE iSerialNumber;
|
|
||||||
BYTE bNumConfigurations;
|
|
||||||
} USB_DEVICE_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB 2.0 Device Qualifier Descriptor */
|
|
||||||
typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
WORD bcdUSB;
|
|
||||||
BYTE bDeviceClass;
|
|
||||||
BYTE bDeviceSubClass;
|
|
||||||
BYTE bDeviceProtocol;
|
|
||||||
BYTE bMaxPacketSize0;
|
|
||||||
BYTE bNumConfigurations;
|
|
||||||
BYTE bReserved;
|
|
||||||
} USB_DEVICE_QUALIFIER_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB Standard Configuration Descriptor */
|
|
||||||
typedef struct _USB_CONFIGURATION_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
WORD wTotalLength;
|
|
||||||
BYTE bNumInterfaces;
|
|
||||||
BYTE bConfigurationValue;
|
|
||||||
BYTE iConfiguration;
|
|
||||||
BYTE bmAttributes;
|
|
||||||
BYTE MaxPower;
|
|
||||||
} USB_CONFIGURATION_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB Standard Interface Descriptor */
|
|
||||||
typedef struct _USB_INTERFACE_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
BYTE bInterfaceNumber;
|
|
||||||
BYTE bAlternateSetting;
|
|
||||||
BYTE bNumEndpoints;
|
|
||||||
BYTE bInterfaceClass;
|
|
||||||
BYTE bInterfaceSubClass;
|
|
||||||
BYTE bInterfaceProtocol;
|
|
||||||
BYTE iInterface;
|
|
||||||
} USB_INTERFACE_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB Standard Endpoint Descriptor */
|
|
||||||
typedef struct _USB_ENDPOINT_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
BYTE bEndpointAddress;
|
|
||||||
BYTE bmAttributes;
|
|
||||||
WORD wMaxPacketSize;
|
|
||||||
BYTE bInterval;
|
|
||||||
} USB_ENDPOINT_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB String Descriptor */
|
|
||||||
typedef struct _USB_STRING_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
WORD bString/*[]*/;
|
|
||||||
} USB_STRING_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB Common Descriptor */
|
|
||||||
typedef struct _USB_COMMON_DESCRIPTOR {
|
|
||||||
BYTE bLength;
|
|
||||||
BYTE bDescriptorType;
|
|
||||||
} USB_COMMON_DESCRIPTOR;
|
|
||||||
|
|
||||||
|
|
||||||
#pragma pack()
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USB_H__ */
|
|
|
@ -1,161 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: USBCFG.H
|
|
||||||
* Purpose: USB Custom Configuration
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBCFG_H__
|
|
||||||
#define __USBCFG_H__
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
//*** <<< Use Configuration Wizard in Context Menu >>> ***
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// <h> USB Configuration
|
|
||||||
// <o0> USB Power
|
|
||||||
// <i> Default Power Setting
|
|
||||||
// <0=> Bus-powered
|
|
||||||
// <1=> Self-powered
|
|
||||||
// <o1> Max Number of Interfaces <1-256>
|
|
||||||
// <o2> Max Number of Endpoints <1-32>
|
|
||||||
// <o3> Max Endpoint 0 Packet Size
|
|
||||||
// <8=> 8 Bytes <16=> 16 Bytes <32=> 32 Bytes <64=> 64 Bytes
|
|
||||||
// <e4> DMA Transfer
|
|
||||||
// <i> Use DMA for selected Endpoints
|
|
||||||
// <o5.0> Endpoint 0 Out
|
|
||||||
// <o5.1> Endpoint 0 In
|
|
||||||
// <o5.2> Endpoint 1 Out
|
|
||||||
// <o5.3> Endpoint 1 In
|
|
||||||
// <o5.4> Endpoint 2 Out
|
|
||||||
// <o5.5> Endpoint 2 In
|
|
||||||
// <o5.6> Endpoint 3 Out
|
|
||||||
// <o5.7> Endpoint 3 In
|
|
||||||
// <o5.8> Endpoint 4 Out
|
|
||||||
// <o5.9> Endpoint 4 In
|
|
||||||
// <o5.10> Endpoint 5 Out
|
|
||||||
// <o5.11> Endpoint 5 In
|
|
||||||
// <o5.12> Endpoint 6 Out
|
|
||||||
// <o5.13> Endpoint 6 In
|
|
||||||
// <o5.14> Endpoint 7 Out
|
|
||||||
// <o5.15> Endpoint 7 In
|
|
||||||
// <o5.16> Endpoint 8 Out
|
|
||||||
// <o5.17> Endpoint 8 In
|
|
||||||
// <o5.18> Endpoint 9 Out
|
|
||||||
// <o5.19> Endpoint 9 In
|
|
||||||
// <o5.20> Endpoint 10 Out
|
|
||||||
// <o5.21> Endpoint 10 In
|
|
||||||
// <o5.22> Endpoint 11 Out
|
|
||||||
// <o5.23> Endpoint 11 In
|
|
||||||
// <o5.24> Endpoint 12 Out
|
|
||||||
// <o5.25> Endpoint 12 In
|
|
||||||
// <o5.26> Endpoint 13 Out
|
|
||||||
// <o5.27> Endpoint 13 In
|
|
||||||
// <o5.28> Endpoint 14 Out
|
|
||||||
// <o5.29> Endpoint 14 In
|
|
||||||
// <o5.30> Endpoint 15 Out
|
|
||||||
// <o5.31> Endpoint 15 In
|
|
||||||
// </e>
|
|
||||||
// </h>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define USB_POWER 0
|
|
||||||
#define USB_IF_NUM 4
|
|
||||||
#define USB_EP_NUM 32
|
|
||||||
#define USB_MAX_PACKET0 64
|
|
||||||
#define USB_DMA 0
|
|
||||||
#define USB_DMA_EP 0x00000040
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// <h> USB Event Handlers
|
|
||||||
// <h> Device Events
|
|
||||||
// <o0.0> Power Event
|
|
||||||
// <o1.0> Reset Event
|
|
||||||
// <o2.0> Suspend Event
|
|
||||||
// <o3.0> Resume Event
|
|
||||||
// <o4.0> Remote Wakeup Event
|
|
||||||
// <o5.0> Start of Frame Event
|
|
||||||
// <o6.0> Error Event
|
|
||||||
// </h>
|
|
||||||
// <h> Endpoint Events
|
|
||||||
// <o7.0> Endpoint 0 Event
|
|
||||||
// <o7.1> Endpoint 1 Event
|
|
||||||
// <o7.2> Endpoint 2 Event
|
|
||||||
// <o7.3> Endpoint 3 Event
|
|
||||||
// <o7.4> Endpoint 4 Event
|
|
||||||
// <o7.5> Endpoint 5 Event
|
|
||||||
// <o7.6> Endpoint 6 Event
|
|
||||||
// <o7.7> Endpoint 7 Event
|
|
||||||
// <o7.8> Endpoint 8 Event
|
|
||||||
// <o7.9> Endpoint 9 Event
|
|
||||||
// <o7.10> Endpoint 10 Event
|
|
||||||
// <o7.11> Endpoint 11 Event
|
|
||||||
// <o7.12> Endpoint 12 Event
|
|
||||||
// <o7.13> Endpoint 13 Event
|
|
||||||
// <o7.14> Endpoint 14 Event
|
|
||||||
// <o7.15> Endpoint 15 Event
|
|
||||||
// </h>
|
|
||||||
// <h> USB Core Events
|
|
||||||
// <o8.0> Set Configuration Event
|
|
||||||
// <o9.0> Set Interface Event
|
|
||||||
// <o10.0> Set/Clear Feature Event
|
|
||||||
// </h>
|
|
||||||
// </h>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define USB_POWER_EVENT 0
|
|
||||||
#define USB_RESET_EVENT 1
|
|
||||||
#define USB_SUSPEND_EVENT 0
|
|
||||||
#define USB_RESUME_EVENT 0
|
|
||||||
#define USB_WAKEUP_EVENT 0
|
|
||||||
#define USB_SOF_EVENT 1
|
|
||||||
#define USB_ERROR_EVENT 0
|
|
||||||
#define USB_EP_EVENT 0x0009
|
|
||||||
#define USB_CONFIGURE_EVENT 0
|
|
||||||
#define USB_INTERFACE_EVENT 0
|
|
||||||
#define USB_FEATURE_EVENT 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// <e0> USB Class Support
|
|
||||||
// <e1> Human Interface Device (HID)
|
|
||||||
// <o2> Interface Number <0-255>
|
|
||||||
// </e>
|
|
||||||
// <e3> Mass Storage
|
|
||||||
// <o4> Interface Number <0-255>
|
|
||||||
// </e>
|
|
||||||
// <e5> Audio Device
|
|
||||||
// <o6> Control Interface Number <0-255>
|
|
||||||
// <o7> Streaming Interface 1 Number <0-255>
|
|
||||||
// <o8> Streaming Interface 2 Number <0-255>
|
|
||||||
// </e>
|
|
||||||
// </e>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define USB_CLASS 1
|
|
||||||
#define USB_HID 0
|
|
||||||
#define USB_HID_IF_NUM 0
|
|
||||||
#define USB_MSC 0
|
|
||||||
#define USB_MSC_IF_NUM 0
|
|
||||||
#define USB_AUDIO 1
|
|
||||||
#define USB_ADC_CIF_NUM 0
|
|
||||||
#define USB_ADC_SIF1_NUM 1
|
|
||||||
#define USB_ADC_SIF2_NUM 2
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USBCFG_H__ */
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: USBCORE.H
|
|
||||||
* Purpose: USB Core Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBCORE_H__
|
|
||||||
#define __USBCORE_H__
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Endpoint Data Structure */
|
|
||||||
typedef struct _USB_EP_DATA {
|
|
||||||
BYTE *pData;
|
|
||||||
WORD Count;
|
|
||||||
} USB_EP_DATA;
|
|
||||||
|
|
||||||
/* USB Core Global Variables */
|
|
||||||
extern WORD USB_DeviceStatus;
|
|
||||||
extern BYTE USB_DeviceAddress;
|
|
||||||
extern BYTE USB_Configuration;
|
|
||||||
extern DWORD USB_EndPointMask;
|
|
||||||
extern DWORD USB_EndPointHalt;
|
|
||||||
extern BYTE USB_AltSetting[USB_IF_NUM];
|
|
||||||
|
|
||||||
/* USB Endpoint 0 Buffer */
|
|
||||||
extern BYTE EP0Buf[USB_MAX_PACKET0];
|
|
||||||
|
|
||||||
/* USB Endpoint 0 Data Info */
|
|
||||||
extern USB_EP_DATA EP0Data;
|
|
||||||
|
|
||||||
/* USB Setup Packet */
|
|
||||||
extern USB_SETUP_PACKET SetupPacket;
|
|
||||||
|
|
||||||
/* USB Core Functions */
|
|
||||||
extern void USB_ResetCore (void);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USBCORE_H__ */
|
|
|
@ -1,36 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: USBDESC.C
|
|
||||||
* Purpose: USB Descriptors Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBDESC_H__
|
|
||||||
#define __USBDESC_H__
|
|
||||||
|
|
||||||
|
|
||||||
#define WBVAL(x) (x & 0xFF),((x >> 8) & 0xFF)
|
|
||||||
#define B3VAL(x) (x & 0xFF),((x >> 8) & 0xFF),((x >> 16) & 0xFF)
|
|
||||||
|
|
||||||
#define USB_DEVICE_DESC_SIZE (sizeof(USB_DEVICE_DESCRIPTOR))
|
|
||||||
#define USB_CONFIGUARTION_DESC_SIZE (sizeof(USB_CONFIGURATION_DESCRIPTOR))
|
|
||||||
#define USB_INTERFACE_DESC_SIZE (sizeof(USB_INTERFACE_DESCRIPTOR))
|
|
||||||
#define USB_ENDPOINT_DESC_SIZE (sizeof(USB_ENDPOINT_DESCRIPTOR))
|
|
||||||
|
|
||||||
extern const BYTE USB_DeviceDescriptor[];
|
|
||||||
extern const BYTE USB_ConfigDescriptor[];
|
|
||||||
extern const BYTE USB_StringDescriptor[];
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USBDESC_H__ */
|
|
|
@ -1,107 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: USBHW.H
|
|
||||||
* Purpose: USB Hardware Layer Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBHW_H__
|
|
||||||
#define __USBHW_H__
|
|
||||||
|
|
||||||
|
|
||||||
/* USB RAM Definitions */
|
|
||||||
#define USB_RAM_ADR 0x7FD00000 /* USB RAM Start Address */
|
|
||||||
#define USB_RAM_SZ 0x00002000 /* USB RAM Size (8kB) */
|
|
||||||
|
|
||||||
/* DMA Endpoint Descriptors */
|
|
||||||
#define DD_NISO_CNT 16 /* Non-Iso EP DMA Descr. Count (max. 32) */
|
|
||||||
#define DD_ISO_CNT 8 /* Iso EP DMA Descriptor Count (max. 32) */
|
|
||||||
#define DD_NISO_SZ (DD_NISO_CNT * 16) /* Non-Iso DMA Descr. Size */
|
|
||||||
#define DD_ISO_SZ (DD_ISO_CNT * 20) /* Iso DMA Descriptor Size */
|
|
||||||
#define DD_NISO_ADR (USB_RAM_ADR + 128) /* Non-Iso DMA Descr. Address */
|
|
||||||
#define DD_ISO_ADR (DD_NISO_ADR + DD_NISO_SZ) /* Iso DMA Descr. Address */
|
|
||||||
#define DD_SZ (128 + DD_NISO_SZ + DD_ISO_SZ) /* Descr. Size */
|
|
||||||
|
|
||||||
/* DMA Buffer Memory Definitions */
|
|
||||||
#define DMA_BUF_ADR (USB_RAM_ADR + DD_SZ) /* DMA Buffer Start Address */
|
|
||||||
#define DMA_BUF_SZ (USB_RAM_SZ - DD_SZ) /* DMA Buffer Size */
|
|
||||||
|
|
||||||
/* USB Error Codes */
|
|
||||||
#define USB_ERR_PID 0x0001 /* PID Error */
|
|
||||||
#define USB_ERR_UEPKT 0x0002 /* Unexpected Packet */
|
|
||||||
#define USB_ERR_DCRC 0x0004 /* Data CRC Error */
|
|
||||||
#define USB_ERR_TIMOUT 0x0008 /* Bus Time-out Error */
|
|
||||||
#define USB_ERR_EOP 0x0010 /* End of Packet Error */
|
|
||||||
#define USB_ERR_B_OVRN 0x0020 /* Buffer Overrun */
|
|
||||||
#define USB_ERR_BTSTF 0x0040 /* Bit Stuff Error */
|
|
||||||
#define USB_ERR_TGL 0x0080 /* Toggle Bit Error */
|
|
||||||
|
|
||||||
/* USB DMA Status Codes */
|
|
||||||
#define USB_DMA_INVALID 0x0000 /* DMA Invalid - Not Configured */
|
|
||||||
#define USB_DMA_IDLE 0x0001 /* DMA Idle - Waiting for Trigger */
|
|
||||||
#define USB_DMA_BUSY 0x0002 /* DMA Busy - Transfer in progress */
|
|
||||||
#define USB_DMA_DONE 0x0003 /* DMA Transfer Done (no Errors)*/
|
|
||||||
#define USB_DMA_OVER_RUN 0x0004 /* Data Over Run */
|
|
||||||
#define USB_DMA_UNDER_RUN 0x0005 /* Data Under Run (Short Packet) */
|
|
||||||
#define USB_DMA_ERROR 0x0006 /* Error */
|
|
||||||
#define USB_DMA_UNKNOWN 0xFFFF /* Unknown State */
|
|
||||||
|
|
||||||
/* USB DMA Descriptor */
|
|
||||||
typedef struct _USB_DMA_DESCRIPTOR {
|
|
||||||
DWORD BufAdr; /* DMA Buffer Address */
|
|
||||||
WORD BufLen; /* DMA Buffer Length */
|
|
||||||
WORD MaxSize; /* Maximum Packet Size */
|
|
||||||
DWORD InfoAdr; /* Packet Info Memory Address */
|
|
||||||
union { /* DMA Configuration */
|
|
||||||
struct {
|
|
||||||
DWORD Link : 1; /* Link to existing Descriptors */
|
|
||||||
DWORD IsoEP : 1; /* Isonchronous Endpoint */
|
|
||||||
DWORD ATLE : 1; /* ATLE (Auto Transfer Length Extract) */
|
|
||||||
DWORD Rsrvd : 5; /* Reserved */
|
|
||||||
DWORD LenPos : 8; /* Length Position (ATLE) */
|
|
||||||
} Type;
|
|
||||||
DWORD Val;
|
|
||||||
} Cfg;
|
|
||||||
} USB_DMA_DESCRIPTOR;
|
|
||||||
|
|
||||||
/* USB Hardware Functions */
|
|
||||||
extern void USB_Init (void);
|
|
||||||
extern void USB_Connect (BOOL con);
|
|
||||||
extern void USB_Reset (void);
|
|
||||||
extern void USB_Suspend (void);
|
|
||||||
extern void USB_Resume (void);
|
|
||||||
extern void USB_WakeUp (void);
|
|
||||||
extern void USB_WakeUpCfg (BOOL cfg);
|
|
||||||
extern void USB_SetAddress (DWORD adr);
|
|
||||||
extern void USB_Configure (BOOL cfg);
|
|
||||||
extern void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD);
|
|
||||||
extern void USB_DirCtrlEP (DWORD dir);
|
|
||||||
extern void USB_EnableEP (DWORD EPNum);
|
|
||||||
extern void USB_DisableEP (DWORD EPNum);
|
|
||||||
extern void USB_ResetEP (DWORD EPNum);
|
|
||||||
extern void USB_SetStallEP (DWORD EPNum);
|
|
||||||
extern void USB_ClrStallEP (DWORD EPNum);
|
|
||||||
extern DWORD USB_ReadEP (DWORD EPNum, BYTE *pData);
|
|
||||||
extern DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt);
|
|
||||||
extern BOOL USB_DMA_Setup (DWORD EPNum, USB_DMA_DESCRIPTOR *pDD);
|
|
||||||
extern void USB_DMA_Enable (DWORD EPNum);
|
|
||||||
extern void USB_DMA_Disable(DWORD EPNum);
|
|
||||||
extern DWORD USB_DMA_Status (DWORD EPNum);
|
|
||||||
extern DWORD USB_DMA_BufAdr (DWORD EPNum);
|
|
||||||
extern DWORD USB_DMA_BufCnt (DWORD EPNum);
|
|
||||||
extern DWORD USB_GetFrame (void);
|
|
||||||
extern void USB_ISR (void) __irq;
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USBHW_H__ */
|
|
|
@ -1,195 +0,0 @@
|
||||||
/***********************************************************************/
|
|
||||||
/* This file is part of the uVision/ARM development tools */
|
|
||||||
/* Copyright KEIL ELEKTRONIK GmbH 2002-2006 */
|
|
||||||
/***********************************************************************/
|
|
||||||
/* */
|
|
||||||
/* USBREG.H: Header file for Philips LPC214X USB */
|
|
||||||
/* */
|
|
||||||
/***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef __USBREG_H
|
|
||||||
#define __USBREG_H
|
|
||||||
|
|
||||||
|
|
||||||
#define SCB_BASE_ADDR 0xE01FC000 /* System Control Block */
|
|
||||||
|
|
||||||
/* PLL48 Registers */
|
|
||||||
#define PLL48CON (*(volatile unsigned int*)(SCB_BASE_ADDR + 0xA0))
|
|
||||||
#define PLL48CFG (*(volatile unsigned int*)(SCB_BASE_ADDR + 0xA4))
|
|
||||||
#define PLL48STAT (*(volatile unsigned int*)(SCB_BASE_ADDR + 0xA8))
|
|
||||||
#define PLL48FEED (*(volatile unsigned int*)(SCB_BASE_ADDR + 0xAC))
|
|
||||||
|
|
||||||
/* PLL48 Bit Definitions */
|
|
||||||
#define PLLCON_PLLE (1<<0) /* PLL Enable */
|
|
||||||
#define PLLCON_PLLC (1<<1) /* PLL Connect */
|
|
||||||
#define PLLCFG_MSEL (0x1F<<0) /* PLL Multiplier */
|
|
||||||
#define PLLCFG_PSEL (0x03<<5) /* PLL Divider */
|
|
||||||
#define PLLSTAT_PLOCK (1<<10) /* PLL Lock Status */
|
|
||||||
|
|
||||||
|
|
||||||
#define USB_BASE_ADDR 0xE0090000 /* USB Base Address */
|
|
||||||
|
|
||||||
/* Device Interrupt Registers */
|
|
||||||
#define DEV_INT_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0x00))
|
|
||||||
#define DEV_INT_EN (*(volatile unsigned int*)(USB_BASE_ADDR + 0x04))
|
|
||||||
#define DEV_INT_CLR (*(volatile unsigned int*)(USB_BASE_ADDR + 0x08))
|
|
||||||
#define DEV_INT_SET (*(volatile unsigned int*)(USB_BASE_ADDR + 0x0C))
|
|
||||||
#define DEV_INT_PRIO (*(volatile unsigned int*)(USB_BASE_ADDR + 0x2C))
|
|
||||||
|
|
||||||
/* Endpoint Interrupt Registers */
|
|
||||||
#define EP_INT_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0x30))
|
|
||||||
#define EP_INT_EN (*(volatile unsigned int*)(USB_BASE_ADDR + 0x34))
|
|
||||||
#define EP_INT_CLR (*(volatile unsigned int*)(USB_BASE_ADDR + 0x38))
|
|
||||||
#define EP_INT_SET (*(volatile unsigned int*)(USB_BASE_ADDR + 0x3C))
|
|
||||||
#define EP_INT_PRIO (*(volatile unsigned int*)(USB_BASE_ADDR + 0x40))
|
|
||||||
|
|
||||||
/* Endpoint Realization Registers */
|
|
||||||
#define REALIZE_EP (*(volatile unsigned int*)(USB_BASE_ADDR + 0x44))
|
|
||||||
#define EP_INDEX (*(volatile unsigned int*)(USB_BASE_ADDR + 0x48))
|
|
||||||
#define MAXPACKET_SIZE (*(volatile unsigned int*)(USB_BASE_ADDR + 0x4C))
|
|
||||||
|
|
||||||
/* Command Reagisters */
|
|
||||||
#define CMD_CODE (*(volatile unsigned int*)(USB_BASE_ADDR + 0x10))
|
|
||||||
#define CMD_DATA (*(volatile unsigned int*)(USB_BASE_ADDR + 0x14))
|
|
||||||
|
|
||||||
/* Data Transfer Registers */
|
|
||||||
#define RX_DATA (*(volatile unsigned int*)(USB_BASE_ADDR + 0x18))
|
|
||||||
#define TX_DATA (*(volatile unsigned int*)(USB_BASE_ADDR + 0x1C))
|
|
||||||
#define RX_PLENGTH (*(volatile unsigned int*)(USB_BASE_ADDR + 0x20))
|
|
||||||
#define TX_PLENGTH (*(volatile unsigned int*)(USB_BASE_ADDR + 0x24))
|
|
||||||
#define USB_CTRL (*(volatile unsigned int*)(USB_BASE_ADDR + 0x28))
|
|
||||||
|
|
||||||
/* System Register */
|
|
||||||
#define DC_REVISION (*(volatile unsigned int*)(USB_BASE_ADDR + 0x7C))
|
|
||||||
|
|
||||||
/* DMA Registers */
|
|
||||||
#define DMA_REQ_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0x50))
|
|
||||||
#define DMA_REQ_CLR (*(volatile unsigned int*)(USB_BASE_ADDR + 0x54))
|
|
||||||
#define DMA_REQ_SET (*(volatile unsigned int*)(USB_BASE_ADDR + 0x58))
|
|
||||||
#define UDCA_HEAD (*(volatile unsigned int*)(USB_BASE_ADDR + 0x80))
|
|
||||||
#define EP_DMA_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0x84))
|
|
||||||
#define EP_DMA_EN (*(volatile unsigned int*)(USB_BASE_ADDR + 0x88))
|
|
||||||
#define EP_DMA_DIS (*(volatile unsigned int*)(USB_BASE_ADDR + 0x8C))
|
|
||||||
#define DMA_INT_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0x90))
|
|
||||||
#define DMA_INT_EN (*(volatile unsigned int*)(USB_BASE_ADDR + 0x94))
|
|
||||||
#define EOT_INT_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0xA0))
|
|
||||||
#define EOT_INT_CLR (*(volatile unsigned int*)(USB_BASE_ADDR + 0xA4))
|
|
||||||
#define EOT_INT_SET (*(volatile unsigned int*)(USB_BASE_ADDR + 0xA8))
|
|
||||||
#define NDD_REQ_INT_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0xAC))
|
|
||||||
#define NDD_REQ_INT_CLR (*(volatile unsigned int*)(USB_BASE_ADDR + 0xB0))
|
|
||||||
#define NDD_REQ_INT_SET (*(volatile unsigned int*)(USB_BASE_ADDR + 0xB4))
|
|
||||||
#define SYS_ERR_INT_STAT (*(volatile unsigned int*)(USB_BASE_ADDR + 0xB8))
|
|
||||||
#define SYS_ERR_INT_CLR (*(volatile unsigned int*)(USB_BASE_ADDR + 0xBC))
|
|
||||||
#define SYS_ERR_INT_SET (*(volatile unsigned int*)(USB_BASE_ADDR + 0xC0))
|
|
||||||
#define MODULE_ID (*(volatile unsigned int*)(USB_BASE_ADDR + 0xFC))
|
|
||||||
|
|
||||||
|
|
||||||
/* Device Interrupt Bit Definitions */
|
|
||||||
#define FRAME_INT 0x00000001
|
|
||||||
#define EP_FAST_INT 0x00000002
|
|
||||||
#define EP_SLOW_INT 0x00000004
|
|
||||||
#define DEV_STAT_INT 0x00000008
|
|
||||||
#define CCEMTY_INT 0x00000010
|
|
||||||
#define CDFULL_INT 0x00000020
|
|
||||||
#define RxENDPKT_INT 0x00000040
|
|
||||||
#define TxENDPKT_INT 0x00000080
|
|
||||||
#define EP_RLZED_INT 0x00000100
|
|
||||||
#define ERR_INT 0x00000200
|
|
||||||
|
|
||||||
/* Rx & Tx Packet Length Definitions */
|
|
||||||
#define PKT_LNGTH_MASK 0x000003FF
|
|
||||||
#define PKT_DV 0x00000400
|
|
||||||
#define PKT_RDY 0x00000800
|
|
||||||
|
|
||||||
/* USB Control Definitions */
|
|
||||||
#define CTRL_RD_EN 0x00000001
|
|
||||||
#define CTRL_WR_EN 0x00000002
|
|
||||||
|
|
||||||
/* Command Codes */
|
|
||||||
#define CMD_SET_ADDR 0x00D00500
|
|
||||||
#define CMD_CFG_DEV 0x00D80500
|
|
||||||
#define CMD_SET_MODE 0x00F30500
|
|
||||||
#define CMD_RD_FRAME 0x00F50500
|
|
||||||
#define DAT_RD_FRAME 0x00F50200
|
|
||||||
#define CMD_RD_TEST 0x00FD0500
|
|
||||||
#define DAT_RD_TEST 0x00FD0200
|
|
||||||
#define CMD_SET_DEV_STAT 0x00FE0500
|
|
||||||
#define CMD_GET_DEV_STAT 0x00FE0500
|
|
||||||
#define DAT_GET_DEV_STAT 0x00FE0200
|
|
||||||
#define CMD_GET_ERR_CODE 0x00FF0500
|
|
||||||
#define DAT_GET_ERR_CODE 0x00FF0200
|
|
||||||
#define CMD_RD_ERR_STAT 0x00FB0500
|
|
||||||
#define DAT_RD_ERR_STAT 0x00FB0200
|
|
||||||
#define DAT_WR_BYTE(x) (0x00000100 | ((x) << 16))
|
|
||||||
#define CMD_SEL_EP(x) (0x00000500 | ((x) << 16))
|
|
||||||
#define DAT_SEL_EP(x) (0x00000200 | ((x) << 16))
|
|
||||||
#define CMD_SEL_EP_CLRI(x) (0x00400500 | ((x) << 16))
|
|
||||||
#define DAT_SEL_EP_CLRI(x) (0x00400200 | ((x) << 16))
|
|
||||||
#define CMD_SET_EP_STAT(x) (0x00400500 | ((x) << 16))
|
|
||||||
#define CMD_CLR_BUF 0x00F20500
|
|
||||||
#define DAT_CLR_BUF 0x00F20200
|
|
||||||
#define CMD_VALID_BUF 0x00FA0500
|
|
||||||
|
|
||||||
/* Device Address Register Definitions */
|
|
||||||
#define DEV_ADDR_MASK 0x7F
|
|
||||||
#define DEV_EN 0x80
|
|
||||||
|
|
||||||
/* Device Configure Register Definitions */
|
|
||||||
#define CONF_DVICE 0x01
|
|
||||||
|
|
||||||
/* Device Mode Register Definitions */
|
|
||||||
#define AP_CLK 0x01
|
|
||||||
#define INAK_CI 0x02
|
|
||||||
#define INAK_CO 0x04
|
|
||||||
#define INAK_II 0x08
|
|
||||||
#define INAK_IO 0x10
|
|
||||||
#define INAK_BI 0x20
|
|
||||||
#define INAK_BO 0x40
|
|
||||||
|
|
||||||
/* Device Status Register Definitions */
|
|
||||||
#define DEV_CON 0x01
|
|
||||||
#define DEV_CON_CH 0x02
|
|
||||||
#define DEV_SUS 0x04
|
|
||||||
#define DEV_SUS_CH 0x08
|
|
||||||
#define DEV_RST 0x10
|
|
||||||
|
|
||||||
/* Error Code Register Definitions */
|
|
||||||
#define ERR_EC_MASK 0x0F
|
|
||||||
#define ERR_EA 0x10
|
|
||||||
|
|
||||||
/* Error Status Register Definitions */
|
|
||||||
#define ERR_PID 0x01
|
|
||||||
#define ERR_UEPKT 0x02
|
|
||||||
#define ERR_DCRC 0x04
|
|
||||||
#define ERR_TIMOUT 0x08
|
|
||||||
#define ERR_EOP 0x10
|
|
||||||
#define ERR_B_OVRN 0x20
|
|
||||||
#define ERR_BTSTF 0x40
|
|
||||||
#define ERR_TGL 0x80
|
|
||||||
|
|
||||||
/* Endpoint Select Register Definitions */
|
|
||||||
#define EP_SEL_F 0x01
|
|
||||||
#define EP_SEL_ST 0x02
|
|
||||||
#define EP_SEL_STP 0x04
|
|
||||||
#define EP_SEL_PO 0x08
|
|
||||||
#define EP_SEL_EPN 0x10
|
|
||||||
#define EP_SEL_B_1_FULL 0x20
|
|
||||||
#define EP_SEL_B_2_FULL 0x40
|
|
||||||
|
|
||||||
/* Endpoint Status Register Definitions */
|
|
||||||
#define EP_STAT_ST 0x01
|
|
||||||
#define EP_STAT_DA 0x20
|
|
||||||
#define EP_STAT_RF_MO 0x40
|
|
||||||
#define EP_STAT_CND_ST 0x80
|
|
||||||
|
|
||||||
/* Clear Buffer Register Definitions */
|
|
||||||
#define CLR_BUF_PO 0x01
|
|
||||||
|
|
||||||
|
|
||||||
/* DMA Interrupt Bit Definitions */
|
|
||||||
#define EOT_INT 0x01
|
|
||||||
#define NDD_REQ_INT 0x02
|
|
||||||
#define SYS_ERR_INT 0x04
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USBREG_H */
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*----------------------------------------------------------------------------
|
|
||||||
* U S B - K e r n e l
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* Name: USBUSER.H
|
|
||||||
* Purpose: USB Custom User Definitions
|
|
||||||
* Version: V1.10
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* This software is supplied "AS IS" without any warranties, express,
|
|
||||||
* implied or statutory, including but not limited to the implied
|
|
||||||
* warranties of fitness for purpose, satisfactory quality and
|
|
||||||
* noninfringement. Keil extends you a royalty-free right to reproduce
|
|
||||||
* and distribute executable files created using this software for use
|
|
||||||
* on Philips LPC2xxx microcontroller devices only. Nothing else gives
|
|
||||||
* you the right to use this software.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005-2006 Keil Software.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef __USBUSER_H__
|
|
||||||
#define __USBUSER_H__
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Device Events Callback Functions */
|
|
||||||
extern void USB_Power_Event (BOOL power);
|
|
||||||
extern void USB_Reset_Event (void);
|
|
||||||
extern void USB_Suspend_Event (void);
|
|
||||||
extern void USB_Resume_Event (void);
|
|
||||||
extern void USB_WakeUp_Event (void);
|
|
||||||
extern void USB_SOF_Event (void);
|
|
||||||
extern void USB_Error_Event (DWORD error);
|
|
||||||
|
|
||||||
/* USB Endpoint Callback Events */
|
|
||||||
#define USB_EVT_SETUP 1 /* Setup Packet */
|
|
||||||
#define USB_EVT_OUT 2 /* OUT Packet */
|
|
||||||
#define USB_EVT_IN 3 /* IN Packet */
|
|
||||||
#define USB_EVT_OUT_NAK 4 /* OUT Packet - Not Acknowledged */
|
|
||||||
#define USB_EVT_IN_NAK 5 /* IN Packet - Not Acknowledged */
|
|
||||||
#define USB_EVT_OUT_STALL 6 /* OUT Packet - Stalled */
|
|
||||||
#define USB_EVT_IN_STALL 7 /* IN Packet - Stalled */
|
|
||||||
#define USB_EVT_OUT_DMA_EOT 8 /* DMA OUT EP - End of Transfer */
|
|
||||||
#define USB_EVT_IN_DMA_EOT 9 /* DMA IN EP - End of Transfer */
|
|
||||||
#define USB_EVT_OUT_DMA_NDR 10 /* DMA OUT EP - New Descriptor Request */
|
|
||||||
#define USB_EVT_IN_DMA_NDR 11 /* DMA IN EP - New Descriptor Request */
|
|
||||||
#define USB_EVT_OUT_DMA_ERR 12 /* DMA OUT EP - Error */
|
|
||||||
#define USB_EVT_IN_DMA_ERR 13 /* DMA IN EP - Error */
|
|
||||||
|
|
||||||
/* USB Endpoint Events Callback Pointers */
|
|
||||||
extern void (* const USB_P_EP[16])(DWORD event);
|
|
||||||
|
|
||||||
/* USB Endpoint Events Callback Functions */
|
|
||||||
extern void USB_EndPoint0 (DWORD event);
|
|
||||||
extern void USB_EndPoint1 (DWORD event);
|
|
||||||
extern void USB_EndPoint2 (DWORD event);
|
|
||||||
extern void USB_EndPoint3 (DWORD event);
|
|
||||||
extern void USB_EndPoint4 (DWORD event);
|
|
||||||
extern void USB_EndPoint5 (DWORD event);
|
|
||||||
extern void USB_EndPoint6 (DWORD event);
|
|
||||||
extern void USB_EndPoint7 (DWORD event);
|
|
||||||
extern void USB_EndPoint8 (DWORD event);
|
|
||||||
extern void USB_EndPoint9 (DWORD event);
|
|
||||||
extern void USB_EndPoint10 (DWORD event);
|
|
||||||
extern void USB_EndPoint11 (DWORD event);
|
|
||||||
extern void USB_EndPoint12 (DWORD event);
|
|
||||||
extern void USB_EndPoint13 (DWORD event);
|
|
||||||
extern void USB_EndPoint14 (DWORD event);
|
|
||||||
extern void USB_EndPoint15 (DWORD event);
|
|
||||||
|
|
||||||
/* USB Core Events Callback Functions */
|
|
||||||
extern void USB_Configure_Event (void);
|
|
||||||
extern void USB_Interface_Event (void);
|
|
||||||
extern void USB_Feature_Event (void);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __USBUSER_H__ */
|
|
Loading…
Reference in New Issue