1 | $regfile = "m32def.dat"
|
2 | $baud = 9600
|
3 | $noramclear
|
4 | $crystal = 12000000
|
5 |
|
6 | 'Enable debugging output
|
7 | '0 = disable
|
8 | '1 = debugging messages
|
9 | '2 = dbg frame/stack output
|
10 | 'Const Usbdebug = 0
|
11 |
|
12 | $hwstack = 40
|
13 | $swstack = 40
|
14 | $framesize = 50
|
15 |
|
16 | Config Portb = Output
|
17 | Config Portd.6 = Input
|
18 | Config Portd.5 = Input
|
19 | Config Portd.4 = Input
|
20 | Config Portd.3 = Input
|
21 | Portd.6 = 1
|
22 | Portd.5 = 1
|
23 | Portd.4 = 1
|
24 | Portd.3 = 1
|
25 |
|
26 |
|
27 | $lib "swusb.lbx"
|
28 | $external _swusb
|
29 |
|
30 | Declare Sub Usb_reset()
|
31 | Declare Sub Usb_processsetup(txstate As Byte)
|
32 | Declare Sub Usb_send(txstate As Byte , Byval Count As Byte)
|
33 | Declare Sub Usb_senddescriptor(txstate As Byte , Maxlen As Byte)
|
34 |
|
35 | '*******************************************************************************
|
36 | '*************************** Begin USB Configuration ***************************
|
37 | '
|
38 | 'Set the following parameters to match your hardware configuration and USB
|
39 | 'device parameters.
|
40 |
|
41 | '******************************* USB Connections *******************************
|
42 |
|
43 | 'Define the AVR port that the two USB pins are connected to
|
44 | _usb_port Alias Portd
|
45 | _usb_pin Alias Pind
|
46 | _usb_ddr Alias Ddrd
|
47 |
|
48 | 'Define the D+ and D- pins. (put D+ on an interrupt pin)
|
49 | Const _usb_dplus = 2 '4
|
50 | Const _usb_dminus = 7 '5
|
51 |
|
52 | 'Configure the pins as inputs
|
53 | Config Pind.2 = Input
|
54 | Config Pind.7 = Input
|
55 |
|
56 | 'disable pullups
|
57 | _usb_port._usb_dplus = 0
|
58 | _usb_port._usb_dminus = 0
|
59 |
|
60 | '*******************************************************************************
|
61 | '************************* USB Configuration Constants *************************
|
62 |
|
63 | 'Use EEPROM or FLASH to store USB descriptors
|
64 | '1 = EEPROM, 0 = FLASH. Storing to EEPROM will reduce code size slightly.
|
65 | Const _usb_use_eeprom = 0
|
66 |
|
67 | 'Don't wait for sent packets to be ACK'd by the host before marking the
|
68 | 'transmission as complete. This option breaks the USB spec but improves
|
69 | 'throughput with faster polling speeds.
|
70 | 'This may cause reliability issues. Should leave set to 0 to be safe.
|
71 | Const _usb_assume_ack = 0
|
72 |
|
73 | ' *************************** Device Descriptor *****************************
|
74 |
|
75 | 'USB Vendor ID and Product ID (Assigned by USB-IF)
|
76 | Const _usb_vid = &HAAAA
|
77 | Const _usb_pid = &HEF22
|
78 |
|
79 | 'USB Device Release Number (BCD)
|
80 | Const _usb_devrel = &H0001
|
81 |
|
82 | 'USB Release Spec (BCD)
|
83 | Const _usb_spec = &H0110
|
84 |
|
85 | 'USB Device Class, subclass, and protocol (assigned by USB-IF).
|
86 | '&h00 = Class defined by interface. (HID is defined in the interface)
|
87 | '&hFF = Vendor-defined class (You must write your own PC driver)
|
88 | 'See http://www.usb.org/developers/defined_class for more information
|
89 | Const _usb_devclass = 0
|
90 | Const _usb_devsubclass = 0
|
91 | Const _usb_devprot = 0
|
92 |
|
93 | 'These are _indexes_ to UNICODE string descriptors for the manufacturer,
|
94 | 'product name, and serial number. 0 means there is no descriptor.
|
95 | Const _usb_imanufacturer = 1
|
96 | Const _usb_iproduct = 2
|
97 | Const _usb_iserial = 0
|
98 |
|
99 | 'Number of configurations for this device. Don't change this unless
|
100 | 'you know what you are doing. Ordinarily it should just be 1.
|
101 | Const _usb_numconfigs = 1
|
102 |
|
103 | ' *************************** Config Descriptor *****************************
|
104 |
|
105 | 'The number of interfaces for this device (Typically 1)
|
106 | Const _usb_numifaces = 1
|
107 |
|
108 | 'Configuration Number (do not edit)
|
109 | Const _usb_confignum = 1
|
110 |
|
111 | 'Index of UNICODE string descriptor that describes this config (0 = None)
|
112 | Const _usb_iconfig = 2
|
113 |
|
114 | '&H80 = device powered from USB bus.
|
115 | '&HC0 = self-powered (has a power supply)
|
116 | Const _usb_powered = &H80 '&HC0
|
117 |
|
118 | 'Required current in 2mA increments (500mA max)
|
119 | Const _usb_maxpower = 150 '150 * 2mA = 300mA
|
120 |
|
121 | ' ************************** Interface Descriptor ***************************
|
122 |
|
123 | 'Number of interfaces for this device (1 or 2)
|
124 | Const _usb_ifaces = 1
|
125 |
|
126 | 'Interface number
|
127 | Const _usb_ifaceaddr = 0
|
128 |
|
129 | 'Alternate index
|
130 | Const _usb_alternate = 0
|
131 |
|
132 | 'Number of endpoints for this interface (excluding endp 0)
|
133 | Const _usb_ifaceendpoints = 2
|
134 |
|
135 | 'USB Interface Class, subclass, and protocol (assigned by USB-IF).
|
136 | '&h00 = RESERVED
|
137 | '&hFF = Vendor-defined class (You must write your own PC driver)
|
138 | ' Other values are USB interface device class. (such as HID)
|
139 | 'See http://www.usb.org/developers/defined_class for more information
|
140 | Const _usb_ifclass = 3
|
141 | Const _usb_ifsubclass = 0
|
142 | Const _usb_ifprotocol = 0
|
143 |
|
144 | 'Index to UNICODE string descriptor for this interface (0 = None)
|
145 | Const _usb_iiface = 0
|
146 |
|
147 | ' ************************* Optional HID Descriptor *************************
|
148 | 'HID class devices are things like keyboard, mouse, joystick.
|
149 | 'See http://www.usb.org/developers/hidpage/ for the specification,
|
150 | 'tools, and resources.
|
151 |
|
152 | 'Note that for a HID device, the device class, subclass, and protocol
|
153 | 'must be 0. The interface class must be 3 (HID).
|
154 | 'Interface subclass and protocol must be 0 unless you are making a
|
155 | 'keyboard or a mouse that supports the predefined boot protocol.
|
156 | 'See pages 8 and 9 of the HID 1.11 specification PDF.
|
157 |
|
158 | 'Number of HID descriptors (EXCLUDING report and physical)
|
159 | 'If you are not making a HID device, then set this constant to 0
|
160 | Const _usb_hids = 1
|
161 |
|
162 | 'BCD HID releasenumber. Current spec is 1.11
|
163 | Const _usb_hid_release = &H0111
|
164 |
|
165 | 'Country code from page 23 of the HID 1.11 specifications.
|
166 | 'Usually the country code is 0 unless you are making a keyboard.
|
167 | Const _usb_hid_country = 0
|
168 |
|
169 | 'The number of report and physical descriptors for this HID
|
170 | 'Must be at least 1! All HID devices have at least 1 report descriptor.
|
171 | Const _usb_hid_numdescriptors = 1
|
172 |
|
173 | 'Use a software tool to create the report descriptor and $INCLUDE it.
|
174 |
|
175 |
|
176 | ' ************************* Endpoint Descriptor(s) **************************
|
177 |
|
178 | 'Endpoint 0 is not included here. These are only for optional
|
179 | 'endpoints.
|
180 | 'Note: HID devices require 1 interrupt IN endpoint
|
181 |
|
182 | 'Address of optional endpoints (Must be > 0. comment-out to not use)
|
183 | Const _usb_endp2addr = 1
|
184 | Const _usb_endp3addr = 2
|
185 |
|
186 | 'Valid types are 0 for control or 3 for interrupt
|
187 | Const _usb_endp2type = 3
|
188 | Const _usb_endp3type = 3
|
189 |
|
190 | 'Directions are: 0=Out, 1=In. Ignored by control endpoints
|
191 | Const _usb_endp2direction = 1
|
192 | Const _usb_endp3direction = 0
|
193 |
|
194 | 'Polling interval (ms) for interrupt endpoints. Ignored by control endpoints
|
195 | ' (Must be at least 10)
|
196 | Const _usb_endp2interval = 200
|
197 | Const _usb_endp3interval = 100
|
198 |
|
199 | '*******************************************************************************
|
200 | 'The includes need to go right here--between the configuration constants above
|
201 | 'and the start of the program below. The includes will automatically calculate
|
202 | 'constants based on the above configuration, dimension required variables, and
|
203 | 'allocate transmit and receive buffers. Nothing inside the includes file needs
|
204 | 'to be modified.
|
205 | $include "swusb-includes.bas"
|
206 | '*******************************************************************************
|
207 |
|
208 | '**************************** USB Interrupt And Init ***************************
|
209 | 'Set all the variables, flags, and sync bits to their initial states
|
210 | Call Usb_reset()
|
211 |
|
212 |
|
213 |
|
214 | Const _usb_intf = Intf0
|
215 | Config Int0 = Rising
|
216 | On Int0 Usb_isr Nosave
|
217 | Enable Int0
|
218 | Enable Interrupts
|
219 |
|
220 | '*******************************************************************************
|
221 | '*************************** End Of USB Configuration **************************
|
222 |
|
223 | Dim Resetcounter As Word
|
224 | Dim Idlemode As Byte
|
225 | Dim Buttons_current As Byte
|
226 | Dim Buttons_last As Byte
|
227 |
|
228 |
|
229 | Config Portb = Output
|
230 | Config Portc = Input
|
231 | Dim Taste As Byte
|
232 | Do
|
233 | Resetcounter = 0
|
234 |
|
235 | 'Check for reset here
|
236 | While _usb_pin._usb_dminus = 0
|
237 | Incr Resetcounter
|
238 | If Resetcounter = 1000 Then
|
239 | Call Usb_reset()
|
240 | End If
|
241 | Wend
|
242 |
|
243 | 'Check for received data
|
244 | If _usb_status._usb_rxc = 1 Then
|
245 | ' Print Chr(_usb_rx_buffer(1)) ; Chr(_usb_rx_buffer(2)) ; Chr(_usb_rx_buffer(3)) ; Chr(_usb_rx_buffer(4)) ; Chr(_usb_rx_buffer(5)) ; Chr(_usb_rx_buffer(6))
|
246 | If _usb_status._usb_setup = 1 Then
|
247 | 'Process a setup packet/Control message
|
248 | Call Usb_processsetup(_usb_tx_status)
|
249 | Elseif _usb_status._usb_endp1 = 1 Then
|
250 | ' Input data endpoints
|
251 | Portb = _usb_rx_buffer(2) ' Copy USB data in Portb
|
252 |
|
253 | End If
|
254 | 'Reset the RXC bit and set the RTR bit (ready to receive a new packet)
|
255 | _usb_status._usb_rtr = 1
|
256 | _usb_status._usb_rxc = 0
|
257 | End If
|
258 |
|
259 |
|
260 | Taste.0 = Pind.6
|
261 | Taste.1 = Pind.5
|
262 | Taste.2 = Pind.4
|
263 | Taste.3 = Pind.3
|
264 |
|
265 | Buttons_current = Pinc
|
266 | 'Queue data to be sent on endpoint 2 (HID report)
|
267 |
|
268 | If _usb_tx_status2._usb_txc = 1 Then
|
269 | _usb_tx_buffer2(2) = Taste
|
270 | Call Usb_send(_usb_tx_status2 , 1) ' Send data in PC
|
271 | End If
|
272 | ' End If
|
273 |
|
274 |
|
275 |
|
276 | Loop
|
277 |
|
278 | End
|
279 |
|
280 | '*******************************************************************************
|
281 | '******************** Descriptors stored in EEPROM or FLASH ********************
|
282 | ' Do not change the order of the descriptors!
|
283 |
|
284 | $data
|
285 |
|
286 |
|
287 | 'Device Descriptor
|
288 | _usb_devicedescriptor:
|
289 | Data 18 , 18 , _usb_desc_device , _usb_specl , _usb_spech , _usb_devclass
|
290 | Data _usb_devsubclass , _usb_devprot , 8 , _usb_vidl , _usb_vidh , _usb_pidl
|
291 | Data _usb_pidh , _usb_devrell , _usb_devrelh , _usb_imanufacturer
|
292 | Data _usb_iproduct , _usb_iserial , _usb_numconfigs
|
293 |
|
294 |
|
295 | 'Retrieving the configuration descriptor also gets all the interface and
|
296 | 'endpoint descriptors for that configuration. It is not possible to retrieve
|
297 | 'only an interface or only an endpoint descriptor. Consequently, this is a
|
298 | 'large transaction of variable size.
|
299 | _usb_configdescriptor:
|
300 | Data _usb_descr_total , 9 , _usb_desc_config , _usb_descr_totall
|
301 | Data _usb_descr_totalh , _usb_numifaces , _usb_confignum , _usb_iconfig
|
302 | Data _usb_powered , _usb_maxpower
|
303 |
|
304 | '_usb_IFaceDescriptor
|
305 | Data 9 , _usb_desc_iface , _usb_ifaceaddr , _usb_alternate
|
306 | Data _usb_ifaceendpoints , _usb_ifclass , _usb_ifsubclass , _usb_ifprotocol
|
307 | Data _usb_iiface
|
308 |
|
309 | #if _usb_hids > 0
|
310 | '_usb_HIDDescriptor
|
311 | Data _usb_hid_descr_len , _usb_desc_hid , _usb_hid_releasel , _usb_hid_releaseh
|
312 | Data _usb_hid_country , _usb_hid_numdescriptors
|
313 |
|
314 | 'Next follows a list of bType and wLength bytes/words for each report and
|
315 | 'physical descriptor. There must be at least 1 report descriptor. In practice,
|
316 | 'There are usually 0 physical descriptors and only 1 report descriptor.
|
317 | Data _usb_desc_report
|
318 | Data 33 , 0
|
319 | 'End of report/physical descriptor list
|
320 | #endif
|
321 |
|
322 | #if _usb_endpoints > 1
|
323 | '_usb_EndpointDescriptor
|
324 | Data 7 , _usb_desc_endpoint , _usb_endp2attr , _usb_endp2type , 8 , 0
|
325 | Data _usb_endp2interval
|
326 | #endif
|
327 |
|
328 | #if _usb_endpoints > 2
|
329 | '_usb_EndpointDescriptor
|
330 | Data 7 , _usb_desc_endpoint , _usb_endp3attr , _usb_endp3type , 8 , 0
|
331 | Data _usb_endp3interval
|
332 | #endif
|
333 |
|
334 | #if _usb_hids > 0
|
335 | _usb_hid_reportdescriptor:
|
336 | Data 33 ' Length = 33 bytes
|
337 | Data &H06 , &H00 , &HFF ' Usage_page(vendor Defined Page 1)
|
338 | Data &H09 , &H01 ' Usage(vendor Usage 1)
|
339 | Data &HA1 , &H02 ' Collection(logical)
|
340 |
|
341 | Data &H09 , &H01 ' Usage(pointer)
|
342 | Data &H15 , &H00 ' Logical_minimum(0)
|
343 | Data &H25 , &HFF ' Logical_maximum(255)
|
344 | Data &H75 , &H08 ' Report_size(8)
|
345 | Data &H95 , &H01 ' Report_count(1)
|
346 | Data &H81 , &H02 ' Input(data , Var , Abs)
|
347 |
|
348 | Data &H09 , &H01 '1 ' Usage(pointer)
|
349 | Data &H15 , &H00 ' Logical_minimum(0)
|
350 | Data &H26 , &HFF , 0 ' Logical_maximum(255)
|
351 | Data &H75 , &H08 ' Report_size(8)
|
352 | Data &H95 , &H01 '1 ' Report_count(1)
|
353 | Data &H91 , &H02 ' Output(data , Var , Abs)
|
354 |
|
355 | Data &HC0 ' End_collection
|
356 |
|
357 | #endif
|
358 |
|
359 | '*****************************String descriptors********************************
|
360 | 'Yes, they MUST be written like "t","e","s","t". Doing so pads them with
|
361 | '0's. If you write it like "test," I promise you it won't work.
|
362 |
|
363 | 'Default language descriptor (index 0)
|
364 | _usb_langdescriptor:
|
365 | Data 4 , 4 , _usb_desc_string , 09 , 04 '&h0409 = English
|
366 |
|
367 | 'Manufacturer Descriptor (unicode)
|
368 | _usb_mandescriptor:
|
369 | Data 14 , 14 , _usb_desc_string
|
370 | Data "M" , "o" , "s" , "e" , "l" , "0" , "1"
|
371 |
|
372 | 'Product Descriptor (unicode)
|
373 | _usb_proddescriptor:
|
374 | Data 44 , 44 , _usb_desc_string
|
375 | Data "K" , "D" , "R" , " " , " "
|
376 | Data "v" , "1" , "." , "0"
|
377 |
|
378 |
|
379 |
|
380 | '*******************************************************************************
|
381 |
|
382 |
|
383 |
|
384 | '*******************************************************************************
|
385 | '******************************** Subroutines **********************************
|
386 | '*******************************************************************************
|
387 |
|
388 | Sub Usb_processsetup(txstate As Byte)
|
389 | Senddescriptor = 0
|
390 |
|
391 | 'Control transfers reset the sync bits like so
|
392 | Txstate = _usb_setup_sync
|
393 |
|
394 | 'These are the standard device, interface, and endpoint requests that the
|
395 | 'USB spec requires that we support.
|
396 | Select Case _usb_rx_buffer(2)
|
397 | 'Standard Device Requests
|
398 | Case &B10000000:
|
399 | Select Case _usb_rx_buffer(3)
|
400 | ' CASE _usb_REQ_GET_STATUS:
|
401 | Case _usb_req_get_descriptor:
|
402 | Select Case _usb_rx_buffer(5)
|
403 | Case _usb_desc_device:
|
404 |
|
405 | 'Send the device descriptor
|
406 |
|
407 | Restore _usb_devicedescriptor
|
408 |
|
409 | Senddescriptor = 1
|
410 | Case _usb_desc_config:
|
411 |
|
412 | 'Send the configuration descriptor
|
413 |
|
414 | Restore _usb_configdescriptor
|
415 |
|
416 | Senddescriptor = 1
|
417 | Case _usb_desc_string:
|
418 | Select Case _usb_rx_buffer(4)
|
419 | Case 0:
|
420 | 'Send the language descriptor
|
421 |
|
422 | Restore _usb_langdescriptor
|
423 |
|
424 | Senddescriptor = 1
|
425 | Case 1:
|
426 | 'Send the manufacturer descriptor
|
427 |
|
428 | Restore _usb_mandescriptor
|
429 |
|
430 | Senddescriptor = 1
|
431 | Case 2:
|
432 | 'Send the product descriptor
|
433 |
|
434 | Restore _usb_proddescriptor
|
435 |
|
436 | Senddescriptor = 1
|
437 | End Select
|
438 | End Select
|
439 |
|
440 | End Select
|
441 | Case &B00000000:
|
442 | Select Case _usb_rx_buffer(3)
|
443 |
|
444 | Case _usb_req_set_address:
|
445 |
|
446 | 'USB status reporting for control writes
|
447 | Call Usb_send(txstate , 0)
|
448 | While Txstate._usb_txc = 0 : Wend
|
449 | 'We are now addressed.
|
450 | _usb_deviceid = _usb_rx_buffer(4)
|
451 | Case _usb_req_set_config:
|
452 |
|
453 | 'Have to do status reporting
|
454 | Call Usb_send(txstate , 0)
|
455 | End Select
|
456 | 'Standard Interface Requests
|
457 | Case &B10000001:
|
458 | Select Case _usb_rx_buffer(3)
|
459 |
|
460 | Case _usb_req_get_descriptor
|
461 | '_usb_rx_buffer(4) is the descriptor index and (5) is the type
|
462 | Select Case _usb_rx_buffer(5)
|
463 | Case _usb_desc_report:
|
464 |
|
465 |
|
466 | Restore _usb_hid_reportdescriptor
|
467 |
|
468 | Senddescriptor = 1
|
469 |
|
470 |
|
471 | End Select
|
472 | End Select
|
473 |
|
474 | Case &B00100001:
|
475 | 'Class specific SET requests
|
476 | Select Case _usb_rx_buffer(3)
|
477 | 'CASE _usb_REQ_SET_REPORT:
|
478 | Case _usb_req_set_idle:
|
479 | Idlemode = 1
|
480 | 'Do status reporting
|
481 | Call Usb_send(txstate , 0)
|
482 | 'CASE _usb_REQ_SET_PROTOCOL:
|
483 | End Select
|
484 | End Select
|
485 |
|
486 | If Senddescriptor = 1 Then
|
487 | Call Usb_senddescriptor(txstate , _usb_rx_buffer(8))
|
488 | End If
|
489 |
|
490 | End Sub
|
491 |
|
492 | Sub Usb_senddescriptor(txstate As Byte , Maxlen As Byte)
|
493 |
|
494 | 'Break the descriptor into packets and send to TxState
|
495 | Local Size As Byte
|
496 | Local I As Byte
|
497 | Local J As Byte
|
498 | Local Timeout As Word
|
499 |
|
500 |
|
501 | Read Size
|
502 |
|
503 |
|
504 |
|
505 | If Maxlen < Size Then Size = Maxlen
|
506 |
|
507 | I = 2
|
508 | For J = 1 To Size
|
509 | Incr I
|
510 |
|
511 | Read Txstate(i)
|
512 |
|
513 | If I = 10 Or J = Size Then
|
514 | I = I - 2
|
515 | Call Usb_send(txstate , I)
|
516 | While Txstate._usb_txc = 0
|
517 | Timeout = 0
|
518 | 'To prevent an infinite loop, check for reset here
|
519 | While _usb_pin._usb_dminus = 0
|
520 | Incr Timeout
|
521 | If Timeout = 1000 Then '
|
522 | Call Usb_reset()
|
523 | Exit Sub
|
524 | End If
|
525 | Wend
|
526 | Wend
|
527 | I = 2
|
528 | End If
|
529 | Next
|
530 | End Sub
|
531 |
|
532 | Sub Usb_send(txstate As Byte , Byval Count As Byte)
|
533 |
|
534 |
|
535 |
|
536 |
|
537 | 'Calculates and adds the CRC16,adds the DATAx PID,
|
538 | 'and signals to the ISR that the data is ready to be sent.
|
539 | '
|
540 | '"Count" is the DATA payload size. Range is 0 to 8. Do not exceed 8!
|
541 |
|
542 | 'Reset all the flags except TxSync and RxSync
|
543 | Txstate = Txstate And _usb_syncmask
|
544 | ' Print Txstate
|
545 | 'Calculate the 16-bit CRC
|
546 | _usb_crc = 0
|
547 | If Count <> 0 Then
|
548 | _usb_crc = Crc16uni(txstate(3) , Count , &HFFFF , &H8005 , 1 , 1)
|
549 | Toggle _usb_crc
|
550 | End If
|
551 |
|
552 | 'Bytes to transmit will be PID + DATA payload + CRC16
|
553 | Count = Count + 3
|
554 | Txstate = Txstate + Count
|
555 |
|
556 | Txstate(count) = Low(_usb_crc)
|
557 | Incr Count
|
558 | Txstate(count) = High(_usb_crc)
|
559 |
|
560 |
|
561 | 'Add the appropriate DATAx PID
|
562 | Txstate(2) = _usb_pid_data1
|
563 | If Txstate._usb_txsync = 0 Then
|
564 | Txstate(2) = _usb_pid_data0
|
565 | End If
|
566 |
|
567 | 'The last step is to signal that the packet is Ready To Transmit
|
568 | Txstate._usb_rtt = 1
|
569 | Txstate._usb_txc = 0
|
570 | End Sub
|
571 |
|
572 | Sub Usb_reset()
|
573 |
|
574 | 'Reset the receive flags
|
575 | _usb_status._usb_rtr = 1
|
576 | _usb_status._usb_rxc = 0
|
577 |
|
578 | 'Reset the transmit flags
|
579 | _usb_tx_status = _usb_endp_init
|
580 | #if Varexist( "_usb_Endp2Addr")
|
581 | _usb_tx_status2 = _usb_endp_init
|
582 | #endif
|
583 | #if Varexist( "_usb_Endp3Addr")
|
584 | _usb_tx_status3 = _usb_endp_init
|
585 | #endif
|
586 |
|
587 | 'Reset the device ID to 0
|
588 | _usb_deviceid = 0
|
589 |
|
590 |
|
591 | Idlemode = 0
|
592 |
|
593 | End Sub
|