#include "../../core/usb.h"
#include "../../usbspec/usb11spec.h"
#include "../../../malloc.h"
+#include "../../../string.h"
+#include "../../../irq.h"
#include "storage.h"
return 0;
}
-#include <gccore.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/time.h>
-#include <errno.h>
-#include <lwp_heap.h>
-#include <malloc.h>
-
-#include "asm.h"
-#include "processor.h"
-#include "disc_io.h"
-
-#define ROUNDDOWN32(v) (((u32)(v)-0x1f)&~0x1f)
-
-#define HEAP_SIZE (32*1024)
#define TAG_START 0x0BADC0DE
#define CBW_SIZE 31
#define DEVLIST_MAXSIZE 8
-static heap_cntrl __heap;
-static u8 __heap_created = 0;
-static lwpq_t __usbstorage_waitq = 0;
-
/*
The following is for implementing a DISC_INTERFACE
as used by libfat
* for the USB data/IOS reply..
*/
-static s32 __usb_blkmsg_cb(s32 retval, void *dummy)
-{
- usbstorage_handle *dev = (usbstorage_handle *)dummy;
- dev->retval = retval;
- SYS_CancelAlarm(dev->alarm);
- LWP_ThreadBroadcast(__usbstorage_waitq);
- return 0;
-}
-
static s32 __usb_deviceremoved_cb(s32 retval,void *arg)
{
return 0;
}
-static void __usb_timeouthandler(syswd_t alarm,void *cbarg)
-{
- usbstorage_handle *dev = (usbstorage_handle*)cbarg;
- dev->retval = USBSTORAGE_ETIMEDOUT;
- LWP_ThreadBroadcast(__usbstorage_waitq);
-}
-
-static void __usb_settimeout(usbstorage_handle *dev)
-{
- struct timespec ts;
-
- ts.tv_sec = 2;
- ts.tv_nsec = 0;
- SYS_SetAlarm(dev->alarm,&ts,__usb_timeouthandler,dev);
-}
-
static s32 __USB_BlkMsgTimeout(usbstorage_handle *dev, u8 bEndpoint, u16 wLength, void *rpData)
{
- u32 level;
s32 retval;
dev->retval = USBSTORAGE_PROCESSING;
- retval = USB_WriteBlkMsgAsync(dev->usb_fd, bEndpoint, wLength, rpData, __usb_blkmsg_cb, (void *)dev);
- if(retval < 0) return retval;
-
- __usb_settimeout(dev);
-
- _CPU_ISR_Disable(level);
- do {
- retval = dev->retval;
- if(retval!=USBSTORAGE_PROCESSING) break;
- else LWP_ThreadSleep(__usbstorage_waitq);
- } while(retval==USBSTORAGE_PROCESSING);
- _CPU_ISR_Restore(level);
+ retval = USB_WriteBlkMsgAsync(dev->usb_fd, bEndpoint, wLength, rpData, (void *)dev);
+ dev->retval = retval;
- if(retval==USBSTORAGE_ETIMEDOUT) USBStorage_Close(dev);
+ if(retval==USBSTORAGE_ETIMEDOUT)
+ USBStorage_Close(dev);
return retval;
}
static s32 __USB_CtrlMsgTimeout(usbstorage_handle *dev, u8 bmRequestType, u8 bmRequest, u16 wValue, u16 wIndex, u16 wLength, void *rpData)
{
- u32 level;
s32 retval;
- struct timespec ts;
-
- ts.tv_sec = 2;
- ts.tv_nsec = 0;
-
dev->retval = USBSTORAGE_PROCESSING;
- retval = USB_WriteCtrlMsgAsync(dev->usb_fd, bmRequestType, bmRequest, wValue, wIndex, wLength, rpData, __usb_blkmsg_cb, (void *)dev);
- if(retval < 0) return retval;
-
- __usb_settimeout(dev);
-
- _CPU_ISR_Disable(level);
- do {
- retval = dev->retval;
- if(retval!=USBSTORAGE_PROCESSING) break;
- else LWP_ThreadSleep(__usbstorage_waitq);
- } while(retval==USBSTORAGE_PROCESSING);
- _CPU_ISR_Restore(level);
+ retval = USB_WriteCtrlMsgAsync(dev->usb_fd, bmRequestType, bmRequest, wValue, wIndex, wLength, rpData, (void *)dev);
+ dev->retval = retval;
- if(retval==USBSTORAGE_ETIMEDOUT) USBStorage_Close(dev);
+ if(retval==USBSTORAGE_ETIMEDOUT)
+ USBStorage_Close(dev);
return retval;
}
s32 USBStorage_Initialize()
{
- u8 *ptr;
- u32 level;
-
- _CPU_ISR_Disable(level);
- if(__heap_created != 0) {
- _CPU_ISR_Restore(level);
- return IPC_OK;
- }
-
- LWP_InitQueue(&__usbstorage_waitq);
-
- ptr = (u8*)ROUNDDOWN32(((u32)SYS_GetArena2Hi() - HEAP_SIZE));
- if((u32)ptr < (u32)SYS_GetArena2Lo()) {
- _CPU_ISR_Restore(level);
- return IPC_ENOMEM;
- }
-
- SYS_SetArena2Hi(ptr);
-
- __lwp_heap_init(&__heap, ptr, HEAP_SIZE, 32);
- __heap_created = 1;
- _CPU_ISR_Restore(level);
-
- return IPC_OK;
-
+ return 0;
}
static s32 __send_cbw(usbstorage_handle *dev, u8 lun, u32 len, u8 flags, const u8 *cb, u8 cbLen)
s32 retval = USBSTORAGE_OK;
if(cbLen == 0 || cbLen > 16)
- return IPC_EINVAL;
+ return -1;
memset(dev->buffer, 0, CBW_SIZE);
s8 retries = USBSTORAGE_CYCLE_RETRIES + 1;
- LWP_MutexLock(dev->lock);
do
{
retries--;
if(__usbstorage_reset(dev) == USBSTORAGE_ETIMEDOUT)
retval = USBSTORAGE_ETIMEDOUT;
}
- LWP_MutexUnlock(dev->lock);
if(_status != NULL)
dev->suspended = 0;
}
+ /* control message request type bitmask */
+#define USB_CTRLTYPE_DIR_HOST2DEVICE (0<<7)
+#define USB_CTRLTYPE_DIR_DEVICE2HOST (1<<7)
+#define USB_CTRLTYPE_TYPE_STANDARD (0<<5)
+#define USB_CTRLTYPE_TYPE_CLASS (1<<5)
+#define USB_CTRLTYPE_TYPE_VENDOR (2<<5)
+#define USB_CTRLTYPE_TYPE_RESERVED (3<<5)
+#define USB_CTRLTYPE_REC_DEVICE 0
+#define USB_CTRLTYPE_REC_INTERFACE 1
+#define USB_CTRLTYPE_REC_ENDPOINT 2
+#define USB_CTRLTYPE_REC_OTHER 3
retval = __USB_CtrlMsgTimeout(dev, (USB_CTRLTYPE_DIR_HOST2DEVICE | USB_CTRLTYPE_TYPE_CLASS | USB_CTRLTYPE_REC_INTERFACE), USBSTORAGE_RESET, 0, dev->interface, 0, NULL);
/* FIXME?: some devices return -7004 here which definitely violates the usb ms protocol but they still seem to be working... */
usb_interfacedesc *uid;
usb_endpointdesc *ued;
- max_lun = __lwp_heap_allocate(&__heap, 1);
+ max_lun = malloc(1);
if(max_lun==NULL) return IPC_ENOMEM;
memset(dev, 0, sizeof(*dev));
dev->tag = TAG_START;
- if(LWP_MutexInit(&dev->lock, false) < 0)
- goto free_and_return;
- if(SYS_CreateAlarm(&dev->alarm)<0)
- goto free_and_return;
retval = USB_OpenDevice(bus, vid, pid, &dev->usb_fd);
if(retval < 0)
if(retval < 0)
goto free_and_return;
- LWP_MutexLock(dev->lock);
retval = __USB_CtrlMsgTimeout(dev, (USB_CTRLTYPE_DIR_DEVICE2HOST | USB_CTRLTYPE_TYPE_CLASS | USB_CTRLTYPE_REC_INTERFACE), USBSTORAGE_GET_MAX_LUN, 0, dev->interface, 1, max_lun);
- LWP_MutexUnlock(dev->lock);
if(retval < 0)
dev->max_lun = 1;
else
USB_ClearHalt(dev->usb_fd, dev->ep_in);
USB_ClearHalt(dev->usb_fd, dev->ep_out);
- dev->buffer = __lwp_heap_allocate(&__heap, MAX_TRANSFER_SIZE);
+ dev->buffer = malloc(MAX_TRANSFER_SIZE);
if(dev->buffer == NULL) retval = IPC_ENOMEM;
else {
}
free_and_return:
- if(max_lun!=NULL) __lwp_heap_free(&__heap, max_lun);
+ if(max_lun!=NULL) free(max_lun);
if(retval < 0)
{
USB_CloseDevice(&dev->usb_fd);
- LWP_MutexDestroy(dev->lock);
- SYS_RemoveAlarm(dev->alarm);
if(dev->buffer != NULL)
- __lwp_heap_free(&__heap, dev->buffer);
+ free(dev->buffer);
if(dev->sector_size != NULL)
free(dev->sector_size);
memset(dev, 0, sizeof(*dev));
s32 USBStorage_Close(usbstorage_handle *dev)
{
USB_CloseDevice(&dev->usb_fd);
- LWP_MutexDestroy(dev->lock);
- SYS_RemoveAlarm(dev->alarm);
if(dev->sector_size!=NULL)
free(dev->sector_size);
if(dev->buffer!=NULL)
- __lwp_heap_free(&__heap, dev->buffer);
+ free(dev->buffer);
memset(dev, 0, sizeof(*dev));
return 0;
}
{
s32 retval;
- LWP_MutexLock(dev->lock);
retval = __usbstorage_reset(dev);
- LWP_MutexUnlock(dev->lock);
return retval;
}
as used by libfat
*/
-static bool __usbstorage_IsInserted(void);
+static BOOL __usbstorage_IsInserted(void);
-static bool __usbstorage_Startup(void)
+static BOOL __usbstorage_Startup(void)
{
USB_Initialize();
USBStorage_Initialize();
return __usbstorage_IsInserted();
}
-static bool __usbstorage_IsInserted(void)
+static BOOL __usbstorage_IsInserted(void)
{
u8 *buffer;
u8 dummy;
__mounted = 0; //reset it here and check if device is still attached
- buffer = __lwp_heap_allocate(&__heap, DEVLIST_MAXSIZE << 3);
+ buffer = malloc(DEVLIST_MAXSIZE << 3);
if(buffer == NULL)
- return false;
+ return FALSE;
memset(buffer, 0, DEVLIST_MAXSIZE << 3);
if(USB_GetDeviceList("/dev/usb/oh0", buffer, DEVLIST_MAXSIZE, 0, &dummy) < 0)
__vid = 0;
__pid = 0;
- __lwp_heap_free(&__heap,buffer);
- return false;
+ free(buffer);
+ return FALSE;
}
if(__vid!=0 || __pid!=0)
if( (vid == __vid) && (pid == __pid))
{
__mounted = 1;
- __lwp_heap_free(&__heap,buffer);
+ free(buffer);
usleep(50); // I don't know why I have to wait but it's needed
- return true;
+ return TRUE;
}
}
}
break;
}
}
- __lwp_heap_free(&__heap,buffer);
+ free(buffer);
if(__mounted == 1)
- return true;
- return false;
+ return TRUE;
+ return FALSE;
}
-static bool __usbstorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)
+static BOOL __usbstorage_ReadSectors(u32 sector, u32 numSectors, void *buffer)
{
s32 retval;
if(__mounted != 1)
- return false;
+ return FALSE;
retval = USBStorage_Read(&__usbfd, __lun, sector, numSectors, buffer);
if(retval == USBSTORAGE_ETIMEDOUT)
__mounted = 0;
}
if(retval < 0)
- return false;
- return true;
+ return FALSE;
+ return TRUE;
}
-static bool __usbstorage_WriteSectors(u32 sector, u32 numSectors, const void *buffer)
+static BOOL __usbstorage_WriteSectors(u32 sector, u32 numSectors, const void *buffer)
{
s32 retval;
if(__mounted != 1)
- return false;
+ return FALSE;
retval = USBStorage_Write(&__usbfd, __lun, sector, numSectors, buffer);
if(retval == USBSTORAGE_ETIMEDOUT)
__mounted = 0;
}
if(retval < 0)
- return false;
- return true;
+ return FALSE;
+ return TRUE;
}
-static bool __usbstorage_ClearStatus(void)
+static BOOL __usbstorage_ClearStatus(void)
{
- return true;
+ return TRUE;
}
-static bool __usbstorage_Shutdown(void)
+static BOOL __usbstorage_Shutdown(void)
{
//if(__mounted == 1) USBStorage_Close(&__usbfd);
__mounted = 0;
- return true;
+ return TRUE;
}
const DISC_INTERFACE __io_usbstorage = {
(FN_MEDIUM_SHUTDOWN)&__usbstorage_Shutdown
};
-#endif /* HW_RVL */