forked from len0rd/rockbox
present a different USB serial number depending on which USB class drivers are enabled. This is needed for Windows to correctly detect the device if a different set of drivers is active than on the previous plugin
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16511 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
4fe9d7c2cd
commit
52df7addcf
1 changed files with 20 additions and 17 deletions
|
@ -201,11 +201,11 @@ static struct usb_string_descriptor __attribute__((aligned(2))) usb_string_iProd
|
|||
|
||||
static struct usb_string_descriptor __attribute__((aligned(2))) usb_string_iSerial =
|
||||
{
|
||||
82,
|
||||
84,
|
||||
USB_DT_STRING,
|
||||
{'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
|
||||
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
|
||||
'0','0','0','0','0','0','0','0'}
|
||||
'0','0','0','0','0','0','0','0','0'}
|
||||
};
|
||||
|
||||
/* Generic for all targets */
|
||||
|
@ -255,11 +255,11 @@ static unsigned char __response_data[CACHEALIGN_UP(256)] CACHEALIGN_ATTR;
|
|||
|
||||
static struct usb_transfer_completion_event_data events[NUM_ENDPOINTS];
|
||||
|
||||
static short hex[16] = {'0','1','2','3','4','5','6','7',
|
||||
'8','9','A','B','C','D','E','F'};
|
||||
#ifdef IPOD_ARCH
|
||||
static void set_serial_descriptor(void)
|
||||
{
|
||||
static short hex[16] = {'0','1','2','3','4','5','6','7',
|
||||
'8','9','A','B','C','D','E','F'};
|
||||
#ifdef IPOD_VIDEO
|
||||
uint32_t* serial = (uint32_t*)(0x20004034);
|
||||
#else
|
||||
|
@ -268,7 +268,7 @@ static void set_serial_descriptor(void)
|
|||
|
||||
/* We need to convert from a little-endian 64-bit int
|
||||
into a utf-16 string of hex characters */
|
||||
short* p = &usb_string_iSerial.wString[23];
|
||||
short* p = &usb_string_iSerial.wString[24];
|
||||
uint32_t x;
|
||||
int i,j;
|
||||
|
||||
|
@ -281,17 +281,14 @@ static void set_serial_descriptor(void)
|
|||
x >>= 4;
|
||||
}
|
||||
}
|
||||
usb_string_iSerial.bLength=50;
|
||||
usb_string_iSerial.bLength=52;
|
||||
}
|
||||
#elif defined(HAVE_AS3514)
|
||||
static void set_serial_descriptor(void)
|
||||
{
|
||||
static short hex[16] = {'0','1','2','3','4','5','6','7',
|
||||
'8','9','A','B','C','D','E','F'};
|
||||
|
||||
unsigned char serial[16];
|
||||
/* Align 32 digits right in the 40-digit serial number */
|
||||
short* p = usb_string_iSerial.wString;
|
||||
short* p = &usb_string_iSerial.wString[1];
|
||||
int i;
|
||||
|
||||
i2c_readbytes(AS3514_I2C_ADDR, 0x30, 0x10, serial);
|
||||
|
@ -300,17 +297,14 @@ static void set_serial_descriptor(void)
|
|||
*p++ = hex[(serial[i] >> 4) & 0xF];
|
||||
*p++ = hex[(serial[i] >> 0) & 0xF];
|
||||
}
|
||||
usb_string_iSerial.bLength=66;
|
||||
usb_string_iSerial.bLength=68;
|
||||
}
|
||||
#else
|
||||
/* If we don't know the device serial number, use the one
|
||||
* from the disk */
|
||||
static void set_serial_descriptor(void)
|
||||
{
|
||||
static short hex[16] = {'0','1','2','3','4','5','6','7',
|
||||
'8','9','A','B','C','D','E','F'};
|
||||
|
||||
short* p = usb_string_iSerial.wString;
|
||||
short* p = &usb_string_iSerial.wString[1];
|
||||
unsigned short* identify = ata_get_identify();
|
||||
unsigned short x;
|
||||
int i;
|
||||
|
@ -323,7 +317,7 @@ static void set_serial_descriptor(void)
|
|||
*p++ = hex[(x >> 4) & 0xF];
|
||||
*p++ = hex[(x >> 0) & 0xF];
|
||||
}
|
||||
usb_string_iSerial.bLength=82;
|
||||
usb_string_iSerial.bLength=84;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -417,10 +411,19 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
|
|||
{
|
||||
if(usb_state == DEFAULT) {
|
||||
set_serial_descriptor();
|
||||
|
||||
int serial_function_id = 0;
|
||||
#ifdef USB_STORAGE
|
||||
if(usb_core_storage_enabled)
|
||||
if(usb_core_storage_enabled) {
|
||||
usb_request_exclusive_ata();
|
||||
serial_function_id |= 1;
|
||||
}
|
||||
#endif
|
||||
#ifdef USB_SERIAL
|
||||
if(usb_core_serial_enabled)
|
||||
serial_function_id |= 2;
|
||||
#endif
|
||||
usb_string_iSerial.wString[0] = hex[serial_function_id];
|
||||
}
|
||||
|
||||
switch (req->bRequest) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue