annotate Output/pjrcUSB/arm/usb_dev.c @ 439:68e19d7c953e

Adding proper remote wake-up support - Maintains a sleep state variable (may be able to use as a signal in the future) - On the first keypress, hold the RESUME signal for 10 ms (spec says between 1 and 15 ms) - Removed some messages that were affecting sleep state
author Jacob Alexander <haata@kiibohd.com>
date Tue, 17 May 2016 01:18:14 -0700
parents f10c2dad7f55
children 56237ba5da6f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1 /* Teensyduino Core Library
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
2 * http://www.pjrc.com/teensy/
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
3 * Copyright (c) 2013 PJRC.COM, LLC.
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
4 * Modifications by Jacob Alexander (2013-2016)
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
5 *
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
7 * a copy of this software and associated documentation files (the
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
8 * "Software"), to deal in the Software without restriction, including
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
9 * without limitation the rights to use, copy, modify, merge, publish,
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
10 * distribute, sublicense, and/or sell copies of the Software, and to
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
11 * permit persons to whom the Software is furnished to do so, subject to
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
12 * the following conditions:
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
13 *
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
14 * 1. The above copyright notice and this permission notice shall be
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
15 * included in all copies or substantial portions of the Software.
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
16 *
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
17 * 2. If the Software is incorporated into a build system that allows
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
18 * selection among a list of target devices, then similar target
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
19 * devices manufactured by PJRC.COM must be included in the list of
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
20 * target devices and selectable in the same manner.
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
21 *
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
25 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
26 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
27 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
28 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
29 * SOFTWARE.
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
30 */
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
31
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
32 // ----- Includes -----
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
33
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
34 // Project Includes
118
b61ca96b7c24 File and macro modifications for supporting Teensy 3.1
Jacob Alexander <haata@kiibohd.com>
parents: 117
diff changeset
35 #include <Lib/OutputLib.h>
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
36 #include <print.h>
370
39e338a6733d Fixing default ErgoDox layout and adding FlashMode button
Jacob Alexander <haata@kiibohd.com>
parents: 368
diff changeset
37 #include <kll_defs.h>
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
38
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
39 // Local Includes
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
40 #include "usb_dev.h"
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
41 #include "usb_mem.h"
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
42
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
43
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
44
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
45 // ----- Defines -----
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
46
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
47 // DEBUG Mode
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
48 // XXX - Only use when using usbMuxUart Module
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
49 // Delay causes issues initializing more than 1 hid device (i.e. NKRO keyboard)
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
50 //#define UART_DEBUG 1
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
51 // Debug Unknown USB requests, usually what you want to debug USB issues
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
52 //#define UART_DEBUG_UNKNOWN 1
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
53
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
54
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
55 #define TX_STATE_BOTH_FREE_EVEN_FIRST 0
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
56 #define TX_STATE_BOTH_FREE_ODD_FIRST 1
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
57 #define TX_STATE_EVEN_FREE 2
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
58 #define TX_STATE_ODD_FREE 3
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
59 #define TX_STATE_NONE_FREE_EVEN_FIRST 4
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
60 #define TX_STATE_NONE_FREE_ODD_FIRST 5
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
61
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
62 #define BDT_OWN 0x80
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
63 #define BDT_DATA1 0x40
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
64 #define BDT_DATA0 0x00
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
65 #define BDT_DTS 0x08
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
66 #define BDT_STALL 0x04
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
67
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
68 #define TX 1
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
69 #define RX 0
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
70 #define ODD 1
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
71 #define EVEN 0
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
72 #define DATA0 0
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
73 #define DATA1 1
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
74
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
75
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
76 #define GET_STATUS 0
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
77 #define CLEAR_FEATURE 1
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
78 #define SET_FEATURE 3
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
79 #define SET_ADDRESS 5
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
80 #define GET_DESCRIPTOR 6
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
81 #define SET_DESCRIPTOR 7
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
82 #define GET_CONFIGURATION 8
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
83 #define SET_CONFIGURATION 9
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
84 #define GET_INTERFACE 10
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
85 #define SET_INTERFACE 11
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
86 #define SYNCH_FRAME 12
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
87
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
88 #define TX_STATE_BOTH_FREE_EVEN_FIRST 0
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
89 #define TX_STATE_BOTH_FREE_ODD_FIRST 1
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
90 #define TX_STATE_EVEN_FREE 2
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
91 #define TX_STATE_ODD_FREE 3
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
92 #define TX_STATE_NONE_FREE 4
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
93
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
94
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
95
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
96
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
97
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
98 // ----- Macros -----
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
99
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
100 #define BDT_PID(n) (((n) >> 2) & 15)
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
101
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
102 #define BDT_DESC(count, data) (BDT_OWN | BDT_DTS \
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
103 | ((data) ? BDT_DATA1 : BDT_DATA0) \
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
104 | ((count) << 16))
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
105
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
106 #define index(endpoint, tx, odd) (((endpoint) << 2) | ((tx) << 1) | (odd))
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
107 #define stat2bufferdescriptor(stat) (table + ((stat) >> 2))
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
108
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
109
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
110
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
111 // ----- Structs -----
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
112
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
113 // buffer descriptor table
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
114
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
115 typedef struct {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
116 uint32_t desc;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
117 void * addr;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
118 } bdt_t;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
119
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
120 static union {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
121 struct {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
122 union {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
123 struct {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
124 uint8_t bmRequestType;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
125 uint8_t bRequest;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
126 };
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
127 uint16_t wRequestAndType;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
128 };
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
129 uint16_t wValue;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
130 uint16_t wIndex;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
131 uint16_t wLength;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
132 };
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
133 struct {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
134 uint32_t word1;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
135 uint32_t word2;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
136 };
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
137 } setup;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
138
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
139
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
140
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
141 // ----- Variables -----
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
142
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
143 __attribute__ ((section(".usbdescriptortable"), used))
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
144 static bdt_t table[ (NUM_ENDPOINTS + 1) * 4 ];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
145
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
146 static usb_packet_t *rx_first [ NUM_ENDPOINTS ];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
147 static usb_packet_t *rx_last [ NUM_ENDPOINTS ];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
148 static usb_packet_t *tx_first [ NUM_ENDPOINTS ];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
149 static usb_packet_t *tx_last [ NUM_ENDPOINTS ];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
150 uint16_t usb_rx_byte_count_data[ NUM_ENDPOINTS ];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
151
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
152 static uint8_t tx_state[NUM_ENDPOINTS];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
153
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
154 // SETUP always uses a DATA0 PID for the data field of the SETUP transaction.
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
155 // transactions in the data phase start with DATA1 and toggle (figure 8-12, USB1.1)
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
156 // Status stage uses a DATA1 PID.
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
157
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
158 static uint8_t ep0_rx0_buf[EP0_SIZE] __attribute__ ((aligned (4)));
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
159 static uint8_t ep0_rx1_buf[EP0_SIZE] __attribute__ ((aligned (4)));
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
160 static const uint8_t *ep0_tx_ptr = NULL;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
161 static uint16_t ep0_tx_len;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
162 static uint8_t ep0_tx_bdt_bank = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
163 static uint8_t ep0_tx_data_toggle = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
164 uint8_t usb_rx_memory_needed = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
165
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
166 volatile uint8_t usb_configuration = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
167 volatile uint8_t usb_reboot_timer = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
168
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
169 static uint8_t reply_buffer[8];
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
170
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
171 static uint8_t power_neg_delay;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
172 static uint32_t power_neg_time;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
173
439
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
174 static uint8_t usb_dev_sleep = 0;
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
175
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
176
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
177
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
178 // ----- Functions -----
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
179
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
180 static void endpoint0_stall()
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
181 {
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
182 #ifdef UART_DEBUG_UNKNOWN
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
183 print("STALL" NL );
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
184 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
185 USB0_ENDPT0 = USB_ENDPT_EPSTALL | USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
186 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
187
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
188 static void endpoint0_transmit( const void *data, uint32_t len )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
189 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
190 table[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
191 table[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
192 ep0_tx_data_toggle ^= 1;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
193 ep0_tx_bdt_bank ^= 1;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
194 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
195
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
196 // Used to check any USB state changes that may not have a proper interrupt
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
197 // Called once per scan loop, should take minimal processing time or it may affect other modules
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
198 void usb_device_check()
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
199 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
200 // Check to see if we're still waiting for the next USB request after Get Configuration Descriptor
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
201 // If still waiting, restart the USB initialization with a lower power requirement
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
202 if ( power_neg_delay )
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
203 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
204 // Check if 100 ms has elapsed
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
205 if ( systick_millis_count - power_neg_time > 100 )
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
206 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
207 // Update bMaxPower
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
208 // The value set is in increments of 2 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
209 // So 50 * 2 mA = 100 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
210 // XXX Currently only transitions to 100 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
211 // It may be possible to transition down again to 20 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
212 *usb_bMaxPower = 50;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
213
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
214 // Re-initialize USB
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
215 power_neg_delay = 0;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
216 usb_configuration = 0; // Clear USB configuration if we have one
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
217 USB0_CONTROL = 0; // Disable D+ Pullup to simulate disconnect
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
218 delay(10); // Delay is necessary to simulate disconnect
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
219 usb_init();
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
220 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
221 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
222 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
223
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
224 static void usb_setup()
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
225 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
226 const uint8_t *data = NULL;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
227 uint32_t datalen = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
228 const usb_descriptor_list_t *list;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
229 uint32_t size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
230 volatile uint8_t *reg;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
231 uint8_t epconf;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
232 const uint8_t *cfg;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
233 int i;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
234
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
235 // If another request is made, disable the power negotiation check
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
236 // See GET_DESCRIPTOR - Configuration
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
237 if ( power_neg_delay )
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
238 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
239 power_neg_delay = 0;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
240 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
241
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
242 switch ( setup.wRequestAndType )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
243 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
244 case 0x0500: // SET_ADDRESS
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
245 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
246
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
247 case 0x0900: // SET_CONFIGURATION
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
248 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
249 print("CONFIGURE - ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
250 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
251 usb_configuration = setup.wValue;
347
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
252 Output_Available = usb_configuration;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
253 reg = &USB0_ENDPT1;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
254 cfg = usb_endpoint_config_table;
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
255
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
256 // Now configured so we can utilize bMaxPower now
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
257 Output_update_usb_current( *usb_bMaxPower * 2 );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
258
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
259 // clear all BDT entries, free any allocated memory...
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
260 for ( i = 4; i < ( NUM_ENDPOINTS + 1) * 4; i++ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
261 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
262 if ( table[i].desc & BDT_OWN )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
263 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
264 usb_free( (usb_packet_t *)((uint8_t *)(table[ i ].addr) - 8) );
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
265 }
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
266 }
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
267 // free all queued packets
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
268 for ( i = 0; i < NUM_ENDPOINTS; i++ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
269 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
270 usb_packet_t *p, *n;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
271 p = rx_first[i];
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
272 while ( p )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
273 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
274 n = p->next;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
275 usb_free(p);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
276 p = n;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
277 }
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
278 rx_first[ i ] = NULL;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
279 rx_last[ i ] = NULL;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
280 p = tx_first[i];
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
281 while (p)
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
282 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
283 n = p->next;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
284 usb_free(p);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
285 p = n;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
286 }
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
287 tx_first[ i ] = NULL;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
288 tx_last[ i ] = NULL;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
289 usb_rx_byte_count_data[i] = 0;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
290
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
291 switch ( tx_state[ i ] )
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
292 {
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
293 case TX_STATE_EVEN_FREE:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
294 case TX_STATE_NONE_FREE_EVEN_FIRST:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
295 tx_state[ i ] = TX_STATE_BOTH_FREE_EVEN_FIRST;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
296 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
297 case TX_STATE_ODD_FREE:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
298 case TX_STATE_NONE_FREE_ODD_FIRST:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
299 tx_state[ i ] = TX_STATE_BOTH_FREE_ODD_FIRST;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
300 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
301 default:
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
302 break;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
303 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
304 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
305 usb_rx_memory_needed = 0;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
306 for ( i = 1; i <= NUM_ENDPOINTS; i++ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
307 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
308 epconf = *cfg++;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
309 *reg = epconf;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
310 reg += 4;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
311 if ( epconf & USB_ENDPT_EPRXEN )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
312 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
313 usb_packet_t *p;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
314 p = usb_malloc();
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
315 if ( p )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
316 {
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
317 table[ index( i, RX, EVEN ) ].addr = p->buf;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
318 table[ index( i, RX, EVEN ) ].desc = BDT_DESC( 64, 0 );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
319 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
320 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
321 {
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
322 table[ index( i, RX, EVEN ) ].desc = 0;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
323 usb_rx_memory_needed++;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
324 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
325 p = usb_malloc();
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
326 if ( p )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
327 {
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
328 table[ index( i, RX, ODD ) ].addr = p->buf;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
329 table[ index( i, RX, ODD ) ].desc = BDT_DESC( 64, 1 );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
330 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
331 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
332 {
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
333 table[ index( i, RX, ODD ) ].desc = 0;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
334 usb_rx_memory_needed++;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
335 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
336 }
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
337 table[ index( i, TX, EVEN ) ].desc = 0;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
338 table[ index( i, TX, ODD ) ].desc = 0;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
339 }
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
340 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
341
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
342 case 0x0880: // GET_CONFIGURATION
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
343 reply_buffer[0] = usb_configuration;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
344 datalen = 1;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
345 data = reply_buffer;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
346 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
347
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
348 case 0x0080: // GET_STATUS (device)
346
1beec5f17e64 Revert "Merge pull request #27 from smasher816/wakeup-devel"
Jacob Alexander <haata@kiibohd.com>
parents: 327
diff changeset
349 reply_buffer[0] = 0;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
350 reply_buffer[1] = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
351 datalen = 2;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
352 data = reply_buffer;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
353 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
354
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
355 case 0x0082: // GET_STATUS (endpoint)
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
356 if ( setup.wIndex > NUM_ENDPOINTS )
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
357 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
358 // TODO: do we need to handle IN vs OUT here?
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
359 endpoint0_stall();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
360 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
361 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
362 reply_buffer[0] = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
363 reply_buffer[1] = 0;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
364 if ( *(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4) & 0x02 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
365 reply_buffer[0] = 1;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
366 data = reply_buffer;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
367 datalen = 2;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
368 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
369
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
370 case 0x0100: // CLEAR_FEATURE (device)
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
371 switch ( setup.wValue )
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
372 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
373 // CLEAR_FEATURE(DEVICE_REMOTE_WAKEUP)
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
374 // See SET_FEATURE(DEVICE_REMOTE_WAKEUP) for details
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
375 case 0x1:
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
376 goto send;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
377 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
378
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
379 warn_msg("SET_FEATURE - Device wValue(");
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
380 printHex( setup.wValue );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
381 print( ")" NL );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
382 endpoint0_stall();
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
383 return;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
384
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
385 case 0x0101: // CLEAR_FEATURE (interface)
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
386 // TODO: Currently ignoring, perhaps useful? -HaaTa
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
387 warn_msg("CLEAR_FEATURE - Interface wValue(");
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
388 printHex( setup.wValue );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
389 print(") wIndex(");
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
390 printHex( setup.wIndex );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
391 print( ")" NL );
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
392 endpoint0_stall();
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
393 return;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
394
381
fbe55b27dc02 Cleaning up CLEAR_FEATURE (endpoint)
Jacob Alexander <haata@kiibohd.com>
parents: 376
diff changeset
395 case 0x0102: // CLEAR_FEATURE (endpoint)
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
396 i = setup.wIndex & 0x7F;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
397 if ( i > NUM_ENDPOINTS || setup.wValue != 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
398 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
399 endpoint0_stall();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
400 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
401 }
381
fbe55b27dc02 Cleaning up CLEAR_FEATURE (endpoint)
Jacob Alexander <haata@kiibohd.com>
parents: 376
diff changeset
402 (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4)) &= ~0x02;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
403 // TODO: do we need to clear the data toggle here?
381
fbe55b27dc02 Cleaning up CLEAR_FEATURE (endpoint)
Jacob Alexander <haata@kiibohd.com>
parents: 376
diff changeset
404 goto send;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
405
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
406 case 0x0300: // SET_FEATURE (device)
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
407 switch ( setup.wValue )
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
408 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
409 // SET_FEATURE(DEVICE_REMOTE_WAKEUP)
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
410 // XXX: Only used to confirm Remote Wake
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
411 // Used on Mac OSX and Windows not on Linux
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
412 // Good post on the behaviour:
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
413 // http://community.silabs.com/t5/8-bit-MCU/Remote-wakeup-HID/m-p/74957#M30802
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
414 case 0x1:
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
415 goto send;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
416 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
417
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
418 warn_msg("SET_FEATURE - Device wValue(");
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
419 printHex( setup.wValue );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
420 print( ")" NL );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
421 endpoint0_stall();
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
422 return;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
423
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
424 case 0x0301: // SET_FEATURE (interface)
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
425 // TODO: Currently ignoring, perhaps useful? -HaaTa
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
426 warn_msg("SET_FEATURE - Interface wValue(");
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
427 printHex( setup.wValue );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
428 print(") wIndex(");
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
429 printHex( setup.wIndex );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
430 print( ")" NL );
302
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
431 endpoint0_stall();
ac842066568a Adding additional case statements for SET_FEATURE and CLEAR_FEATURE
Jacob Alexander <haata@kiibohd.com>
parents: 301
diff changeset
432 return;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
433
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
434 case 0x0302: // SET_FEATURE (endpoint)
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
435 i = setup.wIndex & 0x7F;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
436 if ( i > NUM_ENDPOINTS || setup.wValue != 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
437 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
438 // TODO: do we need to handle IN vs OUT here?
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
439 endpoint0_stall();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
440 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
441 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
442 (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4)) |= 0x02;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
443 // TODO: do we need to clear the data toggle here?
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
444 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
445
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
446 case 0x0680: // GET_DESCRIPTOR
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
447 case 0x0681:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
448 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
449 print("desc:");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
450 printHex( setup.wValue );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
451 print( NL );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
452 #endif
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
453 for ( list = usb_descriptor_list; 1; list++ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
454 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
455 if ( list->addr == NULL )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
456 break;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
457 if ( setup.wValue == list->wValue && setup.wIndex == list->wIndex )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
458 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
459 data = list->addr;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
460 if ( (setup.wValue >> 8) == 3 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
461 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
462 // for string descriptors, use the descriptor's
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
463 // length field, allowing runtime configured
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
464 // length.
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
465 datalen = *(list->addr);
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
466 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
467 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
468 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
469 datalen = list->length;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
470 }
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
471
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
472 // XXX Power negotiation hack -HaaTa
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
473 // Some devices such as the Apple Ipad do not support bMaxPower greater than 100 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
474 // However, there is no provision in the basic USB 2.0 stack for power negotiation
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
475 // To get around this:
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
476 // * Attempt to set bMaxPower to 500 mA first
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
477 // * If more than 100 ms passes since retrieving a Get Configuration Descriptor
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
478 // (Descriptor with bMaxPower in it)
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
479 // * Change usb_bMaxPower to 50 (100 mA)
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
480 // * Restart the USB init process
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
481 // According to notes online, it says that some Apple devices can only do 20 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
482 // However, in my testing this hasn't been the case
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
483 // (you can also draw as much current as you want if you just lie in the descriptor :P)
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
484 // If this becomes an issue we can use this hack a second time to negotiate down to 20 mA
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
485 // (which should be fine for just the mcu)
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
486 if ( setup.wValue == 0x0200 && setup.wIndex == 0x0 )
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
487 {
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
488 power_neg_delay = 1;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
489 power_neg_time = systick_millis_count;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
490 }
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
491
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
492 #if UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
493 print("Desc found, ");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
494 printHex32( (uint32_t)data );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
495 print(",");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
496 printHex( datalen );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
497 print(",");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
498 printHex_op( data[0], 2 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
499 printHex_op( data[1], 2 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
500 printHex_op( data[2], 2 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
501 printHex_op( data[3], 2 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
502 printHex_op( data[4], 2 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
503 printHex_op( data[5], 2 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
504 print( NL );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
505 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
506 goto send;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
507 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
508 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
509 #ifdef UART_DEBUG
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
510 print( "desc: not found" NL );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
511 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
512 endpoint0_stall();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
513 return;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
514
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
515 case 0x2221: // CDC_SET_CONTROL_LINE_STATE
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
516 usb_cdc_line_rtsdtr = setup.wValue;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
517 //serial_print("set control line state\n");
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
518 goto send;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
519
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
520 case 0x21A1: // CDC_GET_LINE_CODING
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
521 data = (uint8_t*)usb_cdc_line_coding;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
522 datalen = sizeof( usb_cdc_line_coding );
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
523 goto send;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
524
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
525 case 0x2021: // CDC_SET_LINE_CODING
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
526 // XXX Needed?
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
527 //serial_print("set coding, waiting...\n");
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
528 return;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
529
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
530 case 0x0921: // HID SET_REPORT
383
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
531 // Interface
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
532 switch ( setup.wIndex & 0xFF )
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
533 {
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
534 // Keyboard Interface
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
535 case KEYBOARD_INTERFACE:
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
536 break;
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
537 // NKRO Keyboard Interface
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
538 case NKRO_KEYBOARD_INTERFACE:
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
539 break;
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
540 default:
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
541 warn_msg("Unknown interface - ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
542 printHex( setup.wIndex );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
543 print( NL );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
544 endpoint0_stall();
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
545 break;
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
546 }
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
547
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
548 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
549
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
550 case 0x01A1: // HID GET_REPORT
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
551 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
552 print("GET_REPORT - ");
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
553 printHex( setup.wIndex );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
554 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
555 #endif
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
556 // Search through descriptors returning necessary info
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
557 for ( list = usb_descriptor_list; 1; list++ )
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
558 {
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
559 if ( list->addr == NULL )
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
560 break;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
561 if ( list->wValue != 0x2200 )
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
562 continue;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
563 if ( setup.wIndex == list->wIndex )
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
564 {
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
565 data = list->addr;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
566 datalen = list->length;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
567 goto send;
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
568 }
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
569 }
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
570 endpoint0_stall();
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
571 return;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
572
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
573 case 0x0A21: // HID SET_IDLE
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
574 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
575 print("SET_IDLE - ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
576 printHex( setup.wValue );
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
577 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
578 #endif
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
579 USBKeys_Idle_Config = (setup.wValue >> 8);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
580 USBKeys_Idle_Count = 0;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
581 goto send;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
582
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
583 case 0x0B21: // HID SET_PROTOCOL
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
584 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
585 print("SET_PROTOCOL - ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
586 printHex( setup.wValue );
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
587 print(" - ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
588 printHex( setup.wValue & 0xFF );
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
589 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
590 #endif
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
591 USBKeys_Protocol = setup.wValue & 0xFF; // 0 - Boot Mode, 1 - NKRO Mode
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
592 goto send;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
593
438
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
594 case 0x03A1: /// HID GET_PROTOCOL
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
595 #ifdef UART_DEBUG
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
596 print("GET_PROTOCOL - ");
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
597 printHex( setup.wValue );
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
598 print(" - ");
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
599 printHex( USBKeys_Protocol );
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
600 print(NL);
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
601 #endif
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
602 reply_buffer[0] = USBKeys_Protocol;
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
603 datalen = 1;
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
604 goto send;
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
605
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
606 // case 0xC940:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
607 default:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
608 #ifdef UART_DEBUG_UNKNOWN
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
609 print("UNKNOWN");
438
f10c2dad7f55 Adding missing GET_PROTOCOL handling
Jacob Alexander <haata@kiibohd.com>
parents: 420
diff changeset
610 print(NL);
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
611 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
612 endpoint0_stall();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
613 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
614 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
615
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
616 send:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
617 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
618 print("setup send ");
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
619 printHex32( (uint32_t)data );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
620 print(",");
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
621 for ( uint8_t c = 0; c < datalen; c++ )
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
622 {
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
623 printHex( data[c] );
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
624 print(" ");
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
625 }
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
626 print(",");
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
627 printHex( datalen );
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
628 print( NL );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
629 #endif
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
630
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
631 if ( datalen > setup.wLength )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
632 datalen = setup.wLength;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
633
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
634 size = datalen;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
635 if ( size > EP0_SIZE )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
636 size = EP0_SIZE;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
637
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
638 endpoint0_transmit(data, size);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
639 data += size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
640 datalen -= size;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
641
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
642 // See if transmit has finished
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
643 if ( datalen == 0 && size < EP0_SIZE )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
644 return;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
645
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
646 size = datalen;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
647 if ( size > EP0_SIZE )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
648 size = EP0_SIZE;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
649 endpoint0_transmit(data, size);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
650 data += size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
651 datalen -= size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
652
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
653 // See if transmit has finished
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
654 if ( datalen == 0 && size < EP0_SIZE )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
655 return;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
656
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
657 // Save rest of transfer for later? XXX
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
658 ep0_tx_ptr = data;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
659 ep0_tx_len = datalen;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
660 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
661
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
662
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
663 //A bulk endpoint's toggle sequence is initialized to DATA0 when the endpoint
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
664 //experiences any configuration event (configuration events are explained in
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
665 //Sections 9.1.1.5 and 9.4.5).
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
666
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
667 //Configuring a device or changing an alternate setting causes all of the status
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
668 //and configuration values associated with endpoints in the affected interfaces
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
669 //to be set to their default values. This includes setting the data toggle of
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
670 //any endpoint using data toggles to the value DATA0.
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
671
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
672 //For endpoints using data toggle, regardless of whether an endpoint has the
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
673 //Halt feature set, a ClearFeature(ENDPOINT_HALT) request always results in the
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
674 //data toggle being reinitialized to DATA0.
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
675
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
676 static void usb_control( uint32_t stat )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
677 {
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
678 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
679 print("CONTROL - ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
680 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
681 bdt_t *b;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
682 uint32_t pid, size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
683 uint8_t *buf;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
684 const uint8_t *data;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
685
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
686 b = stat2bufferdescriptor( stat );
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
687 pid = BDT_PID( b->desc );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
688 buf = b->addr;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
689 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
690 print("pid:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
691 printHex(pid);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
692 print(", count:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
693 printHex32(b->desc);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
694 print(" - ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
695 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
696
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
697 switch (pid)
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
698 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
699 case 0x0D: // Setup received from host
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
700 //serial_print("PID=Setup\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
701 //if (count != 8) ; // panic?
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
702 // grab the 8 byte setup info
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
703 setup.word1 = *(uint32_t *)(buf);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
704 setup.word2 = *(uint32_t *)(buf + 4);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
705
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
706 // give the buffer back
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
707 b->desc = BDT_DESC( EP0_SIZE, DATA1 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
708 //table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 1);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
709 //table[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 1);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
710
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
711 // clear any leftover pending IN transactions
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
712 ep0_tx_ptr = NULL;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
713 if ( ep0_tx_data_toggle )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
714 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
715 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
716 //if (table[index(0, TX, EVEN)].desc & 0x80) {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
717 //serial_print("leftover tx even\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
718 //}
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
719 //if (table[index(0, TX, ODD)].desc & 0x80) {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
720 //serial_print("leftover tx odd\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
721 //}
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
722 table[index(0, TX, EVEN)].desc = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
723 table[index(0, TX, ODD)].desc = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
724 // first IN after Setup is always DATA1
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
725 ep0_tx_data_toggle = 1;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
726
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
727 #ifdef UART_DEBUG_UNKNOWN
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
728 print("bmRequestType:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
729 printHex(setup.bmRequestType);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
730 print(", bRequest:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
731 printHex(setup.bRequest);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
732 print(", wValue:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
733 printHex(setup.wValue);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
734 print(", wIndex:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
735 printHex(setup.wIndex);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
736 print(", len:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
737 printHex(setup.wLength);
383
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
738 print(" -- ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
739 printHex32(setup.word1);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
740 print(" ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
741 printHex32(setup.word2);
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
742 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
743 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
744 // actually "do" the setup request
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
745 usb_setup();
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
746 // unfreeze the USB, now that we're ready
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
747 USB0_CTL = USB_CTL_USBENSOFEN; // clear TXSUSPENDTOKENBUSY bit
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
748 break;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
749
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
750 case 0x01: // OUT transaction received from host
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
751 case 0x02:
383
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
752 #ifdef UART_DEBUG_UNKNOWN
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
753 print("PID=OUT wRequestAndType:");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
754 printHex(setup.wRequestAndType);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
755 print(", wValue:");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
756 printHex(setup.wValue);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
757 print(", wIndex:");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
758 printHex(setup.wIndex);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
759 print(", len:");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
760 printHex(setup.wLength);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
761 print(" -- ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
762 printHex32(setup.word1);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
763 print(" ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
764 printHex32(setup.word2);
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
765 print(NL);
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
766 #endif
383
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
767
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
768 // CDC Interface
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
769 if ( setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
770 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
771 int i;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
772 uint8_t *dst = (uint8_t *)usb_cdc_line_coding;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
773 //serial_print("set line coding ");
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
774 for ( i = 0; i < 7; i++ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
775 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
776 //serial_phex(*buf);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
777 *dst++ = *buf++;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
778 }
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
779 //serial_phex32(usb_cdc_line_coding[0]);
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
780 //serial_print("\n");
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
781 if ( usb_cdc_line_coding[0] == 134 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
782 usb_reboot_timer = 15;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
783 endpoint0_transmit( NULL, 0 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
784 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
785
383
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
786 // Keyboard SET_REPORT
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
787 if ( setup.wRequestAndType == 0x921 && setup.wValue & 0x200 )
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
788 {
383
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
789 // Interface
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
790 switch ( setup.wIndex & 0xFF )
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
791 {
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
792 // Keyboard Interface
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
793 case KEYBOARD_INTERFACE:
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
794 USBKeys_LEDs = buf[0];
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
795 endpoint0_transmit( NULL, 0 );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
796 break;
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
797 // NKRO Keyboard Interface
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
798 case NKRO_KEYBOARD_INTERFACE:
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
799 // Only use 2nd byte, first byte is the report id
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
800 USBKeys_LEDs = buf[1];
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
801 endpoint0_transmit( NULL, 0 );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
802 break;
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
803 default:
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
804 warn_msg("Unknown interface - ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
805 printHex( setup.wIndex );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
806 print( NL );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
807 break;
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
808 }
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
809
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
810 #ifdef UART_DEBUG
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
811 for ( size_t len = 0; len < setup.wLength; len++ )
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
812 {
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
813 printHex( buf[ len ] );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
814 print(" ");
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
815 }
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
816 print( NL );
801e7628d977 Fixing long-standing SET_REPORT bug
Jacob Alexander <haata@kiibohd.com>
parents: 381
diff changeset
817 #endif
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
818 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
819
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
820 // give the buffer back
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
821 b->desc = BDT_DESC( EP0_SIZE, DATA1 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
822 break;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
823
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
824 case 0x09: // IN transaction completed to host
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
825 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
826 print("PID=IN:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
827 printHex(stat);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
828 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
829 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
830
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
831 // send remaining data, if any...
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
832 data = ep0_tx_ptr;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
833 if ( data )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
834 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
835 size = ep0_tx_len;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
836 if (size > EP0_SIZE) size = EP0_SIZE;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
837 endpoint0_transmit(data, size);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
838 data += size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
839 ep0_tx_len -= size;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
840 ep0_tx_ptr = (ep0_tx_len > 0 || size == EP0_SIZE) ? data : NULL;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
841 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
842
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
843 if ( setup.bRequest == 5 && setup.bmRequestType == 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
844 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
845 setup.bRequest = 0;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
846 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
847 print("set address: ");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
848 printHex(setup.wValue);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
849 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
850 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
851 USB0_ADDR = setup.wValue;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
852 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
853
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
854 break;
368
06a54d582bf8 FIxing Media Keys and general USB compatibilty
Jacob Alexander <haata@kiibohd.com>
parents: 347
diff changeset
855
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
856 default:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
857 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
858 print("PID=unknown:");
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
859 printHex(pid);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
860 print(NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
861 #endif
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
862 break;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
863 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
864 USB0_CTL = USB_CTL_USBENSOFEN; // clear TXSUSPENDTOKENBUSY bit
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
865 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
866
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
867 usb_packet_t *usb_rx( uint32_t endpoint )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
868 {
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
869 //print("USB RX");
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
870 usb_packet_t *ret;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
871 endpoint--;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
872 if ( endpoint >= NUM_ENDPOINTS )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
873 return NULL;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
874 __disable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
875 ret = rx_first[endpoint];
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
876 if ( ret )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
877 rx_first[ endpoint ] = ret->next;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
878 usb_rx_byte_count_data[ endpoint ] -= ret->len;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
879 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
880 //serial_print("rx, epidx=");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
881 //serial_phex(endpoint);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
882 //serial_print(", packet=");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
883 //serial_phex32(ret);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
884 //serial_print("\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
885 return ret;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
886 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
887
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
888 static uint32_t usb_queue_byte_count( const usb_packet_t *p )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
889 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
890 uint32_t count=0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
891
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
892 __disable_irq();
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
893 for ( ; p; p = p->next )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
894 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
895 count += p->len;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
896 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
897 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
898 return count;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
899 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
900
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
901 uint32_t usb_tx_byte_count( uint32_t endpoint )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
902 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
903 endpoint--;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
904 if ( endpoint >= NUM_ENDPOINTS )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
905 return 0;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
906 return usb_queue_byte_count( tx_first[ endpoint ] );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
907 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
908
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
909 uint32_t usb_tx_packet_count( uint32_t endpoint )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
910 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
911 const usb_packet_t *p;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
912 uint32_t count=0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
913
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
914 endpoint--;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
915 if ( endpoint >= NUM_ENDPOINTS )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
916 return 0;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
917 __disable_irq();
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
918 for ( p = tx_first[ endpoint ]; p; p = p->next )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
919 count++;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
920 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
921 return count;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
922 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
923
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
924
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
925 // Called from usb_free, but only when usb_rx_memory_needed > 0, indicating
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
926 // receive endpoints are starving for memory. The intention is to give
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
927 // endpoints needing receive memory priority over the user's code, which is
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
928 // likely calling usb_malloc to obtain memory for transmitting. When the
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
929 // user is creating data very quickly, their consumption could starve reception
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
930 // without this prioritization. The packet buffer (input) is assigned to the
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
931 // first endpoint needing memory.
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
932 //
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
933 void usb_rx_memory( usb_packet_t *packet )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
934 {
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
935 //print("USB RX MEMORY");
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
936 unsigned int i;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
937 const uint8_t *cfg;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
938
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
939 cfg = usb_endpoint_config_table;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
940 //serial_print("rx_mem:");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
941 __disable_irq();
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
942 for ( i = 1; i <= NUM_ENDPOINTS; i++ )
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
943 {
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
944 if ( *cfg++ & USB_ENDPT_EPRXEN )
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
945 {
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
946 if ( table[ index( i, RX, EVEN ) ].desc == 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
947 {
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
948 table[ index( i, RX, EVEN ) ].addr = packet->buf;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
949 table[ index( i, RX, EVEN ) ].desc = BDT_DESC( 64, 0 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
950 usb_rx_memory_needed--;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
951 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
952 //serial_phex(i);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
953 //serial_print(",even\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
954 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
955 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
956 if ( table[ index( i, RX, ODD ) ].desc == 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
957 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
958 table[ index( i, RX, ODD ) ].addr = packet->buf;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
959 table[ index( i, RX, ODD ) ].desc = BDT_DESC( 64, 1 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
960 usb_rx_memory_needed--;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
961 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
962 //serial_phex(i);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
963 //serial_print(",odd\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
964 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
965 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
966 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
967 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
968 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
969 // we should never reach this point. If we get here, it means
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
970 // usb_rx_memory_needed was set greater than zero, but no memory
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
971 // was actually needed.
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
972 usb_rx_memory_needed = 0;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
973 usb_free( packet );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
974 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
975 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
976
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
977 //#define index(endpoint, tx, odd) (((endpoint) << 2) | ((tx) << 1) | (odd))
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
978 //#define stat2bufferdescriptor(stat) (table + ((stat) >> 2))
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
979
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
980 void usb_tx( uint32_t endpoint, usb_packet_t *packet )
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
981 {
439
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
982 // If we have been sleeping, try to wake up host
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
983 if ( usb_dev_sleep )
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
984 {
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
985 // Force wake-up for 10 ms
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
986 // According to the USB Spec a device must hold resume for at least 1 ms but no more than 15 ms
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
987 USB0_CTL |= USB_CTL_RESUME;
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
988 delay(10);
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
989 USB0_CTL &= ~(USB_CTL_RESUME);
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
990 }
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
991
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
992 // Since we are transmitting data, USB will be brought out of sleep/suspend
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
993 // if it's in that state
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
994 // Use the currently set descriptor value
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
995 Output_update_usb_current( *usb_bMaxPower * 2 );
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
996
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
997 bdt_t *b = &table[ index( endpoint, TX, EVEN ) ];
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
998 uint8_t next;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
999
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1000 endpoint--;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1001 if ( endpoint >= NUM_ENDPOINTS )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1002 return;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1003 __disable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1004 //serial_print("txstate=");
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1005 //serial_phex(tx_state[ endpoint ]);
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1006 //serial_print("\n");
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1007 switch ( tx_state[ endpoint ] )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1008 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1009 case TX_STATE_BOTH_FREE_EVEN_FIRST:
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1010 next = TX_STATE_ODD_FREE;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1011 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1012 case TX_STATE_BOTH_FREE_ODD_FIRST:
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1013 b++;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1014 next = TX_STATE_EVEN_FREE;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1015 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1016 case TX_STATE_EVEN_FREE:
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1017 next = TX_STATE_NONE_FREE_ODD_FIRST;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1018 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1019 case TX_STATE_ODD_FREE:
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1020 b++;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1021 next = TX_STATE_NONE_FREE_EVEN_FIRST;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1022 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1023 default:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1024 if (tx_first[ endpoint ] == NULL)
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1025 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1026 tx_first[ endpoint ] = packet;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1027 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1028 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1029 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1030 tx_last[ endpoint ]->next = packet;
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1031 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1032 tx_last[ endpoint ] = packet;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1033 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1034 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1035 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1036
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1037 tx_state[ endpoint ] = next;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1038 b->addr = packet->buf;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1039 b->desc = BDT_DESC( packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1040 __enable_irq();
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1041 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1042
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1043
109
2c1a9e6ae70e Added more CLI commands.
Jacob Alexander <haata@kiibohd.com>
parents: 104
diff changeset
1044 void usb_device_reload()
2c1a9e6ae70e Added more CLI commands.
Jacob Alexander <haata@kiibohd.com>
parents: 104
diff changeset
1045 {
177
3420e018ffbc Adding McHCK flash reload function and some cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 175
diff changeset
1046 // MCHCK
347
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
1047 // Kiibohd mk20dx256vlh7
385
d8f61e15aca1 Adding jump to bootloader key
Jacob Alexander <haata@kiibohd.com>
parents: 383
diff changeset
1048 #if defined(_mk20dx128vlf5_) || defined(_mk20dx256vlh7_)
347
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
1049 // Copies variable into the VBAT register, must be identical to the variable in the bootloader to jump to the bootloader flash mode
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
1050 for ( int pos = 0; pos < sizeof(sys_reset_to_loader_magic); pos++ )
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
1051 (&VBAT)[ pos ] = sys_reset_to_loader_magic[ pos ];
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
1052 SOFTWARE_RESET();
136e47478441 UARTConnect enumeration working!
Jacob Alexander <haata@kiibohd.com>
parents: 346
diff changeset
1053
177
3420e018ffbc Adding McHCK flash reload function and some cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 175
diff changeset
1054 // Teensy 3.0 and 3.1
3420e018ffbc Adding McHCK flash reload function and some cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 175
diff changeset
1055 #else
109
2c1a9e6ae70e Added more CLI commands.
Jacob Alexander <haata@kiibohd.com>
parents: 104
diff changeset
1056 asm volatile("bkpt");
177
3420e018ffbc Adding McHCK flash reload function and some cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 175
diff changeset
1057 #endif
109
2c1a9e6ae70e Added more CLI commands.
Jacob Alexander <haata@kiibohd.com>
parents: 104
diff changeset
1058 }
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1059
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1060
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1061 void usb_isr()
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1062 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1063 uint8_t status, stat, t;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1064
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1065 //serial_print("isr");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1066 //status = USB0_ISTAT;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1067 //serial_phex(status);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1068 //serial_print("\n");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1069 restart:
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1070 status = USB0_ISTAT;
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1071 /*
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1072 print("USB ISR STATUS: ");
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1073 printHex( status );
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1074 print( NL );
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1075 */
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1076
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1077 if ( (status & USB_INTEN_SOFTOKEN /* 04 */ ) )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1078 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1079 if ( usb_configuration )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1080 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1081 t = usb_reboot_timer;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1082 if ( t )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1083 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1084 usb_reboot_timer = --t;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1085 if ( !t )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1086 usb_device_reload();
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1087 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1088
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1089 // CDC Interface
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1090 t = usb_cdc_transmit_flush_timer;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1091 if ( t )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1092 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1093 usb_cdc_transmit_flush_timer = --t;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1094 if ( t == 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1095 usb_serial_flush_callback();
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1096 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1097
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1098 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1099 USB0_ISTAT = USB_INTEN_SOFTOKEN;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1100 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1101
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1102 if ( (status & USB_ISTAT_TOKDNE /* 08 */ ) )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1103 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1104 uint8_t endpoint;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1105 stat = USB0_STAT;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1106 //serial_print("token: ep=");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1107 //serial_phex(stat >> 4);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1108 //serial_print(stat & 0x08 ? ",tx" : ",rx");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1109 //serial_print(stat & 0x04 ? ",odd\n" : ",even\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1110 endpoint = stat >> 4;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1111 if ( endpoint == 0 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1112 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1113 usb_control( stat );
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1114 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1115 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1116 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1117 bdt_t *b = stat2bufferdescriptor(stat);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1118 usb_packet_t *packet = (usb_packet_t *)((uint8_t *)(b->addr) - 8);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1119 #if 0
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1120 serial_print("ep:");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1121 serial_phex(endpoint);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1122 serial_print(", pid:");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1123 serial_phex(BDT_PID(b->desc));
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1124 serial_print(((uint32_t)b & 8) ? ", odd" : ", even");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1125 serial_print(", count:");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1126 serial_phex(b->desc >> 16);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1127 serial_print("\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1128 #endif
326
05a09eda53fb Inital Remote Wakeup Support
Rowan Decker <Smasher816@gmail.com>
parents: 302
diff changeset
1129 endpoint--; // endpoint is index to zero-based arrays
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1130
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1131 if ( stat & 0x08 )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1132 { // transmit
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1133 usb_free( packet );
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1134 packet = tx_first[ endpoint ];
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1135 if ( packet )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1136 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1137 //serial_print("tx packet\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1138 tx_first[endpoint] = packet->next;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1139 b->addr = packet->buf;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1140 switch ( tx_state[ endpoint ] )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1141 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1142 case TX_STATE_BOTH_FREE_EVEN_FIRST:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1143 tx_state[ endpoint ] = TX_STATE_ODD_FREE;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1144 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1145 case TX_STATE_BOTH_FREE_ODD_FIRST:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1146 tx_state[ endpoint ] = TX_STATE_EVEN_FREE;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1147 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1148 case TX_STATE_EVEN_FREE:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1149 tx_state[ endpoint ] = TX_STATE_NONE_FREE_ODD_FIRST;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1150 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1151 case TX_STATE_ODD_FREE:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1152 tx_state[ endpoint ] = TX_STATE_NONE_FREE_EVEN_FIRST;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1153 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1154 default:
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1155 break;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1156 }
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1157 b->desc = BDT_DESC( packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1158 } else {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1159 //serial_print("tx no packet\n");
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1160 switch ( tx_state[ endpoint ] )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1161 {
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1162 case TX_STATE_BOTH_FREE_EVEN_FIRST:
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1163 case TX_STATE_BOTH_FREE_ODD_FIRST:
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1164 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1165 case TX_STATE_EVEN_FREE:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1166 tx_state[ endpoint ] = TX_STATE_BOTH_FREE_EVEN_FIRST;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1167 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1168 case TX_STATE_ODD_FREE:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1169 tx_state[ endpoint ] = TX_STATE_BOTH_FREE_ODD_FIRST;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1170 break;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1171 default:
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1172 tx_state[ endpoint ] = ((uint32_t)b & 8)
376
47f89f1bfdb7 Prep for mouse support
Jacob Alexander <haata@kiibohd.com>
parents: 370
diff changeset
1173 ? TX_STATE_ODD_FREE
47f89f1bfdb7 Prep for mouse support
Jacob Alexander <haata@kiibohd.com>
parents: 370
diff changeset
1174 : TX_STATE_EVEN_FREE;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1175 break;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1176 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1177 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1178 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1179 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1180 { // receive
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1181 packet->len = b->desc >> 16;
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1182 if ( packet->len > 0 )
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1183 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1184 packet->index = 0;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1185 packet->next = NULL;
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1186 if ( rx_first[ endpoint ] == NULL )
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1187 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1188 //serial_print("rx 1st, epidx=");
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1189 //serial_phex(endpoint);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1190 //serial_print(", packet=");
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1191 //serial_phex32((uint32_t)packet);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1192 //serial_print("\n");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1193 rx_first[ endpoint ] = packet;
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1194 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1195 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1196 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1197 //serial_print("rx Nth, epidx=");
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1198 //serial_phex(endpoint);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1199 //serial_print(", packet=");
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1200 //serial_phex32((uint32_t)packet);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1201 //serial_print("\n");
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1202 rx_last[ endpoint ]->next = packet;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1203 }
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1204 rx_last[ endpoint ] = packet;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1205 usb_rx_byte_count_data[ endpoint ] += packet->len;
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1206 // TODO: implement a per-endpoint maximum # of allocated packets
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1207 // so a flood of incoming data on 1 endpoint doesn't starve
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1208 // the others if the user isn't reading it regularly
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1209 packet = usb_malloc();
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1210 if ( packet )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1211 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1212 b->addr = packet->buf;
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1213 b->desc = BDT_DESC( 64, ((uint32_t)b & 8) ? DATA1 : DATA0 );
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1214 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1215 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1216 {
117
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1217 //serial_print("starving ");
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1218 //serial_phex(endpoint + 1);
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1219 //serial_print(((uint32_t)b & 8) ? ",odd\n" : ",even\n");
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1220 b->desc = 0;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1221 usb_rx_memory_needed++;
5ffefdf89b37 Adding in USB module updates from Teensyduino 1.18rc2.
Jacob Alexander <haata@kiibohd.com>
parents: 109
diff changeset
1222 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1223 }
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1224 else
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1225 {
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1226 b->desc = BDT_DESC( 64, ((uint32_t)b & 8) ? DATA1 : DATA0 );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1227 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1228 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1229
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1230
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1231
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1232
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1233 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1234 USB0_ISTAT = USB_ISTAT_TOKDNE;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1235 goto restart;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1236 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1237
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1238
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1239 if ( status & USB_ISTAT_USBRST /* 01 */ )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1240 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1241 //serial_print("reset\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1242
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1243 // initialize BDT toggle bits
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1244 USB0_CTL = USB_CTL_ODDRST;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1245 ep0_tx_bdt_bank = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1246
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1247 // set up buffers to receive Setup and OUT packets
250
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1248 table[index( 0, RX, EVEN ) ].desc = BDT_DESC( EP0_SIZE, 0 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1249 table[index( 0, RX, EVEN ) ].addr = ep0_rx0_buf;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1250 table[index( 0, RX, ODD ) ].desc = BDT_DESC( EP0_SIZE, 0 );
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1251 table[index( 0, RX, ODD ) ].addr = ep0_rx1_buf;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1252 table[index( 0, TX, EVEN ) ].desc = 0;
afe96322d0c5 Code formatting cleanup.
Jacob Alexander <haata@kiibohd.com>
parents: 231
diff changeset
1253 table[index( 0, TX, ODD ) ].desc = 0;
170
85d74e5e1a95 More work on mk20dx128vlf5 port.
Jacob Alexander <haata@kiibohd.com>
parents: 118
diff changeset
1254
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1255 // activate endpoint 0
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1256 USB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1257
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1258 // clear all ending interrupts
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1259 USB0_ERRSTAT = 0xFF;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1260 USB0_ISTAT = 0xFF;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1261
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1262 // set the address to zero during enumeration
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1263 USB0_ADDR = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1264
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1265 // enable other interrupts
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1266 USB0_ERREN = 0xFF;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1267 USB0_INTEN = USB_INTEN_TOKDNEEN |
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1268 USB_INTEN_SOFTOKEN |
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1269 USB_INTEN_STALLEN |
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1270 USB_INTEN_ERROREN |
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1271 USB_INTEN_USBRSTEN |
439
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1272 USB_INTEN_RESUMEEN |
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1273 USB_INTEN_SLEEPEN;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1274
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1275 // is this necessary?
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1276 USB0_CTL = USB_CTL_USBENSOFEN;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1277 return;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1278 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1279
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1280
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1281 if ( (status & USB_ISTAT_STALL /* 80 */ ) )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1282 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1283 //serial_print("stall:\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1284 USB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1285 USB0_ISTAT = USB_ISTAT_STALL;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1286 }
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1287 if ( (status & USB_ISTAT_ERROR /* 02 */ ) )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1288 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1289 uint8_t err = USB0_ERRSTAT;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1290 USB0_ERRSTAT = err;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1291 //serial_print("err:");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1292 //serial_phex(err);
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1293 //serial_print("\n");
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1294 USB0_ISTAT = USB_ISTAT_ERROR;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1295 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1296
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
1297 // USB Host signalling device to enter 'sleep' state
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
1298 // The USB Module triggers this interrupt when it detects the bus has been idle for 3 ms
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1299 if ( (status & USB_ISTAT_SLEEP /* 10 */ ) )
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1300 {
439
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1301 //info_print("Host has requested USB sleep/suspend state");
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
1302 Output_update_usb_current( 100 ); // Set to 100 mA
439
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1303 usb_dev_sleep = 1;
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1304 USB0_ISTAT |= USB_ISTAT_SLEEP;
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1305 }
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1306
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1307 // On USB Resume, unset the usb_dev_sleep so we don't keep sending resume signals
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1308 if ( (status & USB_ISTAT_RESUME /* 20 */ ) )
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1309 {
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1310 //info_print("Host has woken-up/resumed from sleep/suspend state");
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1311 Output_update_usb_current( *usb_bMaxPower * 2 );
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1312 usb_dev_sleep = 0;
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1313 USB0_ISTAT |= USB_ISTAT_RESUME;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1314 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1315 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1316
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1317
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1318
275
d5bf41d7f7ef Initial code for USB cable detection
Jacob Alexander <haata@kiibohd.com>
parents: 251
diff changeset
1319 uint8_t usb_init()
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1320 {
231
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1321 #ifdef UART_DEBUG
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1322 print("USB INIT"NL);
4afb170978e9 More preparation for NKRO USB for arm
Jacob Alexander <haata@kiibohd.com>
parents: 192
diff changeset
1323 #endif
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1324
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1325 // Clear out endpoints table
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1326 for ( int i = 0; i <= NUM_ENDPOINTS * 4; i++ )
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1327 {
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1328 table[i].desc = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1329 table[i].addr = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1330 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1331
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1332 // this basically follows the flowchart in the Kinetis
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1333 // Quick Reference User Guide, Rev. 1, 03/2012, page 141
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1334
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1335 // assume 48 MHz clock already running
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1336 // SIM - enable clock
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1337 SIM_SCGC4 |= SIM_SCGC4_USBOTG;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1338
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1339 // reset USB module
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1340 USB0_USBTRC0 = USB_USBTRC_USBRESET;
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1341 while ( (USB0_USBTRC0 & USB_USBTRC_USBRESET) != 0 ); // wait for reset to end
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1342
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1343 // set desc table base addr
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1344 USB0_BDTPAGE1 = ((uint32_t)table) >> 8;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1345 USB0_BDTPAGE2 = ((uint32_t)table) >> 16;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1346 USB0_BDTPAGE3 = ((uint32_t)table) >> 24;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1347
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1348 // clear all ISR flags
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1349 USB0_ISTAT = 0xFF;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1350 USB0_ERRSTAT = 0xFF;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1351 USB0_OTGISTAT = 0xFF;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1352
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1353 USB0_USBTRC0 |= 0x40; // undocumented bit
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1354
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1355 // enable USB
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1356 USB0_CTL = USB_CTL_USBENSOFEN;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1357 USB0_USBCTRL = 0;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1358
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1359 // enable reset interrupt
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1360 USB0_INTEN = USB_INTEN_USBRSTEN;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1361
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1362 // enable interrupt in NVIC...
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1363 NVIC_SET_PRIORITY( IRQ_USBOTG, 112 );
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1364 NVIC_ENABLE_IRQ( IRQ_USBOTG );
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1365
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1366 // enable d+ pullup
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1367 USB0_CONTROL = USB_CONTROL_DPPULLUPNONOTG;
275
d5bf41d7f7ef Initial code for USB cable detection
Jacob Alexander <haata@kiibohd.com>
parents: 251
diff changeset
1368
420
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
1369 // Do not check for power negotiation delay until Get Configuration Descriptor
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
1370 power_neg_delay = 0;
23a1868b4ac2 Adding dynamic USB power support
Jacob Alexander <haata@kiibohd.com>
parents: 385
diff changeset
1371
439
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1372 // During initialization host isn't sleeping
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1373 usb_dev_sleep = 0;
68e19d7c953e Adding proper remote wake-up support
Jacob Alexander <haata@kiibohd.com>
parents: 438
diff changeset
1374
275
d5bf41d7f7ef Initial code for USB cable detection
Jacob Alexander <haata@kiibohd.com>
parents: 251
diff changeset
1375 return 1;
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1376 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1377
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1378 // return 0 if the USB is not configured, or the configuration
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1379 // number selected by the HOST
175
c70f641581b5 McHCK USB WORKS!!
Jacob Alexander <haata@kiibohd.com>
parents: 171
diff changeset
1380 uint8_t usb_configured()
104
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1381 {
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1382 return usb_configuration;
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1383 }
e84738d174bc Moving USB to Output in preparation for additional Output types.
Jacob Alexander <haata@kiibohd.com>
parents:
diff changeset
1384