› Foros › PlayStation 3 › Modchips y Softmods
DeViaNTe escribió:emm, yo lo tengo asi para que reciba el port reset. Lo he adaptado a vuestro code, solo cambiar el case xxx por este otro:case USB_REQ_GET_STATUS:
if ((req->bmRequestType & USB_TYPE_CLASS) == USB_TYPE_CLASS) {
u16 status = 0;
u16 change = 0;
value = 2 * sizeof (u16);
switch (req->bmRequestType & USB_RECIP_MASK) {
case USB_RECIP_DEVICE:
/* HUB STATUS */
status = 0;
change = 0;
break;
case USB_RECIP_OTHER:
/* PORT STATUS */
if (req->wIndex == 0 || req->wIndex > 6) {
//error en el numero del puerto...
break;
}
// Puerto correcto... (Por hacer...)
status = port_status[req->wIndex-1]; // poner el status
change = port_change[req->wIndex-1]; // y el cambio ..
break;
default:
break;
}
if (value > 0) {
if (!g_reportrequest.unused) {
Kprintf("enviando estado puerto... %d\n",req->wIndex);
g_reportrequest.data = (const unsigned char *)&status;
g_reportrequest.size = sizeof(status);
memcpy(g_reportrequest.data + g_reportrequest.size,(const unsigned char *)&change,sizeof(change));
g_reportrequest.size += sizeof(change);
g_reportrequest.endpoint = &endp[0];
g_reportrequest.isControlRequest = 0;
g_reportrequest.onComplete = &complete_request;
g_reportrequest.transmitted = 0;
g_reportrequest.returnCode = 0;
g_reportrequest.unused = &g_reportrequest;
g_reportrequest.next = NULL;
g_reportrequest.physicalAddress = NULL;
int res = sceUsbbdReqSend (&g_reportrequest);
}
else {
Kprintf("inused g_reportrequest");
return -1;
}
}
}
break;
Edito:
Vale a ver, he buscado otro to-do y me encontrao este...case 4: //* PORT_RESET * // TODO:
printf("USB_REQ_SET_FEATURE->USB_RECIP_OTHER->SetPortFeature PORT_RESET called\n");
port_change[req->wIndex - 1] |= C_PORT_RESET;
hub_port_changed();
value = 0;
break;
Asi deberia kedar, con esto introducimos un par de funciones portadas de psgroove.static void hub_interrupt_transmit () {
u8 data = 0;
int i;
for (i = 0; i < 6; i++) {
if (port_change[i] != 0)
data |= 1 << (i+1);
}
if (data != 0) {
int err = 0;
// Mantener una cola?
//if (hub_interrupt_queued) {
// ERROR(dev, "hub_interrupt_transmit: Already queued a request\n");
// return;
///}
/* Only queue one interrupt, and send it only once... If we don't do that
then it will confuse the ps3, which will try to reset our device a few
times and it will make it take over 15 seconds to get to plugging the JIG
which will not work since it must be plugged in during boot in less
than 5 seconds */
// vale, si, hay que mantener cola...
// En el on complete, deberiamos hacer dequeue.
usb_recv_request((const unsigned char *)&data, sizeof(data),0); //endpoint 0.
//hub_interrupt_queued = 1; - la cola!
}
else {
Kprintf("Nothing to report, freeing request, NAK-ing interrupt\n");
}
// y más dequeue.
//if (hub_interrupt_queued)
// usb_ep_dequeue(ep, req);
//hub_interrupt_queued = 0;
}
static void hub_port_changed ()
{
hub_interrupt_transmit();
}
Vale, añadiendo eso ya se hace bien el handle del port reset, y tal y tal.
Y del code, yo kitaría el HUB_READY de donde lo teneis! Pq causa conflicto! (Yo lo he dejado comentado...case 8: //* PORT_POWER *
printf ("port %d, ",req->wIndex);
if (status == INIT && req->wIndex == 6)
{
printf(" OK\n\nHUB Completado\n ");
//status = HUB_READY;
//time_delay_status = 150;//ms
//sceKernelWakeupThread(g_thid_status);
}
Y lo pasaría a cuando ya hemos enviado la info de todos los ports, desconectados, entonces ahi ya activarlo, en mi psp con este code completo, se conecta, manda la info y estados de todos los ports, recibe el reset de todos, y lo procesa bien, y se keda el hub en espera, y correctamente instalado en pc ( supongo en ps3 tambien ), a partir de ahi insertar el retraso de 15ms y estado hub_ready , y conectar el puerto 1, que como se puede ver, se puede mandar por usb_recv_...
Y ara piro pal sobre k ya son horas...
Saludos!
Y por si keda mas claro en source.. pos entero:
http://www.megaupload.com/?d=M6XFHFTV
(por cierto, añadirme a los creditos, k dejo el mio para apuntarme a este ( si kereis... ))
(y lo de la to-do me va bastante bien, asi meto un ctrl+f, "to-do" y ahi meto lo k falta xD)
Es funcion corresponde a esta del psfreedom:switch (req->bRequest) {
case USB_REQ_SET_FEATURE:
if ((req->bmRequestType & USB_TYPE_CLASS) == USB_TYPE_CLASS)
{
switch (req->bmRequestType & USB_RECIP_MASK)
case USB_RECIP_OTHER:
switch (req->wValue)
{
case 4: //* PORT_RESET *
printf("USB_REQ_SET_FEATURE->USB_RECIP_OTHER->SetPortFeature PORT_RESET called\n");
port_change[req->wIndex - 1] |= C_PORT_RESET;
//hub_port_changed(); // Pide hub_connect_port
value = 0;
break;
case 8: //* PORT_POWER *
printf ("port %d, ",req->wIndex);
if (status == INIT && req->wIndex == 6)
{
status = HUB_READY;
printf(" OK\n\nHUB Completado\n ");
time_delay_status = 150;//ms
sceKernelWakeupThread(g_thid_status);
}
value = 0;
break;
Notese que:
Endpoint_ClearSETUP();
Endpoint_ClearIN();
Endpoint_ClearStatusStage();
Es que se devuelve: value = 0, para confirmar que esta correcto el request recibido.
agalardi escribió:hola,
no se si lo he entendido del todo bien, pero creo que uno de los problemas actuales es que una de las comunicaciones hay que hacerla en el momento exacto (cuando lo pida la ps3).
entiendo que estais buscando la forma de esperar esa peticion, pero no sería posible buscar esos tiempos por fuerza bruta? (de eso nos sobra en EOL ).
si eso fuese posible tendrías que hacer algo para que la PSP pidiese el nº de ms a esperar y en el hilo de debate y test nos repartiriamos tiempos a probar, que entre todos y con las ganas que hay, seguro que lo sacamos en un rato.
no se tampoco si ese sería el final o simplemente un paso más hacia el final, pero seguro que todos estariamos encantados de echaros una mano.
PD: he programado en C y otros lenguajes muchos años, pero nunca para consolas, no creo que me de tiempo a meterme en ese mundo a tiempo para ayudaros más en profundidad.
agalardi escribió:hola,
no se si lo he entendido del todo bien, pero creo que uno de los problemas actuales es que una de las comunicaciones hay que hacerla en el momento exacto (cuando lo pida la ps3).
entiendo que estais buscando la forma de esperar esa peticion, pero no sería posible buscar esos tiempos por fuerza bruta? (de eso nos sobra en EOL ).
si eso fuese posible tendrías que hacer algo para que la PSP pidiese el nº de ms a esperar y en el hilo de debate y test nos repartiriamos tiempos a probar, que entre todos y con las ganas que hay, seguro que lo sacamos en un rato.
no se tampoco si ese sería el final o simplemente un paso más hacia el final, pero seguro que todos estariamos encantados de echaros una mano.
PD: he programado en C y otros lenguajes muchos años, pero nunca para consolas, no creo que me de tiempo a meterme en ese mundo a tiempo para ayudaros más en profundidad.
agalardi escribió:ok wuepe, voy a tratar de volver a pensar en C, pues llevo ya unos años centrado en delphi y vb, pero siempre es un gusto volver a los origenes.
entiendo que no hay posibilidad de debugs paso a paso y que cada cambio debe ser compilado y linkado para hacer las pruebas: ¿las haceis con la psp conectada al PC? ¿o la prueba es directa a PS3?
no me molestaré si ves que estoy en "pañales" y prefieres seguir a lo tuyo.
mientras trato de entender un poco el codigo que ya teneis, voy a ir instalando el kernel 1.5 en mi psp slim.
agalardi escribió:hola,
no se si lo he entendido del todo bien, pero creo que uno de los problemas actuales es que una de las comunicaciones hay que hacerla en el momento exacto (cuando lo pida la ps3).
entiendo que estais buscando la forma de esperar esa peticion, pero no sería posible buscar esos tiempos por fuerza bruta? (de eso nos sobra en EOL ).
si eso fuese posible tendrías que hacer algo para que la PSP pidiese el nº de ms a esperar y en el hilo de debate y test nos repartiriamos tiempos a probar, que entre todos y con las ganas que hay, seguro que lo sacamos en un rato.
no se tampoco si ese sería el final o simplemente un paso más hacia el final, pero seguro que todos estariamos encantados de echaros una mano.
PD: he programado en C y otros lenguajes muchos años, pero nunca para consolas, no creo que me de tiempo a meterme en ese mundo a tiempo para ayudaros más en profundidad.
TIOPEPE escribió:agalardi escribió:hola,
no se si lo he entendido del todo bien, pero creo que uno de los problemas actuales es que una de las comunicaciones hay que hacerla en el momento exacto (cuando lo pida la ps3).
entiendo que estais buscando la forma de esperar esa peticion, pero no sería posible buscar esos tiempos por fuerza bruta? (de eso nos sobra en EOL ).
si eso fuese posible tendrías que hacer algo para que la PSP pidiese el nº de ms a esperar y en el hilo de debate y test nos repartiriamos tiempos a probar, que entre todos y con las ganas que hay, seguro que lo sacamos en un rato.
no se tampoco si ese sería el final o simplemente un paso más hacia el final, pero seguro que todos estariamos encantados de echaros una mano.
PD: he programado en C y otros lenguajes muchos años, pero nunca para consolas, no creo que me de tiempo a meterme en ese mundo a tiempo para ayudaros más en profundidad.
Me apunto a esto, que para brutos nosotros. Si explicais como hacerlo, pero explicado para "dummies", nos ponemos a probar tiempos.
Managed to fix device 3 issue; changed max packet size from 64 to 08 and the controller's happy. Now if I could just GET THE TIMING RIGHT...
A common Windows enumeration involves the following steps,
1. The host or hub detects the connection of a new device via the device's pull up resistors on the data pair. The host waits for at least 100ms allowing for the plug to be inserted fully and for power to stabilise on the device.
2. Host issues a reset placing the device is the default state. The device may now respond to the default address zero.
3. The MS Windows host asks for the first 64 bytes of the Device Descriptor.
4. After receiving the first 8 bytes of the Device Descriptor, it immediately issues another bus reset.
5. The host now issues a Set Address command, placing the device in the addressed state.
6. The host asks for the entire 18 bytes of the Device Descriptor.
7. It then asks for 9 bytes of the Configuration Descriptor to determine the overall size.
8. The host asks for 255 bytes of the Configuration Descriptor.
9. Host asks for any String Descriptors if they were specified.
At the end of Step 9, Windows will ask for a driver for your device. It is then common to see it request all the descriptors again before it issues a Set Configuration request.
The above enumeration process is common to Windows 2000, Windows XP and Windows 98 SE.
Step 4 often confuses people writing firmware for the first time. The Host asks for the first 64 bytes of the device descriptor, so when the host resets your device after it receives the first 8 bytes, it is only natural to think there is something wrong with your device descriptor or how your firmware handles the request. However as many will tell you, if you keep persisting by implementing the Set Address Command it will pay off by asking for a full 18 bytes of device descriptor next.
Normally when something is wrong with a descriptor or how it is being sent, the host will attempt to read it three times with long pauses in between requests. After the third attempt, the host gives up reporting an error with your device.
EnvDataStaChgHubPort=1;
time_delay_status = 100;//ms
sceKernelWakeupThread(g_thid_status);
...
USB Connectado a velocidad FULL...OK
Respondiendo con HUB Descriptor... OK
OK Power 6 port Completado
Conectando port 1...
OK
GET PORT 1 STATUS
enviando estado de puerto... 1
OK-> Change... 0 1 OK
USB_REQ_CLEARFEATURE USB_RECIP_OTHER value: 1
ClearPortFeature called
GET PORT 1 STATUS
enviando estado puerto ... 1
OK
->Change... 0 1 OK
USB_REQ_CLEAR_FEATURE USB RECIP OTHER value: 1
USB_REQ_CLEAR_FEATURE->USB_RECIP_OTHER C_PORT_CONNECTION called
GET PORT 1 STATUS
enviando estado de puerto... 1
OK
-> Change... 0 0 OK
USB_REQ_CLEAR_FEATURE USB RECIP OTHER value: 1
USB_REQ_CLEAR_FEATURE->USB_RECIP_OTHER C_PORT_CONNECTION called
GET PORT 1 STATUS
...
static void
hub_connect_port (struct psfreedom_device *dev, unsigned int port)
{
if (port == 0 || port > 6)
return;
switch_to_port (dev, 0);
/* Here, we must enable the port directly, otherwise we might loose time
with the host asking for the status a few more times, and waiting for it to
be enabled, etc.. and we might miss the 5seconds window in which we need
to connect the JIG */
dev->hub_ports[port-1].status |= PORT_STAT_CONNECTION;
dev->hub_ports[port-1].status |= PORT_STAT_ENABLE;
/* If the speed flag set is not the same as what the device suports, it will
not work */
if (psfreedom_is_high_speed ())
dev->hub_ports[port-1].status |= PORT_STAT_HIGH_SPEED;
else if (psfreedom_is_low_speed ())
dev->hub_ports[port-1].status |= PORT_STAT_HIGH_SPEED;
dev->hub_ports[port-1].change |= PORT_STAT_C_CONNECTION;
hub_port_changed (dev);
}
agalardi escribió:he estado probando a insertar algo de codigo para que al comenzar te pida el tiempo a esperar de forma que podamos ir probando diferentes valores sin recompilar y así podríamos participar todos. me ha matado que la psp no tiene teclado y no se como pedir el numero. mañana lo hare recogiendo el valor de un fichero, que tambien es facil de modificar por todos. (dios, como me esta costando volver a C)
por otro lado he revisado mucho tiempo el codigo (muuucho tiempo), y debo reconocer que no me entero aun al 100% pero he mirado el source de psfreedom y veo alguna diferencia:
por un lado hay muchos miembros de estructuras a los que poneis valores directamento, mientras que en psfreedom usan la macro cpu_to_le16, por ejemplo y los mas relevantes al problema actual: port_status y port_change. entiendo que los valores ya son unsigned de 16 bits pero...
por otro lado vosotros tratais de hacer todos los pasos correctamente siguiendo un protocolo mientras que he visto que quizas sea mas efectivo poner enabled directamente el puerto al realizarse la conexion. logicamente luego no seria necesario manejarlo en usb_request. copio la funcion donde lo he visto:
static void
hub_connect_port (struct psfreedom_device *dev, unsigned int port)
{
if (port == 0 || port > 6)
return;
switch_to_port (dev, 0);
/* Here, we must enable the port directly, otherwise we might loose time
with the host asking for the status a few more times, and waiting for it to
be enabled, etc.. and we might miss the 5seconds window in which we need
to connect the JIG */
dev->hub_ports[port-1].status |= PORT_STAT_CONNECTION;
dev->hub_ports[port-1].status |= PORT_STAT_ENABLE;
/* If the speed flag set is not the same as what the device suports, it will
not work */
if (psfreedom_is_high_speed ())
dev->hub_ports[port-1].status |= PORT_STAT_HIGH_SPEED;
else if (psfreedom_is_low_speed ())
dev->hub_ports[port-1].status |= PORT_STAT_HIGH_SPEED;
dev->hub_ports[port-1].change |= PORT_STAT_C_CONNECTION;
hub_port_changed (dev);
}
a ver si sale algo de esto, me voy a sobar que mañana es dia de curre.
port_status[port - 1] = PORT_FULL;
port_change[port - 1] = C_PORT_CONN;
port_status[port - 1] |= PORT_FULL;
port_change[port - 1] |= C_PORT_CONN;
port_status[port-1] |= PORT_STAT_CONNECTION;
port_status[port-1] |= PORT_STAT_ENABLE;
int start_hub(SceSize args, void *argp)
{
Cambiamos esto:
// Activamos Dispositivo CCCC
//retVal = sceUsbActivate(0xCCCC);
retVal = sceUsbActivate(0x1C9);
case 8: //* PORT_POWER *
printf ("port %d, ",req->wIndex);
port_status[req->wIndex - 1] = PORT_STAT_POWER;
if (status == INIT && req->wIndex == 6)
{
//status = HUB_READY;
printf(" OK\n\nHUB Completado\n ");
//time_delay_status = 150;//ms
//sceKernelWakeupThread(g_thid_status);
}
value = 0;
break;
port_status[port - 1] = PORT_FULL;
port_change[port - 1] = C_PORT_CONN;
int usb_thread_state(SceSize size, void *argp)
{
int ret;
u32 result;
unsigned short bufferAux[2];
while(1)
{
sceKernelSleepThread();
sceKernelDelayThread(time_delay_status * 1000);
if (EnvDataStaChgHubPort) // Envio de GET STATUS
{
EnvDataStaChgHubPort=0;
Hex_To_Array(hubstatus,&bufferAux[0],&bufferAux[1]); // Convertir de Long a Array
usb_send_request((const unsigned char *)&bufferAux, 2,1); // Enviamos por enpoint 1
sceKernelWakeupThread(g_thid_wait_request); // Seguimos enviando el siguiente dato
}else
{
// TODO: Implementar los case para retardos necesarios durante todo el proceso...
switch (status) {
case HUB_READY:
//switch_to_port(1);
hub_connect_port(1); // Falta implementa este proceso.
break;
}
}
// Implementar Case para otros retardos necesarios de cambiar puerto/desconexión etc...
}
return 0;
}
...pero aun así la pega es que en la ps3, si no mandamos en 150ms que conecte al puerto 1, se queda quieto aquí(no pide nada nuevo)...
... aquí(no pide nada nuevo), pero en el PC, sigue trabajado y sin pedirlo nos pregunta por los estados de los puertos GET STATUS PORT(debe de ser el s.o. windows quien lo pide), ...
static int usb_send_request(void* data, int size,int idendp)
{
if (!g_reportrequest.unused)
{
g_reportrequest.data = data;
[b]g_reportrequest.size = sizeof (size);[/b]
g_reportrequest.endpoint = &endp[idendp];
g_reportrequest.isControlRequest = 0;
g_reportrequest.onComplete = &complete_request;
g_reportrequest.transmitted = 0;
g_reportrequest.returnCode = 0;
g_reportrequest.unused = &g_reportrequest;
g_reportrequest.next = NULL;
g_reportrequest.physicalAddress = NULL;
int res = sceUsbbdReqSend (&g_reportrequest);
agalardi escribió:LoPelut, acostumbrado a pasar el tamaño de la estructura en este tipo funciones yo ni me había percatado, pero tiene sentido. Eso si, los maestros que lo corroboren.
por otro lado wuepe y CaptainCPS-X, no habra muchas diferencias al programar para consolas, pero realmente me esta costando dios y ayuda hacer 2 cosillas.
si trato de usar funciones como fopen, fseek, etc. para leer de un fichero, o para escribir un log (creo que me enteraré mejor del funcionamiento y la secuencia de los callbacks en lugar de verlo en pantalla), simplemente pongo los includes stdio y stdlib, pero no compila.
si cambio el makefile para comentar las lineas: # USE_KERNEL_LIBC = 1 y # USE_KERNEL_LIBS = 1, entonces compila bien, pero me da un error: "loadcore.c: doLinkLibraryEntries: Cannot link library [Kernel_Library]".
se que este foro no es para que los novatos aprendamos, pero teniendo experiencia previa programando, creo que con un par de empujones puedo llegar a hacer mis propias pruebas y ayudar no solo revisando codigo y diciendo teorias.
agalardi escribió:...
si trato de usar funciones como fopen, fseek, etc. para leer de un fichero, o para escribir un log (creo que me enteraré mejor del funcionamiento y la secuencia de los callbacks en lugar de verlo en pantalla), simplemente pongo los includes stdio y stdlib, pero no compila.
...
#include <pspiofilemgr.h>
...
char fichero_salida = "ms0:/nombre_fichero.txt"
SceUID fd = sceIoOpen(fichero_salida, PSP_O_WRONLY|PSP_O_CREAT, 0777);
sceIoWrite(fd, dump, modulo_usb.segmentsize[i]*sizeof(char));
sceIoClose(fd);
LoPelut escribió:int usb_thread_state(SceSize size, void *argp)
{
int ret;
u32 result;
unsigned short bufferAux[2];
while(1)
{
sceKernelSleepThread();
sceKernelDelayThread(time_delay_status * 1000);
if (EnvDataStaChgHubPort) // Envio de GET STATUS
{
EnvDataStaChgHubPort=0;
Hex_To_Array(hubstatus,&bufferAux[0],&bufferAux[1]); // Convertir de Long a Array
usb_send_request((const unsigned char *)&bufferAux, 2,1); // Enviamos por enpoint 1
sceKernelWakeupThread(g_thid_wait_request); // Seguimos enviando el siguiente dato
}else
{
// TODO: Implementar los case para retardos necesarios durante todo el proceso...
switch (status) {
case HUB_READY:
//switch_to_port(1);
hub_connect_port(1); // Falta implementa este proceso.
break;
}
}
// Implementar Case para otros retardos necesarios de cambiar puerto/desconexión etc...
}
return 0;
}...pero aun así la pega es que en la ps3, si no mandamos en 150ms que conecte al puerto 1, se queda quieto aquí(no pide nada nuevo)...
A lo mejor si que está pidiendo, pero no nos enteramos.
Posiblemente me equivoco, pero con sceKernelSleepThread estamos haciendo que el hilo se duerma, cuando lo que queremos es que siga despierto escuchando diferentes eventos...
Esto es un fallo común en la programacion de microcontroladores y PLC's (y en VB con el MsgBox, que te para TODO el código hasta que aceptas o cancelas...); no hay que hacer que duerma, sino que en ese lapso de tiempo no ejecute las instrucciones que nos interese, pero que siga ejecutando lo que nos interesa. Que tal programar un temporizador genérico que cuente milisegundos y condicionar el código al valor de ese temporizador? al fin y al cabo, es lo que hace el PSGroove...
Repito, puede que me equivoque si el thread que dormís no es el mismo que el que se encarga de las transacciones, pero creo que lo usais de forma genérica para todos los paquetes de la comunicacion...... aquí(no pide nada nuevo), pero en el PC, sigue trabajado y sin pedirlo nos pregunta por los estados de los puertos GET STATUS PORT(debe de ser el s.o. windows quien lo pide), ...
Windows tiene peticiones URB, PnP y algunas más que no me acuerdo, y todas ellas van en cascada: cuando conectamos un usb, primero pide descripción el sistema PnP (que debe tener algún tipo de código especial cuando se conecta un HUB para rotar las peticiones de estado de conexión de puertos), esto se le pasa al HUB y el HUB al dispositivo. Éste contesta al HUB y del HUB se envía al sistema PnP, quien lo envía al controlador (.inf, por llamarlo de alguna forma) USB adecuado. El GET STATUS PORT se envía desde el sistema PnP de Windows, no desde los paquetes URB que son los que llevan la información del cambio de dirección y habilitacion de dispositivo.
Me he tirado un par de días con el USBLyzer mirando tramas, y algo he llegado a entender: para saber como funciona todo esto en Windows está muy bien probar, pero para que funcione el programa en la PS3 no tiene nada que ver.
Saludos!
EDIT: Ok, creo que me he colado, en realidad lo que haceis es activar el thread cada vez que hay que enviar respuesta justo despues de establecer el tiempo de sleep... sorry.
Por otra parte, revisando código, me he encontrado con esto:static int usb_send_request(void* data, int size,int idendp)
{
if (!g_reportrequest.unused)
{
g_reportrequest.data = data;
[b]g_reportrequest.size = sizeof (size);[/b]
g_reportrequest.endpoint = &endp[idendp];
g_reportrequest.isControlRequest = 0;
g_reportrequest.onComplete = &complete_request;
g_reportrequest.transmitted = 0;
g_reportrequest.returnCode = 0;
g_reportrequest.unused = &g_reportrequest;
g_reportrequest.next = NULL;
g_reportrequest.physicalAddress = NULL;
int res = sceUsbbdReqSend (&g_reportrequest);
Eso no debería ser simplemente g_reportrequest.size = size;?
[/* Full-Speed endpoint descriptors */
struct EndpointDescriptor endpdesc_hi[3] = {
...
.wMaxPacketSize = 0x01,
...
.wMaxPacketSize = 0x08,
/* String descriptor */ //TODO Revisar si esta bien, y si es importante
unsigned char strp[] =
{
0x09, 0x29, 0x06, 0xA9, 0x00, 0x32, 0x64, 0x00, 0xff
};
struct UsbDriver g_driver =
{
HUBDRIVER_NAME,
4,
endp,
&intp,
NULL, NULL, NULL, NULL,
(struct StringDescriptor *) strp,
usb_request, func28, usb_attach, usb_detach,
usb_configure,
start_func,
stop_func,
NULL
};
usb_send_request((const unsigned char *)&HUB_Hub_Descriptor, sizeof(HUB_Hub_Descriptor),0); // endpoint 0 control
usb_send_request((const unsigned char *)&hub_header_desc, sizeof(hub_header_desc),0); // endpoint 0 control
LoPelut escribió:
Lo que parece cierto es que, segun habeis comentado, en lugar de hacer
[code]usb_send_request((const unsigned char *)&HUB_Hub_Descriptor, sizeof(HUB_Hub_Descriptor),0); // endpoint 0 control[/code]
haceis
[code]
usb_send_request((const unsigned char *)&hub_header_desc, sizeof(hub_header_desc),0); // endpoint 0 control
habiendo cambiado antes en hub_header_desc el orden de algunos bytes y haciendo que funcione. Con esto quiero decir que a lo mejor el (struct StringDescriptor *)strp hay que cambiarlo por (const unsigned char *)hub_header_desc.
EDIT: Error, esto no creo que esté bien (o llenamos de basura información del driver). En ese campo se espera el descriptor de cadena del driver, y le estamos pasando la cabecera entera.
http://psp.jim.sh/pspsdk-doc/structStringDescriptor.html
en teoría debe haber un paquete de 34 bytes: uno para longitud (correcto,9 bytes), otro para tipo de descriptor (correcto, hub es tipo 0x29) y un array de 32 bytes máximo (del cual usamos 7 con basura). No creo que sea un fallo, ya que no se hace nada dañino, pero tampoco creo que esté bien. En resumen, no creo que sea importante.
reqtools escribió:Una pregunta tonta, que hace muchos años que no toco programación.....pero muchos.....
Donde está definido hub_header_desc?
Gracias.
Un saludo!
/* 11.23.2.1 Class-Specific AC Interface Descriptor */
struct usb_hub_header_descriptor {
unsigned char bLength; /* 8+n */
unsigned char bDescriptorType; /* USB_DT_CS_HUB */
unsigned char bNbrPorts; /* n */
unsigned short wHubCharacteristics; /* hub characteristics */
unsigned char bPwrOn2PwrGood; /* Port settling time, in 2ms */
unsigned char bHubContrCurrent; /* ? */
unsigned char DeviceRemovable; /* [n/8] */
unsigned char PortPwrCtrlMask; /* [n/8] */
} __attribute__ ((packed));
azsxdcf escribió:a los scenerss...
como va el asunto?? en que parte estais atascados o por donde va el port?
NeoRyoga escribió:azsxdcf escribió:a los scenerss...
como va el asunto?? en que parte estais atascados o por donde va el port?
porque tu los vas a ayudar!!!!
esa presion!!!!!
ve y compra un clon xD mejor o actualiza tu ps3....
si no han puesto novedades es que no lo hay......
NeoRyoga escribió:azsxdcf escribió:a los scenerss...
como va el asunto?? en que parte estais atascados o por donde va el port?
porque tu los vas a ayudar!!!!
esa presion!!!!!
ve y compra un clon xD mejor o actualiza tu ps3....
si no han puesto novedades es que no lo hay......
Abenlx escribió:NeoRyoga escribió:azsxdcf escribió:a los scenerss...
como va el asunto?? en que parte estais atascados o por donde va el port?
porque tu los vas a ayudar!!!!
esa presion!!!!!
ve y compra un clon xD mejor o actualiza tu ps3....
si no han puesto novedades es que no lo hay......
Que aburrido tienes que estar chaval.....hay dias tontos y tontos todos los dias!
CaptainCPS-X escribió:reqtools escribió:Una pregunta tonta, que hace muchos años que no toco programación.....pero muchos.....
Donde está definido hub_header_desc?
Gracias.
Un saludo!
Supongo que es esto (pero lo curioso es que esta estructura no se usa en el codigo actual, solo se declara).../* 11.23.2.1 Class-Specific AC Interface Descriptor */
struct usb_hub_header_descriptor {
unsigned char bLength; /* 8+n */
unsigned char bDescriptorType; /* USB_DT_CS_HUB */
unsigned char bNbrPorts; /* n */
unsigned short wHubCharacteristics; /* hub characteristics */
unsigned char bPwrOn2PwrGood; /* Port settling time, in 2ms */
unsigned char bHubContrCurrent; /* ? */
unsigned char DeviceRemovable; /* [n/8] */
unsigned char PortPwrCtrlMask; /* [n/8] */
} __attribute__ ((packed));
Saludos.
//#define USB_DT_HUB_HEADER_SIZE(n) (sizeof(struct usb_hub_header_descriptor))
#define USB_DT_HUB_HEADER_SIZE (sizeof(struct usb_hub_header_descriptor))
/* Hub class specific Descriptor */
static const struct usb_hub_header_descriptor hub_header_desc = {
.bLength = USB_DT_HUB_HEADER_SIZE,
.bDescriptorType = USB_DT_CS_HUB,
.bNbrPorts = 6,
.wHubCharacteristics = 0x00a9,
.bPwrOn2PwrGood = 50,
.bHubContrCurrent = 100,
.DeviceRemovable = 0x00,
.PortPwrCtrlMask = 0xFF,
};
azsxdcf escribió:quien?
LoPelut escribió:CaptainCPS-X escribió:reqtools escribió:Una pregunta tonta, que hace muchos años que no toco programación.....pero muchos.....
Donde está definido hub_header_desc?
Gracias.
Un saludo!
Supongo que es esto (pero lo curioso es que esta estructura no se usa en el codigo actual, solo se declara).../* 11.23.2.1 Class-Specific AC Interface Descriptor */
struct usb_hub_header_descriptor {
unsigned char bLength; /* 8+n */
unsigned char bDescriptorType; /* USB_DT_CS_HUB */
unsigned char bNbrPorts; /* n */
unsigned short wHubCharacteristics; /* hub characteristics */
unsigned char bPwrOn2PwrGood; /* Port settling time, in 2ms */
unsigned char bHubContrCurrent; /* ? */
unsigned char DeviceRemovable; /* [n/8] */
unsigned char PortPwrCtrlMask; /* [n/8] */
} __attribute__ ((packed));
Saludos.
el uso lo tienes aquí, solo que defines la variable hub_header_desc y la inicializas a la vez://#define USB_DT_HUB_HEADER_SIZE(n) (sizeof(struct usb_hub_header_descriptor))
#define USB_DT_HUB_HEADER_SIZE (sizeof(struct usb_hub_header_descriptor))
/* Hub class specific Descriptor */
static const struct usb_hub_header_descriptor hub_header_desc = {
.bLength = USB_DT_HUB_HEADER_SIZE,
.bDescriptorType = USB_DT_CS_HUB,
.bNbrPorts = 6,
.wHubCharacteristics = 0x00a9,
.bPwrOn2PwrGood = 50,
.bHubContrCurrent = 100,
.DeviceRemovable = 0x00,
.PortPwrCtrlMask = 0xFF,
};
PD: he redefinido #define USB_DT_HUB_HEADER_SIZE (sizeof(struct usb_hub_header_descriptor))
para sacarle el (n), supongo que debe ser para aprovechar el define segun el descriptor que se pida mas adelante.
Saludos!
LoPelut escribió:el uso lo tienes aquí, solo que defines la variable hub_header_desc y la inicializas a la vez://#define USB_DT_HUB_HEADER_SIZE(n) (sizeof(struct usb_hub_header_descriptor))
#define USB_DT_HUB_HEADER_SIZE (sizeof(struct usb_hub_header_descriptor))
/* Hub class specific Descriptor */
static const struct usb_hub_header_descriptor hub_header_desc = {
.bLength = USB_DT_HUB_HEADER_SIZE,
.bDescriptorType = USB_DT_CS_HUB,
.bNbrPorts = 6,
.wHubCharacteristics = 0x00a9,
.bPwrOn2PwrGood = 50,
.bHubContrCurrent = 100,
.DeviceRemovable = 0x00,
.PortPwrCtrlMask = 0xFF,
};
PD: he redefinido #define USB_DT_HUB_HEADER_SIZE (sizeof(struct usb_hub_header_descriptor))
para sacarle el (n), supongo que debe ser para aprovechar el define segun el descriptor que se pida mas adelante.
Saludos!
/*
PSP FILE IO (REV 3)
Descripcion: Ejemplo de entrada y salida de archivos utilizando el PSPSDK
Por: CaptainCPS-X (2010)
Rev 1: No tiene manejo de salida.
Rev 2: Agregado el manejo de Inicio y de Salida usando botones (entre otros detalles).
Rev 3: Corregida la deteccion de fallos al abrir / escribir el archivo.
Tome de referencia esta pagina: http://www.psp-programming.com/forums/index.php?topic=68
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <pspctrl.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("pspfileio", 0x1000, 1, 1);
int flags = PSP_O_RDWR | PSP_O_CREAT ; // Flag de Lectura / Escritura y Crear archivo de no Existir.
SceMode mode = 0777; // Permiso CHMOD para todo tipo de accion.
const char file[] = "ms0:\\pspfile.txt"; // Archivo a escribir / leer
char fbuffer[256]; // Buffer que se usara para rellenar de texto.
void PSPFileIO(); // Prototipo de la funcion principal.
int bFinished = 0; // Variable para saber si se ha realizado la funcion principal.
int main(int argc, char *argv[]) {
// Iniciamos la pantalla para debug / depurar
pspDebugScreenInit();
// debug
printf("PSP FILE IO (REV. 3) - por CaptainCPS-X (2010) \n\n");
// debug
printf("Este programa abrira el archivo [ %s ] y si no existe lo creara en la Memory Stick del PSP. Luego escribira varias cadenas de texto como forma de prueba.\n\n", file);
printf("PRECIONA \"X\" PARA CONTINUAR...\n\n");
// Buffer data de botones
SceCtrlData pad_data;
// Loop atento a botones
for(;;) {
// Leemos el buffer de botones, por si acaso se ha precionado alguno
sceCtrlReadBufferPositive(&pad_data, 1);
// Si se ha precionado "X" realicamos la funcion principal
if(pad_data.Buttons & PSP_CTRL_CROSS)
{
// Si ya se realizo todo, continua el Loop
if(bFinished) continue;
// debug
printf("Iniciando funcion principal...\n\n");
// Funcion principal
PSPFileIO();
// debug
printf("PRECIONA \"O\" PARA VOLVER AL XBM...\n");
}
// Si se ha precionado "O" salimos del programa
if(pad_data.Buttons & PSP_CTRL_CIRCLE)
{
// debug
printf("Saliendo del programa...\n");
// Salir del programa
sceKernelExitGame();
}
}
return 0;
}
void PSPFileIO() {
// Abrimos el archivo y nos devuelve el ID
SceUID fp = sceIoOpen(file, flags, mode);
if(fp < 0) {
// Error al abrir / crear el archivo.
printf("Error al abrir / crear [ %s ].\n\n", file);
bFinished = 1;
return;
}
// debug
printf("[ %s ] abierto / creado correctamente.\n\n", file);
// Llenamos el buffer con una cadena de texto.
sprintf(fbuffer, "Hola Mundo!.\n");
// Escribimos el buffer al archivo y nos devuelve la cantidad de bytes escritos.
// debug
printf("Escribiendo: %s", fbuffer);
int flen = sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Llenamos el buffer con una cadena de texto nuevamente.
sprintf(fbuffer, "%d bytes escritos.\n", flen);
// Escribimos por ultima vez el buffer al archivo.
// debug
printf("Escribiendo: %s", fbuffer);
sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Cerramos el archivo
// debug
printf("\nCerrando archivo.\n\n");
sceIoClose(fp);
bFinished = 1;
}
/*
PSP FILE IO (REV 2)
Descripcion: Ejemplo de entrada y salida de archivos utilizando el PSPSDK
Por: CaptainCPS-X (13-sep-2010)
Rev 1: No tiene manejo de salida.
Rev 2: Agregado el manejo de Inicio y de Salida usando botones (entre otros detalles).
Tome de referencia esta pagina: http://www.psp-programming.com/forums/index.php?topic=68
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <pspctrl.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("pspfileio", 0x1000, 1, 1);
int flags = PSP_O_RDWR | PSP_O_CREAT ; // Flag de Lectura / Escritura y Crear archivo de no Existir.
SceMode mode = 0777; // Permiso CHMOD para todo tipo de accion.
const char file[] = "ms0:\\pspfile.txt"; // Archivo a escribir / leer
char fbuffer[256]; // Buffer que se usara para rellenar de texto.
void PSPFileIO(); // Prototipo de la funcion principal.
int bFinished = 0; // Variable para saber si se ha realizado la funcion principal.
int main(int argc, char *argv[]) {
// Iniciamos la pantalla para debug / depurar
pspDebugScreenInit();
// debug
printf("PSP FILE IO (REV. 2) - por CaptainCPS-X (2010) \n\n");
// debug
printf("Este programa abrira el archivo [ %s ] y si no existe lo creara en la Memory Stick del PSP. Luego escribira varias cadenas de texto como forma de prueba.\n\n", file);
printf("PRECIONA \"X\" PARA CONTINUAR...\n\n");
// Buffer data de botones
SceCtrlData pad_data;
// Loop atento a botones
for(;;) {
// Leemos el buffer de botones, por si acaso se ha precionado alguno
sceCtrlReadBufferPositive(&pad_data, 1);
// Si se ha precionado "X" realicamos la funcion principal
if(pad_data.Buttons & PSP_CTRL_CROSS)
{
// Si ya se realizo todo, continua el Loop
if(bFinished) continue;
// debug
printf("Iniciando funcion principal...\n\n");
// Funcion principal
PSPFileIO();
// debug
printf("Listo!...(PRECIONA \"O\" PARA VOLVER AL XBM.)\n");
}
// Si se ha precionado "O" salimos del programa
if(pad_data.Buttons & PSP_CTRL_CIRCLE)
{
// debug
printf("Saliendo del programa...\n");
// Salir del programa
sceKernelExitGame();
}
}
return 0;
}
void PSPFileIO() {
// Abrimos el archivo y nos devuelve el ID
SceUID fp = sceIoOpen(file, flags, mode);
if(!fp) {
// Error al abrir / crear el archivo.
printf("Error al abrir / crear [ %s ]\n", file);
bFinished = 1;
return;
}
// debug
printf("[ %s ] abierto / creado correctamente.\n\n", file);
// Llenamos el buffer con una cadena de texto.
sprintf(fbuffer, "Hola Mundo!.\n");
// Escribimos el buffer al archivo y nos devuelve la cantidad de bytes escritos.
// debug
printf("Escribiendo: %s", fbuffer);
int flen = sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Llenamos el buffer con una cadena de texto nuevamente.
sprintf(fbuffer, "%d bytes escritos.\n", flen);
// Escribimos por ultima vez el buffer al archivo.
// debug
printf("Escribiendo: %s", fbuffer);
sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Cerramos el archivo
// debug
printf("\nCerrando archivo.\n\n");
sceIoClose(fp);
bFinished = 1;
}
/*
PSP FILE IO
Descripcion: Ejemplo de entrada y salida de archivos utilizando el PSPSDK
Por: CaptainCPS-X (13-sep-2010)
Nota: Luego de hacer todo el PSP no responde y hay que darle un hard reset. No se por que razon.
Tome de referencia esta pagina: http://www.psp-programming.com/forums/index.php?topic=68
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspiofilemgr.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("pspfileio", 0x1000, 1, 1);
int flags = PSP_O_RDWR | PSP_O_CREAT ; // Flag de Lectura / Escritura y Crear archivo de no Existir.
SceMode mode = 0777; // Permiso CHMOD para todo tipo de accion.
char fbuffer[256]; // Buffer que se usara para rellenar de texto.
int main(int argc, char *argv[]) {
// Iniciamos la pantalla para debug / depurar
pspDebugScreenInit();
// Abrimos el archivo y nos devuelve el ID
SceUID fp = sceIoOpen("ms0:\\pspfile.txt", flags, mode);
if(!fp) {
// Error al abrir / crear el archivo.
printf("Error al abrir / crear el archivo.\n");
return 0;
}
// debug
printf("Archivo abierto / creado correctamente.\n\n");
// Llenamos el buffer con una cadena de texto.
sprintf(fbuffer, "Hola Mundo!.\n");
// Escribimos el buffer al archivo y nos devuelve la cantidad de bytes escritos.
// debug
printf("Escribiendo: %s", fbuffer);
int flen = sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Llenamos el buffer con una cadena de texto nuevamente.
sprintf(fbuffer, "%d bytes escritos.\n", flen);
// Escribimos por ultima vez el buffer al archivo.
// debug
printf("Escribiendo: %s", fbuffer);
sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Cerramos el archivo
// debug
printf("Cerrando archivo.\n\n");
sceIoClose(fp);
// debug
printf("Listo!.");
return 0;
}
CaptainCPS-X escribió:He adjuntado un programa que escribí hace un rato (PSP FILE IO) para demostrar de manera simple como Abrir un archivo para escritura o lectura. Esto nos servirá para llevar un LOG de lo que ocurre mientras corre el PSPGroove.
Aqui tienen el código del main.c:
EDIT: Si se desea escribir en un archivo existente al final del mismo sin sobre-escribirlo se debe utilizar este flag "PSP_O_APPEND".
EDIT 2: He adjuntado la Revision 2 del "PSP FILE IO" y ahora maneja el inicio y salida mediante botones . Ademas le añadi mas informacion, etc.
EDIT 3: Revision 3 adjuntada. (Corregida la detección de fallos al abrir / escribir el archivo)
REV 3:/*
PSP FILE IO (REV 3)
Descripcion: Ejemplo de entrada y salida de archivos utilizando el PSPSDK
Por: CaptainCPS-X (2010)
Rev 1: No tiene manejo de salida.
Rev 2: Agregado el manejo de Inicio y de Salida usando botones (entre otros detalles).
Rev 3: Corregida la deteccion de fallos al abrir / escribir el archivo.
Tome de referencia esta pagina: http://www.psp-programming.com/forums/index.php?topic=68
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <pspctrl.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("pspfileio", 0x1000, 1, 1);
int flags = PSP_O_RDWR | PSP_O_CREAT ; // Flag de Lectura / Escritura y Crear archivo de no Existir.
SceMode mode = 0777; // Permiso CHMOD para todo tipo de accion.
const char file[] = "ms0:\\pspfile.txt"; // Archivo a escribir / leer
char fbuffer[256]; // Buffer que se usara para rellenar de texto.
void PSPFileIO(); // Prototipo de la funcion principal.
int bFinished = 0; // Variable para saber si se ha realizado la funcion principal.
int main(int argc, char *argv[]) {
// Iniciamos la pantalla para debug / depurar
pspDebugScreenInit();
// debug
printf("PSP FILE IO (REV. 3) - por CaptainCPS-X (2010) \n\n");
// debug
printf("Este programa abrira el archivo [ %s ] y si no existe lo creara en la Memory Stick del PSP. Luego escribira varias cadenas de texto como forma de prueba.\n\n", file);
printf("PRECIONA \"X\" PARA CONTINUAR...\n\n");
// Buffer data de botones
SceCtrlData pad_data;
// Loop atento a botones
for(;;) {
// Leemos el buffer de botones, por si acaso se ha precionado alguno
sceCtrlReadBufferPositive(&pad_data, 1);
// Si se ha precionado "X" realicamos la funcion principal
if(pad_data.Buttons & PSP_CTRL_CROSS)
{
// Si ya se realizo todo, continua el Loop
if(bFinished) continue;
// debug
printf("Iniciando funcion principal...\n\n");
// Funcion principal
PSPFileIO();
// debug
printf("PRECIONA \"O\" PARA VOLVER AL XBM...\n");
}
// Si se ha precionado "O" salimos del programa
if(pad_data.Buttons & PSP_CTRL_CIRCLE)
{
// debug
printf("Saliendo del programa...\n");
// Salir del programa
sceKernelExitGame();
}
}
return 0;
}
void PSPFileIO() {
// Abrimos el archivo y nos devuelve el ID
SceUID fp = sceIoOpen(file, flags, mode);
if(fp < 0) {
// Error al abrir / crear el archivo.
printf("Error al abrir / crear [ %s ].\n\n", file);
bFinished = 1;
return;
}
// debug
printf("[ %s ] abierto / creado correctamente.\n\n", file);
// Llenamos el buffer con una cadena de texto.
sprintf(fbuffer, "Hola Mundo!.\n");
// Escribimos el buffer al archivo y nos devuelve la cantidad de bytes escritos.
// debug
printf("Escribiendo: %s", fbuffer);
int flen = sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Llenamos el buffer con una cadena de texto nuevamente.
sprintf(fbuffer, "%d bytes escritos.\n", flen);
// Escribimos por ultima vez el buffer al archivo.
// debug
printf("Escribiendo: %s", fbuffer);
sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Cerramos el archivo
// debug
printf("\nCerrando archivo.\n\n");
sceIoClose(fp);
bFinished = 1;
}
REV 2:/*
PSP FILE IO (REV 2)
Descripcion: Ejemplo de entrada y salida de archivos utilizando el PSPSDK
Por: CaptainCPS-X (13-sep-2010)
Rev 1: No tiene manejo de salida.
Rev 2: Agregado el manejo de Inicio y de Salida usando botones (entre otros detalles).
Tome de referencia esta pagina: http://www.psp-programming.com/forums/index.php?topic=68
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspiofilemgr.h>
#include <pspctrl.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("pspfileio", 0x1000, 1, 1);
int flags = PSP_O_RDWR | PSP_O_CREAT ; // Flag de Lectura / Escritura y Crear archivo de no Existir.
SceMode mode = 0777; // Permiso CHMOD para todo tipo de accion.
const char file[] = "ms0:\\pspfile.txt"; // Archivo a escribir / leer
char fbuffer[256]; // Buffer que se usara para rellenar de texto.
void PSPFileIO(); // Prototipo de la funcion principal.
int bFinished = 0; // Variable para saber si se ha realizado la funcion principal.
int main(int argc, char *argv[]) {
// Iniciamos la pantalla para debug / depurar
pspDebugScreenInit();
// debug
printf("PSP FILE IO (REV. 2) - por CaptainCPS-X (2010) \n\n");
// debug
printf("Este programa abrira el archivo [ %s ] y si no existe lo creara en la Memory Stick del PSP. Luego escribira varias cadenas de texto como forma de prueba.\n\n", file);
printf("PRECIONA \"X\" PARA CONTINUAR...\n\n");
// Buffer data de botones
SceCtrlData pad_data;
// Loop atento a botones
for(;;) {
// Leemos el buffer de botones, por si acaso se ha precionado alguno
sceCtrlReadBufferPositive(&pad_data, 1);
// Si se ha precionado "X" realicamos la funcion principal
if(pad_data.Buttons & PSP_CTRL_CROSS)
{
// Si ya se realizo todo, continua el Loop
if(bFinished) continue;
// debug
printf("Iniciando funcion principal...\n\n");
// Funcion principal
PSPFileIO();
// debug
printf("Listo!...(PRECIONA \"O\" PARA VOLVER AL XBM.)\n");
}
// Si se ha precionado "O" salimos del programa
if(pad_data.Buttons & PSP_CTRL_CIRCLE)
{
// debug
printf("Saliendo del programa...\n");
// Salir del programa
sceKernelExitGame();
}
}
return 0;
}
void PSPFileIO() {
// Abrimos el archivo y nos devuelve el ID
SceUID fp = sceIoOpen(file, flags, mode);
if(!fp) {
// Error al abrir / crear el archivo.
printf("Error al abrir / crear [ %s ]\n", file);
bFinished = 1;
return;
}
// debug
printf("[ %s ] abierto / creado correctamente.\n\n", file);
// Llenamos el buffer con una cadena de texto.
sprintf(fbuffer, "Hola Mundo!.\n");
// Escribimos el buffer al archivo y nos devuelve la cantidad de bytes escritos.
// debug
printf("Escribiendo: %s", fbuffer);
int flen = sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Llenamos el buffer con una cadena de texto nuevamente.
sprintf(fbuffer, "%d bytes escritos.\n", flen);
// Escribimos por ultima vez el buffer al archivo.
// debug
printf("Escribiendo: %s", fbuffer);
sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Cerramos el archivo
// debug
printf("\nCerrando archivo.\n\n");
sceIoClose(fp);
bFinished = 1;
}
REV 1:/*
PSP FILE IO
Descripcion: Ejemplo de entrada y salida de archivos utilizando el PSPSDK
Por: CaptainCPS-X (13-sep-2010)
Nota: Luego de hacer todo el PSP no responde y hay que darle un hard reset. No se por que razon.
Tome de referencia esta pagina: http://www.psp-programming.com/forums/index.php?topic=68
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspiofilemgr.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("pspfileio", 0x1000, 1, 1);
int flags = PSP_O_RDWR | PSP_O_CREAT ; // Flag de Lectura / Escritura y Crear archivo de no Existir.
SceMode mode = 0777; // Permiso CHMOD para todo tipo de accion.
char fbuffer[256]; // Buffer que se usara para rellenar de texto.
int main(int argc, char *argv[]) {
// Iniciamos la pantalla para debug / depurar
pspDebugScreenInit();
// Abrimos el archivo y nos devuelve el ID
SceUID fp = sceIoOpen("ms0:\\pspfile.txt", flags, mode);
if(!fp) {
// Error al abrir / crear el archivo.
printf("Error al abrir / crear el archivo.\n");
return 0;
}
// debug
printf("Archivo abierto / creado correctamente.\n\n");
// Llenamos el buffer con una cadena de texto.
sprintf(fbuffer, "Hola Mundo!.\n");
// Escribimos el buffer al archivo y nos devuelve la cantidad de bytes escritos.
// debug
printf("Escribiendo: %s", fbuffer);
int flen = sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Llenamos el buffer con una cadena de texto nuevamente.
sprintf(fbuffer, "%d bytes escritos.\n", flen);
// Escribimos por ultima vez el buffer al archivo.
// debug
printf("Escribiendo: %s", fbuffer);
sceIoWrite(fp, fbuffer, strlen(fbuffer));
// Cerramos el archivo
// debug
printf("Cerrando archivo.\n\n");
sceIoClose(fp);
// debug
printf("Listo!.");
return 0;
}
Dentro del ZIP esta el binario PBP y el código fuente. Comente casi todas las lineas detalladamente y espero les sirva.
*CORREGIDO* - El único problema con mi programa es que se queda congelado al finalizar todo, no se por que y hay que hacerle reset al PSP para salir.
Saludos.
#include <pspiofilemgr.h>
void milog(const char *cbuffer)
{
char buffer[64];
SceUID fd = sceIoOpen("ms0:/psg.log", PSP_O_WRONLY | PSP_O_CREAT, 0777);
sprintf(buffer, cbuffer);
sceIoWrite(fd, buffer, strlen(buffer));
sceIoClose(fd);
}
SDL_SetTimer((10/10)*10, myTimer);
Uint32 myTimer(Uint32 interval) {
// switch each 100ms
if(nCounter == 100 && !bDone) {
switch(port)
{
case 0:
printf("Hub Ready...");
port = 1;
break;
case 1:
printf("Port 1...");
port = 2;
break;
case 2:
printf("Port 2...");
port = 3;
break;
case 3:
printf("Port 3...");
port = 4;
break;
case 4:
printf("Port 4...");
port = 5;
break;
case 5:
printf("Port 5...");
port = 6;
break;
case 6:
printf("Port 6...");
bDone = 1;
printf("\n\nPRECIONA \"O\" PARA VOLVER AL XBM...");
break;
}
printf("\n");
// reset counter
nCounter = 0;
}
nCounter += 10; // 10ms interval
return interval;
}
wuepe escribió:DeViaNTe [COMING SOON]
Ha remodelado su código, y lo ha adaptado del psfreedom, parece interesante, y por su vertiente habría que mirar si funciona diferente o funciona igual que la rama que se usa aqui.
Habría que mirar, si con los cambios que ha metido, que esta bien estructurado funciona.
Esperemos, que en el de el, se pase de los GET Port Status y si devuelva el Reset.
De todas maneras, eso de tener que cargar siempre su eboot con ese splash, relanteliza el testeo.
hilo_psgroove-port-para-psp-por-deviante-coming-soon_1483049
svn
http://code.google.com/p/psp3jb/
instalar este plugin, es un vsh menu que añade otras cosilla entre las cuales saltarse el Gameboot al cargar un eboot.wuepe escribió:De todas maneras, eso de tener que cargar siempre su eboot con ese splash, relanteliza el testeo.
jotax escribió:instalar este plugin, es un vsh menu que añade otras cosilla entre las cuales saltarse el Gameboot al cargar un eboot.wuepe escribió:De todas maneras, eso de tener que cargar siempre su eboot con ese splash, relanteliza el testeo.
http://i34.tinypic.com/r1n5es.png
http://www.megaupload.com/?d=4MGY0X50
nickieto escribió:jotax escribió:instalar este plugin, es un vsh menu que añade otras cosilla entre las cuales saltarse el Gameboot al cargar un eboot.wuepe escribió:De todas maneras, eso de tener que cargar siempre su eboot con ese splash, relanteliza el testeo.
http://i34.tinypic.com/r1n5es.png
http://www.megaupload.com/?d=4MGY0X50
Y de donde bajo la versión compilada de Deviante, para probarla??