[Investigación] PsGroove en PSP

1, 2, 3, 4, 5, 630
nogaless escribió:
venceitor escribió:Mathieulh
@PspPsGroove muhahahahah xD The HADES team ? the one that claims that I work for sony, that the psgroove is fake and the jig is a pulse ? xD


[poraki]


Una traduccion rapidita, please.


Es algo asi como

"jajaja el hades team? el que dijo que yo trabajaba para sony? que el psgroove es fake y el jig un pulso?
PSPPSGROOVE en twitter:
Psp FAT Working ok. Psp Slim not load module prx (investigating)
minixiqui escribió:Es algo asi como

"jajaja el hades team? el que dijo que yo trabajaba para sony? que el psgroove es fake y el jig un pulso?


Haber, aqui la peña cada vez da a esa frase una traduccion diferente.
Y olvida mencionar que DH también dijo que el PSJailbreak se lo había comprado GeoHot a Sony... No me extraña que se ría de ellos, no dicen más que tonterías.
nogaless escribió:
minixiqui escribió:Es algo asi como

"jajaja el hades team? el que dijo que yo trabajaba para sony? que el psgroove es fake y el jig un pulso?


Haber, aqui la peña cada vez da a esa frase una traduccion diferente.


Puedes usar un traductor de google , pero vamos , la unica dificultad que entraña esa frase es lo del claims y lo del pulse...

Claims es reivindicar,reclamar o afirmar... Y lo del pulse creo que se refiere a aquel tema de que el jig enviaba un pulso a la ps3 etc etc...

Si no te ha servido la traduccion te pido disculpas, pero asi es como yo entiendo esa frase.
@xorloser private release sended to email...

Sisi....
minixiqui escribió:
Puedes usar un traductor de google , pero vamos , la unica dificultad que entraña esa frase es lo del claims y lo del pulse...

Claims es reivindicar,reclamar o afirmar... Y lo del pulse creo que se refiere a aquel tema de que el jig enviaba un pulso a la ps3 etc etc...

Si no te ha servido la traduccion te pido disculpas, pero asi es como yo entiendo esa frase.


No, no si me ha servido pero es que ya he visto tres traducciones diferentes.
Por si a alguien del hilo le interesa, acabo de actualizar el primer post, escribiendo toda la información que a priori tengo. Faltan algunos pequeños trozos de código que he señalizado con código "//TODO:".

Como siempre, no he probado nada, ni siquiera lo he pasado por el compilador, pero creo que alguien que conozca más que yo el SDK de la PSP podría terminarlo, compilarlo y probar si el driver funciona como se espera.

A ver si se anima alguien que ya está prácticamente todo el código hecho ;).

Un saludo!
ayer fue el tio ese del eavpsp, hoy todo esta parafarnalia, en el q el susodicho no da prueba de nada.
con lo cual 0 su veracidad.
un consejo iros a dormir, q estas horas os trastocan un poco el coco, q os creeis todo y leeis lo q quereis ver, nada mas.
cuando salga, saldra sin mas.
saludos
andaaaaaa mirar donde aparece el eavpsp, tiene 15 años

http://twitter.com/grecomafioso
es ami o va mas lento el f5?XD
Gracias por tu trabajo nullEX ;)

Un saludo
esto tiene buena pinta. Animo gente
Twitter de Xorloser
@Mathieulh Why do you pretend you can code, hack and reverse when all you can do is incorrectly repeat what others have told you in private?

La cosa se pone negra... xorloser es un conocido scener de la ps3... mucho drama aca eh!
Eight está baneado por "adiós!"
que ha dicho joder no entiendo ni papa y estoy de los nervioooos!!! que puto hype dios
CoDeX escribió:que quiere decir?

@Mathieulh Why do you pretend you can code, hack and reverse when all you can do is incorrectly repeat what others have told you in private?

Xorloser le dijo a Mathieulh que

"porque pretendes que sabes programar, hackear y hacer ingenieria inversa cuando todo lo que podes hacer es repetir incorrectamente lo que otros te han dicho en privado?"

Que sucede detras de las cortinas? Un lio.
Eight está baneado por "adiós!"
mmm es de hace 21 horas ese mensaje a si que nada
ha podido llover mucho desde entonces.

Sobre lo del twitter de PsPPsGroove y Team Hades...

El nombre del tema...

Imagen

Confirma esto al 100% pues que era otro fake?
Buenas, si alguien quiere comenzar con el tema y necesita instalar el SDK de PSP, en mi firma tiene un tuto ;-)
acojonante, nullEX se esta currando todo esto y aqui la gente no hace mas que ensuciar, no se como no se le quitan las ganas de seguir
Animo y a ver si sale algo de todo esto, pk yo no tengo muy claro eso de que una empresa fabrique un dispositivo electrónico y lo ponga a la venta para sacar tajada y todos los que vienen detrás copien/clonen el funcionamiento del susodicho, y a esto se le llame "scene" Esto a mi personalmente no me parece "scene" así es que a ver si con el exploit (que en el fondo es de lo que se aprovecha el JailBreak) y la PSP podemos hablar de verdadera "scene", y a poder ser Española. (siempre sin desmerecer el impresionante trabajo de la gente que esta detras del PSjb y el PSgroobe). Animo y seguid por este camino que la PSP tiene unas posibilidades inmensas para esto y para otras muchas cosas.Saludos, y espero que mi comentario no levante muchas ampollas y nadie se de por mal aludido.
PD: ya se que no todo el mundo tiene una psp así es que dejo una pregunta: alguien me podría decir si al respecto de todo esto podríamos hacer algo con el propio mando de la PS3¿?, podría ser reprogramado para este menester?. (si pregunto una tontería disculpadme).
Hola nullEX, viendo el hilo pienso que esto pronto se perdera entre comentarios pero yo lo posteo para el que lo vea,

weno he cogido el codigo y las librerias que nullEX amablemente nos ha cedido y las he limpiado un poco (hasta donde mi conocimiento y las ganas de explicar de ifcaro llegan XD ) aún quedan cosas por limpiar y reajustar pero de momento este es un codigo viable si cae en buenas manos sobretodo gracias a nullEX por facilitar el codigo y las librerias

Main.C un poco mas limpio XD


#include <pspkernel.h>
#include <pspsdk.h>
#include <pspusb.h>
#include <pspusbbus.h>
#include <string.h>
#include "descriptors.h"
#include "psgroove.h"
//incluyo algunas librerias adicionales por si acaso xD
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <pspctrl.h>
#include <pspdisplay.h>
#include <psppower.h>
#include <stdio.h>
#include <stdlib.h>
#include <pspusb.h>


#define PSGROOVE_DRIVERNAME "PsGrooveDriver"
#define PSGROOVE_DRIVERPID  (0x1C9)

/*------------------------------------------------------------------------------*/
/* USB driver define                                             */
/*------------------------------------------------------------------------------*/
enum UsbEvents {
   USB_EVENT_ATTACH  = 1,
   USB_EVENT_DETACH  = 2,
   USB_EVENT_ASYNC   = 4,
   USB_EVENT_CONNECT = 8,
   USB_EVENT_ALL     = 0xFFFFFFFF
};

enum UsbTransEvents {
   USB_TRANSEVENT_BULKOUT_DONE = 1,
   USB_TRANSEVENT_BULKIN_DONE  = 2,
};

/*------------------------------------------------------------------------------*/
/* USB HUB device descriptor                                       */
/*------------------------------------------------------------------------------*/
struct DeviceDescriptor devdesc_hub = {
   .bLength            = 0x12,
   .bDescriptorType    = 0x01,
   .bcdUSB             = 0x0002, //? 0x0200
   .bDeviceClass       = 0x09,
   .bDeviceSubClass    = 0x00,
   .bDeviceProtocol    = 0x01,
   .bMaxPacketSize     = 0x08,
   .idVendor           = 0xAAAA,
   .idProduct          = 0xCCCC,
   .bcdDevice          = 0x0001, //? 0x0100
   .iManufacturer      = 0x00,
   .iProduct           = 0x00,
   .iSerialNumber      = 0x00,
   .bNumConfigurations = 0x01
};

/*------------------------------------------------------------------------------*/
/* USB HUB configuration descriptor                                    */
/*------------------------------------------------------------------------------*/
struct ConfigDescriptor confdesc_hub = {
   .bLength             = 0x09,
   .bDescriptorType     = 0x02,
   .wTotalLength        = 0x1900, //? 0x0019
   .bNumInterfaces      = 0x01,
   .bConfigurationValue = 0x01,
   .iConfiguration      = 0x00,
   .bmAttributes        = 0xE0,
   .bMaxPower           = 0x32
};

/*------------------------------------------------------------------------------*/
/* USB HUB interface descriptor                                    */
/*------------------------------------------------------------------------------*/
struct InterfaceDescriptor interdesc_hub = {
   .bLength            = 0x09,
   .bDescriptorType    = 0x04,
   .bInterfaceNumber   = 0x00,
   .bAlternateSetting  = 0x00,
   .bNumEndpoints      = 0x01,
   .bInterfaceClass    = 0x09,
   .bInterfaceSubClass = 0x00,
   .bInterfaceProtocol = 0x00,
   .iInterface         = 0x00
};

/*------------------------------------------------------------------------------*/
/* USB HUB endpoint descriptor                                       */
/*------------------------------------------------------------------------------*/
struct EndpointDescriptor endpdesc_hub = {
   .bLength          = 0x07,
   .bDescriptorType  = 0x05,
   .bEndpointAddress = 0x81,
   .bmAttributes     = 0x03,
   .wMaxPacketSize   = 0x100,
   .bInterval        = 0x0C
};

/*------------------------------------------------------------------------------*/
/* USB HUB string description                                       */
/*------------------------------------------------------------------------------*/
static struct StringDescriptor HUBStringDescriptor = { 0x09, 0x29, {0x06, 0xA9, 0x00, 0x32, 0x64, 0x00, 0xff} };

/*------------------------------------------------------------------------------*/
/* USB driver work                                                */
/*------------------------------------------------------------------------------*/
static struct UsbEndpoint UsbEndpoint[4] = { {0,0,0}, {1,0,0}, {2,0,0} };
static struct UsbInterface UsbInterface = { 0xFFFFFFFF, 0, 1, }; //I don't know what is this
static struct UsbData UsbData[2];
static SceUID UsbMainEventFlag = -1;
static SceUID UsbTransEventFlag = -1;
static SceUID UsbMainSemaphore = -1;
static SceUID UsbMainThreadID = -1;

/*------------------------------------------------------------------------------*/
/* Pre declarations                                                   */
/*------------------------------------------------------------------------------*/
//limpio el static y añado {} así en todas las lineas de error
int UsbMainThread( SceSize size, void *argp ){}

