[boot] move boot related packages to their own folder
[openwrt/svn-archive/archive.git] / package / boot / uboot-xburst / files / cpu / mips / usb_boot.S
1 /*
2 * for jz4740 usb boot
3 *
4 * Copyright (c) 2009 Xiangfu Liu <xiangfu.z@gmail.com>
5 *
6 * See file CREDITS for list of people who contributed to this
7 * project.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
22 * MA 02111-1307 USA
23 */
24 .set noreorder
25 .globl usb_boot
26 .text
27
28 //----------------------------------------------------------------------
29 // Both NAND and USB boot load data to D-Cache first, then transfer
30 // data from D-Cache to I-Cache, and jump to execute the code in I-Cache.
31 // So init caches first and then dispatch to a proper boot routine.
32 //----------------------------------------------------------------------
33
34 .macro load_addr reg addr
35 li \reg, 0x80000000
36 addiu \reg, \reg, \addr
37 la $2, usbboot_begin
38 subu \reg, \reg, $2
39 .endm
40
41 usb_boot:
42 //--------------------------------------------------------------
43 // Initialize PLL: set ICLK to 84MHz and HCLK to 42MHz.
44 //--------------------------------------------------------------
45 la $9, 0xB0000000 // CPCCR: Clock Control Register
46 la $8, 0x42041110 // I:S:M:P=1:2:2:2
47 sw $8, 0($9)
48
49 la $9, 0xB0000010 // CPPCR: PLL Control Register
50 la $8, 0x06000120 // M=12 N=0 D=0 CLK=12*(M+2)/(N+2)
51 sw $8, 0($9)
52
53 mtc0 $0, $26 // CP0_ERRCTL, restore WST reset state
54 nop
55
56 mtc0 $0, $16 // CP0_CONFIG
57 nop
58
59 // Relocate code to beginning of the ram
60
61 la $2, usbboot_begin
62 la $3, usbboot_end
63 li $4, 0x80000000
64
65 1:
66 lw $5, 0($2)
67 sw $5, 0($4)
68 addiu $2, $2, 4
69 bne $2, $3, 1b
70 addiu $4, $4, 4
71
72 li $2, 0x80000000
73 ori $3, $2, 0
74 addiu $3, $3, usbboot_end
75 la $4, usbboot_begin
76 subu $3, $3, $4
77
78
79 2:
80 cache 0x0, 0($2) // Index_Invalidate_I
81 cache 0x1, 0($2) // Index_Writeback_Inv_D
82 addiu $2, $2, 32
83 subu $4, $3, $2
84 bgtz $4, 2b
85 nop
86
87 load_addr $3, usb_boot_return
88
89 jr $3
90
91 usbboot_begin:
92
93 init_caches:
94 li $2, 3 // cacheable for kseg0 access
95 mtc0 $2, $16 // CP0_CONFIG
96 nop
97
98 li $2, 0x20000000 // enable idx-store-data cache insn
99 mtc0 $2, $26 // CP0_ERRCTL
100
101 ori $2, $28, 0 // start address
102 ori $3, $2, 0x3fe0 // end address, total 16KB
103 mtc0 $0, $28, 0 // CP0_TAGLO
104 mtc0 $0, $28, 1 // CP0_DATALO
105 cache_clear_a_line:
106 cache 0x8, 0($2) // Index_Store_Tag_I
107 cache 0x9, 0($2) // Index_Store_Tag_D
108 bne $2, $3, cache_clear_a_line
109 addiu $2, $2, 32 // increment CACHE_LINE_SIZE
110
111 ori $2, $28, 0 // start address
112 ori $3, $2, 0x3fe0 // end address, total 16KB
113 la $4, 0x1ffff000 // physical address and 4KB page mask
114 cache_alloc_a_line:
115 and $5, $2, $4
116 ori $5, $5, 1 // V bit of the physical tag
117 mtc0 $5, $28, 0 // CP0_TAGLO
118 cache 0x8, 0($2) // Index_Store_Tag_I
119 cache 0x9, 0($2) // Index_Store_Tag_D
120 bne $2, $3, cache_alloc_a_line
121 addiu $2, $2, 32 // increment CACHE_LINE_SIZE
122
123 nop
124 nop
125 nop
126 //--------------------------------------------------------------
127 // Transfer data from dcache to icache, then jump to icache.
128 //
129 // Input parameters:
130 //
131 // $19: data length in bytes
132 // $20: jump target address
133 //--------------------------------------------------------------
134 xfer_d2i:
135
136 ori $8, $20, 0
137 addu $9, $8, $19 // total 16KB
138
139 1:
140 cache 0x0, 0($8) // Index_Invalidate_I
141 cache 0x1, 0($8) // Index_Writeback_Inv_D
142 bne $8, $9, 1b
143 addiu $8, $8, 32
144
145 // flush write-buffer
146 sync
147
148 // Invalidate BTB
149 mfc0 $8, $16, 7 // CP0_CONFIG
150 nop
151 ori $8, 2
152 mtc0 $8, $16, 7
153 nop
154
155 // Overwrite config to disable ram initalisation
156 li $2, 0xff
157 sb $2, 20($20)
158
159 jalr $20
160 nop
161
162 icache_return:
163 //--------------------------------------------------------------
164 // User code can return to here after executing itself in
165 // icache, by jumping to $31.
166 //--------------------------------------------------------------
167 b usb_boot_return
168 nop
169
170
171 usb_boot_return:
172 //--------------------------------------------------------------
173 // Enable the USB PHY
174 //--------------------------------------------------------------
175 la $9, 0xB0000024 // CPM_SCR
176 lw $8, 0($9)
177 ori $8, 0x40 // USBPHY_ENABLE
178 sw $8, 0($9)
179
180 //--------------------------------------------------------------
181 // Initialize USB registers
182 //--------------------------------------------------------------
183 la $27, 0xb3040000 // USB registers base address
184
185 sb $0, 0x0b($27) // INTRUSBE: disable common USB interrupts
186 sh $0, 0x06($27) // INTRINE: disable EPIN interrutps
187 sh $0, 0x08($27) // INTROUTE: disable EPOUT interrutps
188
189 li $9, 0x61
190 sb $9, 0x01($27) // POWER: HSENAB | SUSPENDM | SOFTCONN
191
192 //--------------------------------------------------------------
193 // Initialize USB states
194 //--------------------------------------------------------------
195 li $22, 0 // set EP0 to IDLE state
196 li $23, 1 // no data stage
197
198 //--------------------------------------------------------------
199 // Main loop of polling the usb commands
200 //--------------------------------------------------------------
201 usb_command_loop:
202 lbu $9, 0x0a($27) // read INTRUSB
203 andi $9, 0x04 // check USB_INTR_RESET
204 beqz $9, check_intr_ep0in
205 nop
206
207 //--------------------------------------------------------------
208 // 1. Handle USB reset interrupt
209 //--------------------------------------------------------------
210 handle_reset_intr:
211 lbu $9, 0x01($27) // read POWER
212 andi $9, 0x10 // test HS_MODE
213 bnez $9, _usb_set_maxpktsize
214 li $9, 512 // max packet size of HS mode
215 li $9, 64 // max packet size of FS mode
216
217 _usb_set_maxpktsize:
218 li $8, 1
219 sb $8, 0x0e($27) // set INDEX 1
220
221 sh $9, 0x10($27) // INMAXP
222 sb $0, 0x13($27) // INCSRH
223 sh $9, 0x14($27) // OUTMAXP
224 sb $0, 0x17($27) // OUTCSRH
225
226 _usb_flush_fifo:
227 li $8, 0x48 // INCSR_CDT && INCSR_FF
228 sb $8, 0x12($27) // INCSR
229 li $8, 0x90 // OUTCSR_CDT && OUTCSR_FF
230 sb $8, 0x16($27) // OUTCSR
231
232 li $22, 0 // set EP0 to IDLE state
233 li $23, 1 // no data stage
234
235 //--------------------------------------------------------------
236 // 2. Check and handle EP0 interrupt
237 //--------------------------------------------------------------
238 check_intr_ep0in:
239 lhu $10, 0x02($27) // read INTRIN
240 andi $9, $10, 0x1 // check EP0 interrupt
241 beqz $9, check_intr_ep1in
242 nop
243
244 handle_ep0_intr:
245 sb $0, 0x0e($27) // set INDEX 0
246 lbu $11, 0x12($27) // read CSR0
247
248 andi $9, $11, 0x04 // check SENTSTALL
249 beqz $9, _ep0_setupend
250 nop
251
252 _ep0_sentstall:
253 andi $9, $11, 0xdb
254 sb $9, 0x12($27) // clear SENDSTALL and SENTSTALL
255 li $22, 0 // set EP0 to IDLE state
256
257 _ep0_setupend:
258 andi $9, $11, 0x10 // check SETUPEND
259 beqz $9, ep0_idle_state
260 nop
261
262 ori $9, $11, 0x80
263 sb $9, 0x12($27) // set SVDSETUPEND
264 li $22, 0 // set EP0 to IDLE state
265
266 ep0_idle_state:
267 bnez $22, ep0_tx_state
268 nop
269
270 //--------------------------------------------------------------
271 // 2.1 Handle EP0 IDLE state interrupt
272 //--------------------------------------------------------------
273 andi $9, $11, 0x01 // check OUTPKTRDY
274 beqz $9, check_intr_ep1in
275 nop
276
277 //--------------------------------------------------------------
278 // Read 8-bytes setup packet from the FIFO
279 //--------------------------------------------------------------
280 lw $25, 0x20($27) // first word of setup packet
281 lw $26, 0x20($27) // second word of setup packet
282
283 andi $9, $25, 0x60 // bRequestType & USB_TYPE_MASK
284 beqz $9, _ep0_std_req
285 nop
286
287 //--------------------------------------------------------------
288 // 2.1.1 Vendor-specific setup request
289 //--------------------------------------------------------------
290 _ep0_vend_req:
291 li $22, 0 // set EP0 to IDLE state
292 li $23, 1 // NoData = 1
293
294 andi $9, $25, 0xff00 // check bRequest
295 srl $9, $9, 8
296 beqz $9, __ep0_get_cpu_info
297 sub $8, $9, 0x1
298 beqz $8, __ep0_set_data_address
299 sub $8, $9, 0x2
300 beqz $8, __ep0_set_data_length
301 sub $8, $9, 0x3
302 beqz $8, __ep0_flush_caches
303 sub $8, $9, 0x4
304 beqz $8, __ep0_prog_start1
305 sub $8, $9, 0x5
306 beqz $8, __ep0_prog_start2
307 nop
308 b _ep0_idle_state_fini // invalid request
309 nop
310
311 __ep0_get_cpu_info:
312 load_addr $20, cpu_info_data // data pointer to transfer
313 li $21, 8 // bytes left to transfer
314 li $22, 1 // set EP0 to TX state
315 li $23, 0 // NoData = 0
316
317 b _ep0_idle_state_fini
318 nop
319
320 __ep0_set_data_address:
321 li $9, 0xffff0000
322 and $9, $25, $9
323 andi $8, $26, 0xffff
324 or $20, $9, $8 // data address of next transfer
325
326 b _ep0_idle_state_fini
327 nop
328
329 __ep0_set_data_length:
330 li $9, 0xffff0000
331 and $9, $25, $9
332 andi $8, $26, 0xffff
333 or $21, $9, $8 // data length of next transfer
334
335 li $9, 0x48 // SVDOUTPKTRDY and DATAEND
336 sb $9, 0x12($27) // CSR0
337
338 // We must write packet to FIFO before EP1-IN interrupt here.
339 b handle_epin1_intr
340 nop
341
342 __ep0_flush_caches:
343 // Flush dcache and invalidate icache.
344 li $8, 0x80000000
345 addi $9, $8, 0x3fe0 // total 16KB
346
347 1:
348 cache 0x0, 0($8) // Index_Invalidate_I
349 cache 0x1, 0($8) // Index_Writeback_Inv_D
350 bne $8, $9, 1b
351 addiu $8, $8, 32
352
353 // flush write-buffer
354 sync
355
356 // Invalidate BTB
357 mfc0 $8, $16, 7 // CP0_CONFIG
358 nop
359 ori $8, 2
360 mtc0 $8, $16, 7
361 nop
362
363 b _ep0_idle_state_fini
364 nop
365
366 __ep0_prog_start1:
367 li $9, 0x48 // SVDOUTPKTRDY and DATAEND
368 sb $9, 0x12($27) // CSR0
369
370 li $9, 0xffff0000
371 and $9, $25, $9
372 andi $8, $26, 0xffff
373 or $20, $9, $8 // target address
374
375 b xfer_d2i
376 li $19, 0x2000 // 16KB data length
377
378 __ep0_prog_start2:
379 li $9, 0x48 // SVDOUTPKTRDY and DATAEND
380 sb $9, 0x12($27) // CSR0
381
382 li $9, 0xffff0000
383 and $9, $25, $9
384 andi $8, $26, 0xffff
385 or $20, $9, $8 // target address
386
387 jalr $20 // jump, and place the return address in $31
388 nop
389
390 __ep0_prog_start2_return:
391 // User code can return to here after executing itself, by jumping to $31.
392 b usb_boot_return
393 nop
394
395 //--------------------------------------------------------------
396 // 2.1.2 Standard setup request
397 //--------------------------------------------------------------
398 _ep0_std_req:
399 andi $12, $25, 0xff00 // check bRequest
400 srl $12, $12, 8
401 sub $9, $12, 0x05 // check USB_REQ_SET_ADDRESS
402 bnez $9, __ep0_req_set_config
403 nop
404
405 //--------------------------------------------------------------
406 // Handle USB_REQ_SET_ADDRESS
407 //--------------------------------------------------------------
408 __ep0_req_set_addr:
409 srl $9, $25, 16 // get wValue
410 sb $9, 0x0($27) // set FADDR
411 li $23, 1 // NoData = 1
412 b _ep0_idle_state_fini
413 nop
414
415 __ep0_req_set_config:
416 sub $9, $12, 0x09 // check USB_REQ_SET_CONFIGURATION
417 bnez $9, __ep0_req_get_desc
418 nop
419
420 //--------------------------------------------------------------
421 // Handle USB_REQ_SET_CONFIGURATION
422 //--------------------------------------------------------------
423 li $23, 1 // NoData = 1
424 b _ep0_idle_state_fini
425 nop
426
427 __ep0_req_get_desc:
428 sub $9, $12, 0x06 // check USB_REQ_GET_DESCRIPTOR
429 bnez $9, _ep0_idle_state_fini
430 li $23, 1 // NoData = 1
431
432 //--------------------------------------------------------------
433 // Handle USB_REQ_GET_DESCRIPTOR
434 //--------------------------------------------------------------
435 li $23, 0 // NoData = 0
436
437 srl $9, $25, 24 // wValue >> 8
438 sub $8, $9, 0x01 // check USB_DT_DEVICE
439 beqz $8, ___ep0_get_dev_desc
440 srl $21, $26, 16 // get wLength
441 sub $8, $9, 0x02 // check USB_DT_CONFIG
442 beqz $8, ___ep0_get_conf_desc
443 sub $8, $9, 0x03 // check USB_DT_STRING
444 beqz $8, ___ep0_get_string_desc
445 sub $8, $9, 0x06 // check USB_DT_DEVICE_QUALIFIER
446 beqz $8, ___ep0_get_dev_qualifier
447 nop
448 b _ep0_idle_state_fini
449 nop
450
451 ___ep0_get_dev_desc:
452 load_addr $20, device_desc // data pointer
453 li $22, 1 // set EP0 to TX state
454 sub $8, $21, 18
455 blez $8, _ep0_idle_state_fini // wLength <= 18
456 nop
457 li $21, 18 // max length of device_desc
458 b _ep0_idle_state_fini
459 nop
460
461 ___ep0_get_dev_qualifier:
462 load_addr $20, dev_qualifier // data pointer
463 li $22, 1 // set EP0 to TX state
464 sub $8, $21, 10
465 blez $8, _ep0_idle_state_fini // wLength <= 10
466 nop
467 li $21, 10 // max length of dev_qualifier
468 b _ep0_idle_state_fini
469 nop
470
471 ___ep0_get_conf_desc:
472 load_addr $20, config_desc_fs // data pointer of FS mode
473 lbu $8, 0x01($27) // read POWER
474 andi $8, 0x10 // test HS_MODE
475 beqz $8, ___ep0_get_conf_desc2
476 nop
477 load_addr $20, config_desc_hs // data pointer of HS mode
478
479 ___ep0_get_conf_desc2:
480 li $22, 1 // set EP0 to TX state
481 sub $8, $21, 32
482 blez $8, _ep0_idle_state_fini // wLength <= 32
483 nop
484 li $21, 32 // max length of config_desc
485 b _ep0_idle_state_fini
486 nop
487
488 ___ep0_get_string_desc:
489 li $22, 1 // set EP0 to TX state
490
491 srl $9, $25, 16 // wValue & 0xff
492 andi $9, 0xff
493
494 sub $8, $9, 1
495 beqz $8, ___ep0_get_string_manufacture
496 sub $8, $9, 2
497 beqz $8, ___ep0_get_string_product
498 nop
499
500 ___ep0_get_string_lang_ids:
501 load_addr $20, string_lang_ids // data pointer
502 b _ep0_idle_state_fini
503 li $21, 4 // data length
504
505 ___ep0_get_string_manufacture:
506 load_addr $20, string_manufacture // data pointer
507 b _ep0_idle_state_fini
508 li $21, 16 // data length
509
510 ___ep0_get_string_product:
511 load_addr $20, string_product // data pointer
512 b _ep0_idle_state_fini
513 li $21, 46 // data length
514
515 _ep0_idle_state_fini:
516 li $9, 0x40 // SVDOUTPKTRDY
517 beqz $23, _ep0_idle_state_fini2
518 nop
519 ori $9, $9, 0x08 // DATAEND
520 _ep0_idle_state_fini2:
521 sb $9, 0x12($27) // CSR0
522 beqz $22, check_intr_ep1in
523 nop
524
525 //--------------------------------------------------------------
526 // 2.2 Handle EP0 TX state interrupt
527 //--------------------------------------------------------------
528 ep0_tx_state:
529 sub $9, $22, 1
530 bnez $9, check_intr_ep1in
531 nop
532
533 sub $9, $21, 64 // max packetsize
534 blez $9, _ep0_tx_state2 // data count <= 64
535 ori $19, $21, 0
536 li $19, 64
537
538 _ep0_tx_state2:
539 beqz $19, _ep0_tx_state3 // send ZLP
540 ori $18, $19, 0 // record bytes to be transferred
541 sub $21, $21, $19 // decrement data count
542
543 _ep0_fifo_write_loop:
544 lbu $9, 0($20) // read data
545 sb $9, 0x20($27) // load FIFO
546 sub $19, $19, 1 // decrement counter
547 bnez $19, _ep0_fifo_write_loop
548 addi $20, $20, 1 // increment data pointer
549
550 sub $9, $18, 64 // max packetsize
551 beqz $9, _ep0_tx_state4
552 nop
553
554 _ep0_tx_state3:
555 // transferred bytes < max packetsize
556 li $9, 0x0a // set INPKTRDY and DATAEND
557 sb $9, 0x12($27) // CSR0
558 li $22, 0 // set EP0 to IDLE state
559 b check_intr_ep1in
560 nop
561
562 _ep0_tx_state4:
563 // transferred bytes == max packetsize
564 li $9, 0x02 // set INPKTRDY
565 sb $9, 0x12($27) // CSR0
566 b check_intr_ep1in
567 nop
568
569 //--------------------------------------------------------------
570 // 3. Check and handle EP1 BULK-IN interrupt
571 //--------------------------------------------------------------
572 check_intr_ep1in:
573 andi $9, $10, 0x2 // check EP1 IN interrupt
574 beqz $9, check_intr_ep1out
575 nop
576
577 handle_epin1_intr:
578 li $9, 1
579 sb $9, 0x0e($27) // set INDEX 1
580 lbu $9, 0x12($27) // read INCSR
581
582 andi $8, $9, 0x2 // check INCSR_FFNOTEMPT
583 bnez $8, _epin1_tx_state4
584 nop
585
586 _epin1_write_fifo:
587 lhu $9, 0x10($27) // get INMAXP
588 sub $8, $21, $9
589 blez $8, _epin1_tx_state1 // bytes left <= INMAXP
590 ori $19, $21, 0
591 ori $19, $9, 0
592
593 _epin1_tx_state1:
594 beqz $19, _epin1_tx_state4 // No data
595 nop
596
597 sub $21, $21, $19 // decrement data count
598
599 srl $5, $19, 2 // # of word
600 andi $6, $19, 0x3 // # of byte
601 beqz $5, _epin1_tx_state2
602 nop
603
604 _epin1_fifo_write_word:
605 lw $9, 0($20) // read data from source address
606 sw $9, 0x24($27) // write FIFO
607 sub $5, $5, 1 // decrement counter
608 bnez $5, _epin1_fifo_write_word
609 addiu $20, $20, 4 // increment dest address
610
611 _epin1_tx_state2:
612 beqz $6, _epin1_tx_state3
613 nop
614
615 _epin1_fifo_write_byte:
616 lbu $9, 0($20) // read data from source address
617 sb $9, 0x24($27) // write FIFO
618 sub $6, $6, 1 // decrement counter
619 bnez $6, _epin1_fifo_write_byte
620 addiu $20, $20, 1 // increment dest address
621
622 _epin1_tx_state3:
623 li $9, 0x1
624 sb $9, 0x12($27) // INCSR, set INPKTRDY
625
626 _epin1_tx_state4:
627 // nop
628
629 //--------------------------------------------------------------
630 // 4. Check and handle EP1 BULK-OUT interrupt
631 //--------------------------------------------------------------
632 check_intr_ep1out:
633 lhu $9, 0x04($27) // read INTROUT
634 andi $9, 0x2
635 beqz $9, check_status_next
636 nop
637
638 handle_epout1_intr:
639 li $9, 1
640 sb $9, 0x0e($27) // set INDEX 1
641
642 lbu $9, 0x16($27) // read OUTCSR
643 andi $9, 0x1 // check OUTPKTRDY
644 beqz $9, check_status_next
645 nop
646
647 _epout1_read_fifo:
648 lhu $19, 0x18($27) // read OUTCOUNT
649 srl $5, $19, 2 // # of word
650 andi $6, $19, 0x3 // # of byte
651 beqz $5, _epout1_rx_state1
652 nop
653
654 _epout1_fifo_read_word:
655 lw $9, 0x24($27) // read FIFO
656 sw $9, 0($20) // store to dest address
657 sub $5, $5, 1 // decrement counter
658 bnez $5, _epout1_fifo_read_word
659 addiu $20, $20, 4 // increment dest address
660
661 _epout1_rx_state1:
662 beqz $6, _epout1_rx_state2
663 nop
664
665 _epout1_fifo_read_byte:
666 lbu $9, 0x24($27) // read FIFO
667 sb $9, 0($20) // store to dest address
668 sub $6, $6, 1 // decrement counter
669 bnez $6, _epout1_fifo_read_byte
670 addiu $20, $20, 1 // increment dest address
671
672 _epout1_rx_state2:
673 sb $0, 0x16($27) // clear OUTPKTRDY
674
675 check_status_next:
676 b usb_command_loop
677 nop
678
679 //--------------------------------------------------------------
680 // Device/Configuration/Interface/Endpoint/String Descriptors
681 //--------------------------------------------------------------
682
683 .align 2
684 device_desc:
685 .byte 0x12 // bLength
686 .byte 0x01 // bDescriptorType
687 .byte 0x00 // bcdUSB
688 .byte 0x02 // bcdUSB
689 .byte 0x00 // bDeviceClass
690 .byte 0x00 // bDeviceSubClass
691 .byte 0x00 // bDeviceProtocol
692 .byte 0x40 // bMaxPacketSize0
693 .byte 0x1a // idVendor
694 .byte 0x60 // idVendor
695 .byte 0x40 // idProduct
696 .byte 0x47 // idProduct
697 .byte 0x00 // bcdDevice
698 .byte 0x01 // bcdDevice
699 .byte 0x01 // iManufacturer
700 .byte 0x02 // iProduct
701 .byte 0x00 // iSerialNumber
702 .byte 0x01 // bNumConfigurations
703
704 .align 2
705 dev_qualifier:
706 .byte 0x0a // bLength
707 .byte 0x06 // bDescriptorType
708 .byte 0x00 // bcdUSB
709 .byte 0x02 // bcdUSB
710 .byte 0x00 // bDeviceClass
711 .byte 0x00 // bDeviceSubClass
712 .byte 0x00 // bDeviceProtocol
713 .byte 0x40 // bMaxPacketSize0
714 .byte 0x01 // bNumConfigurations
715 .byte 0x00 // bRESERVED
716
717 .align 2
718 config_desc_hs:
719 .byte 0x09 // bLength
720 .byte 0x02 // bDescriptorType
721 .byte 0x20 // wTotalLength
722 .byte 0x00 // wTotalLength
723 .byte 0x01 // bNumInterfaces
724 .byte 0x01 // bConfigurationValue
725 .byte 0x00 // iConfiguration
726 .byte 0xc0 // bmAttributes
727 .byte 0x01 // MaxPower
728 intf_desc_hs:
729 .byte 0x09 // bLength
730 .byte 0x04 // bDescriptorType
731 .byte 0x00 // bInterfaceNumber
732 .byte 0x00 // bAlternateSetting
733 .byte 0x02 // bNumEndpoints
734 .byte 0xff // bInterfaceClass
735 .byte 0x00 // bInterfaceSubClass
736 .byte 0x50 // bInterfaceProtocol
737 .byte 0x00 // iInterface
738 ep1_desc_hs:
739 .byte 0x07 // bLength
740 .byte 0x05 // bDescriptorType
741 .byte 0x01 // bEndpointAddress
742 .byte 0x02 // bmAttributes
743 .byte 0x00 // wMaxPacketSize
744 .byte 0x02 // wMaxPacketSize
745 .byte 0x00 // bInterval
746 ep2_desc_hs:
747 .byte 0x07 // bLength
748 .byte 0x05 // bDescriptorType
749 .byte 0x81 // bEndpointAddress
750 .byte 0x02 // bmAttributes
751 .byte 0x00 // wMaxPacketSize
752 .byte 0x02 // wMaxPacketSize
753 .byte 0x00 // bInterval
754
755 .align 2
756 config_desc_fs:
757 .byte 0x09 // bLength
758 .byte 0x02 // bDescriptorType
759 .byte 0x20 // wTotalLength
760 .byte 0x00 // wTotalLength
761 .byte 0x01 // bNumInterfaces
762 .byte 0x01 // bConfigurationValue
763 .byte 0x00 // iConfiguration
764 .byte 0xc0 // bmAttributes
765 .byte 0x01 // MaxPower
766 intf_desc_fs:
767 .byte 0x09 // bLength
768 .byte 0x04 // bDescriptorType
769 .byte 0x00 // bInterfaceNumber
770 .byte 0x00 // bAlternateSetting
771 .byte 0x02 // bNumEndpoints
772 .byte 0xff // bInterfaceClass
773 .byte 0x00 // bInterfaceSubClass
774 .byte 0x50 // bInterfaceProtocol
775 .byte 0x00 // iInterface
776 ep1_desc_fs:
777 .byte 0x07 // bLength
778 .byte 0x05 // bDescriptorType
779 .byte 0x01 // bEndpointAddress
780 .byte 0x02 // bmAttributes
781 .byte 0x40 // wMaxPacketSize
782 .byte 0x00 // wMaxPacketSize
783 .byte 0x00 // bInterval
784 ep2_desc_fs:
785 .byte 0x07 // bLength
786 .byte 0x05 // bDescriptorType
787 .byte 0x81 // bEndpointAddress
788 .byte 0x02 // bmAttributes
789 .byte 0x40 // wMaxPacketSize
790 .byte 0x00 // wMaxPacketSize
791 .byte 0x00 // bInterval
792
793 .align 2
794 string_lang_ids:
795 .byte 0x04
796 .byte 0x03
797 .byte 0x09
798 .byte 0x04
799
800 .align 2
801 string_manufacture:
802 .byte 0x10
803 .byte 0x03
804 .byte 0x49
805 .byte 0x00
806 .byte 0x6e
807 .byte 0x00
808 .byte 0x67
809 .byte 0x00
810 .byte 0x65
811 .byte 0x00
812 .byte 0x6e
813 .byte 0x00
814 .byte 0x69
815 .byte 0x00
816 .byte 0x63
817 .byte 0x00
818
819 .align 2
820 string_product:
821 .byte 0x2e
822 .byte 0x03
823 .byte 0x4a
824 .byte 0x00
825 .byte 0x5a
826 .byte 0x00
827 .byte 0x34
828 .byte 0x00
829 .byte 0x37
830 .byte 0x00
831 .byte 0x34
832 .byte 0x00
833 .byte 0x30
834 .byte 0x00
835 .byte 0x20
836 .byte 0x00
837 .byte 0x55
838 .byte 0x00
839 .byte 0x53
840 .byte 0x00
841 .byte 0x42
842 .byte 0x00
843 .byte 0x20
844 .byte 0x00
845 .byte 0x42
846 .byte 0x00
847 .byte 0x6f
848 .byte 0x00
849 .byte 0x6f
850 .byte 0x00
851 .byte 0x74
852 .byte 0x00
853 .byte 0x20
854 .byte 0x00
855 .byte 0x44
856 .byte 0x00
857 .byte 0x65
858 .byte 0x00
859 .byte 0x76
860 .byte 0x00
861 .byte 0x69
862 .byte 0x00
863 .byte 0x63
864 .byte 0x00
865 .byte 0x65
866 .byte 0x00
867
868 .align 2
869 cpu_info_data:
870 .byte 0x4a
871 .byte 0x5a
872 .byte 0x34
873 .byte 0x37
874 .byte 0x34
875 .byte 0x30
876 .byte 0x56
877 .byte 0x31
878 usbboot_end:
879
880 .set reorder