Root/package/uboot-xburst/files/arch/mips/cpu/xburst/usbboot.S

1/*
2 * for jz4740 usb boot
3 *
4 * Copyright (c) 2009 Author: <jlwei@ingenic.cn>
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
41usb_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
651:
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
792:
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
91usbboot_begin:
92
93init_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
105cache_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
114cache_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    //--------------------------------------------------------------
134xfer_d2i:
135
136    ori $8, $20, 0
137    addu $9, $8, $19 // total 16KB
138
1391:
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
162icache_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
171usb_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    //--------------------------------------------------------------
201usb_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    //--------------------------------------------------------------
210handle_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    //--------------------------------------------------------------
238check_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
244handle_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
266ep0_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
3471:
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    //--------------------------------------------------------------
528ep0_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    //--------------------------------------------------------------
572check_intr_ep1in:
573    andi $9, $10, 0x2 // check EP1 IN interrupt
574    beqz $9, check_intr_ep1out
575    nop
576
577handle_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    //--------------------------------------------------------------
632check_intr_ep1out:
633    lhu $9, 0x04($27) // read INTROUT
634    andi $9, 0x2
635    beqz $9, check_status_next
636    nop
637
638handle_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
675check_status_next:
676    b usb_command_loop
677    nop
678
679//--------------------------------------------------------------
680// Device/Configuration/Interface/Endpoint/String Descriptors
681//--------------------------------------------------------------
682
683    .align 2
684device_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
705dev_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
718config_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
728intf_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
738ep1_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
746ep2_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
756config_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
766intf_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
776ep1_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
784ep2_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
794string_lang_ids:
795    .byte 0x04
796    .byte 0x03
797    .byte 0x09
798    .byte 0x04
799
800    .align 2
801string_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
820string_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
869cpu_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
878usbboot_end:
879
880    .set reorder
881

Archive Download this file



interactive