forked from len0rd/rockbox
some progress towards software-selectability of usb class drivers.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16422 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
30b129d025
commit
7bf5722a9d
2 changed files with 69 additions and 37 deletions
|
@ -61,6 +61,17 @@
|
||||||
#endif
|
#endif
|
||||||
#endif /* HAVE_USB_POWER */
|
#endif /* HAVE_USB_POWER */
|
||||||
|
|
||||||
|
#ifdef HAVE_USBSTACK
|
||||||
|
/* USB class drivers */
|
||||||
|
enum {
|
||||||
|
USB_DRIVER_MASS_STORAGE,
|
||||||
|
USB_DRIVER_SERIAL,
|
||||||
|
USB_DRIVER_CHARGING_ONLY,
|
||||||
|
USB_DRIVER_COUNT
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void usb_init(void);
|
void usb_init(void);
|
||||||
void usb_enable(bool on);
|
void usb_enable(bool on);
|
||||||
void usb_start_monitoring(void);
|
void usb_start_monitoring(void);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
//#define LOGF_ENABLE
|
//#define LOGF_ENABLE
|
||||||
#include "logf.h"
|
#include "logf.h"
|
||||||
|
|
||||||
|
#include "usb.h"
|
||||||
#include "usb_ch9.h"
|
#include "usb_ch9.h"
|
||||||
#include "usb_drv.h"
|
#include "usb_drv.h"
|
||||||
#include "usb_core.h"
|
#include "usb_core.h"
|
||||||
|
@ -299,6 +300,18 @@ static long usbcore_stack[DEFAULT_STACK_SIZE];
|
||||||
static void usb_core_thread(void);
|
static void usb_core_thread(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ROCKBOX_USB
|
||||||
|
static bool usb_core_charging_enabled = false;
|
||||||
|
static bool usb_core_storage_enabled = true;
|
||||||
|
static bool usb_core_serial_enabled = true;
|
||||||
|
#if defined(USB_BENCHMARK)
|
||||||
|
static bool usb_core_benchmark_enabled = false;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
static bool usb_core_charging_enabled = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void usb_core_control_request_handler(struct usb_ctrlrequest* req);
|
static void usb_core_control_request_handler(struct usb_ctrlrequest* req);
|
||||||
static int ack_control(struct usb_ctrlrequest* req);
|
static int ack_control(struct usb_ctrlrequest* req);
|
||||||
|
|
||||||
|
@ -490,11 +503,9 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
|
||||||
/* note: interrupt context */
|
/* note: interrupt context */
|
||||||
data_connection = true;
|
data_connection = true;
|
||||||
|
|
||||||
#if defined(IPOD_ARCH) || defined(HAVE_AS3514)
|
|
||||||
if(usb_state == DEFAULT) {
|
if(usb_state == DEFAULT) {
|
||||||
set_serial_descriptor();
|
set_serial_descriptor();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USB_BENCHMARK
|
#ifdef USB_BENCHMARK
|
||||||
if ((req->bRequestType & 0x60) == USB_TYPE_VENDOR) {
|
if ((req->bRequestType & 0x60) == USB_TYPE_VENDOR) {
|
||||||
|
@ -510,11 +521,13 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
|
||||||
if (req->wValue){
|
if (req->wValue){
|
||||||
usb_state = CONFIGURED;
|
usb_state = CONFIGURED;
|
||||||
#ifdef USB_STORAGE
|
#ifdef USB_STORAGE
|
||||||
usb_storage_control_request(req);
|
if(usb_core_storage_enabled)
|
||||||
|
usb_storage_control_request(req);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USB_SERIAL
|
#ifdef USB_SERIAL
|
||||||
usb_serial_control_request(req);
|
if(usb_core_serial_enabled)
|
||||||
|
usb_serial_control_request(req);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -631,48 +644,56 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
|
||||||
size = sizeof(config_descriptor);
|
size = sizeof(config_descriptor);
|
||||||
|
|
||||||
#ifdef USB_CHARGING_ONLY
|
#ifdef USB_CHARGING_ONLY
|
||||||
charging_interface_descriptor.bInterfaceNumber=interface_number;
|
if(usb_core_charging_enabled){
|
||||||
interface_number++;
|
charging_interface_descriptor.bInterfaceNumber=interface_number;
|
||||||
memcpy(&response_data[size],&charging_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
interface_number++;
|
||||||
size += sizeof(struct usb_interface_descriptor);
|
memcpy(&response_data[size],&charging_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
||||||
|
size += sizeof(struct usb_interface_descriptor);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USB_STORAGE
|
#ifdef USB_STORAGE
|
||||||
mass_storage_ep_in_descriptor.wMaxPacketSize=max_packet_size;
|
if(usb_core_storage_enabled){
|
||||||
mass_storage_ep_out_descriptor.wMaxPacketSize=max_packet_size;
|
mass_storage_ep_in_descriptor.wMaxPacketSize=max_packet_size;
|
||||||
mass_storage_interface_descriptor.bInterfaceNumber=interface_number;
|
mass_storage_ep_out_descriptor.wMaxPacketSize=max_packet_size;
|
||||||
interface_number++;
|
mass_storage_interface_descriptor.bInterfaceNumber=interface_number;
|
||||||
|
interface_number++;
|
||||||
|
|
||||||
memcpy(&response_data[size],&mass_storage_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
memcpy(&response_data[size],&mass_storage_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
||||||
size += sizeof(struct usb_interface_descriptor);
|
size += sizeof(struct usb_interface_descriptor);
|
||||||
memcpy(&response_data[size],&mass_storage_ep_in_descriptor,sizeof(struct usb_endpoint_descriptor));
|
memcpy(&response_data[size],&mass_storage_ep_in_descriptor,sizeof(struct usb_endpoint_descriptor));
|
||||||
size += sizeof(struct usb_endpoint_descriptor);
|
size += sizeof(struct usb_endpoint_descriptor);
|
||||||
memcpy(&response_data[size],&mass_storage_ep_out_descriptor,sizeof(struct usb_endpoint_descriptor));
|
memcpy(&response_data[size],&mass_storage_ep_out_descriptor,sizeof(struct usb_endpoint_descriptor));
|
||||||
size += sizeof(struct usb_endpoint_descriptor);
|
size += sizeof(struct usb_endpoint_descriptor);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USB_SERIAL
|
#ifdef USB_SERIAL
|
||||||
serial_ep_in_descriptor.wMaxPacketSize=max_packet_size;
|
if(usb_core_serial_enabled){
|
||||||
serial_ep_out_descriptor.wMaxPacketSize=max_packet_size;
|
serial_ep_in_descriptor.wMaxPacketSize=max_packet_size;
|
||||||
serial_interface_descriptor.bInterfaceNumber=interface_number;
|
serial_ep_out_descriptor.wMaxPacketSize=max_packet_size;
|
||||||
interface_number++;
|
serial_interface_descriptor.bInterfaceNumber=interface_number;
|
||||||
|
interface_number++;
|
||||||
|
|
||||||
memcpy(&response_data[size],&serial_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
memcpy(&response_data[size],&serial_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
||||||
size += sizeof(struct usb_interface_descriptor);
|
size += sizeof(struct usb_interface_descriptor);
|
||||||
memcpy(&response_data[size],&serial_ep_in_descriptor,sizeof(struct usb_endpoint_descriptor));
|
memcpy(&response_data[size],&serial_ep_in_descriptor,sizeof(struct usb_endpoint_descriptor));
|
||||||
size += sizeof(struct usb_endpoint_descriptor);
|
size += sizeof(struct usb_endpoint_descriptor);
|
||||||
memcpy(&response_data[size],&serial_ep_out_descriptor,sizeof(struct usb_endpoint_descriptor));
|
memcpy(&response_data[size],&serial_ep_out_descriptor,sizeof(struct usb_endpoint_descriptor));
|
||||||
size += sizeof(struct usb_endpoint_descriptor);
|
size += sizeof(struct usb_endpoint_descriptor);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USB_BENCHMARK
|
#ifdef USB_BENCHMARK
|
||||||
benchmark_ep_in_descriptor.wMaxPacketSize=max_packet_size;
|
if(usb_core_benchmark_enabled){
|
||||||
benchmark_ep_out_descriptor.wMaxPacketSize=max_packet_size;
|
benchmark_ep_in_descriptor.wMaxPacketSize=max_packet_size;
|
||||||
config_descriptor.bNumInterfaces=interface_number;
|
benchmark_ep_out_descriptor.wMaxPacketSize=max_packet_size;
|
||||||
|
config_descriptor.bNumInterfaces=interface_number;
|
||||||
|
|
||||||
memcpy(&response_data[size],&benchmark_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
memcpy(&response_data[size],&benchmark_interface_descriptor,sizeof(struct usb_interface_descriptor));
|
||||||
size += sizeof(struct usb_interface_descriptor);
|
size += sizeof(struct usb_interface_descriptor);
|
||||||
memcpy(&response_data[size],&benchmark_ep_in_descriptor,sizeof(struct usb_endpoint_descriptor));
|
memcpy(&response_data[size],&benchmark_ep_in_descriptor,sizeof(struct usb_endpoint_descriptor));
|
||||||
size += sizeof(struct usb_endpoint_descriptor);
|
size += sizeof(struct usb_endpoint_descriptor);
|
||||||
memcpy(&response_data[size],&benchmark_ep_out_descriptor,sizeof(struct usb_endpoint_descriptor));
|
memcpy(&response_data[size],&benchmark_ep_out_descriptor,sizeof(struct usb_endpoint_descriptor));
|
||||||
size += sizeof(struct usb_endpoint_descriptor);
|
size += sizeof(struct usb_endpoint_descriptor);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
config_descriptor.wTotalLength = size;
|
config_descriptor.wTotalLength = size;
|
||||||
memcpy(&response_data[0],&config_descriptor,sizeof(struct usb_config_descriptor));
|
memcpy(&response_data[0],&config_descriptor,sizeof(struct usb_config_descriptor));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue