forked from len0rd/rockbox
Added GET_CONFIGURATION. Added usb state tracking. Changed charger pktsize to 512. Fixed compile errors for usb_storage.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15797 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
d2ab668679
commit
bfff12aff9
1 changed files with 25 additions and 6 deletions
|
@ -76,7 +76,7 @@ static const struct {
|
||||||
.bNumInterfaces = 1,
|
.bNumInterfaces = 1,
|
||||||
.bConfigurationValue = 1,
|
.bConfigurationValue = 1,
|
||||||
.iConfiguration = 0,
|
.iConfiguration = 0,
|
||||||
.bmAttributes = USB_CONFIG_ATT_ONE,
|
.bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
|
||||||
.bMaxPower = 250, /* 500mA in 2mA units */
|
.bMaxPower = 250, /* 500mA in 2mA units */
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ static const struct {
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
.bEndpointAddress = EP_TX | USB_DIR_IN,
|
.bEndpointAddress = EP_TX | USB_DIR_IN,
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
||||||
.wMaxPacketSize = 64,
|
.wMaxPacketSize = 512,
|
||||||
.bInterval = 0
|
.bInterval = 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -107,7 +107,7 @@ static const struct {
|
||||||
.bDescriptorType = USB_DT_ENDPOINT,
|
.bDescriptorType = USB_DT_ENDPOINT,
|
||||||
.bEndpointAddress = EP_RX | USB_DIR_OUT,
|
.bEndpointAddress = EP_RX | USB_DIR_OUT,
|
||||||
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
.bmAttributes = USB_ENDPOINT_XFER_BULK,
|
||||||
.wMaxPacketSize = 64,
|
.wMaxPacketSize = 512,
|
||||||
.bInterval = 0
|
.bInterval = 0
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -294,6 +294,7 @@ static int usb_address = 0;
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
static bool data_connection = false;
|
static bool data_connection = false;
|
||||||
static struct event_queue usbcore_queue;
|
static struct event_queue usbcore_queue;
|
||||||
|
static enum { DEFAULT, ADDRESS, CONFIGURED } usb_state;
|
||||||
|
|
||||||
#ifdef USB_STORAGE
|
#ifdef USB_STORAGE
|
||||||
static const char usbcore_thread_name[] = "usb_core";
|
static const char usbcore_thread_name[] = "usb_core";
|
||||||
|
@ -324,6 +325,7 @@ void usb_core_init(void)
|
||||||
usb_benchmark_init();
|
usb_benchmark_init();
|
||||||
#endif
|
#endif
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
usb_state = DEFAULT;
|
||||||
logf("usb_core_init() finished");
|
logf("usb_core_init() finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,8 +337,9 @@ void usb_core_exit(void)
|
||||||
#ifdef USB_STORAGE
|
#ifdef USB_STORAGE
|
||||||
remove_thread(usbcore_thread);
|
remove_thread(usbcore_thread);
|
||||||
#endif
|
#endif
|
||||||
data_connection = false;
|
|
||||||
}
|
}
|
||||||
|
data_connection = false;
|
||||||
|
initialized = false;
|
||||||
logf("usb_core_exit() finished");
|
logf("usb_core_exit() finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,7 +356,7 @@ void usb_core_thread(void)
|
||||||
|
|
||||||
queue_wait(&usbcore_queue, &ev);
|
queue_wait(&usbcore_queue, &ev);
|
||||||
|
|
||||||
usb_storage_transfer_complete(ev.id, ev.data);
|
usb_storage_transfer_complete(ev.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -378,8 +381,22 @@ void usb_core_control_request(struct usb_ctrlrequest* req)
|
||||||
usb_storage_control_request(req);
|
usb_storage_control_request(req);
|
||||||
#endif
|
#endif
|
||||||
ack_control(req);
|
ack_control(req);
|
||||||
|
usb_state = CONFIGURED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case USB_REQ_GET_CONFIGURATION: {
|
||||||
|
static char confignum;
|
||||||
|
char* tmp = (void*)UNCACHED_ADDR(&confignum);
|
||||||
|
logf("usb_core: GET_CONFIG");
|
||||||
|
if (usb_state == ADDRESS)
|
||||||
|
*tmp = 0;
|
||||||
|
else
|
||||||
|
*tmp = 1;
|
||||||
|
usb_drv_send(EP_CONTROL, tmp, 1);
|
||||||
|
ack_control(req);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case USB_REQ_SET_INTERFACE:
|
case USB_REQ_SET_INTERFACE:
|
||||||
logf("usb_core: SET_INTERFACE");
|
logf("usb_core: SET_INTERFACE");
|
||||||
ack_control(req);
|
ack_control(req);
|
||||||
|
@ -399,6 +416,7 @@ void usb_core_control_request(struct usb_ctrlrequest* req)
|
||||||
logf("usb_core: SET_ADR %d", usb_address);
|
logf("usb_core: SET_ADR %d", usb_address);
|
||||||
ack_control(req);
|
ack_control(req);
|
||||||
usb_drv_set_address(usb_address);
|
usb_drv_set_address(usb_address);
|
||||||
|
usb_state = ADDRESS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_REQ_GET_STATUS: {
|
case USB_REQ_GET_STATUS: {
|
||||||
|
@ -511,6 +529,7 @@ void usb_core_bus_reset(void)
|
||||||
{
|
{
|
||||||
usb_address = 0;
|
usb_address = 0;
|
||||||
data_connection = false;
|
data_connection = false;
|
||||||
|
usb_state = DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* called by usb_drv_transfer_completed() */
|
/* called by usb_drv_transfer_completed() */
|
||||||
|
@ -530,7 +549,7 @@ void usb_core_transfer_complete(int endpoint, bool in)
|
||||||
#if defined(USB_BENCHMARK)
|
#if defined(USB_BENCHMARK)
|
||||||
usb_benchmark_transfer_complete(endpoint, in);
|
usb_benchmark_transfer_complete(endpoint, in);
|
||||||
#elif defined(USB_STORAGE)
|
#elif defined(USB_STORAGE)
|
||||||
queue_post(&usbcore_queue, endpoint);
|
queue_post(&usbcore_queue, endpoint, 0);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue