1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-03-14 11:29:26 +01:00

rework PUSBCallbacks initialization

This commit is contained in:
Martino Facchin 2015-06-23 16:59:56 +00:00 committed by Cristian Maglie
parent ada0e4c2f3
commit 89928b4e15
4 changed files with 49 additions and 40 deletions

View File

@ -28,12 +28,6 @@
static u8 lastIf = CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT; static u8 lastIf = CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT;
static u8 lastEp = CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT; static u8 lastEp = CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT;
class PUSBListNode {
public:
PUSBListNode *next = NULL;
PUSBCallbacks cb;
};
extern u8 _initEndpoints[]; extern u8 _initEndpoints[];
//PUSBCallbacks cbs[MAX_MODULES]; //PUSBCallbacks cbs[MAX_MODULES];
@ -47,7 +41,7 @@ int8_t PUSB_GetInterface(u8* interfaceNum)
int8_t ret = 0; int8_t ret = 0;
PUSBListNode* node = rootNode; PUSBListNode* node = rootNode;
for (u8 i=0; i<modules_count; i++) { for (u8 i=0; i<modules_count; i++) {
ret = node->cb.getInterface(interfaceNum); ret = node->cb->getInterface(interfaceNum);
node = node->next; node = node->next;
} }
return ret; return ret;
@ -58,7 +52,7 @@ int8_t PUSB_GetDescriptor(int8_t t)
int8_t ret = 0; int8_t ret = 0;
PUSBListNode* node = rootNode; PUSBListNode* node = rootNode;
for (u8 i=0; i<modules_count && ret == 0; i++) { for (u8 i=0; i<modules_count && ret == 0; i++) {
ret = node->cb.getDescriptor(t); ret = node->cb->getDescriptor(t);
node = node->next; node = node->next;
} }
return ret; return ret;
@ -69,24 +63,18 @@ bool PUSB_Setup(Setup& setup, u8 j)
bool ret = false; bool ret = false;
PUSBListNode* node = rootNode; PUSBListNode* node = rootNode;
for (u8 i=0; i<modules_count && ret == false; i++) { for (u8 i=0; i<modules_count && ret == false; i++) {
ret = node->cb.setup(setup, j); ret = node->cb->setup(setup, j);
node = node->next; node = node->next;
} }
return ret; return ret;
} }
int8_t PUSB_AddFunction(PUSBCallbacks *cb, u8* interface) int8_t PUSB_AddFunction(PUSBListNode *node, u8* interface)
{ {
if (modules_count >= MAX_MODULES) { if (modules_count >= MAX_MODULES) {
return 0; return 0;
} }
PUSBListNode *node = new PUSBListNode;
node->cb.setup = cb->setup;
node->cb.getInterface = cb->getInterface;
node->cb.getDescriptor = cb->getDescriptor;
if (modules_count == 0) { if (modules_count == 0) {
rootNode = node; rootNode = node;
lastNode = node; lastNode = node;
@ -95,13 +83,13 @@ int8_t PUSB_AddFunction(PUSBCallbacks *cb, u8* interface)
} }
*interface = lastIf; *interface = lastIf;
lastIf += cb->numInterfaces; lastIf += node->cb->numInterfaces;
for ( u8 i = 0; i< cb->numEndpoints; i++) { for ( u8 i = 0; i< node->cb->numEndpoints; i++) {
_initEndpoints[lastEp] = cb->endpointType[i]; _initEndpoints[lastEp] = node->cb->endpointType[i];
lastEp++; lastEp++;
} }
modules_count++; modules_count++;
return lastEp - cb->numEndpoints; return lastEp - node->cb->numEndpoints;
// restart USB layer??? // restart USB layer???
} }

View File

