1
+
2
+
3
+ /* Copyright (c) 2011, Peter Barrett
4
+ **
5
+ ** Permission to use, copy, modify, and/or distribute this software for
6
+ ** any purpose with or without fee is hereby granted, provided that the
7
+ ** above copyright notice and this permission notice appear in all copies.
8
+ **
9
+ ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10
+ ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11
+ ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
12
+ ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
13
+ ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
14
+ ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
15
+ ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
16
+ ** SOFTWARE.
17
+ */
18
+
19
+ #include " USBAPI.h"
20
+ #include " PluggableUSB.h"
21
+
22
+ #if defined(USBCON)
23
+ #ifdef PLUGGABLE_USB_ENABLED
24
+
25
+ #define MAX_MODULES 6
26
+
27
+ static u8 startIf = CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT;
28
+ static u8 firstEp = CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT;
29
+
30
+ static u8 lastIf = CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT;
31
+ static u8 lastEp = CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT;
32
+
33
+ extern u8 _initEndpoints[];
34
+
35
+ PUSBCallbacks cbs[MAX_MODULES];
36
+ u8 modules_count = 0 ;
37
+
38
+ int PUSB_GetInterface (u8* interfaceNum)
39
+ {
40
+ int ret = 0 ;
41
+ for (u8 i=0 ; i<modules_count; i++) {
42
+ ret = cbs[i].getInterface (interfaceNum);
43
+ }
44
+ return ret;
45
+ }
46
+
47
+ int PUSB_GetDescriptor (int t)
48
+ {
49
+ int ret = 0 ;
50
+ for (u8 i=0 ; i<modules_count && ret == 0 ; i++) {
51
+ ret = cbs[i].getDescriptor (t);
52
+ }
53
+ return ret;
54
+ }
55
+
56
+ bool PUSB_Setup (Setup& setup, u8 j)
57
+ {
58
+ bool ret = false ;
59
+ for (u8 i=0 ; i<modules_count && ret == false ; i++) {
60
+ ret = cbs[i].setup (setup, j);
61
+ }
62
+ return ret;
63
+ }
64
+
65
+ int PUSB_AddFunction (PUSBCallbacks *cb, u8* interface)
66
+ {
67
+ if (modules_count >= MAX_MODULES) {
68
+ return 0 ;
69
+ }
70
+ cbs[modules_count] = *cb;
71
+
72
+ *interface = lastIf;
73
+ lastIf++;
74
+ for ( u8 i = 0 ; i< cb->numEndpoints ; i++) {
75
+ _initEndpoints[lastEp] = cb->endpointType [i];
76
+ lastEp++;
77
+ }
78
+ modules_count++;
79
+ return lastEp-1 ;
80
+ // restart USB layer???
81
+ }
82
+
83
+ #endif
84
+
85
+ #endif /* if defined(USBCON) */
0 commit comments