Skip to content

Commit 07c7fde

Browse files
committed
[PUSB] Fix for static initialization order fiasco (try 2)
1 parent d13aadc commit 07c7fde

File tree

5 files changed

+50
-34
lines changed

5 files changed

+50
-34
lines changed

Diff for: hardware/arduino/avr/cores/arduino/PluggableUSB.cpp

+29-21
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,21 @@
2525

2626
extern uint8_t _initEndpoints[];
2727

28+
PUSBListNode *PluggableUSB_::rootNode = NULL;
29+
30+
void PluggableUSB_::plug(PUSBListNode *node)
31+
{
32+
if (!rootNode) {
33+
rootNode = node;
34+
} else {
35+
PUSBListNode *current = rootNode;
36+
while (current->next) {
37+
current = current->next;
38+
}
39+
current->next = node;
40+
}
41+
}
42+
2843
PluggableUSB_ PluggableUSB;
2944

3045
int PluggableUSB_::getInterface(uint8_t* interfaceNum)
@@ -63,36 +78,29 @@ bool PluggableUSB_::setup(USBSetup& setup, uint8_t j)
6378
return false;
6479
}
6580

66-
bool PluggableUSB_::plug(PUSBListNode *node)
81+
bool PluggableUSB_::init()
6782
{
68-
if ((lastEp + node->numEndpoints) > USB_ENDPOINTS) {
69-
return false;
70-
}
71-
72-
if (!rootNode) {
73-
rootNode = node;
74-
} else {
75-
PUSBListNode *current = rootNode;
76-
while (current->next) {
77-
current = current->next;
83+
PUSBListNode* node;
84+
for (node = rootNode; node; node = node->next) {
85+
if ((lastEp + node->numEndpoints) > USB_ENDPOINTS) {
86+
return false;
7887
}
79-
current->next = node;
80-
}
8188

82-
node->pluggedInterface = lastIf;
83-
node->pluggedEndpoint = lastEp;
84-
lastIf += node->numInterfaces;
85-
for (uint8_t i = 0; i < node->numEndpoints; i++) {
86-
_initEndpoints[lastEp] = node->endpointType[i];
87-
lastEp++;
89+
node->pluggedInterface = lastIf;
90+
node->pluggedEndpoint = lastEp;
91+
lastIf += node->numInterfaces;
92+
for (uint8_t i = 0; i < node->numEndpoints; i++) {
93+
_initEndpoints[lastEp] = node->endpointType[i];
94+
lastEp++;
95+
}
96+
node->init();
8897
}
8998
return true;
9099
// restart USB layer???
91100
}
92101

93102
PluggableUSB_::PluggableUSB_() : lastIf(CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT),
94-
lastEp(CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT),
95-
rootNode(NULL)
103+
lastEp(CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT)
96104
{
97105
// Empty
98106
}

Diff for: hardware/arduino/avr/cores/arduino/PluggableUSB.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class PUSBListNode {
3535
inline int8_t endpoint() const { return pluggedEndpoint; }
3636

3737
protected:
38+
virtual void init();
3839
virtual bool setup(USBSetup& setup, uint8_t i) = 0;
3940
virtual int getInterface(uint8_t* interfaceNum) = 0;
4041
virtual int getDescriptor(int8_t t) = 0;
@@ -54,16 +55,18 @@ class PUSBListNode {
5455

5556
class PluggableUSB_ {
5657
public:
58+
static void plug(PUSBListNode *node);
59+
5760
PluggableUSB_();
58-
bool plug(PUSBListNode *node);
61+
bool init();
5962
int getInterface(uint8_t* interfaceNum);
6063
int getDescriptor(int8_t t);
6164
bool setup(USBSetup& setup, uint8_t i);
6265

6366
private:
6467
uint8_t lastIf;
6568
uint8_t lastEp;
66-
PUSBListNode* rootNode;
69+
static PUSBListNode* rootNode;
6770
};
6871

6972
extern PluggableUSB_ PluggableUSB;

Diff for: hardware/arduino/avr/cores/arduino/USBCore.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,9 @@ void InitEP(u8 index, u8 type, u8 size)
335335
static
336336
void InitEndpoints()
337337
{
338+
#ifdef PLUGGABLE_USB_ENABLED
339+
PluggableUSB.init();
340+
#endif
338341
for (u8 i = 1; i < sizeof(_initEndpoints) && _initEndpoints[i] != 0; i++)
339342
{
340343
UENUM = i;

Diff for: hardware/arduino/avr/libraries/HID/HID.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
HID_ HID;
2525

26+
HIDDescriptorListNode *HID_::rootNode = NULL;
27+
2628
int HID_::getInterface(uint8_t* interfaceNum)
2729
{
2830
*interfaceNum += 1; // uses 1
@@ -63,7 +65,13 @@ void HID_::AppendDescriptor(HIDDescriptorListNode *node)
6365
}
6466
current->next = node;
6567
}
66-
descriptorSize += node->length;
68+
}
69+
70+
void HID_::init() {
71+
HIDDescriptorListNode *node;
72+
for (node = rootNode; node; node = node->next) {
73+
descriptorSize += node->length;
74+
}
6775
}
6876

6977
void HID_::SendReport(uint8_t id, const void* data, int len)
@@ -109,16 +117,10 @@ bool HID_::setup(USBSetup& setup, uint8_t interfaceNum)
109117
}
110118

111119
HID_::HID_(void) : PUSBListNode(1, 1, epType),
112-
rootNode(NULL), descriptorSize(0),
113-
protocol(1), idle(1)
120+
descriptorSize(0), protocol(1), idle(1)
114121
{
115122
epType[0] = EP_TYPE_INTERRUPT_IN;
116123
PluggableUSB.plug(this);
117124
}
118125

119-
int HID_::begin(void)
120-
{
121-
return 0;
122-
}
123-
124126
#endif /* if defined(USBCON) */

Diff for: hardware/arduino/avr/libraries/HID/HID.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,20 @@ class HID_ : public PUSBListNode
7373
{
7474
public:
7575
HID_(void);
76-
int begin(void);
7776
void SendReport(uint8_t id, const void* data, int len);
78-
void AppendDescriptor(HIDDescriptorListNode* node);
77+
static void AppendDescriptor(HIDDescriptorListNode* node);
7978

8079
protected:
8180
// Implementation of the PUSBListNode
81+
void init();
8282
int getInterface(uint8_t* interfaceNum);
8383
int getDescriptor(int8_t type);
8484
bool setup(USBSetup& setup, uint8_t interfaceNum);
8585

8686
private:
8787
uint8_t epType[1];
8888

89-
HIDDescriptorListNode* rootNode;
89+
static HIDDescriptorListNode* rootNode;
9090
uint16_t descriptorSize;
9191

9292
uint8_t protocol;

0 commit comments

Comments
 (0)