@ -32,7 +32,7 @@ typedef struct
int8_t (*getDescriptor)(int8_t t); int8_t (*getDescriptor)(int8_t t);
int8_t numEndpoints; int8_t numEndpoints;
int8_t numInterfaces; int8_t numInterfaces;
u8 endpointType[]; uint8_t *endpointType;
} PUSBCallbacks; } PUSBCallbacks;
typedef struct typedef struct
@ -41,7 +41,14 @@ typedef struct
u8 firstEndpoint; u8 firstEndpoint;
} PUSBReturn; } PUSBReturn;
int8_t PUSB_AddFunction(PUSBCallbacks *cb, u8 *interface); class PUSBListNode {
public:
PUSBListNode *next = NULL;
PUSBCallbacks *cb;
PUSBListNode(PUSBCallbacks *ncb) {cb = ncb;}
};
int8_t PUSB_AddFunction(PUSBListNode *node, u8 *interface);
int8_t PUSB_GetInterface(u8* interfaceNum); int8_t PUSB_GetInterface(u8* interfaceNum);

View File

@ -114,15 +114,22 @@ bool WEAK HID_Setup(Setup& setup, u8 i)
// to be called by begin(), will trigger USB disconnection and reconnection // to be called by begin(), will trigger USB disconnection and reconnection
int8_t HID_Plug(void) int8_t HID_Plug(void)
{ {
PUSBCallbacks cb; static uint8_t endpointType[1];
cb.setup = &HID_Setup; endpointType[0] = EP_TYPE_INTERRUPT_IN;
cb.getInterface = &HID_GetInterface;
cb.getDescriptor = &HID_GetDescriptor; static PUSBCallbacks cb = {
cb.numEndpoints = 1; .setup = &HID_Setup,
cb.numInterfaces = 1; .getInterface = &HID_GetInterface,
cb.endpointType[0] = EP_TYPE_INTERRUPT_IN; .getDescriptor = &HID_GetDescriptor,
HID_ENDPOINT_INT = PUSB_AddFunction(&cb, &HID_INTERFACE); .numEndpoints = 1,
.numInterfaces = 1,
.endpointType = endpointType,
};
static PUSBListNode node(&cb);
HID_ENDPOINT_INT = PUSB_AddFunction(&node, &HID_INTERFACE);
_hidInterface = _hidInterface =
{ {

View File

@ -16,7 +16,7 @@
#include "PluggableUSB.h" #include "PluggableUSB.h"
#include "MIDIUSB.h" #include "MIDIUSB.h"
#define MIDI_BUFFER_SIZE 128 #define MIDI_BUFFER_SIZE 16
static u8 MIDI_AC_INTERFACE; // MIDI AC Interface static u8 MIDI_AC_INTERFACE; // MIDI AC Interface
@ -173,17 +173,24 @@ void MIDI_::sendMIDI(midiEventPacket_t event)
int8_t MIDI_plug(void) int8_t MIDI_plug(void)
{ {
PUSBCallbacks cb;
cb.setup = &MIDI_Setup; static uint8_t endpointType[2];
cb.getInterface = &MIDI_GetInterface;
cb.getDescriptor = &MIDI_GetDescriptor;
cb.numEndpoints = 2;
cb.numInterfaces = 2;
cb.endpointType[0] = EP_TYPE_BULK_OUT_MIDI; // MIDI_ENDPOINT_OUT
cb.endpointType[1] = EP_TYPE_BULK_IN_MIDI; // MIDI_ENDPOINT_IN
MIDI_ENDPOINT_OUT = PUSB_AddFunction(&cb, &MIDI_AC_INTERFACE); endpointType[0] = EP_TYPE_BULK_OUT_MIDI; // MIDI_ENDPOINT_OUT
endpointType[1] = EP_TYPE_BULK_IN_MIDI; // MIDI_ENDPOINT_IN
static PUSBCallbacks cb = {
.setup = &MIDI_Setup,
.getInterface = &MIDI_GetInterface,
.getDescriptor = &MIDI_GetDescriptor,
.numEndpoints = 1,
.numInterfaces = 2,
.endpointType = endpointType,
};
static PUSBListNode node(&cb);
MIDI_ENDPOINT_OUT = PUSB_AddFunction(&node, &MIDI_AC_INTERFACE);
MIDI_ENDPOINT_IN = MIDI_ENDPOINT_OUT + 1; MIDI_ENDPOINT_IN = MIDI_ENDPOINT_OUT + 1;
MIDI_INTERFACE = MIDI_AC_INTERFACE + 1; MIDI_INTERFACE = MIDI_AC_INTERFACE + 1;