CFLAGS += -Wno-unused-parameter
#debug flags; DU = Debug USB
-CFLAGS += -D _DU_OHCI_F #fire @ u/h/ohci.c
+#CFLAGS += -D _DU_OHCI_F #fire @ u/h/ohci.c
#CFLAGS += -D _DU_OHCI_Q #enqueue @ u/h/ohci.c
#CFLAGS += -D _DU_OHCI_RH #roothub @ u/h/ohci.c
CFLAGS += -D _DU_CORE #@ u/c/core.c
dev->epTogl[1] = 0;
dev->epTogl[2] = 0;
- char buf[64];
+#define LEN 128
+ u8 buf[LEN];
memset(buf, 0, sizeof(buf));
- /* ask first 8 bytes of device descriptor with this special
- * GET Descriptor Request, when device address = 0
- */
+ s8 ret;
+ u8 dev_desc_size;
+ memset(buf, 0, sizeof(buf));
+ ret = usb_get_dev_desc_simple(dev, buf, sizeof(buf));
+ printf("=============\nbuf: 0x%08X\nafter usb control msg(ret: %d):\n", buf, ret);
+ hexdump(buf, sizeof(buf));
+
+ /* set MaxPacketSize */
+ dev->bMaxPacketSize0 = (u8) buf[7];
+ if(!(u8)buf[7]) {
+ printf("FU\n");
+ return (void*)1;
+ }
+ /* save device descriptor size */
+ dev_desc_size = buf[0];
+
+ u8 address = usb_next_address();
+ ret = usb_set_address(dev, address);
+ dev->address = address;
+ printf("set address to %d\n", dev->address);
+
+ memset(buf, 0, sizeof(buf));
+ ret = usb_get_dev_desc(dev, buf, sizeof(buf), dev_desc_size);
+ printf("=============\nbuf: 0x%08X\nafter usb control msg(ret: %d):\n", buf, ret);
+ hexdump(buf, sizeof(buf));
+
+ dev->bDeviceClass = (u8) buf[4];
+ dev->bDeviceSubClass = (u8) buf[5];
+ dev->bDeviceProtocoll = (u8) buf[6];
+ dev->idVendor = (u16) (buf[9] << 8) | (buf[8]);
+ dev->idProduct = (u16) (buf[11] << 8) | (buf[10]);
+ dev->bcdDevice = (u16) (buf[13] << 8) | (buf[12]);
+
+ printf( "bDeviceClass 0x%02X\n"
+ "bDeviceSubClass 0x%02X\n"
+ "bDeviceProtocoll 0x%02X\n"
+ "idVendor 0x%04X\n"
+ "idProduct 0x%04X\n"
+ "bcdDevice 0x%04X\n", dev->bDeviceClass,
+ dev->bDeviceSubClass, dev->bDeviceProtocoll,
+ dev->idVendor, dev->idProduct, dev->bcdDevice);
/*
- * see page 253 in usb_20.pdf
- *
- * bmRequestType = 0x80 = 10000000B
- * bRequest = GET_DESCRIPTOR
- * wValue = DEVICE (Descriptor Type)
- * wIndex = 0
- * wLength = 64 // in fact just 8 bytes
- */
- usb_control_msg(dev, 0x80, GET_DESCRIPTOR, DEVICE << 8, 0, 64, buf, 8, 0);
+ usb_get_descriptor(dev, DEVICE, 0, buf, 8);
+ memset(buf, 0, 8);
+ usb_get_descriptor(dev, DEVICE, 0, buf, size >= buf[0] ? buf[0] : size);
+ */
+#if 0
+ memset(buf, 0, sizeof(buf));
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR, (DEVICE << 8) | 0, 0, 8, buf, 0);
+ printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf);
+ hexdump(buf, sizeof(buf));
+
+ memset(buf, 0, sizeof(buf));
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR, (DEVICE << 8) | 0, 0, buf[0], buf, 0);
+ printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf);
+ hexdump(buf, sizeof(buf));
+ memset(buf, 0, sizeof(buf));
+ usb_get_string_simple(dev, 1, buf);
printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf);
hexdump(buf, sizeof(buf));
+#endif
+#if 0
u8 devdescr_size;
- u8 address = usb_next_address();
/* setup real ep0 fifo size */
dev->bMaxPacketSize0 = (u8) buf[7];
devdescr_size = (u8) buf[0];
/* define new adress */
+ memset(buf, 0, sizeof(buf));
usb_control_msg(dev, 0x00, SET_ADDRESS, address, 0, 0, buf, 8, 0);
dev->address = address;
printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf);
/* get complete device descriptor */
- memset(buf, 0, 64);
+ memset(buf, 0, sizeof(buf));
usb_control_msg(dev, 0x80, GET_DESCRIPTOR, DEVICE<<8, 0, devdescr_size, buf, 8, 0);
printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf);
hexdump(buf, sizeof(buf));
/* save only really neccessary values for this small usbstack */
- dev->bDeviceClass = (u8) buf[4];
- dev->bDeviceSubClass = (u8) buf[5];
- dev->bDeviceProtocoll = (u8) buf[6];
- dev->idVendor = (u16) (buf[9] << 8) | (buf[8]);
- dev->idProduct = (u16) (buf[11] << 8) | (buf[10]);
- dev->bcdDevice = (u16) (buf[13] << 8) | (buf[12]);
-
- printf( "bDeviceClass 0x%02X\n"
- "bDeviceSubClass 0x%02X\n"
- "bDeviceProtocoll 0x%02X\n"
- "idVendor 0x%04X\n"
- "idProduct 0x%04X\n"
- "bcdDevice 0x%04X\n", dev->bDeviceClass,
- dev->bDeviceSubClass, dev->bDeviceProtocoll,
- dev->idVendor, dev->idProduct, dev->bcdDevice);
+#endif
-#if 1
- memset(buf, 0, 64);
+#if 0
+ memset(buf, 0, sizeof(buf));
usb_control_msg(dev, 0x80, GET_DESCRIPTOR, (STRING<<8)|2, 0, 0x1a, buf, 8, 0);
hexdump(buf, sizeof(buf));
printf("String Descriptor [1]: ");
usb_transfer_descriptor *td;
u8 runloop = 1;
u16 restlength = irp->len;
- char *td_buf_ptr = irp->buffer;
- char mybuf[64];
+ u8 *td_buf_ptr = irp->buffer;
+ u8 mybuf[64];
u8 togl = irp->dev->epTogl[(irp->endpoint & 0x7F)];
u8 epsize;
u8 type; /* control, interrupt, bulk or isochron */
- char * buffer;
+ u8 *buffer;
u16 len;
//list * td_list;
u8 iso;
u8 togl;
- char * buffer;
+ u8 *buffer;
u16 actlen;
u8 state;
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-//wtf??!
-//#ifndef _USB_H_
-//#define _USB_H_
-
-//#include <stdlib.h>
-
#include "usb.h"
#include "core.h"
#include "../host/host.h"
#include "../usbspec/usb11spec.h"
#include "../../malloc.h"
+#include "../../string.h"
/******************* Device Operations **********************/
/**
* Open a device with verndor- and product-id for a communication.
*/
-usb_device * usb_open(u32 vendor_id, u32 product_id)
+usb_device *usb_open(u32 vendor_id, u32 product_id)
{
usb_device* dev;
element * iterator = core.devices->head;
/**
* Open a device with an class code for a communication.
*/
-usb_device * usb_open_class(u8 class)
+usb_device *usb_open_class(u8 class)
{
usb_device* dev;
element * iterator = core.devices->head;
return NULL;
}
-/**
- * Close device after a communication.
+/* Close device after a communication.
*/
-u8 usb_close(usb_device *dev)
+s8 usb_close(usb_device *dev)
{
return 0;
}
-u8 usb_get_device_descriptor(usb_device *dev, char *buf,u8 size)
+/* ask first 8 bytes of device descriptor with this special
+ * GET Descriptor Request, when device address = 0
+ */
+s8 usb_get_dev_desc_simple(usb_device *dev, u8 *buf, u8 size)
{
-
+ if(size < 8) {
+ return -1;
+ }
+ usb_get_descriptor(dev, DEVICE, 0, buf, 8);
return 0;
}
-u8 usb_set_address(usb_device *dev, u8 address)
+s8 usb_get_dev_desc(usb_device *dev, u8 *buf, u8 size, u8 dev_desc_size)
{
+ printf("WTF SIZE: %X\n", size>= dev_desc_size ? dev_desc_size : size);
+ usb_get_descriptor(dev, DEVICE, 0, buf, size >= dev_desc_size ? dev_desc_size : size);
+ return 0;
+}
+s8 usb_set_address(usb_device *dev, u8 address)
+{
+ u8 buf[64];
+ usb_control_msg(dev, 0x00, SET_ADDRESS, address, 0, 0, buf, 0);
return 0;
}
-u8 usb_set_configuration(usb_device *dev, u8 configuration)
+s8 usb_set_configuration(usb_device *dev, u8 configuration)
{
return 0;
}
-u8 usb_set_altinterface(usb_device *dev, u8 alternate)
+s8 usb_set_altinterface(usb_device *dev, u8 alternate)
{
return 0;
}
-u8 usb_reset(usb_device *dev)
+s8 usb_reset(usb_device *dev)
{
/**
* Create a control transfer.
*/
-u8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length,char *buf, u16 size, u16 timeout)
+s8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request,
+ u16 value, u16 index, u16 length, u8 *buf, u16 timeout)
{
usb_irp *irp = (usb_irp*)malloc(sizeof(usb_irp));
irp->dev = dev;
irp->epsize = dev->bMaxPacketSize0;
irp->type = USB_CTRL;
- buf[0]=(char)requesttype;
- buf[1]=(char)request;
- buf[2]=(char)(value);
- buf[3]=(char)(value >> 8);
- buf[4]=(char)(index);
- buf[5]=(char)(index >> 8);
- buf[6]=(char)(length);
- buf[7]=(char)(length >> 8);
+ buf[0]=(u8)requesttype;
+ buf[1]=(u8)request;
+ buf[2]=(u8)(value);
+ buf[3]=(u8)(value >> 8);
+ buf[4]=(u8)(index);
+ buf[5]=(u8)(index >> 8);
+ buf[6]=(u8)(length);
+ buf[7]=(u8)(length >> 8);
irp->buffer = buf;
irp->len = length;
}
-u8 usb_get_string(usb_device *dev, u8 index, u8 langid, char *buf, u8 buflen)
+s8 usb_get_string(usb_device *dev, u8 index, u8 langid, u8 *buf, u8 buflen)
{
return 0;
}
-u8 usb_get_string_simple(usb_device *dev, u8 index, char *buf, u8 buflen)
+s8 usb_get_string_simple(usb_device *dev, u8 index, u8 *buf, u8 size)
{
-
+ usb_get_descriptor(dev, STRING, index, buf, (u8) 8);
+ usb_get_descriptor(dev, STRING, index, buf, size >= buf[0] ? (u8) buf[0] : size);
return 0;
}
-u8 usb_get_descriptor(usb_device *dev, unsigned char type, unsigned char index, void *buf, u8 size)
+s8 usb_get_descriptor(usb_device *dev, u8 type, u8 index, u8 *buf, u8 size)
{
-
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR, (type << 8) | index, 0, size, buf, 0);
return 0;
}
/**
* Write to an a bulk endpoint.
*/
-u8 usb_bulk_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
+s8 usb_bulk_write(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout)
{
usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
irp->dev = dev;
/**
* Read from an bulk endpoint.
*/
-u8 usb_bulk_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
+s8 usb_bulk_read(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout)
{
usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
//irp->devaddress = dev->address;
/**
* Write to an interrupt endpoint.
*/
-u8 usb_interrupt_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
+s8 usb_interrupt_write(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout)
{
return 0;
/**
* Read from an interrupt endpoint.
*/
-u8 usb_interrupt_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
+s8 usb_interrupt_read(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout)
{
return 0;
/**
* Write to an isochron endpoint.
*/
-u8 usb_isochron_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
+s8 usb_isochron_write(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout)
{
return 0;
/**
* Read from an isochron endpoint.
*/
-u8 usb_isochron_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
+s8 usb_isochron_read(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout)
{
usb_device * usb_open(u32 vendor_id, u32 product_id);
usb_device * usb_open_class(u8 class);
-u8 usb_close(usb_device *dev);
+s8 usb_close(usb_device *dev);
-
-u8 usb_get_device_descriptor(usb_device *dev, char *buf,u8 size);
-u8 usb_set_address(usb_device *dev, u8 address);
-u8 usb_set_configuration(usb_device *dev, u8 configuration);
-u8 usb_set_altinterface(usb_device *dev, u8 alternate);
+s8 usb_get_device_descriptor(usb_device *dev, u8 *buf, u8 buflen);
+s8 usb_set_address(usb_device *dev, u8 address);
+s8 usb_set_configuration(usb_device *dev, u8 configuration);
+s8 usb_set_altinterface(usb_device *dev, u8 alternate);
/**
* it is connected to. Returns 0 on success or < 0 on error.
*/
-u8 usb_reset(usb_device *dev);
+s8 usb_reset(usb_device *dev);
/******************* Control Transfer **********************/
-
-
-u8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length, char *buf, u16 size, u16 timeout);
-u8 usb_get_string(usb_device *dev, u8 index, u8 langid, char *buf, u8 buflen);
-u8 usb_get_string_simple(usb_device *dev, u8 index, char *buf, u8 buflen);
-u8 usb_get_descriptor(usb_device *dev, unsigned char type, unsigned char index, void *buf, u8 size);
+s8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length, u8 *buf, u16 timeout);
+s8 usb_get_string(usb_device *dev, u8 index, u8 langid, u8 *buf, u8 buflen);
+s8 usb_get_string_simple(usb_device *dev, u8 index, u8 *buf, u8 buflen);
+s8 usb_get_dev_desc_simple(usb_device *dev, u8 *buf, u8 size);
+s8 usb_get_dev_desc(usb_device *dev, u8 *buf, u8 size, u8 dev_desc_size);
+s8 usb_get_descriptor(usb_device *dev, u8 type, u8 index, u8 *buf, u8 size);
/******************* Bulk Transfer **********************/
-
-u8 usb_bulk_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout);
-u8 usb_bulk_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout);
+s8 usb_bulk_write(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout);
+s8 usb_bulk_read(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout);
/******************* Interrupt Transfer **********************/
-u8 usb_u8errupt_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout);
-u8 usb_u8errupt_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout);
+s8 usb_u8errupt_write(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout);
+s8 usb_u8errupt_read(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout);
/******************* Isochron Transfer **********************/
-u8 usb_isochron_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout);
-u8 usb_isochron_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout);
-
-
+s8 usb_isochron_write(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout);
+s8 usb_isochron_read(usb_device *dev, u8 ep, u8 *buf, u8 size, u8 timeout);
#endif //_USB_H_
#endif
/* read interface descriptor for class code */
- char buf[32];
+ u8 buf[32];
usb_device* dev;
element * iterator = core.devices->head;
dev = (usb_device*)iterator->data;
/* get interface descriptor */
- usb_control_msg(dev, 0x80, GET_DESCRIPTOR,2, 0, 32,buf, 8, 0);
+ usb_control_msg(dev, 0x80, GET_DESCRIPTOR,2, 0, 32, buf, 0);
if(buf[14]==MASS_STORAGE_CLASSCODE){
massstorage[massstorage_in_use] = dev;
u8 usb_storage_open(u8 device)
{
/* set configuration */
- char tmp[8];
- usb_control_msg(massstorage[device], 0x00,SET_CONFIGURATION,0x0100, 0, 0,tmp, 8, 0);
+ u8 tmp[8];
+ usb_control_msg(massstorage[device], 0x00,SET_CONFIGURATION,0x0100, 0, 0, tmp, 0);
/* class request */
- usb_control_msg(massstorage[device], 0xA1,0xFE,0, 0, 1,tmp, 8, 0);
+ usb_control_msg(massstorage[device], 0xA1,0xFE,0, 0, 1,tmp, 0);
/* wait until the stick is complete ready */
wait_ms(10);
cbw->CBWCB[0]=0x12; // 0x12 = INQUIRY
- usb_bulk_write(massstorage[device], 2, (char*)cbw, 31, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 36, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 13, 0);
+ usb_bulk_write(massstorage[device], 2, (u8*)cbw, 31, 0);
+ usb_bulk_read(massstorage[device], 1, (u8*)cbw, 36, 0);
+ usb_bulk_read(massstorage[device], 1, (u8*)cbw, 13, 0);
free(cbw);
{
/* send cwb "usbc" */
- char tmp[8];
+ u8 tmp[8];
u8 i;
usb_storage_cbw * cbw = (usb_storage_cbw*)malloc(sizeof(usb_storage_cbw));
- usb_control_msg(massstorage[device], 0x02,1,0, 0x8100, 0,tmp, 8, 0); //
+ usb_control_msg(massstorage[device], 0x02,1,0, 0x8100, 0,tmp, 0);
cbw->dCBWSignature= 0x43425355;
cbw->dCBWTag=0x826A6008;
cbw->CBWCB[0]=0x25; // 0x12 = INQUIRY
- usb_bulk_write(massstorage[device], 2, (char*)cbw, 31, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 8, 0);
- usb_bulk_read(massstorage[device], 1, (char*)cbw, 13, 0);
+ usb_bulk_write(massstorage[device], 2, (u8*)cbw, 31, 0);
+ usb_bulk_read(massstorage[device], 1, (u8*)cbw, 8, 0);
+ usb_bulk_read(massstorage[device], 1, (u8*)cbw, 13, 0);
free(cbw);
u8 usb_storage_read_sector(u8 device, u32 sector, char * buf)
{
/* send cwb "usbc" */
- char tmpbuf[] = {0x55,0x53,0x42,0x43,0x08,
+ u8 tmpbuf[] = {0x55,0x53,0x42,0x43,0x08,
0xE0,0x63,0x82,0x00,0x02,
0x00,0x00,0x80,0x00,0x0A,
0x28,0x00,0x00,0x00,0x00,
dest->flags &= LE(~OHCI_TD_DIRECTION_PID_MASK);
switch(src->pid) {
case USB_PID_SETUP:
+#ifdef _DU_OHCI_Q
printf("pid_setup\n");
+#endif
dest->flags |= LE(OHCI_TD_DIRECTION_PID_SETUP);
dest->flags |= LE(OHCI_TD_TOGGLE_0);
dest->flags |= LE(OHCI_TD_BUFFER_ROUNDING);
break;
case USB_PID_OUT:
+#ifdef _DU_OHCI_Q
printf("pid_out\n");
+#endif
dest->flags |= LE(OHCI_TD_DIRECTION_PID_OUT);
dest->flags |= LE(OHCI_TD_BUFFER_ROUNDING);
dest->flags |= LE(OHCI_TD_TOGGLE_1);
break;
case USB_PID_IN:
+#ifdef _DU_OHCI_Q
printf("pid_in\n");
+#endif
dest->flags |= LE(OHCI_TD_DIRECTION_PID_IN);
if(src->maxp > src->actlen) {
dest->flags |= LE(OHCI_TD_BUFFER_ROUNDING);
+#ifdef _DU_OHCI_Q
printf("round buffer!\n");
+#endif
}
/*
* let the endpoint do the togglestuff!
/* For initializing controller (mask in an HCFS mode too) */
#define OHCI_CONTROL_INIT (3 << 0)
#define OHCI_INTR_INIT \
- (OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE \
- | OHCI_INTR_RD | OHCI_INTR_WDH)
+ (OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE)
/* OHCI ROOT HUB REGISTER MASKS */