USB: Need help (for Tyranid)

Discuss the development of new homebrew software, tools and libraries.

Moderators: cheriff, TyRaNiD

Post Reply
pegasus2000
Posts: 160
Joined: Wed Jul 12, 2006 7:09 am

USB: Need help (for Tyranid)

Post by pegasus2000 »

I have desperately need of your help, Tyranid.

We have begun to integrate support for USB webcam in our
Nanodesktop library. We want to use the usbhost_fs routines to
create a stable link between Linux PC and PSP, but we have
troubles in USB managing.

This is a code that we have used for a first attempt: we want to send
an hello message to PC and to reveal it on PC monitor.

On PSP, we have the following:

char ND_SWMODE_DisablePhoenixSubsystem = 1;

#define PSP_MODULE_INFO_DISABLED
#include <nanodesktop.h>


/**
* Define the module info section
*
* 2nd arg must 0x1000 so __init is executed in
* kernelmode for our loaderInit function
*/
PSP_MODULE_INFO("USBSample", 0x1000, 1, 0);

/**
* THREAD_ATTR_USER causes the thread that the startup
* code (ctr0.c) starts this program in to be in usermode
* even though the module was started in kernelmode
*/
PSP_MAIN_THREAD_ATTR (0);


/* Define printf, just to make typing easier */
//#define printf pspDebugScreenPrintf

#include <pspkernel.h>
#include <pspiofilemgr.h>
#include <pspmodulemgr.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspusb.h>
#include <pspusbstor.h>
#include <pspthreadman.h>
#include <pspctrl.h>
#include <pspsdk.h>

#include "host_driver.c"



//make this global so we can check it in the exit_callback
u32 state;

/**
* Function that is called from _init in kernelmode before the
* main thread is started in usermode.
*/
__attribute__ ((constructor))
void loaderInit()
{
pspKernelSetKernelPC();
pspSdkInstallNoDeviceCheckPatch();
pspDebugInstallKprintfHandler(NULL);
}

/* Exit callback */
/*
int exit_callback(int arg1, int arg2, void *common)
{
int retVal;

//cleanup drivers
if (state & PSP_USB_ACTIVATED) {
retVal = sceUsbDeactivate(0);
if (retVal != 0)
printf("Error calling sceUsbDeactivate (0x%08X)\n", retVal);
}
retVal = sceUsbStop(PSP_USBSTOR_DRIVERNAME, 0, 0);
if (retVal != 0)
printf("Error stopping USB Mass Storage driver (0x%08X)\n",
retVal);

retVal = sceUsbStop(PSP_USBBUS_DRIVERNAME, 0, 0);
if (retVal != 0)
printf("Error stopping USB BUS driver (0x%08X)\n", retVal);

sceKernelExitGame();

return 0;
}
*/

/* Callback thread */
/*
int CallbackThread(SceSize args, void *argp)
{
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();

return 0;
}
*/

/* Sets up the callback thread and returns its thread id */
/*
int SetupCallbacks(void)
{
int thid = 0;

thid = sceKernelCreateThread("update_thread", CallbackThread,
0x11, 0xFA0, 0, 0);
if (thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}

return thid;
}
*/

//helper function to make things easier
int LoadStartModule(char *path)
{
u32 loadResult;
u32 startResult;
int status;

loadResult = sceKernelLoadModule(path, 0, NULL);
if (loadResult & 0x80000000)
return -1;
else
startResult =
sceKernelStartModule(loadResult, 0, NULL, &status, NULL);

if (loadResult != startResult)
return -2;

return 0;
}




int main(void)
{
SceCtrlData pad;
u32 oldButtons = 0;
u32 retVal;

state = 0;
//pspDebugScreenInit();
//pspDebugScreenClear();
//SetupCallbacks();

//setup Pad
//sceCtrlSetSamplingCycle(0);
//sceCtrlSetSamplingMode(0);

//print header now in case we have any errors
printf("USB Sample v1.0 by John_K - Based off work by PSPPet\n");

//start necessary drivers
LoadStartModule("flash0:/kd/semawm.prx");
LoadStartModule("flash0:/kd/usbstor.prx");
LoadStartModule("flash0:/kd/usbstormgr.prx");
LoadStartModule("flash0:/kd/usbstorms.prx");
LoadStartModule("flash0:/kd/usbstorboot.prx");

//setup USB drivers
retVal = sceUsbStart(PSP_USBBUS_DRIVERNAME, 0, 0);

if (retVal != 0)
{
printf("Error starting USB Bus driver (0x%08X)\n", retVal);
sceKernelSleepThread();
}

retVal = sceUsbStart(PSP_USBSTOR_DRIVERNAME, 0, 0);
if (retVal != 0)
{
printf("Error starting USB Mass Storage driver (0x%08X)\n",
retVal);
sceKernelSleepThread();
}
retVal = sceUsbstorBootSetCapacity(0x800000);

if (retVal != 0)
{
printf
("Error setting capacity with USB Mass Storage driver (0x%08X)\n",
retVal);
sceKernelSleepThread();
}
retVal = 0;

//if everything worked we now enter our main loop

sceUsbActivate(0x1c8);

ndDelay (20);

state = sceUsbGetState();

printf("USB Sample v1.0 by John_K - Based off work by PSPPet\n\n");
printf("%-14s: %s\n", "USB Driver",
state & PSP_USB_ACTIVATED ? "activated " :
"deactivated");
printf("%-14s: %s\n", "USB Cable",
state & PSP_USB_CABLE_CONNECTED ? "connected " :
"disconnected");
printf("%-14s: %s\n", "USB Connection",
state & PSP_USB_CONNECTION_ESTABLISHED ? "established" :
"not present");

modulestart ();
send_hello_cmd ();


//Exit program
ndDelay (60);
sceKernelExitGame();

return 0;
}


When we use send_hello_cmd routine, we obtained an error on
XCHG Semaphore.

Why ?
TyRaNiD
Posts: 907
Joined: Sun Jan 18, 2004 12:23 am

Post by TyRaNiD »

Well you wont be able to get much done if you try loading the usb mass storage drivers now will you :)
pegasus2000
Posts: 160
Joined: Wed Jul 12, 2006 7:09 am

Post by pegasus2000 »

TyRaNiD wrote:Well you wont be able to get much done if you try loading the usb mass storage drivers now will you :)
I am trying a different source code. Now I am beginning to understand
something. This programs works, USB attached/detached works, but
when the cpu try to run sceUsbbdReqRecv () function in
set_bulkout_req I have an hang.

The source use your code, but it includes it directly in the source,
instead of loading hostfs.prx.

The source code is the following:


char ND_SWMODE_DisablePhoenixSubsystem = 1;

#define PSP_MODULE_INFO_DISABLED
#include <nanodesktop.h>

PSP_MODULE_INFO("USBHostFS_to_MS", 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR (0);

#include <pspiofilemgr.h>
#include <pspctrl.h>
#include <pspusb.h>
#include <stdio.h>
#include <string.h>
#include <psploadexec.h>
#include <pspsysmem.h>

#include ".\host_driver.c"

__attribute__ ((constructor))
void loaderInit()
{
pspKernelSetKernelPC();
pspSdkInstallNoDeviceCheckPatch();
pspDebugInstallKprintfHandler(NULL);
}


int loadStartModule(char * path) { // load and start a module. return 0 for success, -1 for failing to load, -2 for failing to start
u32 loadResult;
u32 startResult;
int status;
loadResult = sceKernelLoadModule(path, 0, NULL);
if (loadResult & 0x80000000) return -1;
else
startResult = sceKernelStartModule(loadResult, 0, NULL, &status, NULL);
if (loadResult != startResult) return -2;
return 0;
}


int StartUSBHostFSDriver() { // start the USBHostFS driver; return 0 on success, -1 on startbus failure, -2 on startdriver failure, -4 on activate failure, or a combination of the three.
int startbus = 0, startdriver = 0, activate = 0;

startbus = sceUsbStart(PSP_USBBUS_DRIVERNAME, 0, 0) ? -1 : 0;
startdriver = sceUsbStart("USBHostFSDriver", 0, 0) ? -2 : 0;
activate = sceUsbActivate(0x1C9) ? -4 : 0;

return startbus + startdriver + activate;
}


void quitWithMessage(char *str, int err)
{
sceUsbDeactivate(0x1c9);
printf("%s %d \n", str, err);
sceKernelDelayThread(10000);
sceKernelExitGame();
}


int main ()
{
int res;
int Buffer [255];

ndInitSystem ();

printf ("Sistema avviato: Caricamento usb driver \n");

printf ("Caricamento modulo Tyranid \n");
modulestart ();

res = StartUSBHostFSDriver();

//if(res) quitWithMessage("main: StartUSBHostFSDriver fails!", res);

ndDelay (10);

int Counter;

for (Counter=0; Counter<2550; Counter++)
{
printf ("DATA SEND %d \n", Counter);

Buffer [0]=255;
Buffer [1]=254;
Buffer [2]=253;
write_data (&Buffer, 4);
}
}

What is wrong, in your opinion ?
User avatar
harleyg
Posts: 123
Joined: Wed Oct 05, 2005 6:15 am

Post by harleyg »

Use:

Code: Select all

&#91;code&#93;&#91;/code&#93;
Post Reply