/*------------------------------------------------------------------------------*/
/* UsbRequest                                                   */
/*------------------------------------------------------------------------------*/
int UsbRequest( int arg1, int arg2, struct DeviceRequest *req ){}
{
   unsigned char DescriptorType = (req->wValue >> 8);
   unsigned char DescriptorNumber = (req->wValue && 0xFF);
   unsigned short wLength = req->wLength;
   void* DataAddress = NULL;
   unsigned short size = 0;

   if ( (size = psgroove_getDescription(DescriptorType, DescriptorNumber, wLength, &DataAddress)) > 0 )
   {
      if (UsbWriteData(DataAddress, size) < size)
         return -1;
   }

   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbUnknown                                                   */
/*------------------------------------------------------------------------------*/
int UsbUnknown( int arg1, int arg2, int arg3 ){}
{
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbAttach                                                   */
/*------------------------------------------------------------------------------*/
int UsbAttach( int speed, void *arg2, void *arg3 ){}
{
   sceKernelSetEventFlag( UsbMainEventFlag, USB_EVENT_ATTACH );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbDetach                                                   */
/*------------------------------------------------------------------------------*/
int UsbDetach( int arg1, int arg2, int arg3 ){}
{
   DisplayEnable();
   sceKernelSetEventFlag( UsbMainEventFlag, USB_EVENT_DETACH );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbStartFunc                                                   */
/*------------------------------------------------------------------------------*/
static int UsbStartFunc( int size, void *p )
{
   memset( UsbData, 0, sizeof(UsbData) );
   memcpy( UsbData[0].devdesc, &devdesc_hub, sizeof(devdesc_hub) );
   UsbData[0].config.pconfdesc = &UsbData[0].confdesc;
   UsbData[0].config.pinterfaces = &UsbData[0].interfaces;
   UsbData[0].config.pinterdesc = &UsbData[0].interdesc;
   UsbData[0].config.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[0].confdesc.desc, &confdesc_hub,  sizeof(confdesc_hub) );
   UsbData[0].confdesc.pinterfaces = &UsbData[0].interfaces;
   UsbData[0].interfaces.pinterdesc[0] = &UsbData[0].interdesc;
   UsbData[0].interfaces.intcount = 1;
   memcpy( UsbData[0].interdesc.desc, &interdesc_hub, sizeof(interdesc_hub) );
   UsbData[0].interdesc.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[0].endp[0].desc, &endpdesc_hhub, (sizeof endpdesc_hub) );
   //memcpy( UsbData[0].endp[1].desc, &endpdesc_hi[1], sizeof(endpdesc_hub[1]) );
   //memcpy( UsbData[0].endp[2].desc, &endpdesc_hi[2], sizeof(endpdesc_hub[2]) );

   memcpy( UsbData[1].devdesc, &devdesc_hub, sizeof(devdesc_hub) );
   UsbData[1].config.pconfdesc = &UsbData[0].confdesc;
   UsbData[1].config.pinterfaces = &UsbData[0].interfaces;
   UsbData[1].config.pinterdesc = &UsbData[0].interdesc;
   UsbData[1].config.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[1].confdesc.desc, &confdesc_hub,  sizeof(confdesc_hub) );
   UsbData[1].confdesc.pinterfaces = &UsbData[0].interfaces;
   UsbData[1].interfaces.pinterdesc[0] = &UsbData[0].interdesc;
   UsbData[1].interfaces.intcount = 1;
   memcpy( UsbData[1].interdesc.desc, &interdesc_hub, sizeof(interdesc_hub) );
   UsbData[1].interdesc.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[1].endp[0].desc, &endpdesc_hhub, sizeof(endpdesc_hub) );
   //memcpy( UsbData[1].endp[1].desc, &endpdesc_hi[1], sizeof(endpdesc_hub[1]) );
   //memcpy( UsbData[1].endp[2].desc, &endpdesc_hi[2], sizeof(endpdesc_hub[2]) );


   UsbMainEventFlag = sceKernelCreateEventFlag( "USBMainEvent", 0x200, 0, NULL );
   if ( UsbMainEventFlag < 0 ){ return( -1 ); }
   UsbTransEventFlag = sceKernelCreateEventFlag( "USBEventTrans", 0x200, 0, NULL );
   if ( UsbTransEventFlag < 0 ){ return( -1 ); }
   UsbMainSemaphore = sceKernelCreateSema( "USBSemaphore", 0, 1, 1, NULL );
   if ( UsbMainSemaphore < 0 ){ return( -1 ); }
   UsbMainThreadID = sceKernelCreateThread( "USBMainThread", UsbMainThread, 10, 0x10000, 0, NULL );
   if ( UsbMainThreadID < 0 ){ return( -1 ); }
   sceKernelStartThread( UsbMainThreadID, 0, NULL );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbStopFunc                                                   */
/*------------------------------------------------------------------------------*/
int UsbStopFunc( int size, void *p ){}
{
   if ( UsbMainThreadID >= 0 ){ sceKernelTerminateDeleteThread( UsbMainThreadID ); }
   UsbMainThreadID = -1;
   if ( UsbMainEventFlag >= 0 ){ sceKernelDeleteEventFlag( UsbMainEventFlag ); }
   UsbMainEventFlag = -1;
   if ( UsbTransEventFlag >= 0 ){ sceKernelDeleteEventFlag( UsbTransEventFlag ); }
   UsbTransEventFlag = -1;
   if ( UsbMainSemaphore >= 0 ){ sceKernelDeleteSema( UsbMainSemaphore ); }
   UsbMainSemaphore = -1;
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* USB driver structure                                             */
/*------------------------------------------------------------------------------*/
struct UsbDriver UsbDriver = {
   PSGROOVE_DRIVERNAME,
   4,
   UsbEndpoint,
   &UsbInterface,
   &UsbData[0].devdesc[0],
   &UsbData[0].config,
   &UsbData[1].devdesc[0],
   &UsbData[1].config,
   &StringDescriptor,
   UsbRequest,
   UsbUnknown,
   UsbAttach,
   UsbDetach,
   0,
   UsbStartFunc,
   UsbStopFunc,
   NULL
};

/********************************************************************************/
/*------------------------------------------------------------------------------*/
/* usb thread work                                                */
/*------------------------------------------------------------------------------*/
static int UsbReady = 0;
static struct UsbdDeviceReq UsbBulkinReq;
static struct UsbdDeviceReq UsbBulkoutReq;
static char UsbBuff[64*1024] __attribute__((aligned(64)));
static char UsbAsyncBuff[512] __attribute__((aligned(64)));

/*------------------------------------------------------------------------------*/
/* UsbBulkinReqDone                                                */
/*------------------------------------------------------------------------------*/
int UsbBulkinReqDone( struct UsbdDeviceReq *req, int arg2, int arg3 ){}
{
   sceKernelSetEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKIN_DONE );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* SetUsbBulkinReq                                                */
/*------------------------------------------------------------------------------*/
int SetUsbBulkinReq( void *data, int size ){}
{
   sceKernelDcacheWritebackRange( data, size );
   memset( &UsbBulkinReq, 0, sizeof(UsbBulkinReq) );
   UsbBulkinReq.endp = &UsbEndpoint[1];
   UsbBulkinReq.data = data;
   UsbBulkinReq.size = size;
   UsbBulkinReq.func = UsbBulkinReqDone;
   sceKernelClearEventFlag( UsbTransEventFlag, ~USB_TRANSEVENT_BULKIN_DONE );
   return( sceUsbbdReqSend( &UsbBulkinReq ) );
}

/*------------------------------------------------------------------------------*/
/* UsbBulkoutReqDone                                             */
/*------------------------------------------------------------------------------*/
int UsbBulkoutReqDone( struct UsbdDeviceReq *req, int arg2, int arg3 ){}
{
   sceKernelSetEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKOUT_DONE );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* SetUsbBulkoutReq                                                */
/*------------------------------------------------------------------------------*/
int SetUsbBulkoutReq( void *data, int size ){}
{
   u32 upper_size = (size + 0x3F) & 0xFFFFFFC0;

   sceKernelDcacheInvalidateRange( data, upper_size );
   memset( &UsbBulkoutReq, 0, sizeof(UsbBulkoutReq) );
   UsbBulkoutReq.endp = &UsbEndpoint[2];
   UsbBulkoutReq.data = data;
   UsbBulkoutReq.size = size;
   UsbBulkoutReq.func = UsbBulkoutReqDone;
   sceKernelClearEventFlag( UsbTransEventFlag, ~USB_TRANSEVENT_BULKOUT_DONE );
   return( sceUsbbdReqRecv( &UsbBulkoutReq ) );
}

/*------------------------------------------------------------------------------*/
/* UsbReadData                                                   */
/*------------------------------------------------------------------------------*/
int UsbReadData( void *data, int data_size ){}
{
   u32 result;
   int read_size = 0;

   while ( read_size < data_size ){
      int rest_size = data_size - read_size;
      if ( rest_size > sizeof(UsbBuff) ){ rest_size = sizeof(UsbBuff); }
      SetUsbBulkoutReq( UsbBuff, rest_size );
      int ret = sceKernelWaitEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKOUT_DONE,
                                PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
      if ( ret == 0 ){
         if ( (UsbBulkoutReq.retcode == 0) && (UsbBulkoutReq.recvsize > 0) ){
            read_size += UsbBulkoutReq.recvsize;
            memcpy( data, UsbBuff, UsbBulkoutReq.recvsize );
            data += UsbBulkoutReq.recvsize;
         } else {
            return( -1 );
         }
      } else {
         return( -1 );
      }
   }
   return( read_size );
}

/*------------------------------------------------------------------------------*/
/* UsbWriteData                                                   */
/*------------------------------------------------------------------------------*/
int UsbWriteData( const void *data, int data_size ){}
{
   u32 result;
   int write_size = 0;

   if ( (u32)data & 0x3F ){
      while ( write_size < data_size ){
         int rest_size = data_size - write_size;
         if ( rest_size > sizeof(UsbBuff) ){ rest_size = sizeof(UsbBuff); }
         memcpy( UsbBuff, data, rest_size );
         SetUsbBulkinReq( UsbBuff, rest_size );
         int ret = sceKernelWaitEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKIN_DONE,
                                   PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
         if ( ret == 0 ){
            if ( (UsbBulkinReq.retcode == 0) && (UsbBulkinReq.recvsize > 0) ){
               write_size += UsbBulkinReq.recvsize;
               data += UsbBulkinReq.recvsize;
            } else {
               return( -1 );
            }
         } else {
            return( -1 );
         }
      }
   } else {
      while ( write_size < data_size ){
         int rest_size = data_size - write_size;
         if ( rest_size > sizeof(UsbBuff) ){ rest_size = sizeof(UsbBuff); }
         SetUsbBulkinReq( (char *)data, rest_size );
         int ret = sceKernelWaitEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKIN_DONE,
                                   PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
         if ( ret == 0 ){
            if ( (UsbBulkinReq.retcode == 0) && (UsbBulkinReq.recvsize > 0) ){
               write_size += UsbBulkinReq.recvsize;
               data += UsbBulkinReq.recvsize;
            } else {
               return( -1 );
            }
         } else {
            return( -1 );
         }
      }
   }
   return( write_size );
}

/*------------------------------------------------------------------------------*/
/* UsbMainThread                                                */
/*------------------------------------------------------------------------------*/
int UsbMainThread( SceSize size, void *argp ){}
{
   int ret;
   u32 result;

   while( 1 ){
      ret = sceKernelWaitEventFlag( UsbMainEventFlag,
                             USB_EVENT_ATTACH | USB_EVENT_DETACH | USB_EVENT_ASYNC,
                             PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
      if ( ret < 0 ){ sceKernelExitDeleteThread( 0 ); }
      if ( result & USB_EVENT_DETACH ){
         UsbReady = 0;
         sceKernelClearEventFlag( UsbMainEventFlag, ~USB_EVENT_CONNECT );
      }
      if ( result & USB_EVENT_ATTACH ){
         UsbReady = 0;
         sceKernelClearEventFlag( UsbMainEventFlag, ~USB_EVENT_CONNECT );
      }
   }
   return( 0 );
}

/********************************************************************************/
/*------------------------------------------------------------------------------*/
/* UsbbdRegister                                                */
/*------------------------------------------------------------------------------*/
void UsbbdRegister( void )
{
   sceUsbbdRegister( &UsbDriver );
}

/*------------------------------------------------------------------------------*/
/* UsbbdUnregister                                                */
/*------------------------------------------------------------------------------*/
void UsbbdUnregister( void )
{
   sceUsbbdUnregister( &UsbDriver );
}

/*------------------------------------------------------------------------------*/
/* UsbStart                                                      */
/*------------------------------------------------------------------------------*/
int UsbStart( void )
{
   int ret;

   ret = sceUsbStart( PSP_USBBUS_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbStart( PSGROOVE_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbActivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbStop                                                      */
/*------------------------------------------------------------------------------*/
int UsbStop( void )
{
   int ret;

   ret = sceUsbDeactivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbStop( PSGROOVE_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbStop( PSP_USBBUS_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbResume                                                   */
/*------------------------------------------------------------------------------*/
int UsbResume( void )
{
   int ret;

   ret = sceUsbActivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbSuspend                                                   */
/*------------------------------------------------------------------------------*/
int UsbSuspend( void )
{
   int ret;

   ret = sceUsbDeactivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbWait                                                      */
/*------------------------------------------------------------------------------*/
int UsbWait( void )
{
   int ret;

   while ( UsbMainEventFlag < 0 ){ sceKernelDelayThread( 100000 ); }
   ret = sceKernelWaitEventFlag( UsbMainEventFlag, USB_EVENT_CONNECT,
                          PSP_EVENT_WAITOR, NULL, NULL );
   return( 0 );
};
};


psgroove.H un poco más limpio

/********************************************************************************/
/*------------------------------------------------------------------------------*/
/* PsGroove Emulation                                             */
/*------------------------------------------------------------------------------*/
unsigned short psgroove_getDescription(unsigned char DescriptorType, unsigned char DescriptorNumber, unsigned short wLength, const void** const DescriptorAddress);
/*------------------------------------------------------------------------------*/
#define PORT_EMPTY 0x0100   /* powered only */
#define PORT_FULL 0x0103    /* connected, enabled, powered, full-speed */
#define C_PORT_CONN  0x0001 /* connection */
#define C_PORT_RESET 0x0010 /* reset */
#define C_PORT_NONE  0x0000 /* no change */
//defino algunas funciones que parecen olvidadas o yo que sé xD
//#define...

unsigned short port_status[6] = { PORT_EMPTY, PORT_EMPTY, PORT_EMPTY, PORT_EMPTY, PORT_EMPTY, PORT_EMPTY };
unsigned short port_change[6] = { C_PORT_NONE, C_PORT_NONE, C_PORT_NONE, C_PORT_NONE, C_PORT_NONE, C_PORT_NONE };
enum {
   init,
   wait_hub_ready,
   hub_ready,
   p1_wait_reset,
   p1_wait_enumerate,
   p1_ready,
   p2_wait_reset,
   p2_wait_enumerate,
   p2_ready,
   p3_wait_reset,
   p3_wait_enumerate,
   p3_ready,
   p2_wait_disconnect,
   p4_wait_connect,
   p4_wait_reset,
   p4_wait_enumerate,
   p4_ready,
   p5_wait_reset,
   p5_wait_enumerate,
   p5_challenged,
   p5_responded,
   p3_wait_disconnect,
   p3_disconnected,
   p5_wait_disconnect,
   p5_disconnected,
   p4_wait_disconnect,
   p4_disconnected,
   p1_wait_disconnect,
   p1_disconnected,
   p6_wait_reset,
   p6_wait_enumerate,
   done,
} state = init;

unsigned char hub_int_response = 0x00;
unsigned char hub_int_force_data0 = 0;
int last_port_conn_clear = 0;
int last_port_reset_clear = 0;

unsigned char port_addr[7] = { -1, -1, -1, -1, -1, -1, -1 };
unsigned char port_cur = -1;
/*------------------------------------------------------------------------------*/

/*------------------------------------------------------------------------------*/
/*psgroove_getDescription                                          */
/*------------------------------------------------------------------------------*/
unsigned short psgroove_getDescription(unsigned char DescriptorType, unsigned char DescriptorNumber, unsigned short wLength,  const void** const DescriptorAddress)
{
   void* Address = NULL;
   unsigned short Size = 0;

   switch(DescriptorType)
   {
   case 0x01: //DTYPE_Device
      switch (port_cur) {
      //case 0:
      //   Address = (void *) HUB_Device_Descriptor;
      //   Size    = sizeof(HUB_Device_Descriptor);
      //   break;
      case 1:
         Address = (void *) (port1_device_descriptor);
         Size    = sizeof port1_device_descriptor;
         break;
      case 2:
         Address = (void *) port2_device_descriptor;
         Size    = sizeof port2_device_descriptor;
         break;
      case 3:
         Address = (void *) port3_device_descriptor;
         Size    = sizeof port3_device_descriptor;
         break;
      case 4:
         Address = (void *) port4_device_descriptor;
         Size    = sizeof(port4_device_descriptor);
         break;
      case 5:
         Address = (void *) port5_device_descriptor;
         Size    = sizeof(port5_device_descriptor);
         break;
      case 6:
         Address = (void *) port6_device_descriptor;
         Size    = sizeof(port6_device_descriptor);
         break;
      }
      break;
   case 0x02: //DTYPE_Configuration
      switch (port_cur) {
      //case 0:
      //   Address = (void *) HUB_Config_Descriptor;
      //   Size    = sizeof(HUB_Config_Descriptor);
      //   break;
      case 1:
         // 4 configurations are the same.
         // For the initial 8-byte request, we give a different
         // length response than in the full request.
         if (DescriptorNumber < 4) {
            if (wLength == 8) {
               Address = (void *) port1_short_config_descriptor;
               Size    = sizeof(port1_short_config_descriptor);
            } else {
               Address = (void *) port1_config_descriptor;
               Size    = sizeof(port1_config_descriptor);
            }
            if (DescriptorNumber == 3 && wLength > 8) {
               state = p1_ready;
               expire = 10;
            }
         }
         break;
      case 2:
         // only 1 config
         Address = (void *) port2_config_descriptor;
         Size    = sizeof(port2_config_descriptor);
         state = p2_ready;
         expire = 15;
         break;
      case 3:
         // 2 configurations are the same
         Address = (void *) port3_config_descriptor;
         Size    = sizeof(port3_config_descriptor);
         if (DescriptorNumber == 1 && wLength > 8) {
            state = p3_ready;
            expire = 10;
         }
         break;
      case 4:
         // 3 configurations
         if (DescriptorNumber == 0) {
            Address = (void *) port4_config_descriptor_1;
            Size    = sizeof(port4_config_descriptor_1);
         } else if (DescriptorNumber == 1) {
            if (wLength == 8) {
               Address = (void *) port4_short_config_descriptor_2;
               Size    = sizeof(port4_short_config_descriptor_2);
            } else {
               Address = (void *) port4_config_descriptor_2;
               Size    = sizeof(port4_config_descriptor_2);
            }
         } else if (DescriptorNumber == 2) {
            Address = (void *) port4_config_descriptor_3;
            Size    = sizeof(port4_config_descriptor_3);
            if (wLength > 8) {
               state = p4_ready;
               expire = 20;  // longer seems to help this one?
            }
         }
         break;
      case 5:
         // 1 config
         Address = (void *) port5_config_descriptor;
         Size    = sizeof(port5_config_descriptor);
         break;
      case 6:
         // 1 config
         Address = (void *) port6_config_descriptor;
         Size    = sizeof(port6_config_descriptor);
         break;
      }
      break;
   //case 0x29: // HUB descriptor (always to port 0 we'll assume)
   //   switch (port_cur) {
   //   case 0:
   //      Address = (void *) HUB_Hub_Descriptor;
   //      Size    = sizeof(HUB_Hub_Descriptor);
   //      break;

};


descriptors.H he limpiado todo lo que he visto y parece que en esta libreria ya no hay ningun fallo

const unsigned short port1_device_descriptor[] = {
   0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08,
   0xAA, 0xAA, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x04,
};

const unsigned short port1_short_config_descriptor[] = {
   0x09, 0x02, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x80,
};

const unsigned short port1_config_descriptor[] = {
   0x09, 0x02, 0x12, 0x00, 0x01, 0x00, 0x00, 0x80, 0xfa, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xce, 0xb0, 0x03, 0xaa, 0xbb, 0xcc, 0xdd,
   0x38, 0x63, 0xf0, 0x00, 0x38, 0xa0, 0x10, 0x00, 0x38, 0x80, 0x00, 0x01, 0x78, 0x84, 0xf8, 0x06,
   0x64, 0x84, 0x00, 0x70, 0x38, 0xa5, 0xff, 0xf8, 0x7c, 0xc3, 0x28, 0x2a, 0x7c, 0xc4, 0x29, 0x2a,
   0x28, 0x25, 0x00, 0x00, 0x40, 0x82, 0xff, 0xf0, 0x38, 0x84, 0x00, 0x80, 0x7c, 0x89, 0x03, 0xa6,
   0x4e, 0x80, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x7c, 0x08, 0x02, 0xa6, 0xf8, 0x21, 0xff, 0x61, 0xfb, 0x61, 0x00, 0x78, 0xfb, 0x81, 0x00, 0x80,
   0xfb, 0xa1, 0x00, 0x88, 0xfb, 0xc1, 0x00, 0x90, 0xfb, 0xe1, 0x00, 0x98, 0xf8, 0x01, 0x00, 0xb0,
   0x3b, 0xe0, 0x00, 0x01, 0x7b, 0xff, 0xf8, 0x06, 0x7f, 0xe3, 0xfb, 0x78, 0x64, 0x63, 0x00, 0x05,
   0x60, 0x63, 0x0b, 0x3c, 0x7f, 0xe4, 0xfb, 0x78, 0x64, 0x84, 0x00, 0x70, 0x60, 0x84, 0x01, 0xac,
   0x38, 0xa0, 0x04, 0xfa, 0x4b, 0x97, 0xbf, 0x59, 0x7f, 0xe3, 0xfb, 0x78, 0x64, 0x63, 0x00, 0x05,
   0x60, 0x63, 0x0b, 0x3c, 0x38, 0x63, 0x00, 0x20, 0x4b, 0x9d, 0x22, 0x01, 0x7f, 0xe3, 0xfb, 0x78,
   0x64, 0x63, 0x00, 0x05, 0x60, 0x63, 0x0b, 0x3c, 0x7f, 0xe4, 0xfb, 0x78, 0x64, 0x84, 0x00, 0x2e,
   0x60, 0x84, 0xb1, 0x28, 0x38, 0x63, 0x00, 0x10, 0xf8, 0x64, 0x01, 0x20, 0x7f, 0xe5, 0xfb, 0x78,
   0x64, 0xa5, 0x00, 0x70, 0x60, 0xa5, 0x01, 0x50, 0x80, 0x65, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00,
   0x41, 0x82, 0x00, 0x18, 0x80, 0x85, 0x00, 0x04, 0x7c, 0x63, 0xfa, 0x14, 0x90, 0x83, 0x00, 0x00,
   0x38, 0xa5, 0x00, 0x08, 0x4b, 0xff, 0xff, 0xe4, 0x48, 0x00, 0x05, 0x88, 0xf8, 0x21, 0xff, 0x51,
   0x7c, 0x08, 0x02, 0xa6, 0xfb, 0xc1, 0x00, 0xa0, 0xfb, 0xe1, 0x00, 0xa8, 0xfb, 0xa1, 0x00, 0x98,
   0xf8, 0x01, 0x00, 0xc0, 0x3b, 0xc0, 0x07, 0xd0, 0x3b, 0xe0, 0x00, 0xc8, 0x4b, 0x90, 0xa9, 0xb8,
   0x00, 0x04, 0x90, 0xe0, 0xe8, 0x82, 0x0f, 0x08, 0x00, 0x04, 0x90, 0xe4, 0xe8, 0x7c, 0x00, 0x20,
   0x00, 0x04, 0x90, 0xe8, 0xf8, 0x64, 0x00, 0x00, 0x00, 0x04, 0xf0, 0xa8, 0x48, 0x00, 0x1a, 0x9d,
   0x00, 0x2a, 0xaf, 0xc8, 0x4b, 0xda, 0x5b, 0x80, 0x00, 0x04, 0xed, 0x18, 0x38, 0x80, 0x00, 0x00,
   0x00, 0x04, 0xed, 0x1c, 0x90, 0x83, 0x00, 0x00, 0x00, 0x04, 0xed, 0x20, 0x4e, 0x80, 0x00, 0x20,
   0x00, 0x3b, 0xa8, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0xd0, 0x38, 0x60, 0x00, 0x01,
   0x00, 0x05, 0x05, 0xd4, 0x4e, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0x60, 0x00, 0x01,
   0x4e, 0x80, 0x00, 0x20, 0x48, 0x00, 0x02, 0x78, 0x48, 0x00, 0x01, 0xec, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x0c, 0xa8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0xe7, 0x20, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x10, 0x32, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x7c, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x0b, 0x8c, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0b, 0x9c, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x0b, 0xd4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0xe7, 0x20, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x0c, 0x1c, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0xe7, 0x20, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x0c, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0xe7, 0x20, 0x80, 0x00, 0x00, 0x00,
   0x00, 0x05, 0x0c, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0xe7, 0x20, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0xf8, 0x21, 0xff, 0x81, 0x7c, 0x08, 0x02, 0xa6, 0xf8, 0x01, 0x00, 0x90,
   0x38, 0x80, 0x00, 0x00, 0x38, 0xa0, 0x00, 0x01, 0x48, 0x08, 0x1d, 0xb1, 0x80, 0xa3, 0x00, 0x08,
   0x38, 0x60, 0x00, 0x00, 0x3c, 0x80, 0xaa, 0xaa, 0x60, 0x84, 0xc0, 0xde, 0x7c, 0x04, 0x28, 0x40,
   0x41, 0x82, 0x00, 0x08, 0x38, 0x60, 0xff, 0xff, 0x7c, 0x63, 0x07, 0xb4, 0xe8, 0x01, 0x00, 0x90,
   0x7c, 0x08, 0x03, 0xa6, 0x38, 0x21, 0x00, 0x80, 0x4e, 0x80, 0x00, 0x20, 0xf8, 0x21, 0xff, 0x81,
   0x7c, 0x08, 0x02, 0xa6, 0xf8, 0x01, 0x00, 0x90, 0x38, 0x80, 0x00, 0x00, 0x48, 0x08, 0x1d, 0x99,
   0x38, 0x81, 0x00, 0x70, 0x38, 0xa0, 0x00, 0x00, 0xf8, 0xa4, 0x00, 0x00, 0x38, 0xc0, 0x21, 0xaa,
   0xb0, 0xc4, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, 0xb0, 0xc4, 0x00, 0x06, 0x38, 0xc0, 0x00, 0x01,
   0x78, 0xc6, 0xf8, 0x06, 0x64, 0xc6, 0x00, 0x05, 0x60, 0xc6, 0x0b, 0xac, 0x38, 0xe0, 0x00, 0x00,
   0x48, 0x08, 0x1c, 0xcd, 0x38, 0x60, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x90, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x21, 0x00, 0x80, 0x4e, 0x80, 0x00, 0x20, 0x4e, 0x80, 0x00, 0x20, 0x39, 0x60, 0x00, 0xff,
   0x44, 0x00, 0x00, 0x22, 0x2c, 0x03, 0x00, 0x00, 0x40, 0x82, 0x00, 0x1c, 0x38, 0x60, 0x00, 0x01,
   0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x05, 0x60, 0x63, 0x0b, 0xbc, 0x38, 0x80, 0x00, 0x01,
   0x90, 0x83, 0x00, 0x10, 0x4e, 0x80, 0x00, 0x20, 0xf8, 0x21, 0xff, 0x31, 0x7c, 0x08, 0x02, 0xa6,
   0xf8, 0x01, 0x00, 0xe0, 0xfb, 0xe1, 0x00, 0xc8, 0x38, 0x81, 0x00, 0x70, 0x48, 0x16, 0x2e, 0x81,
   0x3b, 0xe0, 0x00, 0x01, 0x7b, 0xff, 0xf8, 0x06, 0x67, 0xff, 0x00, 0x05, 0x63, 0xff, 0x0b, 0xbc,
   0xe8, 0x7f, 0x00, 0x00, 0x2c, 0x23, 0x00, 0x00, 0x41, 0x82, 0x00, 0x0c, 0x38, 0x80, 0x00, 0x27,
   0x48, 0x01, 0x17, 0xe9, 0x38, 0x80, 0x00, 0x27, 0x38, 0x60, 0x08, 0x00, 0x48, 0x01, 0x13, 0x9d,
   0xf8, 0x7f, 0x00, 0x00, 0xe8, 0x81, 0x00, 0x70, 0x4b, 0xff, 0xc5, 0xf9, 0xe8, 0x61, 0x00, 0x70,
   0x38, 0x80, 0x00, 0x27, 0x48, 0x01, 0x17, 0xc5, 0xe8, 0x7f, 0x00, 0x00, 0x4b, 0xff, 0xc6, 0x0d,
   0xe8, 0x9f, 0x00, 0x00, 0x7c, 0x64, 0x1a, 0x14, 0xf8, 0x7f, 0x00, 0x08, 0x38, 0x60, 0x00, 0x00,
   0xeb, 0xe1, 0x00, 0xc8, 0xe8, 0x01, 0x00, 0xe0, 0x38, 0x21, 0x00, 0xd0, 0x7c, 0x08, 0x03, 0xa6,
   0x4e, 0x80, 0x00, 0x20, 0xf8, 0x21, 0xff, 0x61, 0x7c, 0x08, 0x02, 0xa6, 0xfb, 0x81, 0x00, 0x80,
   0xfb, 0xa1, 0x00, 0x88, 0xfb, 0xe1, 0x00, 0x98, 0xfb, 0x41, 0x00, 0x70, 0xfb, 0x61, 0x00, 0x78,
   0xf8, 0x01, 0x00, 0xb0, 0x7c, 0x9c, 0x23, 0x78, 0x7c, 0x7d, 0x1b, 0x78, 0x3b, 0xe0, 0x00, 0x01,
   0x7b, 0xff, 0xf8, 0x06, 0x7f, 0xa3, 0xeb, 0x78, 0x7f, 0xe4, 0xfb, 0x78, 0x64, 0x84, 0x00, 0x05,
   0x60, 0x84, 0x10, 0x28, 0x38, 0xa0, 0x00, 0x09, 0x4b, 0xff, 0xc5, 0xcd, 0x28, 0x23, 0x00, 0x00,
   0x40, 0x82, 0x00, 0x34, 0x67, 0xff, 0x00, 0x05, 0x63, 0xff, 0x0b, 0xbc, 0x80, 0x7f, 0x00, 0x10,
   0x28, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x20, 0xe8, 0x7f, 0x00, 0x00, 0x28, 0x23, 0x00, 0x00,
   0x41, 0x82, 0x00, 0x14, 0xe8, 0x7f, 0x00, 0x08, 0x38, 0x9d, 0x00, 0x09, 0x4b, 0xff, 0xc5, 0x45,
   0xeb, 0xbf, 0x00, 0x00, 0x7f, 0xa3, 0xeb, 0x78, 0x48, 0x25, 0xa2, 0x38, 0x7c, 0x08, 0x02, 0xa6,
   0xf8, 0x21, 0xfe, 0x61, 0xfb, 0x61, 0x00, 0x78, 0xfb, 0x81, 0x00, 0x80, 0xfb, 0xa1, 0x00, 0x88,
   0xfb, 0xc1, 0x00, 0x90, 0xfb, 0xe1, 0x00, 0x98, 0xf8, 0x01, 0x01, 0xb0, 0x7c, 0x7d, 0x1b, 0x78,
   0x7c, 0x9e, 0x23, 0x78, 0x3b, 0xe0, 0x00, 0x01, 0x7b, 0xff, 0xf8, 0x06, 0xeb, 0x82, 0x96, 0x00,
   0xeb, 0x9c, 0x00, 0x68, 0xeb, 0x9c, 0x00, 0x18, 0xeb, 0x62, 0x0f, 0x08, 0xe9, 0x3d, 0x00, 0x18,
   0x81, 0x29, 0x00, 0x30, 0x79, 0x29, 0x84, 0x02, 0x2c, 0x09, 0x00, 0x29, 0x40, 0x82, 0x00, 0x58,
   0xe8, 0x9c, 0x00, 0x10, 0x78, 0x85, 0xc1, 0xe4, 0x78, 0xa5, 0x46, 0x20, 0x2c, 0x05, 0x00, 0xff,
   0x41, 0x82, 0x00, 0x18, 0x60, 0x84, 0x00, 0x03, 0xf8, 0x9c, 0x00, 0x10, 0x38, 0x60, 0x00, 0x06,
   0x90, 0x7e, 0x00, 0x00, 0x48, 0x00, 0x00, 0x14, 0x60, 0x84, 0x00, 0x02, 0xf8, 0x9c, 0x00, 0x10,
   0x38, 0x60, 0x00, 0x2c, 0x90, 0x7e, 0x00, 0x00, 0x80, 0xbc, 0x00, 0x04, 0xe8, 0x9c, 0x00, 0x08,
   0xe8, 0x7b, 0x00, 0x00, 0x7d, 0x23, 0x2a, 0x14, 0xf9, 0x3b, 0x00, 0x00, 0x48, 0x02, 0xb1, 0xc1,
   0x48, 0x00, 0x00, 0xc4, 0x7f, 0xa3, 0xeb, 0x78, 0x7f, 0xc4, 0xf3, 0x78, 0x4b, 0xff, 0xd9, 0xb1,
   0x7f, 0xfd, 0xfb, 0x78, 0x67, 0xbd, 0x00, 0x05, 0x63, 0xbd, 0x0b, 0xd0, 0x80, 0x7d, 0x00, 0x00,
   0x80, 0xbc, 0x00, 0x04, 0x7c, 0x63, 0x2a, 0x14, 0x90, 0x7d, 0x00, 0x00, 0xe8, 0x9c, 0x00, 0x10,
   0x78, 0x85, 0xc1, 0xe4, 0x78, 0xa5, 0x46, 0x20, 0x2c, 0x05, 0x00, 0xff, 0x40, 0x82, 0x00, 0x88,
   0xe8, 0x7b, 0x00, 0x00, 0x38, 0x80, 0x00, 0x00, 0x38, 0xc0, 0x00, 0x00, 0x7c, 0xe3, 0x22, 0x14,
   0x80, 0xa7, 0x00, 0x00, 0x7c, 0xc6, 0x2a, 0x78, 0x38, 0x84, 0x00, 0x04, 0x28, 0x24, 0x04, 0x00,
   0x40, 0x82, 0xff, 0xec, 0x80, 0x7d, 0x00, 0x00, 0x78, 0xc6, 0x07, 0xc6, 0x7c, 0xc6, 0x1b, 0x78,
   0x38, 0x60, 0x00, 0x00, 0x90, 0x7d, 0x00, 0x00, 0x7f, 0xe7, 0xfb, 0x78, 0x64, 0xe7, 0x00, 0x05,
   0x60, 0xe7, 0x0f, 0x70, 0xe8, 0x67, 0x00, 0x00, 0x28, 0x23, 0x00, 0x00, 0x41, 0x82, 0x00, 0x38,
   0x38, 0xe7, 0x00, 0x10, 0x7c, 0x23, 0x30, 0x40, 0x40, 0x82, 0xff, 0xec, 0xe8, 0xa7, 0xff, 0xf8,
   0xe8, 0xfb, 0x00, 0x00, 0x80, 0x65, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x41, 0x82, 0x00, 0x18,
   0x80, 0x85, 0x00, 0x04, 0x7c, 0x63, 0x3a, 0x14, 0x90, 0x83, 0x00, 0x00, 0x38, 0xa5, 0x00, 0x08,
   0x4b, 0xff, 0xff, 0xe4, 0x38, 0x60, 0x00, 0x00, 0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80,
   0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90, 0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x01, 0xb0,
   0x38, 0x21, 0x01, 0xa0, 0x7c, 0x08, 0x03, 0xa6, 0x4e, 0x80, 0x00, 0x20, 0xf8, 0x21, 0xff, 0x51,
   0x7c, 0x08, 0x02, 0xa6, 0xfb, 0xc1, 0x00, 0xa0, 0xfb, 0xe1, 0x00, 0xa8, 0xfb, 0xa1, 0x00, 0x98,
   0xf8, 0x01, 0x00, 0xc0, 0x3b, 0xc0, 0x0f, 0xa0, 0x3b, 0xe0, 0x00, 0xc8, 0x4b, 0xfb, 0x9b, 0x98,
   0xa0, 0x55, 0x6f, 0x3d, 0x00, 0x2c, 0xb8, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xb8,
   0x8c, 0x0a, 0x94, 0x8c, 0x00, 0x0d, 0x99, 0xb1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xe0,
   0xa2, 0xbc, 0x1a, 0x56, 0x00, 0x05, 0x2a, 0xdc, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, 0x04,
   0x6b, 0x70, 0x28, 0x02, 0x00, 0x02, 0x00, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xd4,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x53, 0x54, 0x38, 0x60, 0x00, 0x82,
   0x00, 0x5f, 0x3f, 0xc0, 0x38, 0x60, 0x00, 0x01, 0x00, 0x5f, 0x3f, 0xc4, 0x4e, 0x80, 0x00, 0x20,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xed, 0x0c, 0x3b, 0xa0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x22, 0xb8, 0x88, 0x5f, 0x74, 0x6f, 0x6f, 0x00, 0x22, 0xb8, 0x8c, 0x6c, 0x32, 0x2e, 0x78,
   0x00, 0x22, 0xb8, 0x90, 0x6d, 0x6c, 0x23, 0x72, 0x00, 0x22, 0xb8, 0x94, 0x6f, 0x6f, 0x74, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x68, 0xb8, 0x5f, 0x74, 0x6f, 0x6f, 0x00, 0x0d, 0x68, 0xbc,
   0x6c, 0x32, 0x2e, 0x78, 0x00, 0x0d, 0x68, 0xc0, 0x6d, 0x6c, 0x23, 0x72, 0x00, 0x0d, 0x68, 0xc4,
   0x6f, 0x6f, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x64, 0x65, 0x76, 0x5f, 0x78, 0x78, 0x78,
   0x78, 0x00, 0x6d, 0x6f, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
   0xeb, 0xe1, 0x00, 0x98, 0xe8, 0x01, 0x00, 0xb0, 0x38, 0x21, 0x00, 0xa0, 0x7c, 0x08, 0x03, 0xa6,
   0x38, 0x60, 0x00, 0x01, 0x78, 0x63, 0xf8, 0x06, 0x64, 0x63, 0x00, 0x70, 0x38, 0x80, 0x00, 0x00,
   0x38, 0xa0, 0x06, 0xe8, 0x4b, 0x94, 0xca, 0x60, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
   0xeb, 0x61, 0x00, 0x78, 0xeb, 0x81, 0x00, 0x80, 0xeb, 0xa1, 0x00, 0x88, 0xeb, 0xc1, 0x00, 0x90,
};

const unsigned short  port2_device_descriptor[] = {
   0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08,
   0xAA, 0xAA, 0xBB, 0xBB, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x01,
};

const unsigned short  port2_config_descriptor[] = {
   // config
   0x09, 0x02, 0x16, 0x00, 0x01, 0x01, 0x00, 0x80,
   0x01,
   // interface
   0x09, 0x04, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02,
   0x00,
   // extra
   0x04, 0x21, 0xb4, 0x2f,
};

const unsigned short  port3_device_descriptor[] = {
   0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08,
   0xAA, 0xAA, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x02,
};

const unsigned short  port3_config_descriptor[] = {
   0x09, 0x02, 0x4d, 0x0a, 0x01, 0x01, 0x00, 0x80, 0x01, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04,
   0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00,
   0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09,
   0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe,
   0x00, 0xfe, 0x01, 0x02, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
};

const unsigned short port4_device_descriptor[] = {
   0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08,
   0xAA, 0xAA, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x03,
};

const unsigned short port4_config_descriptor_1[] = {
   // config
   0x09, 0x02, 0x12, 0x00, 0x01, 0x01, 0x00, 0x80,
   0x01,
   // interface
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00,
};

const unsigned short port4_short_config_descriptor_2[] = {
   // config
   0x09, 0x02, 0x12, 0x00, 0x01, 0x01, 0x00, 0x80,
};

const unsigned short port4_config_descriptor_2[] = {
   // config
   0x09, 0x02, 0x00, 0x00, 0x01, 0x01, 0x00, 0x80,
   0x01,
   // interface
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00,
};

const unsigned short port4_config_descriptor_3[] = {
   0x09, 0x02, 0x30, 0x00, 0x01, 0x01, 0x00, 0x80, 0x01, 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01,
   0x02, 0x00, 0x3e, 0x21, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xce, 0xb0, 0x03, 0xaa, 0xbb, 0xcc, 0xdd,
   0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xee, 0x70,
};

const unsigned short port5_device_descriptor[] = {
   0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08,
   0x4c, 0x05, 0xeb, 0x02, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x01,
};

const unsigned short port5_config_descriptor[] = {
   // config
   0x09, 0x02, 0x20, 0x00, 0x01, 0x00, 0x00, 0x80,
   0x01,
   // interface
   0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0x00, 0x00,
   0x00,
   // endpoint
   0x07, 0x05, 0x02, 0x02, 0x08, 0x00, 0x00,
   // endpoint
   0x07, 0x05, 0x81, 0x02, 0x08, 0x00, 0x00,
};

const unsigned short port6_device_descriptor[] = {
   0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08,
   0xaa, 0xaa, 0xc0, 0xde, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x01,
};

const unsigned short port6_config_descriptor[] = {
   // config
   0x09, 0x02, 0x12, 0x00, 0x01, 0x01, 0x00, 0x80,
   0x01,
   // interface
   0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,
   0x00,
};


Log.txt del error al compilar con pspdev.bat

C:\pspdev\proyecto1>make
psp-gcc -I. -IC:/pspdev/psp/sdk/include -O2 -G0 -Wall   -c -o main.o main.c
In file included from main.c:7:
psgroove.h : In function 'psgroove_getDescription':
psgroove.h(120) : error: 'expire' undeclared (first use in this function)
psgroove.h(120) : error: (Each undeclared identifier is reported only once
psgroove.h(120) : error: for each function it appears in.)
main.c(109) : error: invalid storage class for function 'UsbMainThread'
main.c(115) : error: invalid storage class for function 'UsbRequest'
main.c : In function 'UsbRequest':
main.c(122) : warning: passing argument 4 of 'psgroove_getDescription' from inco
mpatible pointer type
main.c(124) : warning: implicit declaration of function 'UsbWriteData'
main.c : In function 'psgroove_getDescription':
main.c(135) : error: invalid storage class for function 'UsbUnknown'
main.c(143) : error: invalid storage class for function 'UsbAttach'
main.c(152) : error: invalid storage class for function 'UsbDetach'
main.c : In function 'UsbDetach':
main.c(153) : warning: implicit declaration of function 'DisplayEnable'
main.c : In function 'psgroove_getDescription':
main.c(162) : error: invalid storage class for function 'UsbStartFunc'
main.c : In function 'UsbStartFunc':
main.c(175) : error: 'endpdesc_hhub' undeclared (first use in this function)
main.c(201) : error: 'UsbMainThread' undeclared (first use in this function)
main.c : In function 'psgroove_getDescription':
main.c(211) : error: invalid storage class for function 'UsbStopFunc'
main.c(235) : error: 'StringDescriptor' undeclared (first use in this function)
main.c(260) : error: invalid storage class for function 'UsbBulkinReqDone'
main.c(269) : error: invalid storage class for function 'SetUsbBulkinReq'
main.c(284) : error: invalid storage class for function 'UsbBulkoutReqDone'
main.c(293) : error: invalid storage class for function 'SetUsbBulkoutReq'
main.c(310) : error: invalid storage class for function 'UsbReadData'
main.c(339) : error: invalid storage class for function 'UsbWriteData'
main.c(388) : error: invalid storage class for function 'UsbMainThread'
main.c(254) : warning: unused variable 'UsbAsyncBuff'
main.c(93) : warning: unused variable 'HUBStringDescriptor'
make: *** [main.o] Error 1


Compilador.bat normal y corriente


@echo off
title Compilador
color 1f
echo.
echo Creando Archivo... Espere...
echo.
make
echo.
echo Terminado

pause > nul


Makefile que he usado yo

TARGET = main
OBJS = main.o

INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBS =

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = hello world

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak


POR ÚLTIMO REPITO QUE SOLO HE LIMPIADO UN POCO EL CODIGO DE ERRORES DE SYNTAXYS Y ALGUNAS COSAS MÁS GRACIAS A IFCARO POR LOS CONOCIMIENTOS SOBRE C QUE ME HA APORTADO
@marcan42 Yeah, this is REALLY well done xD

en el twitter d mathieu
Yo si que se programar en C y puedo orientarte con los errores de compilación:


en psgroove.h se usa una variable que se llama expire, que no está definida.

en main.c tb hay dos o tres variables usadas sin definir.. en concreto donde te dice error: 'endpdesc_hhub' undeclared (first use in this function)

main.c(122) : warning: passing argument 4 of 'psgroove_getDescription' from inco
mpatible pointer type -> estas pasando el 4º argumento mal, seguramente la función recibe un puntero y le estas pasando una variable, o recibe una direccion de memoria y le estas pasando otro tipo de dato.

Te recomiendo ke corrijas estas cosas y recompiles, puesto que desde que canta el primer error, el compilador va cascando en cosas que pueden estar bien y ahora marca mal, excepto cuando se refiere a cosas como ke no existen variables ke usas, etc.
No se puede compilar directamente como eboot, os dará error porque usa kernel, y en 3.xx y superiores los eboots deben ser user(el error saldrá al iniciarlo en la psp). Se debe crear un loader que cargue e inicie el prx con el código en sí.

Salu2!
o sea, este codigo esta incompleto, por curiosidad... ¿que le faltaria?
shin-gori escribió:o sea, este codigo esta incompleto, por curiosidad... ¿que le faltaria?

que funcione [carcajad] [carcajad] [carcajad] [carcajad] [carcajad]

en irc alguien de la scene de psp dice que ya lo tiene listo pero que no lo soltara aun... al parecer lo hizo de forma de plugin para que este residente en psp.... y al usar la opcion de usb en psp es cuando entra en accion el plugin [boing] [boing] [boing] [boing]
hola acabo de llegar se confirmo el ps groove para la psp? falta algo? o ya se saco? un saludo
shin-gori escribió:o sea, este codigo esta incompleto, por curiosidad... ¿que le faltaria?


El en fichero psgroove.h faltaría:
- Definir la variable expire, sino me equivoco, como int

En el main.c:
En la definición de las funciones (no de los prototipos) hay que quitar las dos llaves de la definición {}
Ej: int UsbRequest( int arg1, int arg2, struct DeviceRequest *req ){}
{
Sería:
int UsbRequest( int arg1, int arg2, struct DeviceRequest *req )
{

Los prototipos, también deberían de definirse sin las {}
/*------------------------------------------------------------------------------*/
/* Pre declarations */
/*------------------------------------------------------------------------------*/
//limpio el static y añado {} así en todas las lineas de error
int UsbMainThread( SceSize size, void *argp );

Y sino me equivoco, deberían de ir dentro de una librería a parte y luego hacer el include correspondiente.

He analizado el código con un bloc de notas así que es posible que me equivoque pero si podéis probar y poner luego los errores que os da podría seguir analizando el código. He visto que también faltán otras variables por definir pero hasta dentro de un rato no puedo seguir analizándolo.
break__heart escribió:
shin-gori escribió:o sea, este codigo esta incompleto, por curiosidad... ¿que le faltaria?


El en fichero psgroove.h faltaría:
- Definir la variable expire, sino me equivoco, como int

En el main.c:
En la definición de las funciones (no de los prototipos) hay que quitar las dos llaves de la definición {}
Ej: int UsbRequest( int arg1, int arg2, struct DeviceRequest *req ){}
{
Sería:
int UsbRequest( int arg1, int arg2, struct DeviceRequest *req )
{

Los prototipos, también deberían de definirse sin las {}
/*------------------------------------------------------------------------------*/
/* Pre declarations */
/*------------------------------------------------------------------------------*/
//limpio el static y añado {} así en todas las lineas de error
int UsbMainThread( SceSize size, void *argp );

Y sino me equivoco, deberían de ir dentro de una librería a parte y luego hacer el include correspondiente.

He analizado el código con un bloc de notas así que es posible que me equivoque pero si podéis probar y poner luego los errores que os da podría seguir analizando el código. He visto que también faltán otras variables por definir pero hasta dentro de un rato no puedo seguir analizándolo.


Sí señor [oki]
bueno viendo que el tema esta avanzando y que ya hay varias personas picando codigo, ¿porque no creamos un proyecto por ejemplo de google code o de sourceforge, y desarrollar ahí el psgroove para psp?
Espero que esto sea una realidad dentro de poco y no sea un engaño por parte de 4 personas, que solo quieren fama por unos días, seria una pena.
depurando un poco el código he conseguido sacar como resultado de la compilación:

psp-gcc -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150   -c -o main.o main.c
main.c: In function 'UsbRequest':
main.c:133: warning: passing argument 4 of 'psgroove_getDescription' from incompatible pointer type
main.c:135: warning: implicit declaration of function 'UsbWriteData'
main.c: In function 'UsbDetach':
main.c:164: warning: implicit declaration of function 'DisplayEnable'
main.c: In function 'psgroove_getDescription':
main.c:398: error: static declaration of 'UsbMainThread' follows non-static declaration
test.h:3: error: previous declaration of 'UsbMainThread' was here
main.c:265: warning: unused variable 'UsbAsyncBuff'
make: *** [main.o] Error 1


pero ese ya no consigo quitarlo, debe haber algún error en otra función y el compilador dice que esta mal UsbMainThread... porque la declaración es la de toda la vida
int UsbMainThread( SceSize size, void *argp );


os pongo aquí el código del main.c (el unico que he cambiado salvo la definición en psgroove.h de la variable que no habia) por si queréis echarle un vistazo


#include <pspkernel.h>
#include <pspsdk.h>
#include <pspusb.h>
#include <pspusbbus.h>
#include <string.h>
#include "descriptors.h"
#include "psgroove.h"
//incluyo algunas librerias adicionales por si acaso xD
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <pspctrl.h>
#include <pspdisplay.h>
#include <psppower.h>
#include <stdio.h>
#include <stdlib.h>
#include <pspusb.h>


#define PSGROOVE_DRIVERNAME "PsGrooveDriver"
#define PSGROOVE_DRIVERPID  (0x1C9)

/*------------------------------------------------------------------------------*/
/* USB driver define                                             */
/*------------------------------------------------------------------------------*/
enum UsbEvents {
   USB_EVENT_ATTACH  = 1,
   USB_EVENT_DETACH  = 2,
   USB_EVENT_ASYNC   = 4,
   USB_EVENT_CONNECT = 8,
   USB_EVENT_ALL     = 0xFFFFFFFF
};

enum UsbTransEvents {
   USB_TRANSEVENT_BULKOUT_DONE = 1,
   USB_TRANSEVENT_BULKIN_DONE  = 2,
};

/*------------------------------------------------------------------------------*/
/* USB HUB device descriptor                                       */
/*------------------------------------------------------------------------------*/
struct DeviceDescriptor devdesc_hub = {
   .bLength            = 0x12,
   .bDescriptorType    = 0x01,
   .bcdUSB             = 0x0002, //? 0x0200
   .bDeviceClass       = 0x09,
   .bDeviceSubClass    = 0x00,
   .bDeviceProtocol    = 0x01,
   .bMaxPacketSize     = 0x08,
   .idVendor           = 0xAAAA,
   .idProduct          = 0xCCCC,
   .bcdDevice          = 0x0001, //? 0x0100
   .iManufacturer      = 0x00,
   .iProduct           = 0x00,
   .iSerialNumber      = 0x00,
   .bNumConfigurations = 0x01
};

/*------------------------------------------------------------------------------*/
/* USB HUB configuration descriptor                                    */
/*------------------------------------------------------------------------------*/
struct ConfigDescriptor confdesc_hub = {
   .bLength             = 0x09,
   .bDescriptorType     = 0x02,
   .wTotalLength        = 0x1900, //? 0x0019
   .bNumInterfaces      = 0x01,
   .bConfigurationValue = 0x01,
   .iConfiguration      = 0x00,
   .bmAttributes        = 0xE0,
   .bMaxPower           = 0x32
};

/*------------------------------------------------------------------------------*/
/* USB HUB interface descriptor                                    */
/*------------------------------------------------------------------------------*/
struct InterfaceDescriptor interdesc_hub = {
   .bLength            = 0x09,
   .bDescriptorType    = 0x04,
   .bInterfaceNumber   = 0x00,
   .bAlternateSetting  = 0x00,
   .bNumEndpoints      = 0x01,
   .bInterfaceClass    = 0x09,
   .bInterfaceSubClass = 0x00,
   .bInterfaceProtocol = 0x00,
   .iInterface         = 0x00
};

/*------------------------------------------------------------------------------*/
/* USB HUB endpoint descriptor                                       */
/*------------------------------------------------------------------------------*/
struct EndpointDescriptor endpdesc_hub = {
   .bLength          = 0x07,
   .bDescriptorType  = 0x05,
   .bEndpointAddress = 0x81,
   .bmAttributes     = 0x03,
   .wMaxPacketSize   = 0x100,
   .bInterval        = 0x0C
};

/*------------------------------------------------------------------------------*/
/* USB HUB string description                                       */
/*------------------------------------------------------------------------------*/
static struct StringDescriptor HUBStringDescriptor = { 0x09, 0x29, {0x06, 0xA9, 0x00, 0x32, 0x64, 0x00, 0xff} };

/*------------------------------------------------------------------------------*/
/* USB driver work                                                */
/*------------------------------------------------------------------------------*/
static struct UsbEndpoint UsbEndpoint[4] = { {0,0,0}, {1,0,0}, {2,0,0} };
static struct UsbInterface UsbInterface = { 0xFFFFFFFF, 0, 1, }; //I don't know what is this
static struct UsbData UsbData[2];
static SceUID UsbMainEventFlag = -1;
static SceUID UsbTransEventFlag = -1;
static SceUID UsbMainSemaphore = -1;
static SceUID UsbMainThreadID = -1;

/*------------------------------------------------------------------------------*/
/* Pre declarations                                                   */
/*------------------------------------------------------------------------------*/
//limpio el static y añado {} así en todas las lineas de error
int UsbMainThread( SceSize size, void *argp ); //elimino {}

/*------------------------------------------------------------------------------*/
/* UsbRequest                                                   */
/*------------------------------------------------------------------------------*/
int UsbRequest( int arg1, int arg2, struct DeviceRequest *req ) // eliminado {}
{
   unsigned char DescriptorType = (req->wValue >> 8);
   unsigned char DescriptorNumber = (req->wValue && 0xFF);
   unsigned short wLength = req->wLength;
   void *  DataAddress = NULL;
   unsigned short size = 0;

   if ( (size = psgroove_getDescription(DescriptorType, DescriptorNumber, wLength, &DataAddress)) > 0 )
   {
      if (UsbWriteData(DataAddress, size) < size)
         return -1;
   }

   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbUnknown                                                   */
/*------------------------------------------------------------------------------*/
int UsbUnknown( int arg1, int arg2, int arg3 ) //elimino {}
{
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbAttach                                                   */
/*------------------------------------------------------------------------------*/
int UsbAttach( int speed, void *arg2, void *arg3 ) //elimino {}
{
   sceKernelSetEventFlag( UsbMainEventFlag, USB_EVENT_ATTACH );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbDetach                                                   */
/*------------------------------------------------------------------------------*/
int UsbDetach( int arg1, int arg2, int arg3 ) //elimino{}
{
   DisplayEnable();
   sceKernelSetEventFlag( UsbMainEventFlag, USB_EVENT_DETACH );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbStartFunc                                                   */
/*------------------------------------------------------------------------------*/
int UsbStartFunc( int size, void *p ) // sin static compila
{
   memset( UsbData, 0, sizeof(UsbData) );
   memcpy( UsbData[0].devdesc, &devdesc_hub, sizeof(devdesc_hub) );
   UsbData[0].config.pconfdesc = &UsbData[0].confdesc;
   UsbData[0].config.pinterfaces = &UsbData[0].interfaces;
   UsbData[0].config.pinterdesc = &UsbData[0].interdesc;
   UsbData[0].config.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[0].confdesc.desc, &confdesc_hub,  sizeof(confdesc_hub) );
   UsbData[0].confdesc.pinterfaces = &UsbData[0].interfaces;
   UsbData[0].interfaces.pinterdesc[0] = &UsbData[0].interdesc;
   UsbData[0].interfaces.intcount = 1;
   memcpy( UsbData[0].interdesc.desc, &interdesc_hub, sizeof(interdesc_hub) );
   UsbData[0].interdesc.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[0].endp[0].desc, &endpdesc_hub, (sizeof endpdesc_hub) ); // &endpdesc_hhub por endpdesc_hub
   //memcpy( UsbData[0].endp[1].desc, &endpdesc_hi[1], sizeof(endpdesc_hub[1]) );
   //memcpy( UsbData[0].endp[2].desc, &endpdesc_hi[2], sizeof(endpdesc_hub[2]) );

   memcpy( UsbData[1].devdesc, &devdesc_hub, sizeof(devdesc_hub) );
   UsbData[1].config.pconfdesc = &UsbData[0].confdesc;
   UsbData[1].config.pinterfaces = &UsbData[0].interfaces;
   UsbData[1].config.pinterdesc = &UsbData[0].interdesc;
   UsbData[1].config.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[1].confdesc.desc, &confdesc_hub,  sizeof(confdesc_hub) );
   UsbData[1].confdesc.pinterfaces = &UsbData[0].interfaces;
   UsbData[1].interfaces.pinterdesc[0] = &UsbData[0].interdesc;
   UsbData[1].interfaces.intcount = 1;
   memcpy( UsbData[1].interdesc.desc, &interdesc_hub, sizeof(interdesc_hub) );
   UsbData[1].interdesc.pendp = &UsbData[0].endp[0];
   memcpy( UsbData[1].endp[0].desc, &endpdesc_hub, sizeof(endpdesc_hub) ); // &endpdesc_hhub por endpdesc_hub
   //memcpy( UsbData[1].endp[1].desc, &endpdesc_hi[1], sizeof(endpdesc_hub[1]) );
   //memcpy( UsbData[1].endp[2].desc, &endpdesc_hi[2], sizeof(endpdesc_hub[2]) );


   UsbMainEventFlag = sceKernelCreateEventFlag( "USBMainEvent", 0x200, 0, NULL );
   if ( UsbMainEventFlag < 0 ){ return( -1 ); }
   UsbTransEventFlag = sceKernelCreateEventFlag( "USBEventTrans", 0x200, 0, NULL );
   if ( UsbTransEventFlag < 0 ){ return( -1 ); }
   UsbMainSemaphore = sceKernelCreateSema( "USBSemaphore", 0, 1, 1, NULL );
   if ( UsbMainSemaphore < 0 ){ return( -1 ); }
   UsbMainThreadID = sceKernelCreateThread( "USBMainThread", UsbMainThread, 10, 0x10000, 0, NULL );
   if ( UsbMainThreadID < 0 ){ return( -1 ); }
   sceKernelStartThread( UsbMainThreadID, 0, NULL );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbStopFunc                                                   */
/*------------------------------------------------------------------------------*/
int UsbStopFunc( int size, void *p ) // elimino {}
{
   if ( UsbMainThreadID >= 0 ){ sceKernelTerminateDeleteThread( UsbMainThreadID ); }
   UsbMainThreadID = -1;
   if ( UsbMainEventFlag >= 0 ){ sceKernelDeleteEventFlag( UsbMainEventFlag ); }
   UsbMainEventFlag = -1;
   if ( UsbTransEventFlag >= 0 ){ sceKernelDeleteEventFlag( UsbTransEventFlag ); }
   UsbTransEventFlag = -1;
   if ( UsbMainSemaphore >= 0 ){ sceKernelDeleteSema( UsbMainSemaphore ); }
   UsbMainSemaphore = -1;
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* USB driver structure                                             */
/*------------------------------------------------------------------------------*/
struct UsbDriver UsbDriver = {
   PSGROOVE_DRIVERNAME,
   4,
   UsbEndpoint,
   &UsbInterface,
   &UsbData[0].devdesc[0],
   &UsbData[0].config,
   &UsbData[1].devdesc[0],
   &UsbData[1].config,
   &HUBStringDescriptor, // cambio StringDescriptor por HUBStringDescriptor
   UsbRequest,
   UsbUnknown,
   UsbAttach,
   UsbDetach,
   0,
   UsbStartFunc,
   UsbStopFunc,
   NULL
};

/********************************************************************************/
/*------------------------------------------------------------------------------*/
/* usb thread work                                                */
/*------------------------------------------------------------------------------*/
static int UsbReady = 0;
static struct UsbdDeviceReq UsbBulkinReq;
static struct UsbdDeviceReq UsbBulkoutReq;
static char UsbBuff[64*1024] __attribute__((aligned(64)));
static char UsbAsyncBuff[512] __attribute__((aligned(64)));

/*------------------------------------------------------------------------------*/
/* UsbBulkinReqDone                                                */
/*------------------------------------------------------------------------------*/
int UsbBulkinReqDone( struct UsbdDeviceReq *req, int arg2, int arg3 )// elimino {}
{
   sceKernelSetEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKIN_DONE );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* SetUsbBulkinReq                                                */
/*------------------------------------------------------------------------------*/
int SetUsbBulkinReq( void *data, int size )// elimino {}
{
   sceKernelDcacheWritebackRange( data, size );
   memset( &UsbBulkinReq, 0, sizeof(UsbBulkinReq) );
   UsbBulkinReq.endp = &UsbEndpoint[1];
   UsbBulkinReq.data = data;
   UsbBulkinReq.size = size;
   UsbBulkinReq.func = UsbBulkinReqDone;
   sceKernelClearEventFlag( UsbTransEventFlag, ~USB_TRANSEVENT_BULKIN_DONE );
   return( sceUsbbdReqSend( &UsbBulkinReq ) );
}

/*------------------------------------------------------------------------------*/
/* UsbBulkoutReqDone                                             */
/*------------------------------------------------------------------------------*/
int UsbBulkoutReqDone( struct UsbdDeviceReq *req, int arg2, int arg3 ) //elimino {}
{
   sceKernelSetEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKOUT_DONE );
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* SetUsbBulkoutReq                                                */
/*------------------------------------------------------------------------------*/
int SetUsbBulkoutReq( void *data, int size ) // elimino {}
{
   u32 upper_size = (size + 0x3F) & 0xFFFFFFC0;

   sceKernelDcacheInvalidateRange( data, upper_size );
   memset( &UsbBulkoutReq, 0, sizeof(UsbBulkoutReq) );
   UsbBulkoutReq.endp = &UsbEndpoint[2];
   UsbBulkoutReq.data = data;
   UsbBulkoutReq.size = size;
   UsbBulkoutReq.func = UsbBulkoutReqDone;
   sceKernelClearEventFlag( UsbTransEventFlag, ~USB_TRANSEVENT_BULKOUT_DONE );
   return( sceUsbbdReqRecv( &UsbBulkoutReq ) );
}

/*------------------------------------------------------------------------------*/
/* UsbReadData                                                   */
/*------------------------------------------------------------------------------*/
int UsbReadData( void *data, int data_size ) //elimino {}
{
   u32 result;
   int read_size = 0;

   while ( read_size < data_size ){
      int rest_size = data_size - read_size;
      if ( rest_size > sizeof(UsbBuff) ){ rest_size = sizeof(UsbBuff); }
      SetUsbBulkoutReq( UsbBuff, rest_size );
      int ret = sceKernelWaitEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKOUT_DONE,
                                PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
      if ( ret == 0 ){
         if ( (UsbBulkoutReq.retcode == 0) && (UsbBulkoutReq.recvsize > 0) ){
            read_size += UsbBulkoutReq.recvsize;
            memcpy( data, UsbBuff, UsbBulkoutReq.recvsize );
            data += UsbBulkoutReq.recvsize;
         } else {
            return( -1 );
         }
      } else {
         return( -1 );
      }
   }
   return( read_size );
}

/*------------------------------------------------------------------------------*/
/* UsbWriteData                                                   */
/*------------------------------------------------------------------------------*/
int UsbWriteData( const void *data, int data_size ) //elimino {}
{
   u32 result;
   int write_size = 0;

   if ( (u32)data & 0x3F ){
      while ( write_size < data_size ){
         int rest_size = data_size - write_size;
         if ( rest_size > sizeof(UsbBuff) ){ rest_size = sizeof(UsbBuff); }
         memcpy( UsbBuff, data, rest_size );
         SetUsbBulkinReq( UsbBuff, rest_size );
         int ret = sceKernelWaitEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKIN_DONE,
                                   PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
         if ( ret == 0 ){
            if ( (UsbBulkinReq.retcode == 0) && (UsbBulkinReq.recvsize > 0) ){
               write_size += UsbBulkinReq.recvsize;
               data += UsbBulkinReq.recvsize;
            } else {
               return( -1 );
            }
         } else {
            return( -1 );
         }
      }
   } else {
      while ( write_size < data_size ){
         int rest_size = data_size - write_size;
         if ( rest_size > sizeof(UsbBuff) ){ rest_size = sizeof(UsbBuff); }
         SetUsbBulkinReq( (char *)data, rest_size );
         int ret = sceKernelWaitEventFlag( UsbTransEventFlag, USB_TRANSEVENT_BULKIN_DONE,
                                   PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
         if ( ret == 0 ){
            if ( (UsbBulkinReq.retcode == 0) && (UsbBulkinReq.recvsize > 0) ){
               write_size += UsbBulkinReq.recvsize;
               data += UsbBulkinReq.recvsize;
            } else {
               return( -1 );
            }
         } else {
            return( -1 );
         }
      }
   }
   return( write_size );
}

/*------------------------------------------------------------------------------*/
/* UsbMainThread                                                */
/*------------------------------------------------------------------------------*/
int UsbMainThread( SceSize size, void *argp ) //elimino {}
{
   int ret;
   u32 result;

   while( 1 ){
      ret = sceKernelWaitEventFlag( UsbMainEventFlag,
                             USB_EVENT_ATTACH | USB_EVENT_DETACH | USB_EVENT_ASYNC,
                             PSP_EVENT_WAITOR | PSP_EVENT_WAITCLEAR, &result, NULL );
      if ( ret < 0 ){ sceKernelExitDeleteThread( 0 ); }
      if ( result & USB_EVENT_DETACH ){
         UsbReady = 0;
         sceKernelClearEventFlag( UsbMainEventFlag, ~USB_EVENT_CONNECT );
      }
      if ( result & USB_EVENT_ATTACH ){
         UsbReady = 0;
         sceKernelClearEventFlag( UsbMainEventFlag, ~USB_EVENT_CONNECT );
      }
   }
   return( 0 );
}

/********************************************************************************/
/*------------------------------------------------------------------------------*/
/* UsbbdRegister                                                */
/*------------------------------------------------------------------------------*/
void UsbbdRegister( void )
{
   sceUsbbdRegister( &UsbDriver );
}

/*------------------------------------------------------------------------------*/
/* UsbbdUnregister                                                */
/*------------------------------------------------------------------------------*/
void UsbbdUnregister( void )
{
   sceUsbbdUnregister( &UsbDriver );
}

/*------------------------------------------------------------------------------*/
/* UsbStart                                                      */
/*------------------------------------------------------------------------------*/
int UsbStart( void )
{
   int ret;

   ret = sceUsbStart( PSP_USBBUS_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbStart( PSGROOVE_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbActivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbStop                                                      */
/*------------------------------------------------------------------------------*/
int UsbStop( void )
{
   int ret;

   ret = sceUsbDeactivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbStop( PSGROOVE_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   ret = sceUsbStop( PSP_USBBUS_DRIVERNAME, 0, 0 );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbResume                                                   */
/*------------------------------------------------------------------------------*/
int UsbResume( void )
{
   int ret;

   ret = sceUsbActivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbSuspend                                                   */
/*------------------------------------------------------------------------------*/
int UsbSuspend( void )
{
   int ret;

   ret = sceUsbDeactivate( PSGROOVE_DRIVERPID );
   if ( ret != 0 ){ return( -1 ); }
   return( 0 );
}

/*------------------------------------------------------------------------------*/
/* UsbWait                                                      */
/*------------------------------------------------------------------------------*/
int UsbWait( void )
{
   int ret;

   while ( UsbMainEventFlag < 0 ){ sceKernelDelayThread( 100000 ); }
   ret = sceKernelWaitEventFlag( UsbMainEventFlag, USB_EVENT_CONNECT,
                          PSP_EVENT_WAITOR, NULL, NULL );
   return( 0 );
};
};
Mielus escribió:Espero que esto sea una realidad dentro de poco y no sea un engaño por parte de 4 personas, que solo quieren fama por unos días, seria una pena.


en vez de decir eso, no dices.... animo chicos!!!

es k de verdad, k ganas de desanimar a la gente... si es mentira, ellos son los k kedan mal solitos, sin tener k desprestigiarlos nosotros... Y si es verdad, adivina kien keda mal
Aikan78 escribió:
Mielus escribió:Espero que esto sea una realidad dentro de poco y no sea un engaño por parte de 4 personas, que solo quieren fama por unos días, seria una pena.


en vez de decir eso, no dices.... animo chicos!!!

es k de verdad, k ganas de desanimar a la gente... si es mentira, ellos son los k kedan mal solitos, sin tener k desprestigiarlos nosotros... Y si es verdad, adivina kien keda mal


También es verdad, pero no es por desanimar a nadie, pero si se ilusionan y despues le dan el palo pues seria peor. Pero bueno es cierto lo que dices y para no malgastar un mensaje ANIMO CHICOS!!!
A N I M O C H I C O S !!!!!!!!!!!!!!!!!!!!!!!!!!
[plas] [plas] [plas] [plas] [plas] [plas] [plas] [plas] [plas] [plas] [plas]
Me alegro de que alguien se ponga con ello, de todas formas, os aviso que estáis utilizando código antiguo, en el código nuevo, las cosas que faltan están con el comentario "//TODO:".

Y si os fijais el método: "UsbRequest" es diferente:

static int UsbRequest( int arg1, int arg2, struct DeviceRequest *req )
{
   unsigned char DescriptorType = (req->wValue >> 8)
   unsigned char DescriptorNumber = ((req->wValue && 0xFF)
   unsigned short wLength = req->wLength;
   void* DataAddress = NULL;   
   unsigned short size = 0;

   if (req->bRequest == 0x06) {//GetDescriptor Request
      if ( (size = psgroove_getDescription(DescriptorType, DescriptorNumber, wLength, &DataAddress)) > 0 )
         if (UsbWriteData(DataAddress, size) < size)
            return -1;
   }
   else { //Other request
      PsGroove_UnhandledControlRequest(*req);
   }

   return( 0 );
}


Y el archivo de emulación, en el primer post lo tengo ya más completo...

Pero vais por el buen camino :)

Es un plugin, no un Eboot. Este último habrá que desarrollarlo para que cargue el plugin y vea si se han realizado las operaciones con éxito, pero eso puede resultar trivial.
Tranquilo que quien o quienes lo consigan callaran muchas bocas y lo mejor es que serán reconocidos por todo el mundo como un gran trabajo para millones de personas que lo utilizaran y sino al tiempo.
Si es que lo que no se consiga aquí, es imposible XD . Si tuviera conocimientos de programación a ese nivel me encantaría ayudaros pero la verdad es que me quedo corto. Así que sólo puedo mandar ánimos a los que están trabajando en el proyecto y dar las gracias por su esfuerzo, aunque no se consiga nada. Salu2!
Hola a todos!

A mí me gustaría aportar mi granito de arena, al menos depurando el código que ya hay. Sé programar bastante, pero siempre que he querido meterle mano a la PSP acabo desesperado por el lío que hay de versiones de firmware. Si alguien me puede decir exactamente que versión de CFW necesito, cómo compilar el código y cómo probarlo creo que podré aportar algo.

Un saludo!

P.D. y si alguien sabe hacer funcionar el psplink via wifi le estaría agradecido eternamente. He seguido este tutorial http://www.psp-programming.com/forums/index.php?topic=332.msg4062 pero no consigue conectar.
kahrlos escribió:Hola a todos!

A mí me gustaría aportar mi granito de arena, al menos depurando el código que ya hay. Sé programar bastante, pero siempre que he querido meterle mano a la PSP acabo desesperado por el lío que hay de versiones de firmware. Si alguien me puede decir exactamente que versión de CFW necesito, cómo compilar el código y cómo probarlo creo que podré aportar algo.

Un saludo!



Lo mismo digo. Dadme un SDK facil de configurar bajo linux y intentaré aportar lo que pueda, como kahrlos.

Me edito:

hilo_psp-como-programar-para-la-psp_566393
habia que quitar los parentesis en las asignaciones
unsigned char DescriptorType = (req->wValue >> 8)
unsigned char DescriptorNumber = (req->wValue && 0xFF)
y añadirles ;
    static int UsbRequest( int arg1, int arg2, struct DeviceRequest *req ){
   unsigned char DescriptorType = req->wValue >> 8;
   unsigned char DescriptorNumber = req->wValue && 0xFF;
   unsigned short wLength = req->wLength;
   void* DataAddress = NULL;   
   unsigned short size = 0;

   if (req->bRequest == 0x06) {//GetDescriptor Request
      if ( (size = psgroove_getDescription(DescriptorType, DescriptorNumber, wLength, &DataAddress)) > 0 )
         if (UsbWriteData(DataAddress, size) < size)
            return -1;
   }
   else { //Other request
      PsGroove_UnhandledControlRequest(*req);
   }

   return( 0 );
}
nom1979 escribió:
kahrlos escribió:Hola a todos!

A mí me gustaría aportar mi granito de arena, al menos depurando el código que ya hay. Sé programar bastante, pero siempre que he querido meterle mano a la PSP acabo desesperado por el lío que hay de versiones de firmware. Si alguien me puede decir exactamente que versión de CFW necesito, cómo compilar el código y cómo probarlo creo que podré aportar algo.

Un saludo!



Lo mismo digo. Dadme un SDK facil de configurar bajo linux y intentaré aportar lo que pueda, como kahrlos.


yo utilizo el MinPSPW Project http://minpspw.sourceforge.net/, que en windows es tan sencillo como ejecutar el .exe e instalar XD despues con cualquier editor trabajas y despues cmd -> make

hay versión para ubuntu y solaris tb.
por cierto , si le quitamos el static a la inicializacion de UsbRequest desaparece el error:
Main.c:125: error: invalid storage class for function 'UsbRequest'
EDITO:
elproblema del 4 parametro en UsbRequest esta en que le estamos pasando el valor Dataaddres por valor con un & delante
si cambiamos esta linea
if ( (size = psgroove_getDescription(DescriptorType, DescriptorNumber, wLength, &DataAddress)) > 0 )

por esta otra
if ( (size = psgroove_getDescription(DescriptorType, DescriptorNumber, wLength, DataAddress)) > 0 )

el error desaparece
Si, y otro fallo es que psgroove_getDescription, en el nuevo código se llama: PsGroove_GetDescription ;)
nullEX escribió:Si, y otro fallo es que psgroove_getDescription, en el nuevo código se llama: PsGroove_GetDescription ;)

no lo vi XD thx
otro error

memcpy( UsbData[0].endp[0].desc, &endpdesc_hhub, sizeof(endpdesc_hub) );

y tiene que ser

memcpy( UsbData[0].endp[0].desc, &endpdesc_hub, sizeof(endpdesc_hub) );


edito: además, añadiendo al fichero psgroove.h las siguientes lineas también nos quitamos un par de errores:

static int UsbReadData( void *data, int data_size );
static int UsbWriteData( const void *data, int data_size );

edito2: en psgroove.h cambiar tambien las siguientes nombres de funciones

void PsGroove_PsGroove_Switch_Port(int8_t port)
void PsGroove_PsGroove_Connect_Port(int port)
void PsGroove_PsGroove_Disconnect_Port(int port)

les sobra el primer "PsGroove_"

deberan quedar asi:

/*------------------------------------------------------------------------------*/
    /*PsGroove_PsGroove_Switch_Port                                          */
    /*------------------------------------------------------------------------------*/
    void PsGroove_Switch_Port(int8_t port)
    {
       if (port_cur == port) return;
       port_cur = port;
       if (port_addr[port] < 0)
          port_addr[port] = 0;

       //TODO: I can't port this two lines
       //UDADDR = port_addr[port] & 0x7f;
       //UDADDR |= (1 << ADDEN);
    }

    /*------------------------------------------------------------------------------*/
    /*PsGroove_PsGroove_Connect_Port                                          */
    /*------------------------------------------------------------------------------*/
    void PsGroove_Connect_Port(int port)
    {
       last_port_reset_clear = 0;
       hub_int_response = (1 << port);
       port_status[port - 1] = PORT_FULL;
       port_change[port - 1] = C_PORT_CONN;
    }

    /*------------------------------------------------------------------------------*/
    /*PsGroove_PsGroove_Disconnect_Port                                          */
    /*------------------------------------------------------------------------------*/
    void PsGroove_Disconnect_Port(int port)
    {
       last_port_conn_clear = 0;
       hub_int_response = (1 << port);
       port_status[port - 1] = PORT_EMPTY;
       port_change[port - 1] = C_PORT_CONN;
    }


Tambien hay que cambiar "PsGroove_PsGroove_Switch_Port(0)" por "PsGroove_Switch_Port(0)" en PsGroove_Start().


Saludos y animo!!
creo que me ha tirado un intento de compilar (obviando los warnings), pero ha petao, a ver si alguno consequis ver algo en esto.
PSPDevKit >make Main
psp-gcc -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150  -L.
-LC:/pspsdk/psp/sdk/lib   Main.c   -o Main
Main.c: In function 'UsbRequest':
Main.c:157: warning: implicit declaration of function 'psgroove_UnhandledControl
Request'
Main.c: In function 'UsbDetach':
Main.c:185: warning: implicit declaration of function 'DisplayEnable'
Main.c: In function 'psgroove_getDescription':
Main.c:286: warning: unused variable 'UsbAsyncBuff'
Main.c:526: warning: control reaches end of non-void function
Main.c: At top level:
psgroove.h:62: warning: 'UsbWriteData' used but never defined
psgroove.h:61: warning: 'UsbReadData' declared 'static' but never defined
c:/pspsdk/bin/../lib/gcc/psp/4.3.3/../../../../psp/lib/crt0.o: In function `_sta
rt':
../../../../pspsdk/src/startup/crt0.c:149: undefined reference to `sceKernelCrea
teThread'
../../../../pspsdk/src/startup/crt0.c:150: undefined reference to `sceKernelStar
tThread'
c:/pspsdk/bin/../lib/gcc/psp/4.3.3/../../../../psp/lib/crt0.o: In function `_mai
n':
../../../../pspsdk/src/startup/crt0.c:68: undefined reference to `strlen'
../../../../pspsdk/src/startup/crt0.c:83: undefined reference to `atexit'
../../../../pspsdk/src/startup/crt0.c:86: undefined reference to `main'
../../../../pspsdk/src/startup/crt0.c:89: undefined reference to `exit'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `psgroove_getDescript
ion':
Main.c:(.text+0x90): undefined reference to `_flush_cache'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `UsbStopFunc.5303':
Main.c:(.text+0x1d0): undefined reference to `sceKernelTerminateDeleteThread'
Main.c:(.text+0x1ec): undefined reference to `sceKernelDeleteEventFlag'
Main.c:(.text+0x208): undefined reference to `sceKernelDeleteEventFlag'
Main.c:(.text+0x224): undefined reference to `sceKernelDeleteSema'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `UsbDetach.5294':
Main.c:(.text+0x258): undefined reference to `DisplayEnable'
Main.c:(.text+0x268): undefined reference to `sceKernelSetEventFlag'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `UsbAttach.5289':
Main.c:(.text+0x290): undefined reference to `sceKernelSetEventFlag'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `UsbRequest.5273':
Main.c:(.text+0x2e4): undefined reference to `psgroove_UnhandledControlRequest'
Main.c:(.text+0x334): undefined reference to `UsbWriteData'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `UsbStartFunc.5299':
Main.c:(.text+0x390): undefined reference to `memset'
Main.c:(.text+0x584): undefined reference to `sceKernelCreateEventFlag'
Main.c:(.text+0x5dc): undefined reference to `sceKernelCreateEventFlag'
Main.c:(.text+0x604): undefined reference to `sceKernelCreateSema'
Main.c:(.text+0x634): undefined reference to `sceKernelCreateThread'
Main.c:(.text+0x650): undefined reference to `sceKernelStartThread'
C:\DOCUME~1\HP_PRO~1\CONFIG~1\Temp/ccHxyBxr.o: In function `UsbMainThread.5265':

Main.c:(.text+0x694): undefined reference to `sceKernelWaitEventFlag'
Main.c:(.text+0x6bc): undefined reference to `sceKernelClearEventFlag'
Main.c:(.text+0x6d8): undefined reference to `sceKernelClearEventFlag'
Main.c:(.text+0x6f0): undefined reference to `sceKernelWaitEventFlag'
Main.c:(.text+0x700): undefined reference to `sceKernelExitDeleteThread'
collect2: ld returned 1 exit status
make: *** [Main] Error 1

PSPDevKit >
1482 respuestas
1, 2, 3, 4, 5, 630