 |
forums.ps2dev.org Homebrew PS2, PSP & PS3 Development Discussions
|
| View previous topic :: View next topic |
| Author |
Message |
pegasus2000
Joined: 12 Jul 2006 Posts: 160
|
Posted: Sat Mar 24, 2007 8:12 am Post subject: USB: Need help (for Tyranid) |
|
|
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 ? |
|
| Back to top |
|
 |
TyRaNiD
Joined: 18 Jan 2004 Posts: 918
|
Posted: Sat Mar 24, 2007 11:31 pm Post subject: |
|
|
| Well you wont be able to get much done if you try loading the usb mass storage drivers now will you :) |
|
| Back to top |
|
 |
pegasus2000
Joined: 12 Jul 2006 Posts: 160
|
Posted: Sun Mar 25, 2007 1:26 am Post subject: |
|
|
| 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 ? |
|
| Back to top |
|
 |
harleyg

Joined: 05 Oct 2005 Posts: 123
|
Posted: Sun Mar 25, 2007 2:04 am Post subject: |
|
|
Use:
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|