Skip to content

Commit 590bd52

Browse files
facchinmsebromero
authored andcommitted
PluggableUSB: modules modify bcdDevice value
This should solve driver mismatch in Windows when a different USBDevice functionality is added/removed. Based on this suggestion: arduino-libraries/Keyboard#41 (comment) Fixes arduino#107 (comment)
1 parent ac86257 commit 590bd52

File tree

10 files changed

+48
-0
lines changed

10 files changed

+48
-0
lines changed

cores/arduino/USB/PluggableUSBDevice.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ bool arduino::PluggableUSBDevice::plug(internal::PluggableUSBModule*node)
9595

9696
node->pluggedInterface = lastIf;
9797
lastIf += node->numInterfaces;
98+
product_release += node->getProductVersion();
9899
return true;
99100
}
100101

cores/arduino/USB/PluggableUSBDevice.h

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class PluggableUSBModule {
5858
virtual void callback_set_interface(uint16_t interface, uint8_t alternate);
5959
virtual void init(EndpointResolver& resolver);
6060
virtual const uint8_t *string_iinterface_desc();
61+
virtual uint8_t getProductVersion();
6162

6263
uint8_t pluggedInterface;
6364

cores/arduino/USB/USBCDC.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,11 @@ const uint8_t *USBCDC::string_iinterface_desc()
489489
return (const uint8_t *)extraDescriptor;
490490
}
491491

492+
uint8_t USBCDC::getProductVersion()
493+
{
494+
return 1;
495+
}
496+
492497
const uint8_t *USBCDC::string_iproduct_desc()
493498
{
494499
static const uint8_t stringIproductDescriptor[] = {

cores/arduino/USB/USBCDC.h

+7
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ class USBCDC: public internal::PluggableUSBModule{
144144
*/
145145
virtual const uint8_t *string_iproduct_desc();
146146

147+
/*
148+
* Get string product version
149+
*
150+
* Every module must declare a different number
151+
*/
152+
virtual uint8_t getProductVersion();
153+
147154
/*
148155
* Get string interface descriptor
149156
*

libraries/USBAudio/PluggableUSBAudio.h

+7
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,13 @@ class USBAudio: protected internal::PluggableUSBModule {
274274
virtual const uint8_t *string_iinterface_desc();
275275
virtual const uint8_t *configuration_desc(uint8_t index);
276276

277+
/*
278+
* Get string product version
279+
*
280+
* Every module must declare a different number
281+
*/
282+
virtual uint8_t getProductVersion();
283+
277284
private:
278285

279286
class AsyncWrite;

libraries/USBAudio/USBAudio.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,11 @@ const uint8_t *USBAudio::configuration_desc(uint8_t index)
588588
return _config_descriptor;
589589
}
590590

591+
uint8_t USBAudio::getProductVersion()
592+
{
593+
return 2;
594+
}
595+
591596
const uint8_t *USBAudio::string_iinterface_desc()
592597
{
593598
static const uint8_t stringIinterfaceDescriptor[] = {

libraries/USBHID/PluggableUSBHID.h

+7
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ class USBHID: public internal::PluggableUSBModule {
163163
*/
164164
virtual uint16_t report_desc_length();
165165

166+
/*
167+
* Get string product version
168+
*
169+
* Every module must declare a different number
170+
*/
171+
virtual uint8_t getProductVersion();
172+
166173
/*
167174
* Get string product descriptor
168175
*

libraries/USBHID/USBHID.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,10 @@ void USBHID::callback_set_interface(uint16_t interface, uint8_t alternate)
388388
assert_locked();
389389
}
390390

391+
uint8_t USBHID::getProductVersion()
392+
{
393+
return 4;
394+
}
391395

392396
const uint8_t *USBHID::string_iinterface_desc()
393397
{

libraries/USBMSD/PluggableUSBMSD.h

+7
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,13 @@ class USBMSD: public internal::PluggableUSBModule {
282282
// space for config descriptor
283283
uint8_t _configuration_descriptor[32];
284284

285+
/*
286+
* Get string product version
287+
*
288+
* Every module must declare a different number
289+
*/
290+
virtual uint8_t getProductVersion();
291+
285292
virtual const uint8_t *string_iproduct_desc();
286293
virtual const uint8_t *string_iinterface_desc();
287294
virtual const uint8_t *configuration_desc(uint8_t index);

libraries/USBMSD/USBMSD.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,10 @@ void USBMSD::callback_set_interface(uint16_t interface, uint8_t alternate)
311311
//complete_set_interface(success);
312312
}
313313

314+
uint8_t USBMSD::getProductVersion()
315+
{
316+
return 8;
317+
}
314318

315319
const uint8_t *USBMSD::string_iinterface_desc()
316320
{

0 commit comments

Comments
 (0)