forked from mfulz_github/qmk_firmware
5025 lines
187 KiB
Plaintext
5025 lines
187 KiB
Plaintext
|
|
AudioInputHost.elf: file format elf32-avr
|
|
|
|
Sections:
|
|
Idx Name Size VMA LMA File off Algn
|
|
0 .data 0000001c 00800100 000018fa 0000198e 2**0
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
1 .text 000018fa 00000000 00000000 00000094 2**1
|
|
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
|
2 .bss 00000024 0080011c 0080011c 000019aa 2**0
|
|
ALLOC
|
|
3 .stab 00000e28 00000000 00000000 000019ac 2**2
|
|
CONTENTS, READONLY, DEBUGGING
|
|
4 .stabstr 0000026b 00000000 00000000 000027d4 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
5 .debug_aranges 000003b0 00000000 00000000 00002a3f 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
6 .debug_pubnames 0000089a 00000000 00000000 00002def 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
7 .debug_info 000056c7 00000000 00000000 00003689 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
8 .debug_abbrev 00001b65 00000000 00000000 00008d50 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
9 .debug_line 000053bf 00000000 00000000 0000a8b5 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
10 .debug_frame 00000540 00000000 00000000 0000fc74 2**2
|
|
CONTENTS, READONLY, DEBUGGING
|
|
11 .debug_str 000026bf 00000000 00000000 000101b4 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
12 .debug_loc 00003422 00000000 00000000 00012873 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
13 .debug_pubtypes 00000a86 00000000 00000000 00015c95 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
14 .debug_ranges 00000490 00000000 00000000 0001671b 2**0
|
|
CONTENTS, READONLY, DEBUGGING
|
|
|
|
Disassembly of section .text:
|
|
|
|
00000000 <__vectors>:
|
|
0: 51 c1 rjmp .+674 ; 0x2a4 <__ctors_end>
|
|
2: 00 00 nop
|
|
4: 6d c1 rjmp .+730 ; 0x2e0 <__bad_interrupt>
|
|
6: 00 00 nop
|
|
8: 6b c1 rjmp .+726 ; 0x2e0 <__bad_interrupt>
|
|
a: 00 00 nop
|
|
c: 69 c1 rjmp .+722 ; 0x2e0 <__bad_interrupt>
|
|
e: 00 00 nop
|
|
10: 67 c1 rjmp .+718 ; 0x2e0 <__bad_interrupt>
|
|
12: 00 00 nop
|
|
14: 65 c1 rjmp .+714 ; 0x2e0 <__bad_interrupt>
|
|
16: 00 00 nop
|
|
18: 63 c1 rjmp .+710 ; 0x2e0 <__bad_interrupt>
|
|
1a: 00 00 nop
|
|
1c: 61 c1 rjmp .+706 ; 0x2e0 <__bad_interrupt>
|
|
1e: 00 00 nop
|
|
20: 5f c1 rjmp .+702 ; 0x2e0 <__bad_interrupt>
|
|
22: 00 00 nop
|
|
24: 5d c1 rjmp .+698 ; 0x2e0 <__bad_interrupt>
|
|
26: 00 00 nop
|
|
28: d5 c6 rjmp .+3498 ; 0xdd4 <__vector_10>
|
|
2a: 00 00 nop
|
|
2c: 59 c1 rjmp .+690 ; 0x2e0 <__bad_interrupt>
|
|
2e: 00 00 nop
|
|
30: 57 c1 rjmp .+686 ; 0x2e0 <__bad_interrupt>
|
|
32: 00 00 nop
|
|
34: 55 c1 rjmp .+682 ; 0x2e0 <__bad_interrupt>
|
|
36: 00 00 nop
|
|
38: 53 c1 rjmp .+678 ; 0x2e0 <__bad_interrupt>
|
|
3a: 00 00 nop
|
|
3c: 51 c1 rjmp .+674 ; 0x2e0 <__bad_interrupt>
|
|
3e: 00 00 nop
|
|
40: 4f c1 rjmp .+670 ; 0x2e0 <__bad_interrupt>
|
|
42: 00 00 nop
|
|
44: 4d c1 rjmp .+666 ; 0x2e0 <__bad_interrupt>
|
|
46: 00 00 nop
|
|
48: 4b c1 rjmp .+662 ; 0x2e0 <__bad_interrupt>
|
|
4a: 00 00 nop
|
|
4c: 49 c1 rjmp .+658 ; 0x2e0 <__bad_interrupt>
|
|
4e: 00 00 nop
|
|
50: 47 c1 rjmp .+654 ; 0x2e0 <__bad_interrupt>
|
|
52: 00 00 nop
|
|
54: 8b c2 rjmp .+1302 ; 0x56c <__vector_21>
|
|
56: 00 00 nop
|
|
58: 43 c1 rjmp .+646 ; 0x2e0 <__bad_interrupt>
|
|
5a: 00 00 nop
|
|
5c: 41 c1 rjmp .+642 ; 0x2e0 <__bad_interrupt>
|
|
5e: 00 00 nop
|
|
60: 3f c1 rjmp .+638 ; 0x2e0 <__bad_interrupt>
|
|
62: 00 00 nop
|
|
64: 3d c1 rjmp .+634 ; 0x2e0 <__bad_interrupt>
|
|
66: 00 00 nop
|
|
68: 3b c1 rjmp .+630 ; 0x2e0 <__bad_interrupt>
|
|
6a: 00 00 nop
|
|
6c: 39 c1 rjmp .+626 ; 0x2e0 <__bad_interrupt>
|
|
6e: 00 00 nop
|
|
70: 37 c1 rjmp .+622 ; 0x2e0 <__bad_interrupt>
|
|
72: 00 00 nop
|
|
74: 35 c1 rjmp .+618 ; 0x2e0 <__bad_interrupt>
|
|
76: 00 00 nop
|
|
78: 33 c1 rjmp .+614 ; 0x2e0 <__bad_interrupt>
|
|
7a: 00 00 nop
|
|
7c: 31 c1 rjmp .+610 ; 0x2e0 <__bad_interrupt>
|
|
7e: 00 00 nop
|
|
80: 2f c1 rjmp .+606 ; 0x2e0 <__bad_interrupt>
|
|
82: 00 00 nop
|
|
84: 2d c1 rjmp .+602 ; 0x2e0 <__bad_interrupt>
|
|
86: 00 00 nop
|
|
88: 2b c1 rjmp .+598 ; 0x2e0 <__bad_interrupt>
|
|
8a: 00 00 nop
|
|
8c: 29 c1 rjmp .+594 ; 0x2e0 <__bad_interrupt>
|
|
8e: 00 00 nop
|
|
90: 27 c1 rjmp .+590 ; 0x2e0 <__bad_interrupt>
|
|
92: 00 00 nop
|
|
94: 25 c1 rjmp .+586 ; 0x2e0 <__bad_interrupt>
|
|
96: 00 00 nop
|
|
|
|
00000098 <__c.3939>:
|
|
98: 4d 69 63 72 6f 70 68 6f 6e 65 20 45 6e 75 6d 65 Microphone Enume
|
|
a8: 72 61 74 65 64 2e 0d 0a 00 rated....
|
|
|
|
000000b1 <__c.3935>:
|
|
b1: 1b 5b 33 31 6d 43 6f 75 6c 64 20 6e 6f 74 20 73 .[31mCould not s
|
|
c1: 65 74 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 et alternative s
|
|
d1: 74 72 65 61 6d 69 6e 67 20 69 6e 74 65 72 66 61 treaming interfa
|
|
e1: 63 65 20 73 65 74 74 69 6e 67 2e 0d 0a 20 2d 2d ce setting... --
|
|
f1: 20 45 72 72 6f 72 20 43 6f 64 65 3a 20 25 64 0d Error Code: %d.
|
|
101: 0a 1b 5b 33 37 6d 00 ..[37m.
|
|
|
|
00000108 <__c.3933>:
|
|
108: 1b 5b 33 31 6d 43 6f 6e 74 72 6f 6c 20 45 72 72 .[31mControl Err
|
|
118: 6f 72 20 28 53 65 74 20 43 6f 6e 66 69 67 75 72 or (Set Configur
|
|
128: 61 74 69 6f 6e 29 2e 0d 0a 20 2d 2d 20 45 72 72 ation)... -- Err
|
|
138: 6f 72 20 43 6f 64 65 3a 20 25 64 0d 0a 1b 5b 33 or Code: %d...[3
|
|
148: 37 6d 00 7m.
|
|
|
|
0000014b <__c.3930>:
|
|
14b: 20 2d 2d 20 45 72 72 6f 72 20 43 6f 64 65 3a 20 -- Error Code:
|
|
15b: 25 64 0d 0a 1b 5b 33 37 6d 00 %d...[37m.
|
|
|
|
00000165 <__c.3928>:
|
|
165: 1b 5b 33 31 6d 49 6e 76 61 6c 69 64 20 44 65 76 .[31mInvalid Dev
|
|
175: 69 63 65 2e 0d 0a 00 ice....
|
|
|
|
0000017c <__c.3926>:
|
|
17c: 1b 5b 33 31 6d 43 6f 6e 74 72 6f 6c 20 45 72 72 .[31mControl Err
|
|
18c: 6f 72 20 28 47 65 74 20 43 6f 6e 66 69 67 75 72 or (Get Configur
|
|
19c: 61 74 69 6f 6e 29 2e 0d 0a 00 ation)....
|
|
|
|
000001a6 <__c.3924>:
|
|
1a6: 47 65 74 74 69 6e 67 20 43 6f 6e 66 69 67 20 44 Getting Config D
|
|
1b6: 61 74 61 2e 0d 0a 00 ata....
|
|
|
|
000001bd <__c.3917>:
|
|
1bd: 1b 5b 33 31 6d 44 65 76 20 45 6e 75 6d 20 45 72 .[31mDev Enum Er
|
|
1cd: 72 6f 72 0d 0a 20 2d 2d 20 45 72 72 6f 72 20 43 ror.. -- Error C
|
|
1dd: 6f 64 65 20 25 64 0d 0a 20 2d 2d 20 53 75 62 20 ode %d.. -- Sub
|
|
1ed: 45 72 72 6f 72 20 43 6f 64 65 20 25 64 0d 0a 20 Error Code %d..
|
|
1fd: 2d 2d 20 49 6e 20 53 74 61 74 65 20 25 64 0d 0a -- In State %d..
|
|
20d: 1b 5b 33 37 6d 00 .[37m.
|
|
|
|
00000213 <__c.3910>:
|
|
213: 1b 5b 33 31 6d 48 6f 73 74 20 4d 6f 64 65 20 45 .[31mHost Mode E
|
|
223: 72 72 6f 72 0d 0a 20 2d 2d 20 45 72 72 6f 72 20 rror.. -- Error
|
|
233: 43 6f 64 65 20 25 64 0d 0a 1b 5b 33 37 6d 00 Code %d...[37m.
|
|
|
|
00000242 <__c.3902>:
|
|
242: 1b 5b 33 32 6d 44 65 76 69 63 65 20 55 6e 61 74 .[32mDevice Unat
|
|
252: 74 61 63 68 65 64 2e 0d 0a 1b 5b 33 37 6d 00 tached....[37m.
|
|
|
|
00000261 <__c.3897>:
|
|
261: 1b 5b 33 32 6d 44 65 76 69 63 65 20 41 74 74 61 .[32mDevice Atta
|
|
271: 63 68 65 64 2e 0d 0a 1b 5b 33 37 6d 00 ched....[37m.
|
|
|
|
0000027e <__c.3888>:
|
|
27e: 1b 5b 33 36 6d 41 75 64 69 6f 20 48 6f 73 74 20 .[36mAudio Host
|
|
28e: 44 65 6d 6f 20 72 75 6e 6e 69 6e 67 2e 0d 0a 1b Demo running....
|
|
29e: 5b 33 37 6d 00 00 [37m..
|
|
|
|
000002a4 <__ctors_end>:
|
|
2a4: 11 24 eor r1, r1
|
|
2a6: 1f be out 0x3f, r1 ; 63
|
|
2a8: cf ef ldi r28, 0xFF ; 255
|
|
2aa: d0 e2 ldi r29, 0x20 ; 32
|
|
2ac: de bf out 0x3e, r29 ; 62
|
|
2ae: cd bf out 0x3d, r28 ; 61
|
|
|
|
000002b0 <__do_copy_data>:
|
|
2b0: 11 e0 ldi r17, 0x01 ; 1
|
|
2b2: a0 e0 ldi r26, 0x00 ; 0
|
|
2b4: b1 e0 ldi r27, 0x01 ; 1
|
|
2b6: ea ef ldi r30, 0xFA ; 250
|
|
2b8: f8 e1 ldi r31, 0x18 ; 24
|
|
2ba: 00 e0 ldi r16, 0x00 ; 0
|
|
2bc: 0b bf out 0x3b, r16 ; 59
|
|
2be: 02 c0 rjmp .+4 ; 0x2c4 <__do_copy_data+0x14>
|
|
2c0: 07 90 elpm r0, Z+
|
|
2c2: 0d 92 st X+, r0
|
|
2c4: ac 31 cpi r26, 0x1C ; 28
|
|
2c6: b1 07 cpc r27, r17
|
|
2c8: d9 f7 brne .-10 ; 0x2c0 <__do_copy_data+0x10>
|
|
|
|
000002ca <__do_clear_bss>:
|
|
2ca: 11 e0 ldi r17, 0x01 ; 1
|
|
2cc: ac e1 ldi r26, 0x1C ; 28
|
|
2ce: b1 e0 ldi r27, 0x01 ; 1
|
|
2d0: 01 c0 rjmp .+2 ; 0x2d4 <.do_clear_bss_start>
|
|
|
|
000002d2 <.do_clear_bss_loop>:
|
|
2d2: 1d 92 st X+, r1
|
|
|
|
000002d4 <.do_clear_bss_start>:
|
|
2d4: a0 34 cpi r26, 0x40 ; 64
|
|
2d6: b1 07 cpc r27, r17
|
|
2d8: e1 f7 brne .-8 ; 0x2d2 <.do_clear_bss_loop>
|
|
2da: 3e d1 rcall .+636 ; 0x558 <main>
|
|
2dc: 0c 94 7b 0c jmp 0x18f6 ; 0x18f6 <_exit>
|
|
|
|
000002e0 <__bad_interrupt>:
|
|
2e0: 8f ce rjmp .-738 ; 0x0 <__vectors>
|
|
|
|
000002e2 <LEDs_SetAllLEDs>:
|
|
PORTD &= ~LEDMask;
|
|
}
|
|
|
|
static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
|
|
{
|
|
PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
|
|
2e2: 9b b1 in r25, 0x0b ; 11
|
|
2e4: 9f 70 andi r25, 0x0F ; 15
|
|
2e6: 98 2b or r25, r24
|
|
2e8: 9b b9 out 0x0b, r25 ; 11
|
|
}
|
|
2ea: 08 95 ret
|
|
|
|
000002ec <SetupHardware>:
|
|
|
|
/** Configures the board hardware and chip peripherals for the demo's functionality. */
|
|
void SetupHardware(void)
|
|
{
|
|
/* Disable watchdog if enabled by bootloader/fuses */
|
|
MCUSR &= ~(1 << WDRF);
|
|
2ec: 84 b7 in r24, 0x34 ; 52
|
|
2ee: 87 7f andi r24, 0xF7 ; 247
|
|
2f0: 84 bf out 0x34, r24 ; 52
|
|
wdt_disable();
|
|
2f2: 28 e1 ldi r18, 0x18 ; 24
|
|
2f4: 0f b6 in r0, 0x3f ; 63
|
|
2f6: f8 94 cli
|
|
2f8: 20 93 60 00 sts 0x0060, r18
|
|
2fc: 10 92 60 00 sts 0x0060, r1
|
|
300: 0f be out 0x3f, r0 ; 63
|
|
The type of x is clock_div_t.
|
|
*/
|
|
void clock_prescale_set(clock_div_t __x)
|
|
{
|
|
uint8_t __tmp = _BV(CLKPCE);
|
|
__asm__ __volatile__ (
|
|
302: 90 e0 ldi r25, 0x00 ; 0
|
|
304: 80 e8 ldi r24, 0x80 ; 128
|
|
306: 0f b6 in r0, 0x3f ; 63
|
|
308: f8 94 cli
|
|
30a: 80 93 61 00 sts 0x0061, r24
|
|
30e: 90 93 61 00 sts 0x0061, r25
|
|
312: 0f be out 0x3f, r0 ; 63
|
|
* \param[in] DoubleSpeed Enables double speed mode when set, halving the sample time to double the baud rate.
|
|
*/
|
|
static inline void Serial_Init(const uint32_t BaudRate,
|
|
const bool DoubleSpeed)
|
|
{
|
|
UBRR1 = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate));
|
|
314: 83 e3 ldi r24, 0x33 ; 51
|
|
316: 90 e0 ldi r25, 0x00 ; 0
|
|
318: 90 93 cd 00 sts 0x00CD, r25
|
|
31c: 80 93 cc 00 sts 0x00CC, r24
|
|
|
|
UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10));
|
|
320: 86 e0 ldi r24, 0x06 ; 6
|
|
322: 80 93 ca 00 sts 0x00CA, r24
|
|
UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0);
|
|
326: 10 92 c8 00 sts 0x00C8, r1
|
|
UCSR1B = ((1 << TXEN1) | (1 << RXEN1));
|
|
32a: 20 93 c9 00 sts 0x00C9, r18
|
|
|
|
DDRD |= (1 << 3);
|
|
32e: 53 9a sbi 0x0a, 3 ; 10
|
|
PORTD |= (1 << 2);
|
|
330: 5a 9a sbi 0x0b, 2 ; 11
|
|
|
|
/* Inline Functions: */
|
|
#if !defined(__DOXYGEN__)
|
|
static inline void LEDs_Init(void)
|
|
{
|
|
DDRD |= LEDS_ALL_LEDS;
|
|
332: 8a b1 in r24, 0x0a ; 10
|
|
334: 80 6f ori r24, 0xF0 ; 240
|
|
336: 8a b9 out 0x0a, r24 ; 10
|
|
PORTD &= ~LEDS_ALL_LEDS;
|
|
338: 8b b1 in r24, 0x0b ; 11
|
|
33a: 8f 70 andi r24, 0x0F ; 15
|
|
33c: 8b b9 out 0x0b, r24 ; 11
|
|
clock_prescale_set(clock_div_1);
|
|
|
|
/* Hardware Initialization */
|
|
Serial_Init(9600, false);
|
|
LEDs_Init();
|
|
USB_Init();
|
|
33e: 34 d5 rcall .+2664 ; 0xda8 <USB_Init>
|
|
static inline void Serial_CreateStream(FILE* Stream)
|
|
{
|
|
if (!(Stream))
|
|
{
|
|
Stream = &USARTSerialStream;
|
|
stdin = Stream;
|
|
340: ec e2 ldi r30, 0x2C ; 44
|
|
342: f1 e0 ldi r31, 0x01 ; 1
|
|
344: f0 93 3b 01 sts 0x013B, r31
|
|
348: e0 93 3a 01 sts 0x013A, r30
|
|
stdout = Stream;
|
|
34c: f0 93 3d 01 sts 0x013D, r31
|
|
350: e0 93 3c 01 sts 0x013C, r30
|
|
}
|
|
|
|
*Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW);
|
|
354: 8e e0 ldi r24, 0x0E ; 14
|
|
356: df 01 movw r26, r30
|
|
358: 1d 92 st X+, r1
|
|
35a: 8a 95 dec r24
|
|
35c: e9 f7 brne .-6 ; 0x358 <SetupHardware+0x6c>
|
|
35e: 83 e0 ldi r24, 0x03 ; 3
|
|
360: 80 93 2f 01 sts 0x012F, r24
|
|
364: 85 e6 ldi r24, 0x65 ; 101
|
|
366: 99 e0 ldi r25, 0x09 ; 9
|
|
368: 90 93 35 01 sts 0x0135, r25
|
|
36c: 80 93 34 01 sts 0x0134, r24
|
|
370: 8e e6 ldi r24, 0x6E ; 110
|
|
372: 99 e0 ldi r25, 0x09 ; 9
|
|
374: 90 93 37 01 sts 0x0137, r25
|
|
378: 80 93 36 01 sts 0x0136, r24
|
|
|
|
/* Create a stdio stream for the serial port for stdin and stdout */
|
|
Serial_CreateStream(NULL);
|
|
}
|
|
37c: 08 95 ret
|
|
|
|
0000037e <EVENT_USB_Host_DeviceAttached>:
|
|
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
|
|
* starts the library USB task to begin the enumeration and USB management process.
|
|
*/
|
|
void EVENT_USB_Host_DeviceAttached(void)
|
|
{
|
|
puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
|
|
37e: 81 e6 ldi r24, 0x61 ; 97
|
|
380: 92 e0 ldi r25, 0x02 ; 2
|
|
382: de d7 rcall .+4028 ; 0x1340 <puts_P>
|
|
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
|
|
384: 80 ea ldi r24, 0xA0 ; 160
|
|
}
|
|
386: ad cf rjmp .-166 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
|
|
00000388 <EVENT_USB_Host_DeviceUnattached>:
|
|
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
|
|
* stops the library USB task management process.
|
|
*/
|
|
void EVENT_USB_Host_DeviceUnattached(void)
|
|
{
|
|
puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));
|
|
388: 82 e4 ldi r24, 0x42 ; 66
|
|
38a: 92 e0 ldi r25, 0x02 ; 2
|
|
38c: d9 d7 rcall .+4018 ; 0x1340 <puts_P>
|
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
|
38e: 80 e1 ldi r24, 0x10 ; 16
|
|
}
|
|
390: a8 cf rjmp .-176 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
|
|
00000392 <EVENT_USB_Host_DeviceEnumerationComplete>:
|
|
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
|
|
* enumerated by the host and is now ready to be used by the application.
|
|
*/
|
|
void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
|
{
|
|
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
|
392: 80 e6 ldi r24, 0x60 ; 96
|
|
}
|
|
394: a6 cf rjmp .-180 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
|
|
00000396 <EVENT_USB_Host_HostError>:
|
|
|
|
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
|
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
|
|
{
|
|
396: df 93 push r29
|
|
398: cf 93 push r28
|
|
39a: 0f 92 push r0
|
|
39c: cd b7 in r28, 0x3d ; 61
|
|
39e: de b7 in r29, 0x3e ; 62
|
|
USB_Disable();
|
|
3a0: 89 83 std Y+1, r24 ; 0x01
|
|
3a2: 9c d4 rcall .+2360 ; 0xcdc <USB_Disable>
|
|
|
|
printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
|
|
3a4: 00 d0 rcall .+0 ; 0x3a6 <EVENT_USB_Host_HostError+0x10>
|
|
3a6: 00 d0 rcall .+0 ; 0x3a8 <EVENT_USB_Host_HostError+0x12>
|
|
3a8: ed b7 in r30, 0x3d ; 61
|
|
3aa: fe b7 in r31, 0x3e ; 62
|
|
3ac: 31 96 adiw r30, 0x01 ; 1
|
|
3ae: 23 e1 ldi r18, 0x13 ; 19
|
|
3b0: 32 e0 ldi r19, 0x02 ; 2
|
|
3b2: ad b7 in r26, 0x3d ; 61
|
|
3b4: be b7 in r27, 0x3e ; 62
|
|
3b6: 12 96 adiw r26, 0x02 ; 2
|
|
3b8: 3c 93 st X, r19
|
|
3ba: 2e 93 st -X, r18
|
|
3bc: 11 97 sbiw r26, 0x01 ; 1
|
|
3be: 89 81 ldd r24, Y+1 ; 0x01
|
|
3c0: 82 83 std Z+2, r24 ; 0x02
|
|
3c2: 13 82 std Z+3, r1 ; 0x03
|
|
3c4: 9e d7 rcall .+3900 ; 0x1302 <printf_P>
|
|
" -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
|
|
|
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
|
3c6: 0f 90 pop r0
|
|
3c8: 0f 90 pop r0
|
|
3ca: 0f 90 pop r0
|
|
3cc: 0f 90 pop r0
|
|
3ce: 80 e9 ldi r24, 0x90 ; 144
|
|
3d0: 88 df rcall .-240 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
3d2: ff cf rjmp .-2 ; 0x3d2 <EVENT_USB_Host_HostError+0x3c>
|
|
|
|
000003d4 <EVENT_USB_Host_DeviceEnumerationFailed>:
|
|
* enumerating an attached USB device.
|
|
*/
|
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
|
const uint8_t SubErrorCode)
|
|
{
|
|
printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
|
|
3d4: 90 91 2b 01 lds r25, 0x012B
|
|
3d8: 2d b7 in r18, 0x3d ; 61
|
|
3da: 3e b7 in r19, 0x3e ; 62
|
|
3dc: 28 50 subi r18, 0x08 ; 8
|
|
3de: 30 40 sbci r19, 0x00 ; 0
|
|
3e0: 0f b6 in r0, 0x3f ; 63
|
|
3e2: f8 94 cli
|
|
3e4: 3e bf out 0x3e, r19 ; 62
|
|
3e6: 0f be out 0x3f, r0 ; 63
|
|
3e8: 2d bf out 0x3d, r18 ; 61
|
|
3ea: ed b7 in r30, 0x3d ; 61
|
|
3ec: fe b7 in r31, 0x3e ; 62
|
|
3ee: 31 96 adiw r30, 0x01 ; 1
|
|
3f0: 2d eb ldi r18, 0xBD ; 189
|
|
3f2: 31 e0 ldi r19, 0x01 ; 1
|
|
3f4: ad b7 in r26, 0x3d ; 61
|
|
3f6: be b7 in r27, 0x3e ; 62
|
|
3f8: 12 96 adiw r26, 0x02 ; 2
|
|
3fa: 3c 93 st X, r19
|
|
3fc: 2e 93 st -X, r18
|
|
3fe: 11 97 sbiw r26, 0x01 ; 1
|
|
400: 82 83 std Z+2, r24 ; 0x02
|
|
402: 13 82 std Z+3, r1 ; 0x03
|
|
404: 64 83 std Z+4, r22 ; 0x04
|
|
406: 15 82 std Z+5, r1 ; 0x05
|
|
408: 96 83 std Z+6, r25 ; 0x06
|
|
40a: 17 82 std Z+7, r1 ; 0x07
|
|
40c: 7a d7 rcall .+3828 ; 0x1302 <printf_P>
|
|
" -- Error Code %d\r\n"
|
|
" -- Sub Error Code %d\r\n"
|
|
" -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
|
|
|
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
|
40e: 2d b7 in r18, 0x3d ; 61
|
|
410: 3e b7 in r19, 0x3e ; 62
|
|
412: 28 5f subi r18, 0xF8 ; 248
|
|
414: 3f 4f sbci r19, 0xFF ; 255
|
|
416: 0f b6 in r0, 0x3f ; 63
|
|
418: f8 94 cli
|
|
41a: 3e bf out 0x3e, r19 ; 62
|
|
41c: 0f be out 0x3f, r0 ; 63
|
|
41e: 2d bf out 0x3d, r18 ; 61
|
|
420: 80 e9 ldi r24, 0x90 ; 144
|
|
}
|
|
422: 5f cf rjmp .-322 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
|
|
00000424 <Audio_Task>:
|
|
|
|
void Audio_Task(void)
|
|
{
|
|
424: 1f 93 push r17
|
|
426: df 93 push r29
|
|
428: cf 93 push r28
|
|
42a: 00 d0 rcall .+0 ; 0x42c <Audio_Task+0x8>
|
|
42c: 0f 92 push r0
|
|
42e: cd b7 in r28, 0x3d ; 61
|
|
430: de b7 in r29, 0x3e ; 62
|
|
uint8_t ErrorCode;
|
|
|
|
switch (USB_HostState)
|
|
432: 80 91 2b 01 lds r24, 0x012B
|
|
436: 8b 30 cpi r24, 0x0B ; 11
|
|
438: 09 f0 breq .+2 ; 0x43c <Audio_Task+0x18>
|
|
43a: 87 c0 rjmp .+270 ; 0x54a <Audio_Task+0x126>
|
|
{
|
|
case HOST_STATE_Addressed:
|
|
puts_P(PSTR("Getting Config Data.\r\n"));
|
|
43c: 86 ea ldi r24, 0xA6 ; 166
|
|
43e: 91 e0 ldi r25, 0x01 ; 1
|
|
440: 7f d7 rcall .+3838 ; 0x1340 <puts_P>
|
|
|
|
/* Get and process the configuration descriptor data */
|
|
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
|
|
442: 30 d1 rcall .+608 ; 0x6a4 <ProcessConfigurationDescriptor>
|
|
444: 18 2f mov r17, r24
|
|
446: 88 23 and r24, r24
|
|
448: e9 f0 breq .+58 ; 0x484 <Audio_Task+0x60>
|
|
{
|
|
if (ErrorCode == ControlError)
|
|
44a: 81 30 cpi r24, 0x01 ; 1
|
|
44c: 19 f4 brne .+6 ; 0x454 <Audio_Task+0x30>
|
|
puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
|
|
44e: 8c e7 ldi r24, 0x7C ; 124
|
|
450: 91 e0 ldi r25, 0x01 ; 1
|
|
452: 02 c0 rjmp .+4 ; 0x458 <Audio_Task+0x34>
|
|
else
|
|
puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
|
|
454: 85 e6 ldi r24, 0x65 ; 101
|
|
456: 91 e0 ldi r25, 0x01 ; 1
|
|
458: 73 d7 rcall .+3814 ; 0x1340 <puts_P>
|
|
|
|
printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
|
|
45a: 00 d0 rcall .+0 ; 0x45c <Audio_Task+0x38>
|
|
45c: 00 d0 rcall .+0 ; 0x45e <Audio_Task+0x3a>
|
|
45e: ed b7 in r30, 0x3d ; 61
|
|
460: fe b7 in r31, 0x3e ; 62
|
|
462: 31 96 adiw r30, 0x01 ; 1
|
|
464: 2b e4 ldi r18, 0x4B ; 75
|
|
466: 31 e0 ldi r19, 0x01 ; 1
|
|
468: ad b7 in r26, 0x3d ; 61
|
|
46a: be b7 in r27, 0x3e ; 62
|
|
46c: 12 96 adiw r26, 0x02 ; 2
|
|
46e: 3c 93 st X, r19
|
|
470: 2e 93 st -X, r18
|
|
472: 11 97 sbiw r26, 0x01 ; 1
|
|
474: 12 83 std Z+2, r17 ; 0x02
|
|
476: 13 82 std Z+3, r1 ; 0x03
|
|
478: 44 d7 rcall .+3720 ; 0x1302 <printf_P>
|
|
|
|
/* Indicate error status */
|
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
|
47a: 0f 90 pop r0
|
|
47c: 0f 90 pop r0
|
|
47e: 0f 90 pop r0
|
|
480: 0f 90 pop r0
|
|
482: 4a c0 rjmp .+148 ; 0x518 <Audio_Task+0xf4>
|
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
|
break;
|
|
}
|
|
|
|
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
|
|
if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
|
|
484: 81 e0 ldi r24, 0x01 ; 1
|
|
486: 82 d3 rcall .+1796 ; 0xb8c <USB_Host_SetDeviceConfiguration>
|
|
488: 88 23 and r24, r24
|
|
48a: 41 f0 breq .+16 ; 0x49c <Audio_Task+0x78>
|
|
{
|
|
printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
|
|
48c: 00 d0 rcall .+0 ; 0x48e <Audio_Task+0x6a>
|
|
48e: 00 d0 rcall .+0 ; 0x490 <Audio_Task+0x6c>
|
|
490: ed b7 in r30, 0x3d ; 61
|
|
492: fe b7 in r31, 0x3e ; 62
|
|
494: 31 96 adiw r30, 0x01 ; 1
|
|
496: 28 e0 ldi r18, 0x08 ; 8
|
|
498: 31 e0 ldi r19, 0x01 ; 1
|
|
49a: 0e c0 rjmp .+28 ; 0x4b8 <Audio_Task+0x94>
|
|
/* Wait until USB device disconnected */
|
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
|
break;
|
|
}
|
|
|
|
if ((ErrorCode = USB_Host_SetInterfaceAltSetting(StreamingInterfaceIndex,
|
|
49c: 80 91 1c 01 lds r24, 0x011C
|
|
4a0: 60 91 1d 01 lds r22, 0x011D
|
|
4a4: 89 d3 rcall .+1810 ; 0xbb8 <USB_Host_SetInterfaceAltSetting>
|
|
4a6: 88 23 and r24, r24
|
|
4a8: 79 f0 breq .+30 ; 0x4c8 <Audio_Task+0xa4>
|
|
StreamingInterfaceAltSetting)) != HOST_SENDCONTROL_Successful)
|
|
{
|
|
printf_P(PSTR(ESC_FG_RED "Could not set alternative streaming interface setting.\r\n"
|
|
4aa: 00 d0 rcall .+0 ; 0x4ac <Audio_Task+0x88>
|
|
4ac: 00 d0 rcall .+0 ; 0x4ae <Audio_Task+0x8a>
|
|
4ae: ed b7 in r30, 0x3d ; 61
|
|
4b0: fe b7 in r31, 0x3e ; 62
|
|
4b2: 31 96 adiw r30, 0x01 ; 1
|
|
4b4: 21 eb ldi r18, 0xB1 ; 177
|
|
4b6: 30 e0 ldi r19, 0x00 ; 0
|
|
4b8: ad b7 in r26, 0x3d ; 61
|
|
4ba: be b7 in r27, 0x3e ; 62
|
|
4bc: 12 96 adiw r26, 0x02 ; 2
|
|
4be: 3c 93 st X, r19
|
|
4c0: 2e 93 st -X, r18
|
|
4c2: 11 97 sbiw r26, 0x01 ; 1
|
|
4c4: 82 83 std Z+2, r24 ; 0x02
|
|
4c6: d7 cf rjmp .-82 ; 0x476 <Audio_Task+0x52>
|
|
/* Wait until USB device disconnected */
|
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
|
break;
|
|
}
|
|
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
4c8: 20 91 1e 01 lds r18, 0x011E
|
|
4cc: 82 e2 ldi r24, 0x22 ; 34
|
|
4ce: 80 93 23 01 sts 0x0123, r24
|
|
4d2: 81 e0 ldi r24, 0x01 ; 1
|
|
4d4: 80 93 24 01 sts 0x0124, r24
|
|
4d8: 80 e0 ldi r24, 0x00 ; 0
|
|
4da: 91 e0 ldi r25, 0x01 ; 1
|
|
4dc: 90 93 26 01 sts 0x0126, r25
|
|
4e0: 80 93 25 01 sts 0x0125, r24
|
|
4e4: 20 93 27 01 sts 0x0127, r18
|
|
4e8: 10 92 28 01 sts 0x0128, r1
|
|
4ec: 83 e0 ldi r24, 0x03 ; 3
|
|
4ee: 90 e0 ldi r25, 0x00 ; 0
|
|
4f0: 90 93 2a 01 sts 0x012A, r25
|
|
4f4: 80 93 29 01 sts 0x0129, r24
|
|
.wValue = 0x0100,
|
|
.wIndex = StreamingEndpointAddress,
|
|
.wLength = sizeof(USB_Audio_SampleFreq_t),
|
|
};
|
|
|
|
USB_Audio_SampleFreq_t SampleRate = AUDIO_SAMPLE_FREQ(48000);
|
|
4f8: de 01 movw r26, r28
|
|
4fa: 11 96 adiw r26, 0x01 ; 1
|
|
4fc: e0 e0 ldi r30, 0x00 ; 0
|
|
4fe: f1 e0 ldi r31, 0x01 ; 1
|
|
500: 83 e0 ldi r24, 0x03 ; 3
|
|
502: 01 90 ld r0, Z+
|
|
504: 0d 92 st X+, r0
|
|
506: 81 50 subi r24, 0x01 ; 1
|
|
508: e1 f7 brne .-8 ; 0x502 <Audio_Task+0xde>
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
50a: 10 92 a7 00 sts 0x00A7, r1
|
|
|
|
/* Select the control pipe for the request transfer */
|
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
|
|
|
/* Set the sample rate on the streaming interface endpoint */
|
|
if ((ErrorCode = USB_Host_SendControlRequest(&SampleRate)) != HOST_SENDCONTROL_Successful)
|
|
50e: ce 01 movw r24, r28
|
|
510: 01 96 adiw r24, 0x01 ; 1
|
|
512: b7 d5 rcall .+2926 ; 0x1082 <USB_Host_SendControlRequest>
|
|
514: 88 23 and r24, r24
|
|
516: 29 f0 breq .+10 ; 0x522 <Audio_Task+0xfe>
|
|
{
|
|
/* Indicate error status */
|
|
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
|
518: 80 e9 ldi r24, 0x90 ; 144
|
|
51a: e3 de rcall .-570 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
|
|
/* Wait until USB device disconnected */
|
|
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
|
51c: 10 92 2b 01 sts 0x012B, r1
|
|
break;
|
|
520: 14 c0 rjmp .+40 ; 0x54a <Audio_Task+0x126>
|
|
}
|
|
|
|
/* Sample reload timer initialization */
|
|
TIMSK0 = (1 << OCIE0A);
|
|
522: 82 e0 ldi r24, 0x02 ; 2
|
|
524: 80 93 6e 00 sts 0x006E, r24
|
|
OCR0A = ((F_CPU / 8 / 8000) - 1);
|
|
528: 9c e7 ldi r25, 0x7C ; 124
|
|
52a: 97 bd out 0x27, r25 ; 39
|
|
TCCR0A = (1 << WGM01); // CTC mode
|
|
52c: 84 bd out 0x24, r24 ; 36
|
|
TCCR0B = (1 << CS01); // Fcpu/8 speed
|
|
52e: 85 bd out 0x25, r24 ; 37
|
|
|
|
/* Set speaker as output */
|
|
DDRC |= (1 << 6);
|
|
530: 3e 9a sbi 0x07, 6 ; 7
|
|
|
|
/* PWM speaker timer initialization */
|
|
TCCR3A = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0)
|
|
532: 81 ef ldi r24, 0xF1 ; 241
|
|
534: 80 93 90 00 sts 0x0090, r24
|
|
| (1 << COM3B1) | (1 << COM3B0)); // Set on match, clear on TOP
|
|
TCCR3B = ((1 << WGM32) | (1 << CS30)); // Fast 8-Bit PWM, F_CPU speed
|
|
538: 89 e0 ldi r24, 0x09 ; 9
|
|
53a: 80 93 91 00 sts 0x0091, r24
|
|
|
|
puts_P(PSTR("Microphone Enumerated.\r\n"));
|
|
53e: 88 e9 ldi r24, 0x98 ; 152
|
|
540: 90 e0 ldi r25, 0x00 ; 0
|
|
542: fe d6 rcall .+3580 ; 0x1340 <puts_P>
|
|
|
|
USB_HostState = HOST_STATE_Configured;
|
|
544: 8c e0 ldi r24, 0x0C ; 12
|
|
546: 80 93 2b 01 sts 0x012B, r24
|
|
break;
|
|
case HOST_STATE_Configured:
|
|
break;
|
|
}
|
|
}
|
|
54a: 0f 90 pop r0
|
|
54c: 0f 90 pop r0
|
|
54e: 0f 90 pop r0
|
|
550: cf 91 pop r28
|
|
552: df 91 pop r29
|
|
554: 1f 91 pop r17
|
|
556: 08 95 ret
|
|
|
|
00000558 <main>:
|
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
|
* enters a loop to run the application tasks in sequence.
|
|
*/
|
|
int main(void)
|
|
{
|
|
SetupHardware();
|
|
558: c9 de rcall .-622 ; 0x2ec <SetupHardware>
|
|
|
|
puts_P(PSTR(ESC_FG_CYAN "Audio Host Demo running.\r\n" ESC_FG_WHITE));
|
|
55a: 8e e7 ldi r24, 0x7E ; 126
|
|
55c: 92 e0 ldi r25, 0x02 ; 2
|
|
55e: f0 d6 rcall .+3552 ; 0x1340 <puts_P>
|
|
|
|
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
|
560: 80 e1 ldi r24, 0x10 ; 16
|
|
562: bf de rcall .-642 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
sei();
|
|
564: 78 94 sei
|
|
|
|
for (;;)
|
|
{
|
|
Audio_Task();
|
|
566: 5e df rcall .-324 ; 0x424 <Audio_Task>
|
|
USB_USBTask();
|
|
568: a2 d6 rcall .+3396 ; 0x12ae <USB_USBTask>
|
|
56a: fd cf rjmp .-6 ; 0x566 <main+0xe>
|
|
|
|
0000056c <__vector_21>:
|
|
}
|
|
}
|
|
|
|
/** ISR to handle the reloading of the PWM timer with the next sample. */
|
|
ISR(TIMER0_COMPA_vect, ISR_BLOCK)
|
|
{
|
|
56c: 1f 92 push r1
|
|
56e: 0f 92 push r0
|
|
570: 0f b6 in r0, 0x3f ; 63
|
|
572: 0f 92 push r0
|
|
574: 0b b6 in r0, 0x3b ; 59
|
|
576: 0f 92 push r0
|
|
578: 11 24 eor r1, r1
|
|
57a: 1f 93 push r17
|
|
57c: 2f 93 push r18
|
|
57e: 3f 93 push r19
|
|
580: 4f 93 push r20
|
|
582: 5f 93 push r21
|
|
584: 6f 93 push r22
|
|
586: 7f 93 push r23
|
|
588: 8f 93 push r24
|
|
58a: 9f 93 push r25
|
|
58c: af 93 push r26
|
|
58e: bf 93 push r27
|
|
590: ef 93 push r30
|
|
592: ff 93 push r31
|
|
* \return Index of the currently selected pipe.
|
|
*/
|
|
static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline uint8_t Pipe_GetCurrentPipe(void)
|
|
{
|
|
return (UPNUM & PIPE_PIPENUM_MASK);
|
|
594: 10 91 a7 00 lds r17, 0x00A7
|
|
598: 17 70 andi r17, 0x07 ; 7
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
59a: 81 e0 ldi r24, 0x01 ; 1
|
|
59c: 80 93 a7 00 sts 0x00A7, r24
|
|
|
|
/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
|
|
static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Unfreeze(void)
|
|
{
|
|
UPCONX &= ~(1 << PFREEZE);
|
|
5a0: 80 91 a9 00 lds r24, 0x00A9
|
|
5a4: 8f 7b andi r24, 0xBF ; 191
|
|
5a6: 80 93 a9 00 sts 0x00A9, r24
|
|
* \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsINReceived(void)
|
|
{
|
|
return ((UPINTX & (1 << RXINI)) ? true : false);
|
|
5aa: 80 91 a6 00 lds r24, 0x00A6
|
|
|
|
Pipe_SelectPipe(AUDIO_DATA_IN_PIPE);
|
|
Pipe_Unfreeze();
|
|
|
|
/* Check if the current pipe can be read from (contains a packet) and the device is sending data */
|
|
if (Pipe_IsINReceived())
|
|
5ae: 80 ff sbrs r24, 0
|
|
5b0: 2b c0 rjmp .+86 ; 0x608 <__vector_21+0x9c>
|
|
{
|
|
uint16_t Value;
|
|
uint8_t Bytes[2];
|
|
} Data;
|
|
|
|
Data.Bytes[0] = UPDATX;
|
|
5b2: 80 91 af 00 lds r24, 0x00AF
|
|
Data.Bytes[1] = UPDATX;
|
|
5b6: 40 91 af 00 lds r20, 0x00AF
|
|
* on its direction.
|
|
*/
|
|
static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsReadWriteAllowed(void)
|
|
{
|
|
return ((UPINTX & (1 << RWAL)) ? true : false);
|
|
5ba: 80 91 a6 00 lds r24, 0x00A6
|
|
{
|
|
/* Retrieve the signed 16-bit audio sample, convert to 8-bit */
|
|
int8_t Sample_8Bit = (Pipe_Read_16_LE() >> 8);
|
|
|
|
/* Check to see if the bank is now empty */
|
|
if (!(Pipe_IsReadWriteAllowed()))
|
|
5be: 85 fd sbrc r24, 5
|
|
5c0: 05 c0 rjmp .+10 ; 0x5cc <__vector_21+0x60>
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearIN(void)
|
|
{
|
|
UPINTX &= ~((1 << RXINI) | (1 << FIFOCON));
|
|
5c2: 80 91 a6 00 lds r24, 0x00A6
|
|
5c6: 8e 77 andi r24, 0x7E ; 126
|
|
5c8: 80 93 a6 00 sts 0x00A6, r24
|
|
/* Acknowledge the packet, clear the bank ready for the next packet */
|
|
Pipe_ClearIN();
|
|
}
|
|
|
|
/* Load the sample into the PWM timer channel */
|
|
OCR3A = (Sample_8Bit ^ (1 << 7));
|
|
5cc: 84 2f mov r24, r20
|
|
5ce: 99 27 eor r25, r25
|
|
5d0: 87 fd sbrc r24, 7
|
|
5d2: 90 95 com r25
|
|
5d4: 20 e8 ldi r18, 0x80 ; 128
|
|
5d6: 30 e0 ldi r19, 0x00 ; 0
|
|
5d8: 82 27 eor r24, r18
|
|
5da: 93 27 eor r25, r19
|
|
5dc: 90 93 99 00 sts 0x0099, r25
|
|
5e0: 80 93 98 00 sts 0x0098, r24
|
|
|
|
uint8_t LEDMask = LEDS_NO_LEDS;
|
|
|
|
/* Turn on LEDs as the sample amplitude increases */
|
|
if (Sample_8Bit > 16)
|
|
5e4: 41 31 cpi r20, 0x11 ; 17
|
|
5e6: 44 f4 brge .+16 ; 0x5f8 <__vector_21+0x8c>
|
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
|
|
else if (Sample_8Bit > 8)
|
|
5e8: 49 30 cpi r20, 0x09 ; 9
|
|
5ea: 44 f4 brge .+16 ; 0x5fc <__vector_21+0x90>
|
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
|
|
else if (Sample_8Bit > 4)
|
|
5ec: 45 30 cpi r20, 0x05 ; 5
|
|
5ee: 44 f4 brge .+16 ; 0x600 <__vector_21+0x94>
|
|
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
|
else if (Sample_8Bit > 2)
|
|
5f0: 43 30 cpi r20, 0x03 ; 3
|
|
5f2: 44 f4 brge .+16 ; 0x604 <__vector_21+0x98>
|
|
}
|
|
|
|
/* Load the sample into the PWM timer channel */
|
|
OCR3A = (Sample_8Bit ^ (1 << 7));
|
|
|
|
uint8_t LEDMask = LEDS_NO_LEDS;
|
|
5f4: 80 e0 ldi r24, 0x00 ; 0
|
|
5f6: 07 c0 rjmp .+14 ; 0x606 <__vector_21+0x9a>
|
|
|
|
/* Turn on LEDs as the sample amplitude increases */
|
|
if (Sample_8Bit > 16)
|
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4);
|
|
5f8: 80 ef ldi r24, 0xF0 ; 240
|
|
5fa: 05 c0 rjmp .+10 ; 0x606 <__vector_21+0x9a>
|
|
else if (Sample_8Bit > 8)
|
|
LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3);
|
|
5fc: 80 eb ldi r24, 0xB0 ; 176
|
|
5fe: 03 c0 rjmp .+6 ; 0x606 <__vector_21+0x9a>
|
|
else if (Sample_8Bit > 4)
|
|
LEDMask = (LEDS_LED1 | LEDS_LED2);
|
|
600: 80 e3 ldi r24, 0x30 ; 48
|
|
602: 01 c0 rjmp .+2 ; 0x606 <__vector_21+0x9a>
|
|
else if (Sample_8Bit > 2)
|
|
LEDMask = (LEDS_LED1);
|
|
604: 80 e1 ldi r24, 0x10 ; 16
|
|
|
|
LEDs_SetAllLEDs(LEDMask);
|
|
606: 6d de rcall .-806 ; 0x2e2 <LEDs_SetAllLEDs>
|
|
|
|
/** Freezes the selected pipe, preventing it from communicating with an attached device. */
|
|
static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Freeze(void)
|
|
{
|
|
UPCONX |= (1 << PFREEZE);
|
|
608: 80 91 a9 00 lds r24, 0x00A9
|
|
60c: 80 64 ori r24, 0x40 ; 64
|
|
60e: 80 93 a9 00 sts 0x00A9, r24
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
612: 10 93 a7 00 sts 0x00A7, r17
|
|
}
|
|
|
|
Pipe_Freeze();
|
|
|
|
Pipe_SelectPipe(PrevPipe);
|
|
}
|
|
616: ff 91 pop r31
|
|
618: ef 91 pop r30
|
|
61a: bf 91 pop r27
|
|
61c: af 91 pop r26
|
|
61e: 9f 91 pop r25
|
|
620: 8f 91 pop r24
|
|
622: 7f 91 pop r23
|
|
624: 6f 91 pop r22
|
|
626: 5f 91 pop r21
|
|
628: 4f 91 pop r20
|
|
62a: 3f 91 pop r19
|
|
62c: 2f 91 pop r18
|
|
62e: 1f 91 pop r17
|
|
630: 0f 90 pop r0
|
|
632: 0b be out 0x3b, r0 ; 59
|
|
634: 0f 90 pop r0
|
|
636: 0f be out 0x3f, r0 ; 63
|
|
638: 0f 90 pop r0
|
|
63a: 1f 90 pop r1
|
|
63c: 18 95 reti
|
|
|
|
0000063e <DComp_NextAudioControlInterface>:
|
|
/* Valid data found, return success */
|
|
return SuccessfulConfigRead;
|
|
}
|
|
|
|
uint8_t DComp_NextAudioControlInterface(void* CurrentDescriptor)
|
|
{
|
|
63e: fc 01 movw r30, r24
|
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
|
|
|
if (Header->Type == DTYPE_Interface)
|
|
640: 81 81 ldd r24, Z+1 ; 0x01
|
|
642: 84 30 cpi r24, 0x04 ; 4
|
|
644: 49 f4 brne .+18 ; 0x658 <DComp_NextAudioControlInterface+0x1a>
|
|
{
|
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
|
|
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
|
646: 85 81 ldd r24, Z+5 ; 0x05
|
|
648: 81 30 cpi r24, 0x01 ; 1
|
|
64a: 31 f4 brne .+12 ; 0x658 <DComp_NextAudioControlInterface+0x1a>
|
|
64c: 86 81 ldd r24, Z+6 ; 0x06
|
|
64e: 81 30 cpi r24, 0x01 ; 1
|
|
650: 19 f4 brne .+6 ; 0x658 <DComp_NextAudioControlInterface+0x1a>
|
|
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
|
652: 87 81 ldd r24, Z+7 ; 0x07
|
|
654: 88 23 and r24, r24
|
|
656: 11 f0 breq .+4 ; 0x65c <DComp_NextAudioControlInterface+0x1e>
|
|
{
|
|
return DESCRIPTOR_SEARCH_Found;
|
|
}
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_NotFound;
|
|
658: 82 e0 ldi r24, 0x02 ; 2
|
|
65a: 08 95 ret
|
|
|
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
|
(Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
|
|
(Interface->Protocol == AUDIO_CSCP_ControlProtocol))
|
|
{
|
|
return DESCRIPTOR_SEARCH_Found;
|
|
65c: 80 e0 ldi r24, 0x00 ; 0
|
|
}
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_NotFound;
|
|
}
|
|
65e: 08 95 ret
|
|
|
|
00000660 <DComp_NextAudioStreamInterface>:
|
|
|
|
uint8_t DComp_NextAudioStreamInterface(void* CurrentDescriptor)
|
|
{
|
|
660: fc 01 movw r30, r24
|
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
|
|
|
if (Header->Type == DTYPE_Interface)
|
|
662: 81 81 ldd r24, Z+1 ; 0x01
|
|
664: 84 30 cpi r24, 0x04 ; 4
|
|
666: 49 f4 brne .+18 ; 0x67a <DComp_NextAudioStreamInterface+0x1a>
|
|
{
|
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
|
|
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
|
668: 85 81 ldd r24, Z+5 ; 0x05
|
|
66a: 81 30 cpi r24, 0x01 ; 1
|
|
66c: 31 f4 brne .+12 ; 0x67a <DComp_NextAudioStreamInterface+0x1a>
|
|
66e: 86 81 ldd r24, Z+6 ; 0x06
|
|
670: 82 30 cpi r24, 0x02 ; 2
|
|
672: 19 f4 brne .+6 ; 0x67a <DComp_NextAudioStreamInterface+0x1a>
|
|
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
|
674: 87 81 ldd r24, Z+7 ; 0x07
|
|
676: 88 23 and r24, r24
|
|
678: 11 f0 breq .+4 ; 0x67e <DComp_NextAudioStreamInterface+0x1e>
|
|
{
|
|
return DESCRIPTOR_SEARCH_Found;
|
|
}
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_NotFound;
|
|
67a: 82 e0 ldi r24, 0x02 ; 2
|
|
67c: 08 95 ret
|
|
|
|
if ((Interface->Class == AUDIO_CSCP_AudioClass) &&
|
|
(Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
|
|
(Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
|
|
{
|
|
return DESCRIPTOR_SEARCH_Found;
|
|
67e: 80 e0 ldi r24, 0x00 ; 0
|
|
}
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_NotFound;
|
|
}
|
|
680: 08 95 ret
|
|
|
|
00000682 <DComp_NextAudioInterfaceDataEndpoint>:
|
|
|
|
uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
|
|
{
|
|
682: fc 01 movw r30, r24
|
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
|
|
|
if (Header->Type == DTYPE_Endpoint)
|
|
684: 81 81 ldd r24, Z+1 ; 0x01
|
|
686: 85 30 cpi r24, 0x05 ; 5
|
|
688: 29 f4 brne .+10 ; 0x694 <DComp_NextAudioInterfaceDataEndpoint+0x12>
|
|
{
|
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
|
|
|
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
|
68a: 83 81 ldd r24, Z+3 ; 0x03
|
|
68c: 83 70 andi r24, 0x03 ; 3
|
|
68e: 81 30 cpi r24, 0x01 ; 1
|
|
690: 19 f4 brne .+6 ; 0x698 <DComp_NextAudioInterfaceDataEndpoint+0x16>
|
|
692: 04 c0 rjmp .+8 ; 0x69c <DComp_NextAudioInterfaceDataEndpoint+0x1a>
|
|
return DESCRIPTOR_SEARCH_Found;
|
|
}
|
|
else if (Header->Type == DTYPE_Interface)
|
|
694: 84 30 cpi r24, 0x04 ; 4
|
|
696: 21 f0 breq .+8 ; 0x6a0 <DComp_NextAudioInterfaceDataEndpoint+0x1e>
|
|
{
|
|
return DESCRIPTOR_SEARCH_Fail;
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_NotFound;
|
|
698: 82 e0 ldi r24, 0x02 ; 2
|
|
69a: 08 95 ret
|
|
if (Header->Type == DTYPE_Endpoint)
|
|
{
|
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
|
|
|
if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
|
|
return DESCRIPTOR_SEARCH_Found;
|
|
69c: 80 e0 ldi r24, 0x00 ; 0
|
|
69e: 08 95 ret
|
|
}
|
|
else if (Header->Type == DTYPE_Interface)
|
|
{
|
|
return DESCRIPTOR_SEARCH_Fail;
|
|
6a0: 81 e0 ldi r24, 0x01 ; 1
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_NotFound;
|
|
}
|
|
6a2: 08 95 ret
|
|
|
|
000006a4 <ProcessConfigurationDescriptor>:
|
|
uint8_t StreamingInterfaceIndex = 0;
|
|
uint8_t StreamingInterfaceAltSetting = 0;
|
|
uint8_t StreamingEndpointAddress = 0;
|
|
|
|
uint8_t ProcessConfigurationDescriptor(void)
|
|
{
|
|
6a4: af 92 push r10
|
|
6a6: bf 92 push r11
|
|
6a8: cf 92 push r12
|
|
6aa: df 92 push r13
|
|
6ac: ef 92 push r14
|
|
6ae: ff 92 push r15
|
|
6b0: 0f 93 push r16
|
|
6b2: 1f 93 push r17
|
|
6b4: df 93 push r29
|
|
6b6: cf 93 push r28
|
|
6b8: cd b7 in r28, 0x3d ; 61
|
|
6ba: de b7 in r29, 0x3e ; 62
|
|
6bc: c4 50 subi r28, 0x04 ; 4
|
|
6be: d2 40 sbci r29, 0x02 ; 2
|
|
6c0: 0f b6 in r0, 0x3f ; 63
|
|
6c2: f8 94 cli
|
|
6c4: de bf out 0x3e, r29 ; 62
|
|
6c6: 0f be out 0x3f, r0 ; 63
|
|
6c8: cd bf out 0x3d, r28 ; 61
|
|
uint8_t ConfigDescriptorData[512];
|
|
void* CurrConfigLocation = ConfigDescriptorData;
|
|
6ca: ae 01 movw r20, r28
|
|
6cc: 4b 5f subi r20, 0xFB ; 251
|
|
6ce: 5f 4f sbci r21, 0xFF ; 255
|
|
6d0: 5a 83 std Y+2, r21 ; 0x02
|
|
6d2: 49 83 std Y+1, r20 ; 0x01
|
|
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
|
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
|
|
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
|
6d4: 23 e0 ldi r18, 0x03 ; 3
|
|
6d6: e2 2e mov r14, r18
|
|
6d8: f1 2c mov r15, r1
|
|
6da: ec 0e add r14, r28
|
|
6dc: fd 1e adc r15, r29
|
|
6de: 81 e0 ldi r24, 0x01 ; 1
|
|
6e0: b7 01 movw r22, r14
|
|
6e2: 20 e0 ldi r18, 0x00 ; 0
|
|
6e4: 32 e0 ldi r19, 0x02 ; 2
|
|
6e6: 09 d4 rcall .+2066 ; 0xefa <USB_Host_GetDeviceConfigDescriptor>
|
|
6e8: 85 30 cpi r24, 0x05 ; 5
|
|
6ea: 09 f4 brne .+2 ; 0x6ee <ProcessConfigurationDescriptor+0x4a>
|
|
6ec: 5c c0 rjmp .+184 ; 0x7a6 <ProcessConfigurationDescriptor+0x102>
|
|
6ee: 86 30 cpi r24, 0x06 ; 6
|
|
6f0: 61 f0 breq .+24 ; 0x70a <ProcessConfigurationDescriptor+0x66>
|
|
6f2: 88 23 and r24, r24
|
|
6f4: 61 f4 brne .+24 ; 0x70e <ProcessConfigurationDescriptor+0x6a>
|
|
6f6: 00 e0 ldi r16, 0x00 ; 0
|
|
6f8: 10 e0 ldi r17, 0x00 ; 0
|
|
6fa: cc 24 eor r12, r12
|
|
6fc: dd 24 eor r13, r13
|
|
6fe: 57 01 movw r10, r14
|
|
700: 7e 01 movw r14, r28
|
|
702: 08 94 sec
|
|
704: e1 1c adc r14, r1
|
|
706: f1 1c adc r15, r1
|
|
708: 07 c0 rjmp .+14 ; 0x718 <ProcessConfigurationDescriptor+0x74>
|
|
{
|
|
case HOST_GETCONFIG_Successful:
|
|
break;
|
|
case HOST_GETCONFIG_InvalidData:
|
|
return InvalidConfigDataReturned;
|
|
70a: 83 e0 ldi r24, 0x03 ; 3
|
|
70c: 4f c0 rjmp .+158 ; 0x7ac <ProcessConfigurationDescriptor+0x108>
|
|
case HOST_GETCONFIG_BuffOverflow:
|
|
return DescriptorTooLarge;
|
|
default:
|
|
return ControlError;
|
|
70e: 81 e0 ldi r24, 0x01 ; 1
|
|
710: 4d c0 rjmp .+154 ; 0x7ac <ProcessConfigurationDescriptor+0x108>
|
|
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
|
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
|
|
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
|
712: 9c 01 movw r18, r24
|
|
714: 03 2f mov r16, r19
|
|
716: 18 2f mov r17, r24
|
|
return ControlError;
|
|
}
|
|
|
|
while (!(DataINEndpoint))
|
|
{
|
|
if (!(AudioControlInterface) ||
|
|
718: c1 14 cp r12, r1
|
|
71a: d1 04 cpc r13, r1
|
|
71c: 41 f0 breq .+16 ; 0x72e <ProcessConfigurationDescriptor+0x8a>
|
|
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
|
71e: c5 01 movw r24, r10
|
|
720: b7 01 movw r22, r14
|
|
722: 41 e4 ldi r20, 0x41 ; 65
|
|
724: 53 e0 ldi r21, 0x03 ; 3
|
|
726: 40 d4 rcall .+2176 ; 0xfa8 <USB_GetNextDescriptorComp>
|
|
return ControlError;
|
|
}
|
|
|
|
while (!(DataINEndpoint))
|
|
{
|
|
if (!(AudioControlInterface) ||
|
|
728: 88 23 and r24, r24
|
|
72a: 51 f4 brne .+20 ; 0x740 <ProcessConfigurationDescriptor+0x9c>
|
|
72c: 1c c0 rjmp .+56 ; 0x766 <ProcessConfigurationDescriptor+0xc2>
|
|
USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
|
DComp_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
|
{
|
|
if (!(AudioControlInterface))
|
|
{
|
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
|
72e: c5 01 movw r24, r10
|
|
730: b7 01 movw r22, r14
|
|
732: 4f e1 ldi r20, 0x1F ; 31
|
|
734: 53 e0 ldi r21, 0x03 ; 3
|
|
736: 38 d4 rcall .+2160 ; 0xfa8 <USB_GetNextDescriptorComp>
|
|
738: 88 23 and r24, r24
|
|
73a: b9 f5 brne .+110 ; 0x7aa <ProcessConfigurationDescriptor+0x106>
|
|
/* Descriptor not found, error out */
|
|
return NoCompatibleInterfaceFound;
|
|
}
|
|
|
|
/* Save the interface in case we need to refer back to it later */
|
|
AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
|
73c: c9 80 ldd r12, Y+1 ; 0x01
|
|
73e: da 80 ldd r13, Y+2 ; 0x02
|
|
}
|
|
|
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
|
740: c5 01 movw r24, r10
|
|
742: b7 01 movw r22, r14
|
|
744: 40 e3 ldi r20, 0x30 ; 48
|
|
746: 53 e0 ldi r21, 0x03 ; 3
|
|
748: 2f d4 rcall .+2142 ; 0xfa8 <USB_GetNextDescriptorComp>
|
|
74a: 88 23 and r24, r24
|
|
74c: 49 f0 breq .+18 ; 0x760 <ProcessConfigurationDescriptor+0xbc>
|
|
DComp_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
|
{
|
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
|
74e: c5 01 movw r24, r10
|
|
750: b7 01 movw r22, r14
|
|
752: 4f e1 ldi r20, 0x1F ; 31
|
|
754: 53 e0 ldi r21, 0x03 ; 3
|
|
756: 28 d4 rcall .+2128 ; 0xfa8 <USB_GetNextDescriptorComp>
|
|
758: 88 23 and r24, r24
|
|
75a: 39 f5 brne .+78 ; 0x7aa <ProcessConfigurationDescriptor+0x106>
|
|
/* Descriptor not found, error out */
|
|
return NoCompatibleInterfaceFound;
|
|
}
|
|
|
|
/* Save the interface in case we need to refer back to it later */
|
|
AudioControlInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
|
75c: c9 80 ldd r12, Y+1 ; 0x01
|
|
75e: da 80 ldd r13, Y+2 ; 0x02
|
|
}
|
|
|
|
/* Save the interface in case we need to refer back to it later */
|
|
AudioStreamingInterface = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Interface_t);
|
|
760: 09 81 ldd r16, Y+1 ; 0x01
|
|
762: 1a 81 ldd r17, Y+2 ; 0x02
|
|
|
|
/* Skip the remainder of the loop as we have not found an endpoint yet */
|
|
continue;
|
|
764: 35 c0 rjmp .+106 ; 0x7d0 <ProcessConfigurationDescriptor+0x12c>
|
|
}
|
|
|
|
/* Retrieve the endpoint address from the endpoint descriptor */
|
|
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
|
766: e9 81 ldd r30, Y+1 ; 0x01
|
|
768: fa 81 ldd r31, Y+2 ; 0x02
|
|
|
|
/* If the endpoint is a IN type endpoint */
|
|
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
|
76a: 82 81 ldd r24, Z+2 ; 0x02
|
|
76c: 87 ff sbrs r24, 7
|
|
76e: 30 c0 rjmp .+96 ; 0x7d0 <ProcessConfigurationDescriptor+0x12c>
|
|
770: 90 2f mov r25, r16
|
|
772: 81 2f mov r24, r17
|
|
return DescriptorTooLarge;
|
|
default:
|
|
return ControlError;
|
|
}
|
|
|
|
while (!(DataINEndpoint))
|
|
774: 30 97 sbiw r30, 0x00 ; 0
|
|
776: 69 f2 breq .-102 ; 0x712 <ProcessConfigurationDescriptor+0x6e>
|
|
/* If the endpoint is a IN type endpoint */
|
|
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
|
|
DataINEndpoint = EndpointData;
|
|
}
|
|
|
|
StreamingInterfaceIndex = AudioStreamingInterface->InterfaceNumber;
|
|
778: d8 01 movw r26, r16
|
|
77a: 12 96 adiw r26, 0x02 ; 2
|
|
77c: 8c 91 ld r24, X
|
|
77e: 12 97 sbiw r26, 0x02 ; 2
|
|
780: 80 93 1c 01 sts 0x011C, r24
|
|
StreamingInterfaceAltSetting = AudioStreamingInterface->AlternateSetting;
|
|
784: 13 96 adiw r26, 0x03 ; 3
|
|
786: 8c 91 ld r24, X
|
|
788: 80 93 1d 01 sts 0x011D, r24
|
|
StreamingEndpointAddress = DataINEndpoint->EndpointAddress;
|
|
78c: 22 81 ldd r18, Z+2 ; 0x02
|
|
78e: 20 93 1e 01 sts 0x011E, r18
|
|
|
|
/* Configure the HID data IN pipe */
|
|
Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN,
|
|
792: 04 81 ldd r16, Z+4 ; 0x04
|
|
794: 15 81 ldd r17, Z+5 ; 0x05
|
|
796: 81 e0 ldi r24, 0x01 ; 1
|
|
798: 61 e0 ldi r22, 0x01 ; 1
|
|
79a: 40 e1 ldi r20, 0x10 ; 16
|
|
79c: 94 e0 ldi r25, 0x04 ; 4
|
|
79e: e9 2e mov r14, r25
|
|
7a0: 22 d2 rcall .+1092 ; 0xbe6 <Pipe_ConfigurePipe>
|
|
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE);
|
|
|
|
/* Valid data found, return success */
|
|
return SuccessfulConfigRead;
|
|
7a2: 80 e0 ldi r24, 0x00 ; 0
|
|
7a4: 03 c0 rjmp .+6 ; 0x7ac <ProcessConfigurationDescriptor+0x108>
|
|
case HOST_GETCONFIG_Successful:
|
|
break;
|
|
case HOST_GETCONFIG_InvalidData:
|
|
return InvalidConfigDataReturned;
|
|
case HOST_GETCONFIG_BuffOverflow:
|
|
return DescriptorTooLarge;
|
|
7a6: 82 e0 ldi r24, 0x02 ; 2
|
|
7a8: 01 c0 rjmp .+2 ; 0x7ac <ProcessConfigurationDescriptor+0x108>
|
|
{
|
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
|
DComp_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
|
{
|
|
/* Descriptor not found, error out */
|
|
return NoCompatibleInterfaceFound;
|
|
7aa: 84 e0 ldi r24, 0x04 ; 4
|
|
Pipe_ConfigurePipe(AUDIO_DATA_IN_PIPE, EP_TYPE_ISOCHRONOUS, PIPE_TOKEN_IN,
|
|
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_DOUBLE);
|
|
|
|
/* Valid data found, return success */
|
|
return SuccessfulConfigRead;
|
|
}
|
|
7ac: cc 5f subi r28, 0xFC ; 252
|
|
7ae: dd 4f sbci r29, 0xFD ; 253
|
|
7b0: 0f b6 in r0, 0x3f ; 63
|
|
7b2: f8 94 cli
|
|
7b4: de bf out 0x3e, r29 ; 62
|
|
7b6: 0f be out 0x3f, r0 ; 63
|
|
7b8: cd bf out 0x3d, r28 ; 61
|
|
7ba: cf 91 pop r28
|
|
7bc: df 91 pop r29
|
|
7be: 1f 91 pop r17
|
|
7c0: 0f 91 pop r16
|
|
7c2: ff 90 pop r15
|
|
7c4: ef 90 pop r14
|
|
7c6: df 90 pop r13
|
|
7c8: cf 90 pop r12
|
|
7ca: bf 90 pop r11
|
|
7cc: af 90 pop r10
|
|
7ce: 08 95 ret
|
|
USB_Descriptor_Interface_t* AudioControlInterface = NULL;
|
|
USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
|
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
|
|
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
|
7d0: 90 2f mov r25, r16
|
|
7d2: 81 2f mov r24, r17
|
|
7d4: 9e cf rjmp .-196 ; 0x712 <ProcessConfigurationDescriptor+0x6e>
|
|
|
|
000007d6 <USB_Host_ResetDevice>:
|
|
* \return Boolean \c true if the bus is currently suspended, \c false otherwise.
|
|
*/
|
|
static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool USB_Host_IsBusSuspended(void)
|
|
{
|
|
return ((UHCON & (1 << SOFEN)) ? false : true);
|
|
7d6: 80 91 9e 00 lds r24, 0x009E
|
|
7da: 90 e0 ldi r25, 0x00 ; 0
|
|
7dc: 81 70 andi r24, 0x01 ; 1
|
|
7de: 90 70 andi r25, 0x00 ; 0
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHIEN &= ~(1 << DCONNE);
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHIEN &= ~(1 << DDISCE);
|
|
7e0: 20 91 a0 00 lds r18, 0x00A0
|
|
7e4: 2d 7f andi r18, 0xFD ; 253
|
|
7e6: 20 93 a0 00 sts 0x00A0, r18
|
|
* woken up automatically and the bus resumed after the reset has been correctly issued.
|
|
*/
|
|
static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_ResetBus(void)
|
|
{
|
|
UHCON |= (1 << RESET);
|
|
7ea: 20 91 9e 00 lds r18, 0x009E
|
|
7ee: 22 60 ori r18, 0x02 ; 2
|
|
7f0: 20 93 9e 00 sts 0x009E, r18
|
|
* \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
|
|
*/
|
|
static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool USB_Host_IsBusResetComplete(void)
|
|
{
|
|
return ((UHCON & (1 << RESET)) ? false : true);
|
|
7f4: 20 91 9e 00 lds r18, 0x009E
|
|
bool BusSuspended = USB_Host_IsBusSuspended();
|
|
|
|
USB_INT_Disable(USB_INT_DDISCI);
|
|
|
|
USB_Host_ResetBus();
|
|
while (!(USB_Host_IsBusResetComplete()));
|
|
7f8: 21 fd sbrc r18, 1
|
|
7fa: fc cf rjmp .-8 ; 0x7f4 <USB_Host_ResetDevice+0x1e>
|
|
* host and attached device may occur.
|
|
*/
|
|
static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_ResumeBus(void)
|
|
{
|
|
UHCON |= (1 << SOFEN);
|
|
7fc: 20 91 9e 00 lds r18, 0x009E
|
|
800: 21 60 ori r18, 0x01 ; 1
|
|
802: 20 93 9e 00 sts 0x009E, r18
|
|
case USB_INT_RXSTPI:
|
|
return (UEIENX & (1 << RXSTPE));
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHIEN & (1 << HSOFE));
|
|
806: 20 91 a0 00 lds r18, 0x00A0
|
|
80a: 30 e0 ldi r19, 0x00 ; 0
|
|
80c: 20 72 andi r18, 0x20 ; 32
|
|
80e: 30 70 andi r19, 0x00 ; 0
|
|
UEIENX &= ~(1 << RXSTPE);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHIEN &= ~(1 << HSOFE);
|
|
810: 40 91 a0 00 lds r20, 0x00A0
|
|
814: 4f 7d andi r20, 0xDF ; 223
|
|
816: 40 93 a0 00 sts 0x00A0, r20
|
|
UEINTX &= ~(1 << RXSTPI);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
81a: 40 91 9f 00 lds r20, 0x009F
|
|
81e: 4f 7d andi r20, 0xDF ; 223
|
|
820: 40 93 9f 00 sts 0x009F, r20
|
|
824: 4a e0 ldi r20, 0x0A ; 10
|
|
case USB_INT_RXSTPI:
|
|
return (UEINTX & (1 << RXSTPI));
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHINT & (1 << HSOFI));
|
|
826: 50 91 9f 00 lds r21, 0x009F
|
|
/* Workaround for powerless-pull-up devices. After a USB bus reset,
|
|
all disconnection interrupts are suppressed while a USB frame is
|
|
looked for - if it is found within 10ms, the device is still
|
|
present. */
|
|
|
|
if (USB_INT_HasOccurred(USB_INT_HSOFI))
|
|
82a: 55 ff sbrs r21, 5
|
|
82c: 0b c0 rjmp .+22 ; 0x844 <USB_Host_ResetDevice+0x6e>
|
|
UEINTX &= ~(1 << RXSTPI);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
82e: 40 91 9f 00 lds r20, 0x009F
|
|
832: 4f 7d andi r20, 0xDF ; 223
|
|
834: 40 93 9f 00 sts 0x009F, r20
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHINT &= ~(1 << DCONNI);
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHINT &= ~(1 << DDISCI);
|
|
838: 40 91 9f 00 lds r20, 0x009F
|
|
83c: 4d 7f andi r20, 0xFD ; 253
|
|
83e: 40 93 9f 00 sts 0x009F, r20
|
|
842: 08 c0 rjmp .+16 ; 0x854 <USB_Host_ResetDevice+0x7e>
|
|
#else
|
|
//round up by default
|
|
__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
|
|
#endif
|
|
|
|
__builtin_avr_delay_cycles(__ticks_dc);
|
|
844: ef ec ldi r30, 0xCF ; 207
|
|
846: f7 e0 ldi r31, 0x07 ; 7
|
|
848: 31 97 sbiw r30, 0x01 ; 1
|
|
84a: f1 f7 brne .-4 ; 0x848 <USB_Host_ResetDevice+0x72>
|
|
84c: 00 c0 rjmp .+0 ; 0x84e <USB_Host_ResetDevice+0x78>
|
|
84e: 00 00 nop
|
|
850: 41 50 subi r20, 0x01 ; 1
|
|
bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
|
|
|
|
USB_INT_Disable(USB_INT_HSOFI);
|
|
USB_INT_Clear(USB_INT_HSOFI);
|
|
|
|
for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
|
|
852: 49 f7 brne .-46 ; 0x826 <USB_Host_ResetDevice+0x50>
|
|
}
|
|
|
|
Delay_MS(1);
|
|
}
|
|
|
|
if (HSOFIEnabled)
|
|
854: 21 15 cp r18, r1
|
|
856: 31 05 cpc r19, r1
|
|
858: 29 f0 breq .+10 ; 0x864 <USB_Host_ResetDevice+0x8e>
|
|
UEIENX |= (1 << RXSTPE);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHIEN |= (1 << HSOFE);
|
|
85a: 20 91 a0 00 lds r18, 0x00A0
|
|
85e: 20 62 ori r18, 0x20 ; 32
|
|
860: 20 93 a0 00 sts 0x00A0, r18
|
|
USB_INT_Enable(USB_INT_HSOFI);
|
|
|
|
if (BusSuspended)
|
|
864: 00 97 sbiw r24, 0x00 ; 0
|
|
866: 29 f4 brne .+10 ; 0x872 <USB_Host_ResetDevice+0x9c>
|
|
* messages to the device.
|
|
*/
|
|
static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_SuspendBus(void)
|
|
{
|
|
UHCON &= ~(1 << SOFEN);
|
|
868: 80 91 9e 00 lds r24, 0x009E
|
|
86c: 8e 7f andi r24, 0xFE ; 254
|
|
86e: 80 93 9e 00 sts 0x009E, r24
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHIEN |= (1 << DCONNE);
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHIEN |= (1 << DDISCE);
|
|
872: 80 91 a0 00 lds r24, 0x00A0
|
|
876: 82 60 ori r24, 0x02 ; 2
|
|
878: 80 93 a0 00 sts 0x00A0, r24
|
|
USB_Host_SuspendBus();
|
|
|
|
USB_INT_Enable(USB_INT_DDISCI);
|
|
}
|
|
87c: 08 95 ret
|
|
|
|
0000087e <USB_Host_WaitMS>:
|
|
* \return Boolean \c true if the bus is currently suspended, \c false otherwise.
|
|
*/
|
|
static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool USB_Host_IsBusSuspended(void)
|
|
{
|
|
return ((UHCON & (1 << SOFEN)) ? false : true);
|
|
87e: 40 91 9e 00 lds r20, 0x009E
|
|
882: 50 e0 ldi r21, 0x00 ; 0
|
|
884: 41 70 andi r20, 0x01 ; 1
|
|
886: 50 70 andi r21, 0x00 ; 0
|
|
case USB_INT_RXSTPI:
|
|
return (UEIENX & (1 << RXSTPE));
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHIEN & (1 << HSOFE));
|
|
888: 20 91 a0 00 lds r18, 0x00A0
|
|
88c: 30 e0 ldi r19, 0x00 ; 0
|
|
88e: 20 72 andi r18, 0x20 ; 32
|
|
890: 30 70 andi r19, 0x00 ; 0
|
|
UEIENX &= ~(1 << RXSTPE);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHIEN &= ~(1 << HSOFE);
|
|
892: 90 91 a0 00 lds r25, 0x00A0
|
|
896: 9f 7d andi r25, 0xDF ; 223
|
|
898: 90 93 a0 00 sts 0x00A0, r25
|
|
UEINTX &= ~(1 << RXSTPI);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
89c: 90 91 9f 00 lds r25, 0x009F
|
|
8a0: 9f 7d andi r25, 0xDF ; 223
|
|
8a2: 90 93 9f 00 sts 0x009F, r25
|
|
* host and attached device may occur.
|
|
*/
|
|
static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_ResumeBus(void)
|
|
{
|
|
UHCON |= (1 << SOFEN);
|
|
8a6: 90 91 9e 00 lds r25, 0x009E
|
|
8aa: 91 60 ori r25, 0x01 ; 1
|
|
8ac: 90 93 9e 00 sts 0x009E, r25
|
|
USB_INT_Disable(USB_INT_HSOFI);
|
|
USB_INT_Clear(USB_INT_HSOFI);
|
|
|
|
USB_Host_ResumeBus();
|
|
|
|
while (MS)
|
|
8b0: 26 c0 rjmp .+76 ; 0x8fe <USB_Host_WaitMS+0x80>
|
|
case USB_INT_RXSTPI:
|
|
return (UEINTX & (1 << RXSTPI));
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHINT & (1 << HSOFI));
|
|
8b2: 90 91 9f 00 lds r25, 0x009F
|
|
{
|
|
if (USB_INT_HasOccurred(USB_INT_HSOFI))
|
|
8b6: 95 ff sbrs r25, 5
|
|
8b8: 06 c0 rjmp .+12 ; 0x8c6 <USB_Host_WaitMS+0x48>
|
|
UEINTX &= ~(1 << RXSTPI);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
8ba: 90 91 9f 00 lds r25, 0x009F
|
|
8be: 9f 7d andi r25, 0xDF ; 223
|
|
8c0: 90 93 9f 00 sts 0x009F, r25
|
|
{
|
|
USB_INT_Clear(USB_INT_HSOFI);
|
|
MS--;
|
|
8c4: 81 50 subi r24, 0x01 ; 1
|
|
}
|
|
|
|
if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
|
|
8c6: 90 91 2b 01 lds r25, 0x012B
|
|
8ca: 92 30 cpi r25, 0x02 ; 2
|
|
8cc: d9 f0 breq .+54 ; 0x904 <USB_Host_WaitMS+0x86>
|
|
* \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsError(void)
|
|
{
|
|
return ((UPINTX & (1 << PERRI)) ? true : false);
|
|
8ce: 90 91 a6 00 lds r25, 0x00A6
|
|
ErrorCode = HOST_WAITERROR_DeviceDisconnect;
|
|
|
|
break;
|
|
}
|
|
|
|
if (Pipe_IsError() == true)
|
|
8d2: 94 ff sbrs r25, 4
|
|
8d4: 09 c0 rjmp .+18 ; 0x8e8 <USB_Host_WaitMS+0x6a>
|
|
|
|
/** Clears the error flags for the currently selected pipe. */
|
|
static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearError(void)
|
|
{
|
|
UPERRX = 0;
|
|
8d6: 10 92 f5 00 sts 0x00F5, r1
|
|
UPINTX &= ~(1 << PERRI);
|
|
8da: 80 91 a6 00 lds r24, 0x00A6
|
|
8de: 8f 7e andi r24, 0xEF ; 239
|
|
8e0: 80 93 a6 00 sts 0x00A6, r24
|
|
{
|
|
Pipe_ClearError();
|
|
ErrorCode = HOST_WAITERROR_PipeError;
|
|
8e4: 82 e0 ldi r24, 0x02 ; 2
|
|
|
|
break;
|
|
8e6: 0f c0 rjmp .+30 ; 0x906 <USB_Host_WaitMS+0x88>
|
|
* \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsStalled(void)
|
|
{
|
|
return ((UPINTX & (1 << RXSTALLI)) ? true : false);
|
|
8e8: 90 91 a6 00 lds r25, 0x00A6
|
|
}
|
|
|
|
if (Pipe_IsStalled() == true)
|
|
8ec: 91 ff sbrs r25, 1
|
|
8ee: 07 c0 rjmp .+14 ; 0x8fe <USB_Host_WaitMS+0x80>
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearStall(void)
|
|
{
|
|
UPINTX &= ~(1 << RXSTALLI);
|
|
8f0: 80 91 a6 00 lds r24, 0x00A6
|
|
8f4: 8d 7f andi r24, 0xFD ; 253
|
|
8f6: 80 93 a6 00 sts 0x00A6, r24
|
|
{
|
|
Pipe_ClearStall();
|
|
ErrorCode = HOST_WAITERROR_SetupStalled;
|
|
8fa: 83 e0 ldi r24, 0x03 ; 3
|
|
|
|
break;
|
|
8fc: 04 c0 rjmp .+8 ; 0x906 <USB_Host_WaitMS+0x88>
|
|
USB_INT_Disable(USB_INT_HSOFI);
|
|
USB_INT_Clear(USB_INT_HSOFI);
|
|
|
|
USB_Host_ResumeBus();
|
|
|
|
while (MS)
|
|
8fe: 88 23 and r24, r24
|
|
900: c1 f6 brne .-80 ; 0x8b2 <USB_Host_WaitMS+0x34>
|
|
902: 01 c0 rjmp .+2 ; 0x906 <USB_Host_WaitMS+0x88>
|
|
MS--;
|
|
}
|
|
|
|
if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
|
|
{
|
|
ErrorCode = HOST_WAITERROR_DeviceDisconnect;
|
|
904: 81 e0 ldi r24, 0x01 ; 1
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (BusSuspended)
|
|
906: 41 15 cp r20, r1
|
|
908: 51 05 cpc r21, r1
|
|
90a: 29 f4 brne .+10 ; 0x916 <USB_Host_WaitMS+0x98>
|
|
* messages to the device.
|
|
*/
|
|
static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_SuspendBus(void)
|
|
{
|
|
UHCON &= ~(1 << SOFEN);
|
|
90c: 90 91 9e 00 lds r25, 0x009E
|
|
910: 9e 7f andi r25, 0xFE ; 254
|
|
912: 90 93 9e 00 sts 0x009E, r25
|
|
USB_Host_SuspendBus();
|
|
|
|
if (HSOFIEnabled)
|
|
916: 21 15 cp r18, r1
|
|
918: 31 05 cpc r19, r1
|
|
91a: 29 f0 breq .+10 ; 0x926 <USB_Host_WaitMS+0xa8>
|
|
UEIENX |= (1 << RXSTPE);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHIEN |= (1 << HSOFE);
|
|
91c: 90 91 a0 00 lds r25, 0x00A0
|
|
920: 90 62 ori r25, 0x20 ; 32
|
|
922: 90 93 a0 00 sts 0x00A0, r25
|
|
USB_INT_Enable(USB_INT_HSOFI);
|
|
|
|
return ErrorCode;
|
|
}
|
|
926: 08 95 ret
|
|
|
|
00000928 <USB_Host_ProcessNextHostState>:
|
|
|
|
#define __INCLUDE_FROM_HOST_C
|
|
#include "../Host.h"
|
|
|
|
void USB_Host_ProcessNextHostState(void)
|
|
{
|
|
928: ef 92 push r14
|
|
92a: 0f 93 push r16
|
|
92c: 1f 93 push r17
|
|
92e: df 93 push r29
|
|
930: cf 93 push r28
|
|
932: cd b7 in r28, 0x3d ; 61
|
|
934: de b7 in r29, 0x3e ; 62
|
|
936: 28 97 sbiw r28, 0x08 ; 8
|
|
938: 0f b6 in r0, 0x3f ; 63
|
|
93a: f8 94 cli
|
|
93c: de bf out 0x3e, r29 ; 62
|
|
93e: 0f be out 0x3f, r0 ; 63
|
|
940: cd bf out 0x3d, r28 ; 61
|
|
uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
|
|
|
|
static uint16_t WaitMSRemaining;
|
|
static uint8_t PostWaitState;
|
|
|
|
switch (USB_HostState)
|
|
942: 80 91 2b 01 lds r24, 0x012B
|
|
946: 86 30 cpi r24, 0x06 ; 6
|
|
948: 09 f4 brne .+2 ; 0x94c <USB_Host_ProcessNextHostState+0x24>
|
|
94a: 99 c0 rjmp .+306 ; 0xa7e <USB_Host_ProcessNextHostState+0x156>
|
|
94c: 87 30 cpi r24, 0x07 ; 7
|
|
94e: 70 f4 brcc .+28 ; 0x96c <USB_Host_ProcessNextHostState+0x44>
|
|
950: 83 30 cpi r24, 0x03 ; 3
|
|
952: c9 f1 breq .+114 ; 0x9c6 <USB_Host_ProcessNextHostState+0x9e>
|
|
954: 84 30 cpi r24, 0x04 ; 4
|
|
956: 20 f4 brcc .+8 ; 0x960 <USB_Host_ProcessNextHostState+0x38>
|
|
958: 81 30 cpi r24, 0x01 ; 1
|
|
95a: 09 f0 breq .+2 ; 0x95e <USB_Host_ProcessNextHostState+0x36>
|
|
95c: 0b c1 rjmp .+534 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
95e: 13 c0 rjmp .+38 ; 0x986 <USB_Host_ProcessNextHostState+0x5e>
|
|
960: 84 30 cpi r24, 0x04 ; 4
|
|
962: c9 f1 breq .+114 ; 0x9d6 <USB_Host_ProcessNextHostState+0xae>
|
|
964: 85 30 cpi r24, 0x05 ; 5
|
|
966: 09 f0 breq .+2 ; 0x96a <USB_Host_ProcessNextHostState+0x42>
|
|
968: 05 c1 rjmp .+522 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
96a: 60 c0 rjmp .+192 ; 0xa2c <USB_Host_ProcessNextHostState+0x104>
|
|
96c: 88 30 cpi r24, 0x08 ; 8
|
|
96e: 09 f4 brne .+2 ; 0x972 <USB_Host_ProcessNextHostState+0x4a>
|
|
970: a0 c0 rjmp .+320 ; 0xab2 <USB_Host_ProcessNextHostState+0x18a>
|
|
972: 88 30 cpi r24, 0x08 ; 8
|
|
974: 08 f4 brcc .+2 ; 0x978 <USB_Host_ProcessNextHostState+0x50>
|
|
976: 8f c0 rjmp .+286 ; 0xa96 <USB_Host_ProcessNextHostState+0x16e>
|
|
978: 89 30 cpi r24, 0x09 ; 9
|
|
97a: 09 f4 brne .+2 ; 0x97e <USB_Host_ProcessNextHostState+0x56>
|
|
97c: b9 c0 rjmp .+370 ; 0xaf0 <USB_Host_ProcessNextHostState+0x1c8>
|
|
97e: 8a 30 cpi r24, 0x0A ; 10
|
|
980: 09 f0 breq .+2 ; 0x984 <USB_Host_ProcessNextHostState+0x5c>
|
|
982: f8 c0 rjmp .+496 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
984: de c0 rjmp .+444 ; 0xb42 <USB_Host_ProcessNextHostState+0x21a>
|
|
{
|
|
case HOST_STATE_WaitForDevice:
|
|
if (WaitMSRemaining)
|
|
986: 00 91 20 01 lds r16, 0x0120
|
|
98a: 10 91 21 01 lds r17, 0x0121
|
|
98e: 01 15 cp r16, r1
|
|
990: 11 05 cpc r17, r1
|
|
992: 09 f4 brne .+2 ; 0x996 <USB_Host_ProcessNextHostState+0x6e>
|
|
994: ef c0 rjmp .+478 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
{
|
|
if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
|
996: 81 e0 ldi r24, 0x01 ; 1
|
|
998: 72 df rcall .-284 ; 0x87e <USB_Host_WaitMS>
|
|
99a: 68 2f mov r22, r24
|
|
99c: 88 23 and r24, r24
|
|
99e: 31 f0 breq .+12 ; 0x9ac <USB_Host_ProcessNextHostState+0x84>
|
|
{
|
|
USB_HostState = PostWaitState;
|
|
9a0: 80 91 1f 01 lds r24, 0x011F
|
|
9a4: 80 93 2b 01 sts 0x012B, r24
|
|
ErrorCode = HOST_ENUMERROR_WaitStage;
|
|
9a8: 81 e0 ldi r24, 0x01 ; 1
|
|
break;
|
|
9aa: e0 c0 rjmp .+448 ; 0xb6c <USB_Host_ProcessNextHostState+0x244>
|
|
}
|
|
|
|
if (!(--WaitMSRemaining))
|
|
9ac: 01 50 subi r16, 0x01 ; 1
|
|
9ae: 10 40 sbci r17, 0x00 ; 0
|
|
9b0: 10 93 21 01 sts 0x0121, r17
|
|
9b4: 00 93 20 01 sts 0x0120, r16
|
|
9b8: 01 15 cp r16, r1
|
|
9ba: 11 05 cpc r17, r1
|
|
9bc: 09 f0 breq .+2 ; 0x9c0 <USB_Host_ProcessNextHostState+0x98>
|
|
9be: da c0 rjmp .+436 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
USB_HostState = PostWaitState;
|
|
9c0: 80 91 1f 01 lds r24, 0x011F
|
|
9c4: c3 c0 rjmp .+390 ; 0xb4c <USB_Host_ProcessNextHostState+0x224>
|
|
}
|
|
|
|
break;
|
|
case HOST_STATE_Powered:
|
|
WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
|
|
9c6: 88 ee ldi r24, 0xE8 ; 232
|
|
9c8: 93 e0 ldi r25, 0x03 ; 3
|
|
9ca: 90 93 21 01 sts 0x0121, r25
|
|
9ce: 80 93 20 01 sts 0x0120, r24
|
|
|
|
USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
|
|
9d2: 84 e0 ldi r24, 0x04 ; 4
|
|
9d4: bb c0 rjmp .+374 ; 0xb4c <USB_Host_ProcessNextHostState+0x224>
|
|
break;
|
|
case HOST_STATE_Powered_WaitForDeviceSettle:
|
|
if (WaitMSRemaining--)
|
|
9d6: 80 91 20 01 lds r24, 0x0120
|
|
9da: 90 91 21 01 lds r25, 0x0121
|
|
9de: 9c 01 movw r18, r24
|
|
9e0: 21 50 subi r18, 0x01 ; 1
|
|
9e2: 30 40 sbci r19, 0x00 ; 0
|
|
9e4: 30 93 21 01 sts 0x0121, r19
|
|
9e8: 20 93 20 01 sts 0x0120, r18
|
|
9ec: 00 97 sbiw r24, 0x00 ; 0
|
|
9ee: 39 f0 breq .+14 ; 0x9fe <USB_Host_ProcessNextHostState+0xd6>
|
|
9f0: 8f ec ldi r24, 0xCF ; 207
|
|
9f2: 97 e0 ldi r25, 0x07 ; 7
|
|
9f4: 01 97 sbiw r24, 0x01 ; 1
|
|
9f6: f1 f7 brne .-4 ; 0x9f4 <USB_Host_ProcessNextHostState+0xcc>
|
|
9f8: 00 c0 rjmp .+0 ; 0x9fa <USB_Host_ProcessNextHostState+0xd2>
|
|
9fa: 00 00 nop
|
|
9fc: bb c0 rjmp .+374 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Manual_Off(void)
|
|
{
|
|
PORTE &= ~(1 << 7);
|
|
9fe: 77 98 cbi 0x0e, 7 ; 14
|
|
|
|
#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
|
|
static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_OTGPAD_On(void)
|
|
{
|
|
USBCON |= (1 << OTGPADE);
|
|
a00: 80 91 d8 00 lds r24, 0x00D8
|
|
a04: 80 61 ori r24, 0x10 ; 16
|
|
a06: 80 93 d8 00 sts 0x00D8, r24
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Auto_Enable(void)
|
|
{
|
|
OTGCON &= ~(1 << VBUSHWC);
|
|
a0a: 80 91 dd 00 lds r24, 0x00DD
|
|
a0e: 8b 7f andi r24, 0xFB ; 251
|
|
a10: 80 93 dd 00 sts 0x00DD, r24
|
|
UHWCON |= (1 << UVCONE);
|
|
a14: 80 91 d7 00 lds r24, 0x00D7
|
|
a18: 80 61 ori r24, 0x10 ; 16
|
|
a1a: 80 93 d7 00 sts 0x00D7, r24
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Auto_On(void)
|
|
{
|
|
OTGCON |= (1 << VBUSREQ);
|
|
a1e: 80 91 dd 00 lds r24, 0x00DD
|
|
a22: 82 60 ori r24, 0x02 ; 2
|
|
a24: 80 93 dd 00 sts 0x00DD, r24
|
|
|
|
USB_OTGPAD_On();
|
|
USB_Host_VBUS_Auto_Enable();
|
|
USB_Host_VBUS_Auto_On();
|
|
|
|
USB_HostState = HOST_STATE_Powered_WaitForConnect;
|
|
a28: 85 e0 ldi r24, 0x05 ; 5
|
|
a2a: 90 c0 rjmp .+288 ; 0xb4c <USB_Host_ProcessNextHostState+0x224>
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHINT & (1 << HSOFI));
|
|
case USB_INT_DCONNI:
|
|
return (UHINT & (1 << DCONNI));
|
|
a2c: 80 91 9f 00 lds r24, 0x009F
|
|
}
|
|
|
|
break;
|
|
case HOST_STATE_Powered_WaitForConnect:
|
|
if (USB_INT_HasOccurred(USB_INT_DCONNI))
|
|
a30: 80 ff sbrs r24, 0
|
|
a32: a0 c0 rjmp .+320 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHINT &= ~(1 << DCONNI);
|
|
a34: 80 91 9f 00 lds r24, 0x009F
|
|
a38: 8e 7f andi r24, 0xFE ; 254
|
|
a3a: 80 93 9f 00 sts 0x009F, r24
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHINT &= ~(1 << DDISCI);
|
|
a3e: 80 91 9f 00 lds r24, 0x009F
|
|
a42: 8d 7f andi r24, 0xFD ; 253
|
|
a44: 80 93 9f 00 sts 0x009F, r24
|
|
break;
|
|
case USB_INT_BCERRI:
|
|
OTGINT &= ~(1 << BCERRI);
|
|
break;
|
|
case USB_INT_VBERRI:
|
|
OTGINT &= ~(1 << VBERRI);
|
|
a48: 80 91 df 00 lds r24, 0x00DF
|
|
a4c: 8d 7f andi r24, 0xFD ; 253
|
|
a4e: 80 93 df 00 sts 0x00DF, r24
|
|
break;
|
|
case USB_INT_BCERRI:
|
|
OTGIEN |= (1 << BCERRE);
|
|
break;
|
|
case USB_INT_VBERRI:
|
|
OTGIEN |= (1 << VBERRE);
|
|
a52: 80 91 de 00 lds r24, 0x00DE
|
|
a56: 82 60 ori r24, 0x02 ; 2
|
|
a58: 80 93 de 00 sts 0x00DE, r24
|
|
* host and attached device may occur.
|
|
*/
|
|
static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_ResumeBus(void)
|
|
{
|
|
UHCON |= (1 << SOFEN);
|
|
a5c: 80 91 9e 00 lds r24, 0x009E
|
|
a60: 81 60 ori r24, 0x01 ; 1
|
|
a62: 80 93 9e 00 sts 0x009E, r24
|
|
|
|
USB_INT_Clear(USB_INT_VBERRI);
|
|
USB_INT_Enable(USB_INT_VBERRI);
|
|
|
|
USB_Host_ResumeBus();
|
|
Pipe_ClearPipes();
|
|
a66: 26 d1 rcall .+588 ; 0xcb4 <Pipe_ClearPipes>
|
|
|
|
HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
|
|
a68: 81 e0 ldi r24, 0x01 ; 1
|
|
a6a: 80 93 2b 01 sts 0x012B, r24
|
|
a6e: 84 e6 ldi r24, 0x64 ; 100
|
|
a70: 90 e0 ldi r25, 0x00 ; 0
|
|
a72: 90 93 21 01 sts 0x0121, r25
|
|
a76: 80 93 20 01 sts 0x0120, r24
|
|
a7a: 86 e0 ldi r24, 0x06 ; 6
|
|
a7c: 5f c0 rjmp .+190 ; 0xb3c <USB_Host_ProcessNextHostState+0x214>
|
|
}
|
|
|
|
break;
|
|
case HOST_STATE_Powered_DoReset:
|
|
USB_Host_ResetDevice();
|
|
a7e: ab de rcall .-682 ; 0x7d6 <USB_Host_ResetDevice>
|
|
|
|
HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
|
|
a80: 81 e0 ldi r24, 0x01 ; 1
|
|
a82: 80 93 2b 01 sts 0x012B, r24
|
|
a86: 88 ec ldi r24, 0xC8 ; 200
|
|
a88: 90 e0 ldi r25, 0x00 ; 0
|
|
a8a: 90 93 21 01 sts 0x0121, r25
|
|
a8e: 80 93 20 01 sts 0x0120, r24
|
|
a92: 87 e0 ldi r24, 0x07 ; 7
|
|
a94: 53 c0 rjmp .+166 ; 0xb3c <USB_Host_ProcessNextHostState+0x214>
|
|
break;
|
|
case HOST_STATE_Powered_ConfigPipe:
|
|
Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
|
|
a96: 80 e0 ldi r24, 0x00 ; 0
|
|
a98: 60 e0 ldi r22, 0x00 ; 0
|
|
a9a: 40 e0 ldi r20, 0x00 ; 0
|
|
a9c: 20 e0 ldi r18, 0x00 ; 0
|
|
a9e: 00 e4 ldi r16, 0x40 ; 64
|
|
aa0: 10 e0 ldi r17, 0x00 ; 0
|
|
aa2: ee 24 eor r14, r14
|
|
aa4: a0 d0 rcall .+320 ; 0xbe6 <Pipe_ConfigurePipe>
|
|
* \return Boolean \c true if the selected pipe is configured, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsConfigured(void)
|
|
{
|
|
return ((UPSTAX & (1 << CFGOK)) ? true : false);
|
|
aa6: 80 91 ac 00 lds r24, 0x00AC
|
|
PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
|
|
PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);
|
|
|
|
if (!(Pipe_IsConfigured()))
|
|
aaa: 87 ff sbrs r24, 7
|
|
aac: 5b c0 rjmp .+182 ; 0xb64 <USB_Host_ProcessNextHostState+0x23c>
|
|
ErrorCode = HOST_ENUMERROR_PipeConfigError;
|
|
SubErrorCode = 0;
|
|
break;
|
|
}
|
|
|
|
USB_HostState = HOST_STATE_Default;
|
|
aae: 88 e0 ldi r24, 0x08 ; 8
|
|
ab0: 4d c0 rjmp .+154 ; 0xb4c <USB_Host_ProcessNextHostState+0x224>
|
|
break;
|
|
case HOST_STATE_Default:
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
ab2: a3 e2 ldi r26, 0x23 ; 35
|
|
ab4: b1 e0 ldi r27, 0x01 ; 1
|
|
ab6: e3 e1 ldi r30, 0x13 ; 19
|
|
ab8: f1 e0 ldi r31, 0x01 ; 1
|
|
aba: 88 e0 ldi r24, 0x08 ; 8
|
|
abc: 01 90 ld r0, Z+
|
|
abe: 0d 92 st X+, r0
|
|
ac0: 81 50 subi r24, 0x01 ; 1
|
|
ac2: e1 f7 brne .-8 ; 0xabc <USB_Host_ProcessNextHostState+0x194>
|
|
.wLength = 8,
|
|
};
|
|
|
|
uint8_t DataBuffer[8];
|
|
|
|
if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
|
|
ac4: ce 01 movw r24, r28
|
|
ac6: 01 96 adiw r24, 0x01 ; 1
|
|
ac8: dc d2 rcall .+1464 ; 0x1082 <USB_Host_SendControlRequest>
|
|
aca: 68 2f mov r22, r24
|
|
acc: 88 23 and r24, r24
|
|
ace: 09 f0 breq .+2 ; 0xad2 <USB_Host_ProcessNextHostState+0x1aa>
|
|
ad0: 4c c0 rjmp .+152 ; 0xb6a <USB_Host_ProcessNextHostState+0x242>
|
|
{
|
|
ErrorCode = HOST_ENUMERROR_ControlError;
|
|
break;
|
|
}
|
|
|
|
USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
|
|
ad2: 88 85 ldd r24, Y+8 ; 0x08
|
|
ad4: 80 93 1b 01 sts 0x011B, r24
|
|
|
|
USB_Host_ResetDevice();
|
|
ad8: 7e de rcall .-772 ; 0x7d6 <USB_Host_ResetDevice>
|
|
|
|
HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
|
|
ada: 81 e0 ldi r24, 0x01 ; 1
|
|
adc: 80 93 2b 01 sts 0x012B, r24
|
|
ae0: 88 ec ldi r24, 0xC8 ; 200
|
|
ae2: 90 e0 ldi r25, 0x00 ; 0
|
|
ae4: 90 93 21 01 sts 0x0121, r25
|
|
ae8: 80 93 20 01 sts 0x0120, r24
|
|
aec: 89 e0 ldi r24, 0x09 ; 9
|
|
aee: 26 c0 rjmp .+76 ; 0xb3c <USB_Host_ProcessNextHostState+0x214>
|
|
break;
|
|
case HOST_STATE_Default_PostReset:
|
|
Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
|
|
af0: 00 91 1b 01 lds r16, 0x011B
|
|
af4: 80 e0 ldi r24, 0x00 ; 0
|
|
af6: 60 e0 ldi r22, 0x00 ; 0
|
|
af8: 40 e0 ldi r20, 0x00 ; 0
|
|
afa: 20 e0 ldi r18, 0x00 ; 0
|
|
afc: 10 e0 ldi r17, 0x00 ; 0
|
|
afe: ee 24 eor r14, r14
|
|
b00: 72 d0 rcall .+228 ; 0xbe6 <Pipe_ConfigurePipe>
|
|
b02: 80 91 ac 00 lds r24, 0x00AC
|
|
PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
|
|
USB_ControlPipeSize, PIPE_BANK_SINGLE);
|
|
|
|
if (!(Pipe_IsConfigured()))
|
|
b06: 87 ff sbrs r24, 7
|
|
b08: 2d c0 rjmp .+90 ; 0xb64 <USB_Host_ProcessNextHostState+0x23c>
|
|
ErrorCode = HOST_ENUMERROR_PipeConfigError;
|
|
SubErrorCode = 0;
|
|
break;
|
|
}
|
|
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
b0a: a3 e2 ldi r26, 0x23 ; 35
|
|
b0c: b1 e0 ldi r27, 0x01 ; 1
|
|
b0e: eb e0 ldi r30, 0x0B ; 11
|
|
b10: f1 e0 ldi r31, 0x01 ; 1
|
|
b12: 88 e0 ldi r24, 0x08 ; 8
|
|
b14: 01 90 ld r0, Z+
|
|
b16: 0d 92 st X+, r0
|
|
b18: 81 50 subi r24, 0x01 ; 1
|
|
b1a: e1 f7 brne .-8 ; 0xb14 <USB_Host_ProcessNextHostState+0x1ec>
|
|
.wValue = USB_HOST_DEVICEADDRESS,
|
|
.wIndex = 0,
|
|
.wLength = 0,
|
|
};
|
|
|
|
if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
|
|
b1c: 80 e0 ldi r24, 0x00 ; 0
|
|
b1e: 90 e0 ldi r25, 0x00 ; 0
|
|
b20: b0 d2 rcall .+1376 ; 0x1082 <USB_Host_SendControlRequest>
|
|
b22: 68 2f mov r22, r24
|
|
b24: 88 23 and r24, r24
|
|
b26: 09 f5 brne .+66 ; 0xb6a <USB_Host_ProcessNextHostState+0x242>
|
|
{
|
|
ErrorCode = HOST_ENUMERROR_ControlError;
|
|
break;
|
|
}
|
|
|
|
HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
|
|
b28: 81 e0 ldi r24, 0x01 ; 1
|
|
b2a: 80 93 2b 01 sts 0x012B, r24
|
|
b2e: 84 e6 ldi r24, 0x64 ; 100
|
|
b30: 90 e0 ldi r25, 0x00 ; 0
|
|
b32: 90 93 21 01 sts 0x0121, r25
|
|
b36: 80 93 20 01 sts 0x0120, r24
|
|
b3a: 8a e0 ldi r24, 0x0A ; 10
|
|
b3c: 80 93 1f 01 sts 0x011F, r24
|
|
break;
|
|
b40: 19 c0 rjmp .+50 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
}
|
|
|
|
static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
|
|
{
|
|
UHADDR = (Address & 0x7F);
|
|
b42: 81 e0 ldi r24, 0x01 ; 1
|
|
b44: 80 93 a1 00 sts 0x00A1, r24
|
|
case HOST_STATE_Default_PostAddressSet:
|
|
USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
|
|
|
|
EVENT_USB_Host_DeviceEnumerationComplete();
|
|
b48: 24 dc rcall .-1976 ; 0x392 <EVENT_USB_Host_DeviceEnumerationComplete>
|
|
USB_HostState = HOST_STATE_Addressed;
|
|
b4a: 8b e0 ldi r24, 0x0B ; 11
|
|
b4c: 80 93 2b 01 sts 0x012B, r24
|
|
break;
|
|
b50: 11 c0 rjmp .+34 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
}
|
|
|
|
if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
|
|
{
|
|
EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
|
|
b52: 40 dc rcall .-1920 ; 0x3d4 <EVENT_USB_Host_DeviceEnumerationFailed>
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Auto_Off(void)
|
|
{
|
|
OTGCON |= (1 << VBUSRQC);
|
|
b54: 80 91 dd 00 lds r24, 0x00DD
|
|
b58: 81 60 ori r24, 0x01 ; 1
|
|
b5a: 80 93 dd 00 sts 0x00DD, r24
|
|
|
|
USB_Host_VBUS_Auto_Off();
|
|
|
|
EVENT_USB_Host_DeviceUnattached();
|
|
b5e: 14 dc rcall .-2008 ; 0x388 <EVENT_USB_Host_DeviceUnattached>
|
|
|
|
USB_ResetInterface();
|
|
b60: d5 d0 rcall .+426 ; 0xd0c <USB_ResetInterface>
|
|
b62: 08 c0 rjmp .+16 ; 0xb74 <USB_Host_ProcessNextHostState+0x24c>
|
|
USB_ControlPipeSize, PIPE_BANK_SINGLE);
|
|
|
|
if (!(Pipe_IsConfigured()))
|
|
{
|
|
ErrorCode = HOST_ENUMERROR_PipeConfigError;
|
|
SubErrorCode = 0;
|
|
b64: 60 e0 ldi r22, 0x00 ; 0
|
|
PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
|
|
USB_ControlPipeSize, PIPE_BANK_SINGLE);
|
|
|
|
if (!(Pipe_IsConfigured()))
|
|
{
|
|
ErrorCode = HOST_ENUMERROR_PipeConfigError;
|
|
b66: 84 e0 ldi r24, 0x04 ; 4
|
|
b68: 01 c0 rjmp .+2 ; 0xb6c <USB_Host_ProcessNextHostState+0x244>
|
|
.wLength = 0,
|
|
};
|
|
|
|
if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
|
|
{
|
|
ErrorCode = HOST_ENUMERROR_ControlError;
|
|
b6a: 83 e0 ldi r24, 0x03 ; 3
|
|
EVENT_USB_Host_DeviceEnumerationComplete();
|
|
USB_HostState = HOST_STATE_Addressed;
|
|
break;
|
|
}
|
|
|
|
if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
|
|
b6c: 90 91 2b 01 lds r25, 0x012B
|
|
b70: 92 30 cpi r25, 0x02 ; 2
|
|
b72: 79 f7 brne .-34 ; 0xb52 <USB_Host_ProcessNextHostState+0x22a>
|
|
|
|
EVENT_USB_Host_DeviceUnattached();
|
|
|
|
USB_ResetInterface();
|
|
}
|
|
}
|
|
b74: 28 96 adiw r28, 0x08 ; 8
|
|
b76: 0f b6 in r0, 0x3f ; 63
|
|
b78: f8 94 cli
|
|
b7a: de bf out 0x3e, r29 ; 62
|
|
b7c: 0f be out 0x3f, r0 ; 63
|
|
b7e: cd bf out 0x3d, r28 ; 61
|
|
b80: cf 91 pop r28
|
|
b82: df 91 pop r29
|
|
b84: 1f 91 pop r17
|
|
b86: 0f 91 pop r16
|
|
b88: ef 90 pop r14
|
|
b8a: 08 95 ret
|
|
|
|
00000b8c <USB_Host_SetDeviceConfiguration>:
|
|
USB_INT_Enable(USB_INT_DDISCI);
|
|
}
|
|
|
|
uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber)
|
|
{
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
b8c: 10 92 23 01 sts 0x0123, r1
|
|
b90: 99 e0 ldi r25, 0x09 ; 9
|
|
b92: 90 93 24 01 sts 0x0124, r25
|
|
b96: 80 93 25 01 sts 0x0125, r24
|
|
b9a: 10 92 26 01 sts 0x0126, r1
|
|
b9e: 10 92 28 01 sts 0x0128, r1
|
|
ba2: 10 92 27 01 sts 0x0127, r1
|
|
ba6: 10 92 2a 01 sts 0x012A, r1
|
|
baa: 10 92 29 01 sts 0x0129, r1
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
bae: 10 92 a7 00 sts 0x00A7, r1
|
|
.wLength = 0,
|
|
};
|
|
|
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
|
|
|
return USB_Host_SendControlRequest(NULL);
|
|
bb2: 80 e0 ldi r24, 0x00 ; 0
|
|
bb4: 90 e0 ldi r25, 0x00 ; 0
|
|
}
|
|
bb6: 65 c2 rjmp .+1226 ; 0x1082 <USB_Host_SendControlRequest>
|
|
|
|
00000bb8 <USB_Host_SetInterfaceAltSetting>:
|
|
}
|
|
|
|
uint8_t USB_Host_SetInterfaceAltSetting(const uint8_t InterfaceNum,
|
|
const uint8_t AltSetting)
|
|
{
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
bb8: e3 e2 ldi r30, 0x23 ; 35
|
|
bba: f1 e0 ldi r31, 0x01 ; 1
|
|
bbc: 91 e0 ldi r25, 0x01 ; 1
|
|
bbe: 90 93 23 01 sts 0x0123, r25
|
|
bc2: 9b e0 ldi r25, 0x0B ; 11
|
|
bc4: 90 93 24 01 sts 0x0124, r25
|
|
bc8: 60 93 25 01 sts 0x0125, r22
|
|
bcc: 13 82 std Z+3, r1 ; 0x03
|
|
bce: 80 93 27 01 sts 0x0127, r24
|
|
bd2: 15 82 std Z+5, r1 ; 0x05
|
|
bd4: 10 92 2a 01 sts 0x012A, r1
|
|
bd8: 10 92 29 01 sts 0x0129, r1
|
|
bdc: 10 92 a7 00 sts 0x00A7, r1
|
|
.wLength = 0,
|
|
};
|
|
|
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
|
|
|
return USB_Host_SendControlRequest(NULL);
|
|
be0: 80 e0 ldi r24, 0x00 ; 0
|
|
be2: 90 e0 ldi r25, 0x00 ; 0
|
|
}
|
|
be4: 4e c2 rjmp .+1180 ; 0x1082 <USB_Host_SendControlRequest>
|
|
|
|
00000be6 <Pipe_ConfigurePipe>:
|
|
const uint8_t Type,
|
|
const uint8_t Token,
|
|
const uint8_t EndpointNumber,
|
|
const uint16_t Size,
|
|
const uint8_t Banks)
|
|
{
|
|
be6: ef 92 push r14
|
|
be8: 0f 93 push r16
|
|
bea: 1f 93 push r17
|
|
bec: 5e 2d mov r21, r14
|
|
|
|
Pipe_SelectPipe(PNum);
|
|
|
|
if (PNum == Number)
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
bee: 62 95 swap r22
|
|
bf0: 66 0f add r22, r22
|
|
bf2: 66 0f add r22, r22
|
|
bf4: 60 7c andi r22, 0xC0 ; 192
|
|
bf6: 64 2b or r22, r20
|
|
bf8: 2f 70 andi r18, 0x0F ; 15
|
|
bfa: 62 2b or r22, r18
|
|
|
|
Pipe_SetInfiniteINRequests();
|
|
|
|
return Pipe_IsConfigured();
|
|
#else
|
|
for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
|
|
bfc: 98 2f mov r25, r24
|
|
Pipe_SelectPipe(PNum);
|
|
|
|
if (PNum == Number)
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
|
bfe: 52 60 ori r21, 0x02 ; 2
|
|
|
|
Pipe_SetInfiniteINRequests();
|
|
|
|
return Pipe_IsConfigured();
|
|
#else
|
|
for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
|
|
c00: 4d c0 rjmp .+154 ; 0xc9c <Pipe_ConfigurePipe+0xb6>
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
c02: 90 93 a7 00 sts 0x00A7, r25
|
|
uint8_t UPINRQXTemp;
|
|
uint8_t UPIENXTemp;
|
|
|
|
Pipe_SelectPipe(PNum);
|
|
|
|
if (PNum == Number)
|
|
c06: 98 17 cp r25, r24
|
|
c08: b1 f4 brne .+44 ; 0xc36 <Pipe_ConfigurePipe+0x50>
|
|
c0a: 28 e0 ldi r18, 0x08 ; 8
|
|
c0c: 30 e0 ldi r19, 0x00 ; 0
|
|
c0e: 40 e0 ldi r20, 0x00 ; 0
|
|
c10: 03 c0 rjmp .+6 ; 0xc18 <Pipe_ConfigurePipe+0x32>
|
|
uint8_t MaskVal = 0;
|
|
uint16_t CheckBytes = 8;
|
|
|
|
while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
|
|
{
|
|
MaskVal++;
|
|
c12: 4f 5f subi r20, 0xFF ; 255
|
|
CheckBytes <<= 1;
|
|
c14: 22 0f add r18, r18
|
|
c16: 33 1f adc r19, r19
|
|
static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
|
|
{
|
|
uint8_t MaskVal = 0;
|
|
uint16_t CheckBytes = 8;
|
|
|
|
while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
|
|
c18: 20 17 cp r18, r16
|
|
c1a: 31 07 cpc r19, r17
|
|
c1c: 10 f4 brcc .+4 ; 0xc22 <Pipe_ConfigurePipe+0x3c>
|
|
c1e: 45 30 cpi r20, 0x05 ; 5
|
|
c20: c1 f7 brne .-16 ; 0xc12 <Pipe_ConfigurePipe+0x2c>
|
|
{
|
|
MaskVal++;
|
|
CheckBytes <<= 1;
|
|
}
|
|
|
|
return (MaskVal << EPSIZE0);
|
|
c22: 24 2f mov r18, r20
|
|
c24: 22 95 swap r18
|
|
c26: 20 7f andi r18, 0xF0 ; 240
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
|
c28: 25 2b or r18, r21
|
|
|
|
Pipe_SelectPipe(PNum);
|
|
|
|
if (PNum == Number)
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
c2a: a6 2f mov r26, r22
|
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
|
UPCFG2XTemp = 0;
|
|
UPCONXTemp = ((1 << PEN) | (1 << INMODE));
|
|
UPINRQXTemp = 0;
|
|
UPIENXTemp = 0;
|
|
c2c: 40 e0 ldi r20, 0x00 ; 0
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
|
UPCFG2XTemp = 0;
|
|
UPCONXTemp = ((1 << PEN) | (1 << INMODE));
|
|
UPINRQXTemp = 0;
|
|
c2e: 70 e0 ldi r23, 0x00 ; 0
|
|
if (PNum == Number)
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
|
UPCFG2XTemp = 0;
|
|
UPCONXTemp = ((1 << PEN) | (1 << INMODE));
|
|
c30: e1 e2 ldi r30, 0x21 ; 33
|
|
|
|
if (PNum == Number)
|
|
{
|
|
UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
|
|
UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
|
|
UPCFG2XTemp = 0;
|
|
c32: f0 e0 ldi r31, 0x00 ; 0
|
|
c34: 0c c0 rjmp .+24 ; 0xc4e <Pipe_ConfigurePipe+0x68>
|
|
UPINRQXTemp = 0;
|
|
UPIENXTemp = 0;
|
|
}
|
|
else
|
|
{
|
|
UPCFG0XTemp = UPCFG0X;
|
|
c36: a0 91 aa 00 lds r26, 0x00AA
|
|
UPCFG1XTemp = UPCFG1X;
|
|
c3a: 20 91 ab 00 lds r18, 0x00AB
|
|
UPCFG2XTemp = UPCFG2X;
|
|
c3e: f0 91 ad 00 lds r31, 0x00AD
|
|
UPCONXTemp = UPCONX;
|
|
c42: e0 91 a9 00 lds r30, 0x00A9
|
|
UPINRQXTemp = UPINRQX;
|
|
c46: 70 91 a5 00 lds r23, 0x00A5
|
|
UPIENXTemp = UPIENX;
|
|
c4a: 40 91 ae 00 lds r20, 0x00AE
|
|
|
|
/** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
|
|
static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SetInfiniteINRequests(void)
|
|
{
|
|
UPCONX |= (1 << INMODE);
|
|
c4e: 30 91 a9 00 lds r19, 0x00A9
|
|
c52: 30 62 ori r19, 0x20 ; 32
|
|
c54: 30 93 a9 00 sts 0x00A9, r19
|
|
}
|
|
|
|
Pipe_SetInfiniteINRequests();
|
|
|
|
if (!(UPCFG1XTemp & (1 << ALLOC)))
|
|
c58: 21 ff sbrs r18, 1
|
|
c5a: 1f c0 rjmp .+62 ; 0xc9a <Pipe_ConfigurePipe+0xb4>
|
|
* from an attached device.
|
|
*/
|
|
static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_DisablePipe(void)
|
|
{
|
|
UPCONX &= ~(1 << PEN);
|
|
c5c: 30 91 a9 00 lds r19, 0x00A9
|
|
c60: 3e 7f andi r19, 0xFE ; 254
|
|
c62: 30 93 a9 00 sts 0x00A9, r19
|
|
continue;
|
|
|
|
Pipe_DisablePipe();
|
|
UPCFG1X &= (1 << ALLOC);
|
|
c66: 30 91 ab 00 lds r19, 0x00AB
|
|
c6a: 32 70 andi r19, 0x02 ; 2
|
|
c6c: 30 93 ab 00 sts 0x00AB, r19
|
|
* \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
|
|
*/
|
|
static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_EnablePipe(void)
|
|
{
|
|
UPCONX |= (1 << PEN);
|
|
c70: 30 91 a9 00 lds r19, 0x00A9
|
|
c74: 31 60 ori r19, 0x01 ; 1
|
|
c76: 30 93 a9 00 sts 0x00A9, r19
|
|
|
|
Pipe_EnablePipe();
|
|
UPCFG0X = UPCFG0XTemp;
|
|
c7a: a0 93 aa 00 sts 0x00AA, r26
|
|
UPCFG1X = UPCFG1XTemp;
|
|
c7e: 20 93 ab 00 sts 0x00AB, r18
|
|
UPCFG2X = UPCFG2XTemp;
|
|
c82: f0 93 ad 00 sts 0x00AD, r31
|
|
UPCONX = UPCONXTemp;
|
|
c86: e0 93 a9 00 sts 0x00A9, r30
|
|
UPINRQX = UPINRQXTemp;
|
|
c8a: 70 93 a5 00 sts 0x00A5, r23
|
|
UPIENX = UPIENXTemp;
|
|
c8e: 40 93 ae 00 sts 0x00AE, r20
|
|
* \return Boolean \c true if the selected pipe is configured, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsConfigured(void)
|
|
{
|
|
return ((UPSTAX & (1 << CFGOK)) ? true : false);
|
|
c92: 20 91 ac 00 lds r18, 0x00AC
|
|
|
|
if (!(Pipe_IsConfigured()))
|
|
c96: 27 ff sbrs r18, 7
|
|
c98: 08 c0 rjmp .+16 ; 0xcaa <Pipe_ConfigurePipe+0xc4>
|
|
|
|
Pipe_SetInfiniteINRequests();
|
|
|
|
return Pipe_IsConfigured();
|
|
#else
|
|
for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
|
|
c9a: 9f 5f subi r25, 0xFF ; 255
|
|
c9c: 97 30 cpi r25, 0x07 ; 7
|
|
c9e: 08 f4 brcc .+2 ; 0xca2 <Pipe_ConfigurePipe+0xbc>
|
|
ca0: b0 cf rjmp .-160 ; 0xc02 <Pipe_ConfigurePipe+0x1c>
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
ca2: 80 93 a7 00 sts 0x00A7, r24
|
|
if (!(Pipe_IsConfigured()))
|
|
return false;
|
|
}
|
|
|
|
Pipe_SelectPipe(Number);
|
|
return true;
|
|
ca6: 81 e0 ldi r24, 0x01 ; 1
|
|
ca8: 01 c0 rjmp .+2 ; 0xcac <Pipe_ConfigurePipe+0xc6>
|
|
UPCONX = UPCONXTemp;
|
|
UPINRQX = UPINRQXTemp;
|
|
UPIENX = UPIENXTemp;
|
|
|
|
if (!(Pipe_IsConfigured()))
|
|
return false;
|
|
caa: 80 e0 ldi r24, 0x00 ; 0
|
|
}
|
|
|
|
Pipe_SelectPipe(Number);
|
|
return true;
|
|
#endif
|
|
}
|
|
cac: 1f 91 pop r17
|
|
cae: 0f 91 pop r16
|
|
cb0: ef 90 pop r14
|
|
cb2: 08 95 ret
|
|
|
|
00000cb4 <Pipe_ClearPipes>:
|
|
|
|
void Pipe_ClearPipes(void)
|
|
{
|
|
UPINT = 0;
|
|
cb4: 10 92 f8 00 sts 0x00F8, r1
|
|
|
|
for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
|
|
cb8: 80 e0 ldi r24, 0x00 ; 0
|
|
cba: 80 93 a7 00 sts 0x00A7, r24
|
|
{
|
|
Pipe_SelectPipe(PNum);
|
|
UPIENX = 0;
|
|
cbe: 10 92 ae 00 sts 0x00AE, r1
|
|
UPINTX = 0;
|
|
cc2: 10 92 a6 00 sts 0x00A6, r1
|
|
UPCFG1X = 0;
|
|
cc6: 10 92 ab 00 sts 0x00AB, r1
|
|
* from an attached device.
|
|
*/
|
|
static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_DisablePipe(void)
|
|
{
|
|
UPCONX &= ~(1 << PEN);
|
|
cca: 90 91 a9 00 lds r25, 0x00A9
|
|
cce: 9e 7f andi r25, 0xFE ; 254
|
|
cd0: 90 93 a9 00 sts 0x00A9, r25
|
|
|
|
void Pipe_ClearPipes(void)
|
|
{
|
|
UPINT = 0;
|
|
|
|
for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
|
|
cd4: 8f 5f subi r24, 0xFF ; 255
|
|
cd6: 87 30 cpi r24, 0x07 ; 7
|
|
cd8: 81 f7 brne .-32 ; 0xcba <Pipe_ClearPipes+0x6>
|
|
UPIENX = 0;
|
|
UPINTX = 0;
|
|
UPCFG1X = 0;
|
|
Pipe_DisablePipe();
|
|
}
|
|
}
|
|
cda: 08 95 ret
|
|
|
|
00000cdc <USB_Disable>:
|
|
USB_ResetInterface();
|
|
}
|
|
|
|
void USB_Disable(void)
|
|
{
|
|
USB_INT_DisableAllInterrupts();
|
|
cdc: 6e d0 rcall .+220 ; 0xdba <USB_INT_DisableAllInterrupts>
|
|
USB_INT_ClearAllInterrupts();
|
|
cde: 75 d0 rcall .+234 ; 0xdca <USB_INT_ClearAllInterrupts>
|
|
* enumerating the device once attached until \ref USB_Attach() is called.
|
|
*/
|
|
static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Detach(void)
|
|
{
|
|
UDCON |= (1 << DETACH);
|
|
ce0: e0 ee ldi r30, 0xE0 ; 224
|
|
ce2: f0 e0 ldi r31, 0x00 ; 0
|
|
ce4: 80 81 ld r24, Z
|
|
ce6: 81 60 ori r24, 0x01 ; 1
|
|
ce8: 80 83 st Z, r24
|
|
}
|
|
|
|
static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Controller_Disable(void)
|
|
{
|
|
USBCON &= ~(1 << USBE);
|
|
cea: e8 ed ldi r30, 0xD8 ; 216
|
|
cec: f0 e0 ldi r31, 0x00 ; 0
|
|
cee: 80 81 ld r24, Z
|
|
cf0: 8f 77 andi r24, 0x7F ; 127
|
|
cf2: 80 83 st Z, r24
|
|
}
|
|
|
|
static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_PLL_Off(void)
|
|
{
|
|
PLLCSR = 0;
|
|
cf4: 19 bc out 0x29, r1 ; 41
|
|
|
|
static inline void USB_REG_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_REG_Off(void)
|
|
{
|
|
#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
|
|
UHWCON &= ~(1 << UVREGE);
|
|
cf6: a7 ed ldi r26, 0xD7 ; 215
|
|
cf8: b0 e0 ldi r27, 0x00 ; 0
|
|
cfa: 8c 91 ld r24, X
|
|
cfc: 8e 7f andi r24, 0xFE ; 254
|
|
cfe: 8c 93 st X, r24
|
|
}
|
|
|
|
static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_OTGPAD_Off(void)
|
|
{
|
|
USBCON &= ~(1 << OTGPADE);
|
|
d00: 80 81 ld r24, Z
|
|
d02: 8f 7e andi r24, 0xEF ; 239
|
|
d04: 80 83 st Z, r24
|
|
|
|
#if defined(USB_CAN_BE_BOTH)
|
|
USB_CurrentMode = USB_MODE_None;
|
|
#endif
|
|
|
|
USB_IsInitialized = false;
|
|
d06: 10 92 22 01 sts 0x0122, r1
|
|
}
|
|
d0a: 08 95 ret
|
|
|
|
00000d0c <USB_ResetInterface>:
|
|
{
|
|
#if defined(USB_CAN_BE_BOTH)
|
|
bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0);
|
|
#endif
|
|
|
|
USB_INT_DisableAllInterrupts();
|
|
d0c: 56 d0 rcall .+172 ; 0xdba <USB_INT_DisableAllInterrupts>
|
|
USB_INT_ClearAllInterrupts();
|
|
d0e: 5d d0 rcall .+186 ; 0xdca <USB_INT_ClearAllInterrupts>
|
|
}
|
|
|
|
static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Controller_Reset(void)
|
|
{
|
|
const uint8_t Temp = USBCON;
|
|
d10: 80 91 d8 00 lds r24, 0x00D8
|
|
|
|
USBCON = (Temp & ~(1 << USBE));
|
|
d14: 98 2f mov r25, r24
|
|
d16: 9f 77 andi r25, 0x7F ; 127
|
|
d18: 90 93 d8 00 sts 0x00D8, r25
|
|
USBCON = (Temp | (1 << USBE));
|
|
d1c: 80 68 ori r24, 0x80 ; 128
|
|
d1e: 80 93 d8 00 sts 0x00D8, r24
|
|
}
|
|
|
|
static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_CLK_Unfreeze(void)
|
|
{
|
|
USBCON &= ~(1 << FRZCLK);
|
|
d22: 80 91 d8 00 lds r24, 0x00D8
|
|
d26: 8f 7d andi r24, 0xDF ; 223
|
|
d28: 80 93 d8 00 sts 0x00D8, r24
|
|
#endif
|
|
}
|
|
else if (USB_CurrentMode == USB_MODE_Host)
|
|
{
|
|
#if defined(USB_CAN_BE_HOST)
|
|
UHWCON &= ~(1 << UIMOD);
|
|
d2c: 80 91 d7 00 lds r24, 0x00D7
|
|
d30: 8f 77 andi r24, 0x7F ; 127
|
|
d32: 80 93 d7 00 sts 0x00D7, r24
|
|
|
|
/* Inline Functions: */
|
|
static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_PLL_On(void)
|
|
{
|
|
PLLCSR = USB_PLL_PSC;
|
|
d36: 8c e0 ldi r24, 0x0C ; 12
|
|
d38: 89 bd out 0x29, r24 ; 41
|
|
PLLCSR |= (1 << PLLE);
|
|
d3a: 89 b5 in r24, 0x29 ; 41
|
|
d3c: 82 60 ori r24, 0x02 ; 2
|
|
d3e: 89 bd out 0x29, r24 ; 41
|
|
|
|
if (!(USB_Options & USB_OPT_MANUAL_PLL))
|
|
{
|
|
#if defined(USB_CAN_BE_HOST)
|
|
USB_PLL_On();
|
|
while (!(USB_PLL_IsReady()));
|
|
d40: 09 b4 in r0, 0x29 ; 41
|
|
d42: 00 fe sbrs r0, 0
|
|
d44: fd cf rjmp .-6 ; 0xd40 <USB_ResetInterface+0x34>
|
|
#endif
|
|
|
|
#if defined(USB_CAN_BE_HOST)
|
|
static void USB_Init_Host(void)
|
|
{
|
|
USB_HostState = HOST_STATE_Unattached;
|
|
d46: 82 e0 ldi r24, 0x02 ; 2
|
|
d48: 80 93 2b 01 sts 0x012B, r24
|
|
USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
|
|
d4c: 80 e4 ldi r24, 0x40 ; 64
|
|
d4e: 80 93 1b 01 sts 0x011B, r24
|
|
#if !defined(__DOXYGEN__)
|
|
/* Macros: */
|
|
static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_HostMode_On(void)
|
|
{
|
|
USBCON |= (1 << HOST);
|
|
d52: 80 91 d8 00 lds r24, 0x00D8
|
|
d56: 80 64 ori r24, 0x40 ; 64
|
|
d58: 80 93 d8 00 sts 0x00D8, r24
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Auto_Off(void)
|
|
{
|
|
OTGCON |= (1 << VBUSRQC);
|
|
d5c: 80 91 dd 00 lds r24, 0x00DD
|
|
d60: 81 60 ori r24, 0x01 ; 1
|
|
d62: 80 93 dd 00 sts 0x00DD, r24
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Manual_Enable(void)
|
|
{
|
|
OTGCON |= (1 << VBUSHWC);
|
|
d66: 80 91 dd 00 lds r24, 0x00DD
|
|
d6a: 84 60 ori r24, 0x04 ; 4
|
|
d6c: 80 93 dd 00 sts 0x00DD, r24
|
|
UHWCON &= ~(1 << UVCONE);
|
|
d70: 80 91 d7 00 lds r24, 0x00D7
|
|
d74: 8f 7e andi r24, 0xEF ; 239
|
|
d76: 80 93 d7 00 sts 0x00D7, r24
|
|
|
|
DDRE |= (1 << 7);
|
|
d7a: 6f 9a sbi 0x0d, 7 ; 13
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Manual_On(void)
|
|
{
|
|
PORTE |= (1 << 7);
|
|
d7c: 77 9a sbi 0x0e, 7 ; 14
|
|
break;
|
|
case USB_INT_VBERRI:
|
|
OTGIEN |= (1 << VBERRE);
|
|
break;
|
|
case USB_INT_SRPI:
|
|
OTGIEN |= (1 << SRPE);
|
|
d7e: 80 91 de 00 lds r24, 0x00DE
|
|
d82: 81 60 ori r24, 0x01 ; 1
|
|
d84: 80 93 de 00 sts 0x00DE, r24
|
|
break;
|
|
case USB_INT_RSTI:
|
|
UHIEN |= (1 << RSTE);
|
|
break;
|
|
case USB_INT_BCERRI:
|
|
OTGIEN |= (1 << BCERRE);
|
|
d88: 80 91 de 00 lds r24, 0x00DE
|
|
d8c: 84 60 ori r24, 0x04 ; 4
|
|
d8e: 80 93 de 00 sts 0x00DE, r24
|
|
* register and despite the datasheet making no mention of its requirement in host mode.
|
|
*/
|
|
static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Attach(void)
|
|
{
|
|
UDCON &= ~(1 << DETACH);
|
|
d92: 80 91 e0 00 lds r24, 0x00E0
|
|
d96: 8e 7f andi r24, 0xFE ; 254
|
|
d98: 80 93 e0 00 sts 0x00E0, r24
|
|
|
|
#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
|
|
static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_OTGPAD_On(void)
|
|
{
|
|
USBCON |= (1 << OTGPADE);
|
|
d9c: 80 91 d8 00 lds r24, 0x00D8
|
|
da0: 80 61 ori r24, 0x10 ; 16
|
|
da2: 80 93 d8 00 sts 0x00D8, r24
|
|
}
|
|
|
|
#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
|
|
USB_OTGPAD_On();
|
|
#endif
|
|
}
|
|
da6: 08 95 ret
|
|
|
|
00000da8 <USB_Init>:
|
|
|
|
static inline void USB_REG_On(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_REG_On(void)
|
|
{
|
|
#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
|
|
UHWCON |= (1 << UVREGE);
|
|
da8: e7 ed ldi r30, 0xD7 ; 215
|
|
daa: f0 e0 ldi r31, 0x00 ; 0
|
|
dac: 80 81 ld r24, Z
|
|
dae: 81 60 ori r24, 0x01 ; 1
|
|
db0: 80 83 st Z, r24
|
|
UHWCON &= ~(1 << UIDE);
|
|
USB_CurrentMode = Mode;
|
|
}
|
|
#endif
|
|
|
|
USB_IsInitialized = true;
|
|
db2: 81 e0 ldi r24, 0x01 ; 1
|
|
db4: 80 93 22 01 sts 0x0122, r24
|
|
|
|
USB_ResetInterface();
|
|
}
|
|
db8: a9 cf rjmp .-174 ; 0xd0c <USB_ResetInterface>
|
|
|
|
00000dba <USB_INT_DisableAllInterrupts>:
|
|
#include "../USBInterrupt.h"
|
|
|
|
void USB_INT_DisableAllInterrupts(void)
|
|
{
|
|
#if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
|
|
USBCON &= ~((1 << VBUSTE) | (1 << IDTE));
|
|
dba: e8 ed ldi r30, 0xD8 ; 216
|
|
dbc: f0 e0 ldi r31, 0x00 ; 0
|
|
dbe: 80 81 ld r24, Z
|
|
dc0: 8c 7f andi r24, 0xFC ; 252
|
|
dc2: 80 83 st Z, r24
|
|
#if defined(USB_CAN_BE_BOTH)
|
|
OTGIEN = 0;
|
|
#endif
|
|
|
|
#if defined(USB_CAN_BE_HOST)
|
|
UHIEN = 0;
|
|
dc4: 10 92 a0 00 sts 0x00A0, r1
|
|
#endif
|
|
|
|
#if defined(USB_CAN_BE_DEVICE)
|
|
UDIEN = 0;
|
|
#endif
|
|
}
|
|
dc8: 08 95 ret
|
|
|
|
00000dca <USB_INT_ClearAllInterrupts>:
|
|
|
|
void USB_INT_ClearAllInterrupts(void)
|
|
{
|
|
#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
|
|
USBINT = 0;
|
|
dca: 10 92 da 00 sts 0x00DA, r1
|
|
#if defined(USB_CAN_BE_BOTH)
|
|
OTGINT = 0;
|
|
#endif
|
|
|
|
#if defined(USB_CAN_BE_HOST)
|
|
UHINT = 0;
|
|
dce: 10 92 9f 00 sts 0x009F, r1
|
|
#endif
|
|
|
|
#if defined(USB_CAN_BE_DEVICE)
|
|
UDINT = 0;
|
|
#endif
|
|
}
|
|
dd2: 08 95 ret
|
|
|
|
00000dd4 <__vector_10>:
|
|
|
|
ISR(USB_GEN_vect, ISR_BLOCK)
|
|
{
|
|
dd4: 1f 92 push r1
|
|
dd6: 0f 92 push r0
|
|
dd8: 0f b6 in r0, 0x3f ; 63
|
|
dda: 0f 92 push r0
|
|
ddc: 0b b6 in r0, 0x3b ; 59
|
|
dde: 0f 92 push r0
|
|
de0: 11 24 eor r1, r1
|
|
de2: 2f 93 push r18
|
|
de4: 3f 93 push r19
|
|
de6: 4f 93 push r20
|
|
de8: 5f 93 push r21
|
|
dea: 6f 93 push r22
|
|
dec: 7f 93 push r23
|
|
dee: 8f 93 push r24
|
|
df0: 9f 93 push r25
|
|
df2: af 93 push r26
|
|
df4: bf 93 push r27
|
|
df6: ef 93 push r30
|
|
df8: ff 93 push r31
|
|
case USB_INT_RXSTPI:
|
|
return (UEINTX & (1 << RXSTPI));
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHINT & (1 << HSOFI));
|
|
dfa: 80 91 9f 00 lds r24, 0x009F
|
|
}
|
|
#endif
|
|
|
|
#if defined(USB_CAN_BE_HOST)
|
|
#if !defined(NO_SOF_EVENTS)
|
|
if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
|
|
dfe: 85 ff sbrs r24, 5
|
|
e00: 0a c0 rjmp .+20 ; 0xe16 <__vector_10+0x42>
|
|
case USB_INT_RXSTPI:
|
|
return (UEIENX & (1 << RXSTPE));
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
return (UHIEN & (1 << HSOFE));
|
|
e02: 80 91 a0 00 lds r24, 0x00A0
|
|
e06: 85 ff sbrs r24, 5
|
|
e08: 06 c0 rjmp .+12 ; 0xe16 <__vector_10+0x42>
|
|
UEINTX &= ~(1 << RXSTPI);
|
|
break;
|
|
#endif
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
e0a: 80 91 9f 00 lds r24, 0x009F
|
|
e0e: 8f 7d andi r24, 0xDF ; 223
|
|
e10: 80 93 9f 00 sts 0x009F, r24
|
|
{
|
|
USB_INT_Clear(USB_INT_HSOFI);
|
|
|
|
EVENT_USB_Host_StartOfFrame();
|
|
e14: 0c d1 rcall .+536 ; 0x102e <USB_Event_Stub>
|
|
case USB_INT_HSOFI:
|
|
return (UHINT & (1 << HSOFI));
|
|
case USB_INT_DCONNI:
|
|
return (UHINT & (1 << DCONNI));
|
|
case USB_INT_DDISCI:
|
|
return (UHINT & (1 << DDISCI));
|
|
e16: 80 91 9f 00 lds r24, 0x009F
|
|
}
|
|
#endif
|
|
|
|
if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
|
|
e1a: 81 ff sbrs r24, 1
|
|
e1c: 15 c0 rjmp .+42 ; 0xe48 <__vector_10+0x74>
|
|
case USB_INT_HSOFI:
|
|
return (UHIEN & (1 << HSOFE));
|
|
case USB_INT_DCONNI:
|
|
return (UHIEN & (1 << DCONNE));
|
|
case USB_INT_DDISCI:
|
|
return (UHIEN & (1 << DDISCE));
|
|
e1e: 80 91 a0 00 lds r24, 0x00A0
|
|
e22: 81 ff sbrs r24, 1
|
|
e24: 11 c0 rjmp .+34 ; 0xe48 <__vector_10+0x74>
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHINT &= ~(1 << DCONNI);
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHINT &= ~(1 << DDISCI);
|
|
e26: 80 91 9f 00 lds r24, 0x009F
|
|
e2a: 8d 7f andi r24, 0xFD ; 253
|
|
e2c: 80 93 9f 00 sts 0x009F, r24
|
|
#if defined(USB_CAN_BE_HOST)
|
|
case USB_INT_HSOFI:
|
|
UHINT &= ~(1 << HSOFI);
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHINT &= ~(1 << DCONNI);
|
|
e30: 80 91 9f 00 lds r24, 0x009F
|
|
e34: 8e 7f andi r24, 0xFE ; 254
|
|
e36: 80 93 9f 00 sts 0x009F, r24
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHIEN &= ~(1 << DCONNE);
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHIEN &= ~(1 << DDISCE);
|
|
e3a: 80 91 a0 00 lds r24, 0x00A0
|
|
e3e: 8d 7f andi r24, 0xFD ; 253
|
|
e40: 80 93 a0 00 sts 0x00A0, r24
|
|
{
|
|
USB_INT_Clear(USB_INT_DDISCI);
|
|
USB_INT_Clear(USB_INT_DCONNI);
|
|
USB_INT_Disable(USB_INT_DDISCI);
|
|
|
|
EVENT_USB_Host_DeviceUnattached();
|
|
e44: a1 da rcall .-2750 ; 0x388 <EVENT_USB_Host_DeviceUnattached>
|
|
|
|
USB_ResetInterface();
|
|
e46: 62 df rcall .-316 ; 0xd0c <USB_ResetInterface>
|
|
case USB_INT_RSTI:
|
|
return (UHINT & (1 << RSTI));
|
|
case USB_INT_BCERRI:
|
|
return (OTGINT & (1 << BCERRI));
|
|
case USB_INT_VBERRI:
|
|
return (OTGINT & (1 << VBERRI));
|
|
e48: 80 91 df 00 lds r24, 0x00DF
|
|
}
|
|
|
|
if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
|
|
e4c: 81 ff sbrs r24, 1
|
|
e4e: 15 c0 rjmp .+42 ; 0xe7a <__vector_10+0xa6>
|
|
case USB_INT_RSTI:
|
|
return (UHIEN & (1 << RSTE));
|
|
case USB_INT_BCERRI:
|
|
return (OTGIEN & (1 << BCERRE));
|
|
case USB_INT_VBERRI:
|
|
return (OTGIEN & (1 << VBERRE));
|
|
e50: 80 91 de 00 lds r24, 0x00DE
|
|
e54: 81 ff sbrs r24, 1
|
|
e56: 11 c0 rjmp .+34 ; 0xe7a <__vector_10+0xa6>
|
|
break;
|
|
case USB_INT_BCERRI:
|
|
OTGINT &= ~(1 << BCERRI);
|
|
break;
|
|
case USB_INT_VBERRI:
|
|
OTGINT &= ~(1 << VBERRI);
|
|
e58: 80 91 df 00 lds r24, 0x00DF
|
|
e5c: 8d 7f andi r24, 0xFD ; 253
|
|
e5e: 80 93 df 00 sts 0x00DF, r24
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Manual_Off(void)
|
|
{
|
|
PORTE &= ~(1 << 7);
|
|
e62: 77 98 cbi 0x0e, 7 ; 14
|
|
}
|
|
|
|
static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_VBUS_Auto_Off(void)
|
|
{
|
|
OTGCON |= (1 << VBUSRQC);
|
|
e64: 80 91 dd 00 lds r24, 0x00DD
|
|
e68: 81 60 ori r24, 0x01 ; 1
|
|
e6a: 80 93 dd 00 sts 0x00DD, r24
|
|
USB_INT_Clear(USB_INT_VBERRI);
|
|
|
|
USB_Host_VBUS_Manual_Off();
|
|
USB_Host_VBUS_Auto_Off();
|
|
|
|
EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
|
|
e6e: 80 e0 ldi r24, 0x00 ; 0
|
|
e70: 92 da rcall .-2780 ; 0x396 <EVENT_USB_Host_HostError>
|
|
EVENT_USB_Host_DeviceUnattached();
|
|
e72: 8a da rcall .-2796 ; 0x388 <EVENT_USB_Host_DeviceUnattached>
|
|
|
|
USB_HostState = HOST_STATE_Unattached;
|
|
e74: 82 e0 ldi r24, 0x02 ; 2
|
|
e76: 80 93 2b 01 sts 0x012B, r24
|
|
case USB_INT_BCERRI:
|
|
return (OTGINT & (1 << BCERRI));
|
|
case USB_INT_VBERRI:
|
|
return (OTGINT & (1 << VBERRI));
|
|
case USB_INT_SRPI:
|
|
return (OTGINT & (1 << SRPI));
|
|
e7a: 80 91 df 00 lds r24, 0x00DF
|
|
}
|
|
|
|
if (USB_INT_HasOccurred(USB_INT_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI))
|
|
e7e: 80 ff sbrs r24, 0
|
|
e80: 17 c0 rjmp .+46 ; 0xeb0 <__vector_10+0xdc>
|
|
case USB_INT_BCERRI:
|
|
return (OTGIEN & (1 << BCERRE));
|
|
case USB_INT_VBERRI:
|
|
return (OTGIEN & (1 << VBERRE));
|
|
case USB_INT_SRPI:
|
|
return (OTGIEN & (1 << SRPE));
|
|
e82: 80 91 de 00 lds r24, 0x00DE
|
|
e86: 80 ff sbrs r24, 0
|
|
e88: 13 c0 rjmp .+38 ; 0xeb0 <__vector_10+0xdc>
|
|
break;
|
|
case USB_INT_VBERRI:
|
|
OTGINT &= ~(1 << VBERRI);
|
|
break;
|
|
case USB_INT_SRPI:
|
|
OTGINT &= ~(1 << SRPI);
|
|
e8a: 80 91 df 00 lds r24, 0x00DF
|
|
e8e: 8e 7f andi r24, 0xFE ; 254
|
|
e90: 80 93 df 00 sts 0x00DF, r24
|
|
break;
|
|
case USB_INT_VBERRI:
|
|
OTGIEN &= ~(1 << VBERRE);
|
|
break;
|
|
case USB_INT_SRPI:
|
|
OTGIEN &= ~(1 << SRPE);
|
|
e94: 80 91 de 00 lds r24, 0x00DE
|
|
e98: 8e 7f andi r24, 0xFE ; 254
|
|
e9a: 80 93 de 00 sts 0x00DE, r24
|
|
{
|
|
USB_INT_Clear(USB_INT_SRPI);
|
|
USB_INT_Disable(USB_INT_SRPI);
|
|
|
|
EVENT_USB_Host_DeviceAttached();
|
|
e9e: 6f da rcall .-2850 ; 0x37e <EVENT_USB_Host_DeviceAttached>
|
|
break;
|
|
case USB_INT_DCONNI:
|
|
UHIEN |= (1 << DCONNE);
|
|
break;
|
|
case USB_INT_DDISCI:
|
|
UHIEN |= (1 << DDISCE);
|
|
ea0: 80 91 a0 00 lds r24, 0x00A0
|
|
ea4: 82 60 ori r24, 0x02 ; 2
|
|
ea6: 80 93 a0 00 sts 0x00A0, r24
|
|
|
|
USB_INT_Enable(USB_INT_DDISCI);
|
|
|
|
USB_HostState = HOST_STATE_Powered;
|
|
eaa: 83 e0 ldi r24, 0x03 ; 3
|
|
eac: 80 93 2b 01 sts 0x012B, r24
|
|
case USB_INT_DDISCI:
|
|
return (UHINT & (1 << DDISCI));
|
|
case USB_INT_RSTI:
|
|
return (UHINT & (1 << RSTI));
|
|
case USB_INT_BCERRI:
|
|
return (OTGINT & (1 << BCERRI));
|
|
eb0: 80 91 df 00 lds r24, 0x00DF
|
|
}
|
|
|
|
if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
|
|
eb4: 82 ff sbrs r24, 2
|
|
eb6: 0e c0 rjmp .+28 ; 0xed4 <__vector_10+0x100>
|
|
case USB_INT_DDISCI:
|
|
return (UHIEN & (1 << DDISCE));
|
|
case USB_INT_RSTI:
|
|
return (UHIEN & (1 << RSTE));
|
|
case USB_INT_BCERRI:
|
|
return (OTGIEN & (1 << BCERRE));
|
|
eb8: 80 91 de 00 lds r24, 0x00DE
|
|
ebc: 82 ff sbrs r24, 2
|
|
ebe: 0a c0 rjmp .+20 ; 0xed4 <__vector_10+0x100>
|
|
break;
|
|
case USB_INT_RSTI:
|
|
UHINT &= ~(1 << RSTI);
|
|
break;
|
|
case USB_INT_BCERRI:
|
|
OTGINT &= ~(1 << BCERRI);
|
|
ec0: 80 91 df 00 lds r24, 0x00DF
|
|
ec4: 8b 7f andi r24, 0xFB ; 251
|
|
ec6: 80 93 df 00 sts 0x00DF, r24
|
|
{
|
|
USB_INT_Clear(USB_INT_BCERRI);
|
|
|
|
EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
|
|
eca: 82 e0 ldi r24, 0x02 ; 2
|
|
ecc: 60 e0 ldi r22, 0x00 ; 0
|
|
ece: 82 da rcall .-2812 ; 0x3d4 <EVENT_USB_Host_DeviceEnumerationFailed>
|
|
EVENT_USB_Host_DeviceUnattached();
|
|
ed0: 5b da rcall .-2890 ; 0x388 <EVENT_USB_Host_DeviceUnattached>
|
|
|
|
USB_ResetInterface();
|
|
ed2: 1c df rcall .-456 ; 0xd0c <USB_ResetInterface>
|
|
USB_ResetInterface();
|
|
|
|
EVENT_USB_UIDChange();
|
|
}
|
|
#endif
|
|
}
|
|
ed4: ff 91 pop r31
|
|
ed6: ef 91 pop r30
|
|
ed8: bf 91 pop r27
|
|
eda: af 91 pop r26
|
|
edc: 9f 91 pop r25
|
|
ede: 8f 91 pop r24
|
|
ee0: 7f 91 pop r23
|
|
ee2: 6f 91 pop r22
|
|
ee4: 5f 91 pop r21
|
|
ee6: 4f 91 pop r20
|
|
ee8: 3f 91 pop r19
|
|
eea: 2f 91 pop r18
|
|
eec: 0f 90 pop r0
|
|
eee: 0b be out 0x3b, r0 ; 59
|
|
ef0: 0f 90 pop r0
|
|
ef2: 0f be out 0x3f, r0 ; 63
|
|
ef4: 0f 90 pop r0
|
|
ef6: 1f 90 pop r1
|
|
ef8: 18 95 reti
|
|
|
|
00000efa <USB_Host_GetDeviceConfigDescriptor>:
|
|
#if defined(USB_CAN_BE_HOST)
|
|
uint8_t USB_Host_GetDeviceConfigDescriptor(const uint8_t ConfigNumber,
|
|
uint16_t* const ConfigSizePtr,
|
|
void* const BufferPtr,
|
|
const uint16_t BufferSize)
|
|
{
|
|
efa: cf 92 push r12
|
|
efc: df 92 push r13
|
|
efe: ef 92 push r14
|
|
f00: ff 92 push r15
|
|
f02: 0f 93 push r16
|
|
f04: 1f 93 push r17
|
|
f06: df 93 push r29
|
|
f08: cf 93 push r28
|
|
f0a: cd b7 in r28, 0x3d ; 61
|
|
f0c: de b7 in r29, 0x3e ; 62
|
|
f0e: 29 97 sbiw r28, 0x09 ; 9
|
|
f10: 0f b6 in r0, 0x3f ; 63
|
|
f12: f8 94 cli
|
|
f14: de bf out 0x3e, r29 ; 62
|
|
f16: 0f be out 0x3f, r0 ; 63
|
|
f18: cd bf out 0x3d, r28 ; 61
|
|
f1a: 6b 01 movw r12, r22
|
|
f1c: 8a 01 movw r16, r20
|
|
f1e: 79 01 movw r14, r18
|
|
uint8_t ErrorCode;
|
|
uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
|
|
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
f20: 90 e8 ldi r25, 0x80 ; 128
|
|
f22: 90 93 23 01 sts 0x0123, r25
|
|
f26: 96 e0 ldi r25, 0x06 ; 6
|
|
f28: 90 93 24 01 sts 0x0124, r25
|
|
{
|
|
.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
|
|
.bRequest = REQ_GetDescriptor,
|
|
.wValue = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)),
|
|
f2c: 90 e0 ldi r25, 0x00 ; 0
|
|
f2e: 01 97 sbiw r24, 0x01 ; 1
|
|
f30: 92 60 ori r25, 0x02 ; 2
|
|
const uint16_t BufferSize)
|
|
{
|
|
uint8_t ErrorCode;
|
|
uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
|
|
|
|
USB_ControlRequest = (USB_Request_Header_t)
|
|
f32: 90 93 26 01 sts 0x0126, r25
|
|
f36: 80 93 25 01 sts 0x0125, r24
|
|
f3a: 10 92 28 01 sts 0x0128, r1
|
|
f3e: 10 92 27 01 sts 0x0127, r1
|
|
f42: 89 e0 ldi r24, 0x09 ; 9
|
|
f44: 90 e0 ldi r25, 0x00 ; 0
|
|
f46: 90 93 2a 01 sts 0x012A, r25
|
|
f4a: 80 93 29 01 sts 0x0129, r24
|
|
f4e: 10 92 a7 00 sts 0x00A7, r1
|
|
.wLength = sizeof(USB_Descriptor_Configuration_Header_t),
|
|
};
|
|
|
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
|
|
|
if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful)
|
|
f52: ce 01 movw r24, r28
|
|
f54: 01 96 adiw r24, 0x01 ; 1
|
|
f56: 95 d0 rcall .+298 ; 0x1082 <USB_Host_SendControlRequest>
|
|
f58: 88 23 and r24, r24
|
|
f5a: b9 f4 brne .+46 ; 0xf8a <USB_Host_GetDeviceConfigDescriptor+0x90>
|
|
return ErrorCode;
|
|
|
|
*ConfigSizePtr = DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize;
|
|
f5c: 8b 81 ldd r24, Y+3 ; 0x03
|
|
f5e: 9c 81 ldd r25, Y+4 ; 0x04
|
|
f60: f6 01 movw r30, r12
|
|
f62: 91 83 std Z+1, r25 ; 0x01
|
|
f64: 80 83 st Z, r24
|
|
|
|
if (*ConfigSizePtr > BufferSize)
|
|
f66: e8 16 cp r14, r24
|
|
f68: f9 06 cpc r15, r25
|
|
f6a: 70 f0 brcs .+28 ; 0xf88 <USB_Host_GetDeviceConfigDescriptor+0x8e>
|
|
return HOST_GETCONFIG_BuffOverflow;
|
|
|
|
USB_ControlRequest.wLength = *ConfigSizePtr;
|
|
f6c: 90 93 2a 01 sts 0x012A, r25
|
|
f70: 80 93 29 01 sts 0x0129, r24
|
|
|
|
if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful)
|
|
f74: c8 01 movw r24, r16
|
|
f76: 85 d0 rcall .+266 ; 0x1082 <USB_Host_SendControlRequest>
|
|
f78: 88 23 and r24, r24
|
|
f7a: 39 f4 brne .+14 ; 0xf8a <USB_Host_GetDeviceConfigDescriptor+0x90>
|
|
return ErrorCode;
|
|
|
|
if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)
|
|
f7c: f8 01 movw r30, r16
|
|
f7e: 91 81 ldd r25, Z+1 ; 0x01
|
|
f80: 92 30 cpi r25, 0x02 ; 2
|
|
f82: 19 f0 breq .+6 ; 0xf8a <USB_Host_GetDeviceConfigDescriptor+0x90>
|
|
return HOST_GETCONFIG_InvalidData;
|
|
f84: 86 e0 ldi r24, 0x06 ; 6
|
|
f86: 01 c0 rjmp .+2 ; 0xf8a <USB_Host_GetDeviceConfigDescriptor+0x90>
|
|
return ErrorCode;
|
|
|
|
*ConfigSizePtr = DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize;
|
|
|
|
if (*ConfigSizePtr > BufferSize)
|
|
return HOST_GETCONFIG_BuffOverflow;
|
|
f88: 85 e0 ldi r24, 0x05 ; 5
|
|
|
|
if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)
|
|
return HOST_GETCONFIG_InvalidData;
|
|
|
|
return HOST_GETCONFIG_Successful;
|
|
}
|
|
f8a: 29 96 adiw r28, 0x09 ; 9
|
|
f8c: 0f b6 in r0, 0x3f ; 63
|
|
f8e: f8 94 cli
|
|
f90: de bf out 0x3e, r29 ; 62
|
|
f92: 0f be out 0x3f, r0 ; 63
|
|
f94: cd bf out 0x3d, r28 ; 61
|
|
f96: cf 91 pop r28
|
|
f98: df 91 pop r29
|
|
f9a: 1f 91 pop r17
|
|
f9c: 0f 91 pop r16
|
|
f9e: ff 90 pop r15
|
|
fa0: ef 90 pop r14
|
|
fa2: df 90 pop r13
|
|
fa4: cf 90 pop r12
|
|
fa6: 08 95 ret
|
|
|
|
00000fa8 <USB_GetNextDescriptorComp>:
|
|
}
|
|
|
|
uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem,
|
|
void** const CurrConfigLoc,
|
|
const ConfigComparatorPtr_t const ComparatorRoutine)
|
|
{
|
|
fa8: af 92 push r10
|
|
faa: bf 92 push r11
|
|
fac: cf 92 push r12
|
|
fae: df 92 push r13
|
|
fb0: ef 92 push r14
|
|
fb2: ff 92 push r15
|
|
fb4: 0f 93 push r16
|
|
fb6: 1f 93 push r17
|
|
fb8: cf 93 push r28
|
|
fba: df 93 push r29
|
|
fbc: 8c 01 movw r16, r24
|
|
fbe: eb 01 movw r28, r22
|
|
fc0: 6a 01 movw r12, r20
|
|
uint8_t ErrorCode;
|
|
|
|
while (*BytesRem)
|
|
fc2: 23 c0 rjmp .+70 ; 0x100a <USB_GetNextDescriptorComp+0x62>
|
|
{
|
|
uint8_t* PrevDescLoc = *CurrConfigLoc;
|
|
fc4: e8 81 ld r30, Y
|
|
fc6: f9 81 ldd r31, Y+1 ; 0x01
|
|
fc8: 5f 01 movw r10, r30
|
|
static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
|
|
void** CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
|
|
static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
|
|
void** CurrConfigLoc)
|
|
{
|
|
uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
|
|
fca: 20 81 ld r18, Z
|
|
fcc: 30 e0 ldi r19, 0x00 ; 0
|
|
fce: c7 01 movw r24, r14
|
|
fd0: 2e 15 cp r18, r14
|
|
fd2: 3f 05 cpc r19, r15
|
|
fd4: 08 f4 brcc .+2 ; 0xfd8 <USB_GetNextDescriptorComp+0x30>
|
|
fd6: c9 01 movw r24, r18
|
|
|
|
if (*BytesRem < CurrDescriptorSize)
|
|
CurrDescriptorSize = *BytesRem;
|
|
|
|
*CurrConfigLoc = (void*)((uintptr_t)*CurrConfigLoc + CurrDescriptorSize);
|
|
fd8: e8 0f add r30, r24
|
|
fda: f9 1f adc r31, r25
|
|
fdc: f9 83 std Y+1, r31 ; 0x01
|
|
fde: e8 83 st Y, r30
|
|
*BytesRem -= CurrDescriptorSize;
|
|
fe0: f8 01 movw r30, r16
|
|
fe2: 20 81 ld r18, Z
|
|
fe4: 31 81 ldd r19, Z+1 ; 0x01
|
|
fe6: 28 1b sub r18, r24
|
|
fe8: 39 0b sbc r19, r25
|
|
fea: 31 83 std Z+1, r19 ; 0x01
|
|
fec: 20 83 st Z, r18
|
|
uint16_t PrevBytesRem = *BytesRem;
|
|
|
|
USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
|
|
|
|
if ((ErrorCode = ComparatorRoutine(*CurrConfigLoc)) != DESCRIPTOR_SEARCH_NotFound)
|
|
fee: 88 81 ld r24, Y
|
|
ff0: 99 81 ldd r25, Y+1 ; 0x01
|
|
ff2: f6 01 movw r30, r12
|
|
ff4: 09 95 icall
|
|
ff6: 82 30 cpi r24, 0x02 ; 2
|
|
ff8: 41 f0 breq .+16 ; 0x100a <USB_GetNextDescriptorComp+0x62>
|
|
{
|
|
if (ErrorCode == DESCRIPTOR_SEARCH_Fail)
|
|
ffa: 81 30 cpi r24, 0x01 ; 1
|
|
ffc: 69 f4 brne .+26 ; 0x1018 <USB_GetNextDescriptorComp+0x70>
|
|
{
|
|
*CurrConfigLoc = PrevDescLoc;
|
|
ffe: a8 82 st Y, r10
|
|
1000: b9 82 std Y+1, r11 ; 0x01
|
|
*BytesRem = PrevBytesRem;
|
|
1002: f8 01 movw r30, r16
|
|
1004: f1 82 std Z+1, r15 ; 0x01
|
|
1006: e0 82 st Z, r14
|
|
1008: 07 c0 rjmp .+14 ; 0x1018 <USB_GetNextDescriptorComp+0x70>
|
|
void** const CurrConfigLoc,
|
|
const ConfigComparatorPtr_t const ComparatorRoutine)
|
|
{
|
|
uint8_t ErrorCode;
|
|
|
|
while (*BytesRem)
|
|
100a: f8 01 movw r30, r16
|
|
100c: e0 80 ld r14, Z
|
|
100e: f1 80 ldd r15, Z+1 ; 0x01
|
|
1010: e1 14 cp r14, r1
|
|
1012: f1 04 cpc r15, r1
|
|
1014: b9 f6 brne .-82 ; 0xfc4 <USB_GetNextDescriptorComp+0x1c>
|
|
|
|
return ErrorCode;
|
|
}
|
|
}
|
|
|
|
return DESCRIPTOR_SEARCH_COMP_EndOfDescriptor;
|
|
1016: 82 e0 ldi r24, 0x02 ; 2
|
|
}
|
|
1018: df 91 pop r29
|
|
101a: cf 91 pop r28
|
|
101c: 1f 91 pop r17
|
|
101e: 0f 91 pop r16
|
|
1020: ff 90 pop r15
|
|
1022: ef 90 pop r14
|
|
1024: df 90 pop r13
|
|
1026: cf 90 pop r12
|
|
1028: bf 90 pop r11
|
|
102a: af 90 pop r10
|
|
102c: 08 95 ret
|
|
|
|
0000102e <USB_Event_Stub>:
|
|
#include "Events.h"
|
|
|
|
void USB_Event_Stub(void)
|
|
{
|
|
|
|
}
|
|
102e: 08 95 ret
|
|
|
|
00001030 <USB_Host_WaitForIOS>:
|
|
|
|
return ReturnStatus;
|
|
}
|
|
|
|
static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType)
|
|
{
|
|
1030: 1f 93 push r17
|
|
1032: cf 93 push r28
|
|
1034: df 93 push r29
|
|
1036: 18 2f mov r17, r24
|
|
#if (USB_HOST_TIMEOUT_MS < 0xFF)
|
|
uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
|
#else
|
|
uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
|
1038: c8 ee ldi r28, 0xE8 ; 232
|
|
103a: d3 e0 ldi r29, 0x03 ; 3
|
|
#endif
|
|
|
|
while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) ||
|
|
103c: 07 c0 rjmp .+14 ; 0x104c <USB_Host_WaitForIOS+0x1c>
|
|
((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
|
|
((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsOUTReady())))
|
|
{
|
|
uint8_t ErrorCode;
|
|
|
|
if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
|
103e: 81 e0 ldi r24, 0x01 ; 1
|
|
1040: 1e dc rcall .-1988 ; 0x87e <USB_Host_WaitMS>
|
|
1042: 88 23 and r24, r24
|
|
1044: d1 f4 brne .+52 ; 0x107a <USB_Host_WaitForIOS+0x4a>
|
|
return ErrorCode;
|
|
|
|
if (!(TimeoutCounter--))
|
|
1046: 20 97 sbiw r28, 0x00 ; 0
|
|
1048: b9 f0 breq .+46 ; 0x1078 <USB_Host_WaitForIOS+0x48>
|
|
104a: 21 97 sbiw r28, 0x01 ; 1
|
|
uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
|
#else
|
|
uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
|
#endif
|
|
|
|
while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) ||
|
|
104c: 11 23 and r17, r17
|
|
104e: 29 f4 brne .+10 ; 0x105a <USB_Host_WaitForIOS+0x2a>
|
|
* \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsSETUPSent(void)
|
|
{
|
|
return ((UPINTX & (1 << TXSTPI)) ? true : false);
|
|
1050: 80 91 a6 00 lds r24, 0x00A6
|
|
1054: 83 ff sbrs r24, 3
|
|
1056: f3 cf rjmp .-26 ; 0x103e <USB_Host_WaitForIOS+0xe>
|
|
1058: 0d c0 rjmp .+26 ; 0x1074 <USB_Host_WaitForIOS+0x44>
|
|
105a: 11 30 cpi r17, 0x01 ; 1
|
|
105c: 29 f4 brne .+10 ; 0x1068 <USB_Host_WaitForIOS+0x38>
|
|
* \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsINReceived(void)
|
|
{
|
|
return ((UPINTX & (1 << RXINI)) ? true : false);
|
|
105e: 80 91 a6 00 lds r24, 0x00A6
|
|
((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
|
|
1062: 80 ff sbrs r24, 0
|
|
1064: ec cf rjmp .-40 ; 0x103e <USB_Host_WaitForIOS+0xe>
|
|
1066: 06 c0 rjmp .+12 ; 0x1074 <USB_Host_WaitForIOS+0x44>
|
|
uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
|
#else
|
|
uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
|
#endif
|
|
|
|
while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) ||
|
|
1068: 12 30 cpi r17, 0x02 ; 2
|
|
106a: 49 f7 brne .-46 ; 0x103e <USB_Host_WaitForIOS+0xe>
|
|
* \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
|
|
*/
|
|
static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Pipe_IsOUTReady(void)
|
|
{
|
|
return ((UPINTX & (1 << TXOUTI)) ? true : false);
|
|
106c: 80 91 a6 00 lds r24, 0x00A6
|
|
((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
|
|
((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsOUTReady())))
|
|
1070: 82 ff sbrs r24, 2
|
|
1072: e5 cf rjmp .-54 ; 0x103e <USB_Host_WaitForIOS+0xe>
|
|
|
|
if (!(TimeoutCounter--))
|
|
return HOST_SENDCONTROL_SoftwareTimeOut;
|
|
}
|
|
|
|
return HOST_SENDCONTROL_Successful;
|
|
1074: 80 e0 ldi r24, 0x00 ; 0
|
|
1076: 01 c0 rjmp .+2 ; 0x107a <USB_Host_WaitForIOS+0x4a>
|
|
|
|
if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
|
return ErrorCode;
|
|
|
|
if (!(TimeoutCounter--))
|
|
return HOST_SENDCONTROL_SoftwareTimeOut;
|
|
1078: 84 e0 ldi r24, 0x04 ; 4
|
|
}
|
|
|
|
return HOST_SENDCONTROL_Successful;
|
|
}
|
|
107a: df 91 pop r29
|
|
107c: cf 91 pop r28
|
|
107e: 1f 91 pop r17
|
|
1080: 08 95 ret
|
|
|
|
00001082 <USB_Host_SendControlRequest>:
|
|
|
|
#define __INCLUDE_FROM_HOSTSTDREQ_C
|
|
#include "HostStandardReq.h"
|
|
|
|
uint8_t USB_Host_SendControlRequest(void* const BufferPtr)
|
|
{
|
|
1082: ef 92 push r14
|
|
1084: ff 92 push r15
|
|
1086: 0f 93 push r16
|
|
1088: 1f 93 push r17
|
|
108a: cf 93 push r28
|
|
108c: df 93 push r29
|
|
108e: 8c 01 movw r16, r24
|
|
* \return Boolean \c true if the bus is currently suspended, \c false otherwise.
|
|
*/
|
|
static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool USB_Host_IsBusSuspended(void)
|
|
{
|
|
return ((UHCON & (1 << SOFEN)) ? false : true);
|
|
1090: e0 90 9e 00 lds r14, 0x009E
|
|
1094: ff 24 eor r15, r15
|
|
1096: 81 e0 ldi r24, 0x01 ; 1
|
|
1098: e8 22 and r14, r24
|
|
109a: ff 24 eor r15, r15
|
|
uint8_t* DataStream = (uint8_t*)BufferPtr;
|
|
bool BusSuspended = USB_Host_IsBusSuspended();
|
|
uint8_t ReturnStatus = HOST_SENDCONTROL_Successful;
|
|
uint16_t DataLen = USB_ControlRequest.wLength;
|
|
109c: c0 91 29 01 lds r28, 0x0129
|
|
10a0: d0 91 2a 01 lds r29, 0x012A
|
|
* host and attached device may occur.
|
|
*/
|
|
static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_ResumeBus(void)
|
|
{
|
|
UHCON |= (1 << SOFEN);
|
|
10a4: 80 91 9e 00 lds r24, 0x009E
|
|
10a8: 81 60 ori r24, 0x01 ; 1
|
|
10aa: 80 93 9e 00 sts 0x009E, r24
|
|
|
|
USB_Host_ResumeBus();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
|
10ae: 81 e0 ldi r24, 0x01 ; 1
|
|
10b0: e6 db rcall .-2100 ; 0x87e <USB_Host_WaitMS>
|
|
10b2: 88 23 and r24, r24
|
|
10b4: 09 f0 breq .+2 ; 0x10b8 <USB_Host_SendControlRequest+0x36>
|
|
10b6: e2 c0 rjmp .+452 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
* \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
|
|
*/
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token)
|
|
{
|
|
UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
|
|
10b8: 80 91 aa 00 lds r24, 0x00AA
|
|
10bc: 8f 7c andi r24, 0xCF ; 207
|
|
10be: 80 93 aa 00 sts 0x00AA, r24
|
|
|
|
/** Clears the error flags for the currently selected pipe. */
|
|
static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearError(void)
|
|
{
|
|
UPERRX = 0;
|
|
10c2: 10 92 f5 00 sts 0x00F5, r1
|
|
UPINTX &= ~(1 << PERRI);
|
|
10c6: 80 91 a6 00 lds r24, 0x00A6
|
|
10ca: 8f 7e andi r24, 0xEF ; 239
|
|
10cc: 80 93 a6 00 sts 0x00A6, r24
|
|
|
|
/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
|
|
static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Unfreeze(void)
|
|
{
|
|
UPCONX &= ~(1 << PFREEZE);
|
|
10d0: 80 91 a9 00 lds r24, 0x00A9
|
|
10d4: 8f 7b andi r24, 0xBF ; 191
|
|
10d6: 80 93 a9 00 sts 0x00A9, r24
|
|
Pipe_SetPipeToken(PIPE_TOKEN_SETUP);
|
|
Pipe_ClearError();
|
|
|
|
Pipe_Unfreeze();
|
|
|
|
Pipe_Write_8(USB_ControlRequest.bmRequestType);
|
|
10da: 80 91 23 01 lds r24, 0x0123
|
|
* \param[in] Data Data to write into the the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Write_8(const uint8_t Data)
|
|
{
|
|
UPDATX = Data;
|
|
10de: 80 93 af 00 sts 0x00AF, r24
|
|
Pipe_Write_8(USB_ControlRequest.bRequest);
|
|
10e2: 80 91 24 01 lds r24, 0x0124
|
|
10e6: 80 93 af 00 sts 0x00AF, r24
|
|
Pipe_Write_16_LE(USB_ControlRequest.wValue);
|
|
10ea: 90 91 25 01 lds r25, 0x0125
|
|
10ee: 80 91 26 01 lds r24, 0x0126
|
|
* \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Write_16_LE(const uint16_t Data)
|
|
{
|
|
UPDATX = (Data & 0xFF);
|
|
10f2: 90 93 af 00 sts 0x00AF, r25
|
|
UPDATX = (Data >> 8);
|
|
10f6: 80 93 af 00 sts 0x00AF, r24
|
|
Pipe_Write_16_LE(USB_ControlRequest.wIndex);
|
|
10fa: 90 91 27 01 lds r25, 0x0127
|
|
10fe: 80 91 28 01 lds r24, 0x0128
|
|
* \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Write_16_LE(const uint16_t Data)
|
|
{
|
|
UPDATX = (Data & 0xFF);
|
|
1102: 90 93 af 00 sts 0x00AF, r25
|
|
UPDATX = (Data >> 8);
|
|
1106: 80 93 af 00 sts 0x00AF, r24
|
|
Pipe_Write_16_LE(USB_ControlRequest.wLength);
|
|
110a: 90 91 29 01 lds r25, 0x0129
|
|
110e: 80 91 2a 01 lds r24, 0x012A
|
|
* \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Write_16_LE(const uint16_t Data)
|
|
{
|
|
UPDATX = (Data & 0xFF);
|
|
1112: 90 93 af 00 sts 0x00AF, r25
|
|
UPDATX = (Data >> 8);
|
|
1116: 80 93 af 00 sts 0x00AF, r24
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearSETUP(void)
|
|
{
|
|
UPINTX &= ~((1 << TXSTPI) | (1 << FIFOCON));
|
|
111a: 80 91 a6 00 lds r24, 0x00A6
|
|
111e: 87 77 andi r24, 0x77 ; 119
|
|
1120: 80 93 a6 00 sts 0x00A6, r24
|
|
|
|
Pipe_ClearSETUP();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful)
|
|
1124: 80 e0 ldi r24, 0x00 ; 0
|
|
1126: 84 df rcall .-248 ; 0x1030 <USB_Host_WaitForIOS>
|
|
1128: 88 23 and r24, r24
|
|
112a: 09 f0 breq .+2 ; 0x112e <USB_Host_SendControlRequest+0xac>
|
|
112c: a7 c0 rjmp .+334 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
|
|
/** Freezes the selected pipe, preventing it from communicating with an attached device. */
|
|
static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Freeze(void)
|
|
{
|
|
UPCONX |= (1 << PFREEZE);
|
|
112e: 80 91 a9 00 lds r24, 0x00A9
|
|
1132: 80 64 ori r24, 0x40 ; 64
|
|
1134: 80 93 a9 00 sts 0x00A9, r24
|
|
goto End_Of_Control_Send;
|
|
|
|
Pipe_Freeze();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
|
1138: 81 e0 ldi r24, 0x01 ; 1
|
|
113a: a1 db rcall .-2238 ; 0x87e <USB_Host_WaitMS>
|
|
113c: 88 23 and r24, r24
|
|
113e: 09 f0 breq .+2 ; 0x1142 <USB_Host_SendControlRequest+0xc0>
|
|
1140: 9d c0 rjmp .+314 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
goto End_Of_Control_Send;
|
|
|
|
if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
|
|
1142: 80 91 23 01 lds r24, 0x0123
|
|
1146: 87 ff sbrs r24, 7
|
|
1148: 4f c0 rjmp .+158 ; 0x11e8 <USB_Host_SendControlRequest+0x166>
|
|
* \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
|
|
*/
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token)
|
|
{
|
|
UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
|
|
114a: 80 91 aa 00 lds r24, 0x00AA
|
|
114e: 8f 7c andi r24, 0xCF ; 207
|
|
1150: 80 61 ori r24, 0x10 ; 16
|
|
1152: 80 93 aa 00 sts 0x00AA, r24
|
|
{
|
|
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
|
|
|
if (DataStream != NULL)
|
|
1156: 01 15 cp r16, r1
|
|
1158: 11 05 cpc r17, r1
|
|
115a: 61 f5 brne .+88 ; 0x11b4 <USB_Host_SendControlRequest+0x132>
|
|
115c: 2d c0 rjmp .+90 ; 0x11b8 <USB_Host_SendControlRequest+0x136>
|
|
|
|
/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
|
|
static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Unfreeze(void)
|
|
{
|
|
UPCONX &= ~(1 << PFREEZE);
|
|
115e: 80 91 a9 00 lds r24, 0x00A9
|
|
1162: 8f 7b andi r24, 0xBF ; 191
|
|
1164: 80 93 a9 00 sts 0x00A9, r24
|
|
{
|
|
while (DataLen)
|
|
{
|
|
Pipe_Unfreeze();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
|
|
1168: 81 e0 ldi r24, 0x01 ; 1
|
|
116a: 62 df rcall .-316 ; 0x1030 <USB_Host_WaitForIOS>
|
|
116c: 88 23 and r24, r24
|
|
116e: 09 f0 breq .+2 ; 0x1172 <USB_Host_SendControlRequest+0xf0>
|
|
1170: 85 c0 rjmp .+266 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
* \return Total number of bytes in the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline uint16_t Pipe_BytesInPipe(void)
|
|
{
|
|
return UPBCX;
|
|
1172: 80 91 f6 00 lds r24, 0x00F6
|
|
1176: 90 91 f7 00 lds r25, 0x00F7
|
|
goto End_Of_Control_Send;
|
|
|
|
if (!(Pipe_BytesInPipe()))
|
|
117a: 00 97 sbiw r24, 0x00 ; 0
|
|
117c: 49 f4 brne .+18 ; 0x1190 <USB_Host_SendControlRequest+0x10e>
|
|
DataLen = 0;
|
|
117e: c0 e0 ldi r28, 0x00 ; 0
|
|
1180: d0 e0 ldi r29, 0x00 ; 0
|
|
1182: 06 c0 rjmp .+12 ; 0x1190 <USB_Host_SendControlRequest+0x10e>
|
|
* \return Next byte in the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline uint8_t Pipe_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline uint8_t Pipe_Read_8(void)
|
|
{
|
|
return UPDATX;
|
|
1184: 80 91 af 00 lds r24, 0x00AF
|
|
|
|
while (Pipe_BytesInPipe() && DataLen)
|
|
{
|
|
*(DataStream++) = Pipe_Read_8();
|
|
1188: f8 01 movw r30, r16
|
|
118a: 81 93 st Z+, r24
|
|
118c: 8f 01 movw r16, r30
|
|
DataLen--;
|
|
118e: 21 97 sbiw r28, 0x01 ; 1
|
|
* \return Total number of bytes in the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline uint16_t Pipe_BytesInPipe(void)
|
|
{
|
|
return UPBCX;
|
|
1190: 80 91 f6 00 lds r24, 0x00F6
|
|
1194: 90 91 f7 00 lds r25, 0x00F7
|
|
goto End_Of_Control_Send;
|
|
|
|
if (!(Pipe_BytesInPipe()))
|
|
DataLen = 0;
|
|
|
|
while (Pipe_BytesInPipe() && DataLen)
|
|
1198: 00 97 sbiw r24, 0x00 ; 0
|
|
119a: 11 f0 breq .+4 ; 0x11a0 <USB_Host_SendControlRequest+0x11e>
|
|
119c: 20 97 sbiw r28, 0x00 ; 0
|
|
119e: 91 f7 brne .-28 ; 0x1184 <USB_Host_SendControlRequest+0x102>
|
|
|
|
/** Freezes the selected pipe, preventing it from communicating with an attached device. */
|
|
static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Freeze(void)
|
|
{
|
|
UPCONX |= (1 << PFREEZE);
|
|
11a0: 80 91 a9 00 lds r24, 0x00A9
|
|
11a4: 80 64 ori r24, 0x40 ; 64
|
|
11a6: 80 93 a9 00 sts 0x00A9, r24
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearIN(void)
|
|
{
|
|
UPINTX &= ~((1 << RXINI) | (1 << FIFOCON));
|
|
11aa: 80 91 a6 00 lds r24, 0x00A6
|
|
11ae: 8e 77 andi r24, 0x7E ; 126
|
|
11b0: 80 93 a6 00 sts 0x00A6, r24
|
|
{
|
|
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
|
|
|
if (DataStream != NULL)
|
|
{
|
|
while (DataLen)
|
|
11b4: 20 97 sbiw r28, 0x00 ; 0
|
|
11b6: 99 f6 brne .-90 ; 0x115e <USB_Host_SendControlRequest+0xdc>
|
|
* \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
|
|
*/
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token)
|
|
{
|
|
UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
|
|
11b8: 80 91 aa 00 lds r24, 0x00AA
|
|
11bc: 8f 7c andi r24, 0xCF ; 207
|
|
11be: 80 62 ori r24, 0x20 ; 32
|
|
11c0: 80 93 aa 00 sts 0x00AA, r24
|
|
|
|
/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
|
|
static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Unfreeze(void)
|
|
{
|
|
UPCONX &= ~(1 << PFREEZE);
|
|
11c4: 80 91 a9 00 lds r24, 0x00A9
|
|
11c8: 8f 7b andi r24, 0xBF ; 191
|
|
11ca: 80 93 a9 00 sts 0x00A9, r24
|
|
}
|
|
|
|
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
|
Pipe_Unfreeze();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
|
11ce: 82 e0 ldi r24, 0x02 ; 2
|
|
11d0: 2f df rcall .-418 ; 0x1030 <USB_Host_WaitForIOS>
|
|
11d2: 88 23 and r24, r24
|
|
11d4: 09 f0 breq .+2 ; 0x11d8 <USB_Host_SendControlRequest+0x156>
|
|
11d6: 52 c0 rjmp .+164 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearOUT(void)
|
|
{
|
|
UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON));
|
|
11d8: 80 91 a6 00 lds r24, 0x00A6
|
|
11dc: 8b 77 andi r24, 0x7B ; 123
|
|
11de: 80 93 a6 00 sts 0x00A6, r24
|
|
goto End_Of_Control_Send;
|
|
|
|
Pipe_ClearOUT();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
|
11e2: 82 e0 ldi r24, 0x02 ; 2
|
|
11e4: 25 df rcall .-438 ; 0x1030 <USB_Host_WaitForIOS>
|
|
11e6: 4a c0 rjmp .+148 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
goto End_Of_Control_Send;
|
|
}
|
|
else
|
|
{
|
|
if (DataStream != NULL)
|
|
11e8: 01 15 cp r16, r1
|
|
11ea: 11 05 cpc r17, r1
|
|
11ec: 99 f1 breq .+102 ; 0x1254 <USB_Host_SendControlRequest+0x1d2>
|
|
* \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
|
|
*/
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token)
|
|
{
|
|
UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
|
|
11ee: 80 91 aa 00 lds r24, 0x00AA
|
|
11f2: 8f 7c andi r24, 0xCF ; 207
|
|
11f4: 80 62 ori r24, 0x20 ; 32
|
|
11f6: 80 93 aa 00 sts 0x00AA, r24
|
|
|
|
/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
|
|
static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Unfreeze(void)
|
|
{
|
|
UPCONX &= ~(1 << PFREEZE);
|
|
11fa: 80 91 a9 00 lds r24, 0x00A9
|
|
11fe: 8f 7b andi r24, 0xBF ; 191
|
|
1200: 80 93 a9 00 sts 0x00A9, r24
|
|
{
|
|
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
|
Pipe_Unfreeze();
|
|
|
|
while (DataLen)
|
|
1204: 1c c0 rjmp .+56 ; 0x123e <USB_Host_SendControlRequest+0x1bc>
|
|
{
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
|
1206: 82 e0 ldi r24, 0x02 ; 2
|
|
1208: 13 df rcall .-474 ; 0x1030 <USB_Host_WaitForIOS>
|
|
120a: 88 23 and r24, r24
|
|
120c: b9 f5 brne .+110 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
120e: f8 01 movw r30, r16
|
|
1210: 06 c0 rjmp .+12 ; 0x121e <USB_Host_SendControlRequest+0x19c>
|
|
goto End_Of_Control_Send;
|
|
|
|
while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize))
|
|
{
|
|
Pipe_Write_8(*(DataStream++));
|
|
1212: 81 91 ld r24, Z+
|
|
1214: 8f 01 movw r16, r30
|
|
* \param[in] Data Data to write into the the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Write_8(const uint8_t Data)
|
|
{
|
|
UPDATX = Data;
|
|
1216: 80 93 af 00 sts 0x00AF, r24
|
|
DataLen--;
|
|
121a: 21 97 sbiw r28, 0x01 ; 1
|
|
while (DataLen)
|
|
{
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
|
goto End_Of_Control_Send;
|
|
|
|
while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize))
|
|
121c: 59 f0 breq .+22 ; 0x1234 <USB_Host_SendControlRequest+0x1b2>
|
|
121e: 8f 01 movw r16, r30
|
|
* \return Total number of bytes in the currently selected pipe's FIFO buffer.
|
|
*/
|
|
static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline uint16_t Pipe_BytesInPipe(void)
|
|
{
|
|
return UPBCX;
|
|
1220: 20 91 f6 00 lds r18, 0x00F6
|
|
1224: 30 91 f7 00 lds r19, 0x00F7
|
|
1228: 80 91 1b 01 lds r24, 0x011B
|
|
122c: 90 e0 ldi r25, 0x00 ; 0
|
|
122e: 28 17 cp r18, r24
|
|
1230: 39 07 cpc r19, r25
|
|
1232: 78 f3 brcs .-34 ; 0x1212 <USB_Host_SendControlRequest+0x190>
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearOUT(void)
|
|
{
|
|
UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON));
|
|
1234: 80 91 a6 00 lds r24, 0x00A6
|
|
1238: 8b 77 andi r24, 0x7B ; 123
|
|
123a: 80 93 a6 00 sts 0x00A6, r24
|
|
if (DataStream != NULL)
|
|
{
|
|
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
|
Pipe_Unfreeze();
|
|
|
|
while (DataLen)
|
|
123e: 20 97 sbiw r28, 0x00 ; 0
|
|
1240: 11 f7 brne .-60 ; 0x1206 <USB_Host_SendControlRequest+0x184>
|
|
}
|
|
|
|
Pipe_ClearOUT();
|
|
}
|
|
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
|
1242: 82 e0 ldi r24, 0x02 ; 2
|
|
1244: f5 de rcall .-534 ; 0x1030 <USB_Host_WaitForIOS>
|
|
1246: 88 23 and r24, r24
|
|
1248: c9 f4 brne .+50 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
|
|
/** Freezes the selected pipe, preventing it from communicating with an attached device. */
|
|
static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Freeze(void)
|
|
{
|
|
UPCONX |= (1 << PFREEZE);
|
|
124a: 80 91 a9 00 lds r24, 0x00A9
|
|
124e: 80 64 ori r24, 0x40 ; 64
|
|
1250: 80 93 a9 00 sts 0x00A9, r24
|
|
* \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
|
|
*/
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SetPipeToken(const uint8_t Token)
|
|
{
|
|
UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
|
|
1254: 80 91 aa 00 lds r24, 0x00AA
|
|
1258: 8f 7c andi r24, 0xCF ; 207
|
|
125a: 80 61 ori r24, 0x10 ; 16
|
|
125c: 80 93 aa 00 sts 0x00AA, r24
|
|
|
|
/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
|
|
static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Unfreeze(void)
|
|
{
|
|
UPCONX &= ~(1 << PFREEZE);
|
|
1260: 80 91 a9 00 lds r24, 0x00A9
|
|
1264: 8f 7b andi r24, 0xBF ; 191
|
|
1266: 80 93 a9 00 sts 0x00A9, r24
|
|
}
|
|
|
|
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
|
Pipe_Unfreeze();
|
|
|
|
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
|
|
126a: 81 e0 ldi r24, 0x01 ; 1
|
|
126c: e1 de rcall .-574 ; 0x1030 <USB_Host_WaitForIOS>
|
|
126e: 88 23 and r24, r24
|
|
1270: 29 f4 brne .+10 ; 0x127c <USB_Host_SendControlRequest+0x1fa>
|
|
* \ingroup Group_PipePacketManagement_AVR8
|
|
*/
|
|
static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ClearIN(void)
|
|
{
|
|
UPINTX &= ~((1 << RXINI) | (1 << FIFOCON));
|
|
1272: 90 91 a6 00 lds r25, 0x00A6
|
|
1276: 9e 77 andi r25, 0x7E ; 126
|
|
1278: 90 93 a6 00 sts 0x00A6, r25
|
|
|
|
/** Freezes the selected pipe, preventing it from communicating with an attached device. */
|
|
static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_Freeze(void)
|
|
{
|
|
UPCONX |= (1 << PFREEZE);
|
|
127c: 90 91 a9 00 lds r25, 0x00A9
|
|
1280: 90 64 ori r25, 0x40 ; 64
|
|
1282: 90 93 a9 00 sts 0x00A9, r25
|
|
}
|
|
|
|
End_Of_Control_Send:
|
|
Pipe_Freeze();
|
|
|
|
if (BusSuspended)
|
|
1286: e1 14 cp r14, r1
|
|
1288: f1 04 cpc r15, r1
|
|
128a: 29 f4 brne .+10 ; 0x1296 <USB_Host_SendControlRequest+0x214>
|
|
* messages to the device.
|
|
*/
|
|
static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
|
|
static inline void USB_Host_SuspendBus(void)
|
|
{
|
|
UHCON &= ~(1 << SOFEN);
|
|
128c: 90 91 9e 00 lds r25, 0x009E
|
|
1290: 9e 7f andi r25, 0xFE ; 254
|
|
1292: 90 93 9e 00 sts 0x009E, r25
|
|
* \param[in] PipeNumber Index of the pipe to reset.
|
|
*/
|
|
static inline void Pipe_ResetPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_ResetPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPRST = (1 << PipeNumber);
|
|
1296: 91 e0 ldi r25, 0x01 ; 1
|
|
1298: 90 93 a8 00 sts 0x00A8, r25
|
|
UPRST = 0;
|
|
129c: 10 92 a8 00 sts 0x00A8, r1
|
|
USB_Host_SuspendBus();
|
|
|
|
Pipe_ResetPipe(PIPE_CONTROLPIPE);
|
|
|
|
return ReturnStatus;
|
|
}
|
|
12a0: df 91 pop r29
|
|
12a2: cf 91 pop r28
|
|
12a4: 1f 91 pop r17
|
|
12a6: 0f 91 pop r16
|
|
12a8: ff 90 pop r15
|
|
12aa: ef 90 pop r14
|
|
12ac: 08 95 ret
|
|
|
|
000012ae <USB_USBTask>:
|
|
#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR)
|
|
volatile uint8_t USB_DeviceState;
|
|
#endif
|
|
|
|
void USB_USBTask(void)
|
|
{
|
|
12ae: 1f 93 push r17
|
|
12b0: cf 93 push r28
|
|
12b2: df 93 push r29
|
|
* \return Index of the currently selected pipe.
|
|
*/
|
|
static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline uint8_t Pipe_GetCurrentPipe(void)
|
|
{
|
|
return (UPNUM & PIPE_PIPENUM_MASK);
|
|
12b4: c7 ea ldi r28, 0xA7 ; 167
|
|
12b6: d0 e0 ldi r29, 0x00 ; 0
|
|
12b8: 18 81 ld r17, Y
|
|
12ba: 17 70 andi r17, 0x07 ; 7
|
|
* \param[in] PipeNumber Index of the pipe to select.
|
|
*/
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
|
|
static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
|
|
{
|
|
UPNUM = PipeNumber;
|
|
12bc: 18 82 st Y, r1
|
|
{
|
|
uint8_t PrevPipe = Pipe_GetCurrentPipe();
|
|
|
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
|
|
|
USB_Host_ProcessNextHostState();
|
|
12be: 34 db rcall .-2456 ; 0x928 <USB_Host_ProcessNextHostState>
|
|
12c0: 18 83 st Y, r17
|
|
if (USB_CurrentMode == USB_MODE_Device)
|
|
USB_DeviceTask();
|
|
else if (USB_CurrentMode == USB_MODE_Host)
|
|
USB_HostTask();
|
|
#endif
|
|
}
|
|
12c2: df 91 pop r29
|
|
12c4: cf 91 pop r28
|
|
12c6: 1f 91 pop r17
|
|
12c8: 08 95 ret
|
|
|
|
000012ca <Serial_putchar>:
|
|
* \param[in] DataByte Byte to transmit through the USART.
|
|
*/
|
|
static inline void Serial_SendByte(const char DataByte) ATTR_ALWAYS_INLINE;
|
|
static inline void Serial_SendByte(const char DataByte)
|
|
{
|
|
while (!(UCSR1A & (1 << UDRE1)));
|
|
12ca: 90 91 c8 00 lds r25, 0x00C8
|
|
12ce: 95 ff sbrs r25, 5
|
|
12d0: fc cf rjmp .-8 ; 0x12ca <Serial_putchar>
|
|
UDR1 = DataByte;
|
|
12d2: 80 93 ce 00 sts 0x00CE, r24
|
|
{
|
|
(void)Stream;
|
|
|
|
Serial_SendByte(DataByte);
|
|
return 0;
|
|
}
|
|
12d6: 80 e0 ldi r24, 0x00 ; 0
|
|
12d8: 90 e0 ldi r25, 0x00 ; 0
|
|
12da: 08 95 ret
|
|
|
|
000012dc <Serial_getchar>:
|
|
* \return Boolean \c true if a character has been received, \c false otherwise.
|
|
*/
|
|
static inline bool Serial_IsCharReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
|
|
static inline bool Serial_IsCharReceived(void)
|
|
{
|
|
return ((UCSR1A & (1 << RXC1)) ? true : false);
|
|
12dc: 80 91 c8 00 lds r24, 0x00C8
|
|
|
|
int Serial_getchar(FILE *Stream)
|
|
{
|
|
(void)Stream;
|
|
|
|
if (!(Serial_IsCharReceived()))
|
|
12e0: 87 ff sbrs r24, 7
|
|
12e2: 08 c0 rjmp .+16 ; 0x12f4 <Serial_getchar+0x18>
|
|
12e4: 80 91 c8 00 lds r24, 0x00C8
|
|
* \return Next byte received from the USART, or a negative value if no byte has been received.
|
|
*/
|
|
static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE;
|
|
static inline int16_t Serial_ReceiveByte(void)
|
|
{
|
|
if (!(Serial_IsCharReceived()))
|
|
12e8: 87 ff sbrs r24, 7
|
|
12ea: 07 c0 rjmp .+14 ; 0x12fa <Serial_getchar+0x1e>
|
|
return -1;
|
|
|
|
return UDR1;
|
|
12ec: 20 91 ce 00 lds r18, 0x00CE
|
|
12f0: 30 e0 ldi r19, 0x00 ; 0
|
|
12f2: 05 c0 rjmp .+10 ; 0x12fe <Serial_getchar+0x22>
|
|
return _FDEV_EOF;
|
|
12f4: 2e ef ldi r18, 0xFE ; 254
|
|
12f6: 3f ef ldi r19, 0xFF ; 255
|
|
12f8: 02 c0 rjmp .+4 ; 0x12fe <Serial_getchar+0x22>
|
|
*/
|
|
static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE;
|
|
static inline int16_t Serial_ReceiveByte(void)
|
|
{
|
|
if (!(Serial_IsCharReceived()))
|
|
return -1;
|
|
12fa: 2f ef ldi r18, 0xFF ; 255
|
|
12fc: 3f ef ldi r19, 0xFF ; 255
|
|
|
|
return Serial_ReceiveByte();
|
|
}
|
|
12fe: c9 01 movw r24, r18
|
|
1300: 08 95 ret
|
|
|
|
00001302 <printf_P>:
|
|
1302: df 93 push r29
|
|
1304: cf 93 push r28
|
|
1306: cd b7 in r28, 0x3d ; 61
|
|
1308: de b7 in r29, 0x3e ; 62
|
|
130a: fe 01 movw r30, r28
|
|
130c: 35 96 adiw r30, 0x05 ; 5
|
|
130e: 61 91 ld r22, Z+
|
|
1310: 71 91 ld r23, Z+
|
|
1312: 80 91 3c 01 lds r24, 0x013C
|
|
1316: 90 91 3d 01 lds r25, 0x013D
|
|
131a: dc 01 movw r26, r24
|
|
131c: 13 96 adiw r26, 0x03 ; 3
|
|
131e: 2c 91 ld r18, X
|
|
1320: 13 97 sbiw r26, 0x03 ; 3
|
|
1322: 28 60 ori r18, 0x08 ; 8
|
|
1324: 13 96 adiw r26, 0x03 ; 3
|
|
1326: 2c 93 st X, r18
|
|
1328: af 01 movw r20, r30
|
|
132a: 42 d0 rcall .+132 ; 0x13b0 <vfprintf>
|
|
132c: e0 91 3c 01 lds r30, 0x013C
|
|
1330: f0 91 3d 01 lds r31, 0x013D
|
|
1334: 23 81 ldd r18, Z+3 ; 0x03
|
|
1336: 27 7f andi r18, 0xF7 ; 247
|
|
1338: 23 83 std Z+3, r18 ; 0x03
|
|
133a: cf 91 pop r28
|
|
133c: df 91 pop r29
|
|
133e: 08 95 ret
|
|
|
|
00001340 <puts_P>:
|
|
1340: ef 92 push r14
|
|
1342: ff 92 push r15
|
|
1344: 0f 93 push r16
|
|
1346: 1f 93 push r17
|
|
1348: cf 93 push r28
|
|
134a: df 93 push r29
|
|
134c: 8c 01 movw r16, r24
|
|
134e: e0 91 3c 01 lds r30, 0x013C
|
|
1352: f0 91 3d 01 lds r31, 0x013D
|
|
1356: 83 81 ldd r24, Z+3 ; 0x03
|
|
1358: 81 ff sbrs r24, 1
|
|
135a: 20 c0 rjmp .+64 ; 0x139c <puts_P+0x5c>
|
|
135c: c0 e0 ldi r28, 0x00 ; 0
|
|
135e: d0 e0 ldi r29, 0x00 ; 0
|
|
1360: 0c c0 rjmp .+24 ; 0x137a <puts_P+0x3a>
|
|
1362: db 01 movw r26, r22
|
|
1364: 18 96 adiw r26, 0x08 ; 8
|
|
1366: ed 91 ld r30, X+
|
|
1368: fc 91 ld r31, X
|
|
136a: 19 97 sbiw r26, 0x09 ; 9
|
|
136c: 09 95 icall
|
|
136e: 00 97 sbiw r24, 0x00 ; 0
|
|
1370: 11 f0 breq .+4 ; 0x1376 <puts_P+0x36>
|
|
1372: cf ef ldi r28, 0xFF ; 255
|
|
1374: df ef ldi r29, 0xFF ; 255
|
|
1376: 0f 5f subi r16, 0xFF ; 255
|
|
1378: 1f 4f sbci r17, 0xFF ; 255
|
|
137a: f8 01 movw r30, r16
|
|
137c: 84 91 lpm r24, Z+
|
|
137e: 60 91 3c 01 lds r22, 0x013C
|
|
1382: 70 91 3d 01 lds r23, 0x013D
|
|
1386: 88 23 and r24, r24
|
|
1388: 61 f7 brne .-40 ; 0x1362 <puts_P+0x22>
|
|
138a: db 01 movw r26, r22
|
|
138c: 18 96 adiw r26, 0x08 ; 8
|
|
138e: ed 91 ld r30, X+
|
|
1390: fc 91 ld r31, X
|
|
1392: 19 97 sbiw r26, 0x09 ; 9
|
|
1394: 8a e0 ldi r24, 0x0A ; 10
|
|
1396: 09 95 icall
|
|
1398: 00 97 sbiw r24, 0x00 ; 0
|
|
139a: 11 f0 breq .+4 ; 0x13a0 <puts_P+0x60>
|
|
139c: cf ef ldi r28, 0xFF ; 255
|
|
139e: df ef ldi r29, 0xFF ; 255
|
|
13a0: ce 01 movw r24, r28
|
|
13a2: df 91 pop r29
|
|
13a4: cf 91 pop r28
|
|
13a6: 1f 91 pop r17
|
|
13a8: 0f 91 pop r16
|
|
13aa: ff 90 pop r15
|
|
13ac: ef 90 pop r14
|
|
13ae: 08 95 ret
|
|
|
|
000013b0 <vfprintf>:
|
|
13b0: 2f 92 push r2
|
|
13b2: 3f 92 push r3
|
|
13b4: 4f 92 push r4
|
|
13b6: 5f 92 push r5
|
|
13b8: 6f 92 push r6
|
|
13ba: 7f 92 push r7
|
|
13bc: 8f 92 push r8
|
|
13be: 9f 92 push r9
|
|
13c0: af 92 push r10
|
|
13c2: bf 92 push r11
|
|
13c4: cf 92 push r12
|
|
13c6: df 92 push r13
|
|
13c8: ef 92 push r14
|
|
13ca: ff 92 push r15
|
|
13cc: 0f 93 push r16
|
|
13ce: 1f 93 push r17
|
|
13d0: df 93 push r29
|
|
13d2: cf 93 push r28
|
|
13d4: cd b7 in r28, 0x3d ; 61
|
|
13d6: de b7 in r29, 0x3e ; 62
|
|
13d8: 2c 97 sbiw r28, 0x0c ; 12
|
|
13da: 0f b6 in r0, 0x3f ; 63
|
|
13dc: f8 94 cli
|
|
13de: de bf out 0x3e, r29 ; 62
|
|
13e0: 0f be out 0x3f, r0 ; 63
|
|
13e2: cd bf out 0x3d, r28 ; 61
|
|
13e4: 6c 01 movw r12, r24
|
|
13e6: 1b 01 movw r2, r22
|
|
13e8: 8a 01 movw r16, r20
|
|
13ea: fc 01 movw r30, r24
|
|
13ec: 17 82 std Z+7, r1 ; 0x07
|
|
13ee: 16 82 std Z+6, r1 ; 0x06
|
|
13f0: 83 81 ldd r24, Z+3 ; 0x03
|
|
13f2: 81 ff sbrs r24, 1
|
|
13f4: c4 c1 rjmp .+904 ; 0x177e <vfprintf+0x3ce>
|
|
13f6: 2e 01 movw r4, r28
|
|
13f8: 08 94 sec
|
|
13fa: 41 1c adc r4, r1
|
|
13fc: 51 1c adc r5, r1
|
|
13fe: f6 01 movw r30, r12
|
|
1400: 93 81 ldd r25, Z+3 ; 0x03
|
|
1402: f1 01 movw r30, r2
|
|
1404: 93 fd sbrc r25, 3
|
|
1406: 85 91 lpm r24, Z+
|
|
1408: 93 ff sbrs r25, 3
|
|
140a: 81 91 ld r24, Z+
|
|
140c: 1f 01 movw r2, r30
|
|
140e: 88 23 and r24, r24
|
|
1410: 09 f4 brne .+2 ; 0x1414 <vfprintf+0x64>
|
|
1412: b1 c1 rjmp .+866 ; 0x1776 <vfprintf+0x3c6>
|
|
1414: 85 32 cpi r24, 0x25 ; 37
|
|
1416: 39 f4 brne .+14 ; 0x1426 <vfprintf+0x76>
|
|
1418: 93 fd sbrc r25, 3
|
|
141a: 85 91 lpm r24, Z+
|
|
141c: 93 ff sbrs r25, 3
|
|
141e: 81 91 ld r24, Z+
|
|
1420: 1f 01 movw r2, r30
|
|
1422: 85 32 cpi r24, 0x25 ; 37
|
|
1424: 21 f4 brne .+8 ; 0x142e <vfprintf+0x7e>
|
|
1426: 90 e0 ldi r25, 0x00 ; 0
|
|
1428: b6 01 movw r22, r12
|
|
142a: db d1 rcall .+950 ; 0x17e2 <fputc>
|
|
142c: e8 cf rjmp .-48 ; 0x13fe <vfprintf+0x4e>
|
|
142e: ee 24 eor r14, r14
|
|
1430: ff 24 eor r15, r15
|
|
1432: 20 e0 ldi r18, 0x00 ; 0
|
|
1434: 20 32 cpi r18, 0x20 ; 32
|
|
1436: b0 f4 brcc .+44 ; 0x1464 <vfprintf+0xb4>
|
|
1438: 8b 32 cpi r24, 0x2B ; 43
|
|
143a: 69 f0 breq .+26 ; 0x1456 <vfprintf+0xa6>
|
|
143c: 8c 32 cpi r24, 0x2C ; 44
|
|
143e: 28 f4 brcc .+10 ; 0x144a <vfprintf+0x9a>
|
|
1440: 80 32 cpi r24, 0x20 ; 32
|
|
1442: 51 f0 breq .+20 ; 0x1458 <vfprintf+0xa8>
|
|
1444: 83 32 cpi r24, 0x23 ; 35
|
|
1446: 71 f4 brne .+28 ; 0x1464 <vfprintf+0xb4>
|
|
1448: 0b c0 rjmp .+22 ; 0x1460 <vfprintf+0xb0>
|
|
144a: 8d 32 cpi r24, 0x2D ; 45
|
|
144c: 39 f0 breq .+14 ; 0x145c <vfprintf+0xac>
|
|
144e: 80 33 cpi r24, 0x30 ; 48
|
|
1450: 49 f4 brne .+18 ; 0x1464 <vfprintf+0xb4>
|
|
1452: 21 60 ori r18, 0x01 ; 1
|
|
1454: 2c c0 rjmp .+88 ; 0x14ae <vfprintf+0xfe>
|
|
1456: 22 60 ori r18, 0x02 ; 2
|
|
1458: 24 60 ori r18, 0x04 ; 4
|
|
145a: 29 c0 rjmp .+82 ; 0x14ae <vfprintf+0xfe>
|
|
145c: 28 60 ori r18, 0x08 ; 8
|
|
145e: 27 c0 rjmp .+78 ; 0x14ae <vfprintf+0xfe>
|
|
1460: 20 61 ori r18, 0x10 ; 16
|
|
1462: 25 c0 rjmp .+74 ; 0x14ae <vfprintf+0xfe>
|
|
1464: 27 fd sbrc r18, 7
|
|
1466: 2c c0 rjmp .+88 ; 0x14c0 <vfprintf+0x110>
|
|
1468: 38 2f mov r19, r24
|
|
146a: 30 53 subi r19, 0x30 ; 48
|
|
146c: 3a 30 cpi r19, 0x0A ; 10
|
|
146e: 98 f4 brcc .+38 ; 0x1496 <vfprintf+0xe6>
|
|
1470: 26 ff sbrs r18, 6
|
|
1472: 08 c0 rjmp .+16 ; 0x1484 <vfprintf+0xd4>
|
|
1474: 8e 2d mov r24, r14
|
|
1476: 88 0f add r24, r24
|
|
1478: e8 2e mov r14, r24
|
|
147a: ee 0c add r14, r14
|
|
147c: ee 0c add r14, r14
|
|
147e: e8 0e add r14, r24
|
|
1480: e3 0e add r14, r19
|
|
1482: 15 c0 rjmp .+42 ; 0x14ae <vfprintf+0xfe>
|
|
1484: 8f 2d mov r24, r15
|
|
1486: 88 0f add r24, r24
|
|
1488: f8 2e mov r15, r24
|
|
148a: ff 0c add r15, r15
|
|
148c: ff 0c add r15, r15
|
|
148e: f8 0e add r15, r24
|
|
1490: f3 0e add r15, r19
|
|
1492: 20 62 ori r18, 0x20 ; 32
|
|
1494: 0c c0 rjmp .+24 ; 0x14ae <vfprintf+0xfe>
|
|
1496: 8e 32 cpi r24, 0x2E ; 46
|
|
1498: 21 f4 brne .+8 ; 0x14a2 <vfprintf+0xf2>
|
|
149a: 26 fd sbrc r18, 6
|
|
149c: 6c c1 rjmp .+728 ; 0x1776 <vfprintf+0x3c6>
|
|
149e: 20 64 ori r18, 0x40 ; 64
|
|
14a0: 06 c0 rjmp .+12 ; 0x14ae <vfprintf+0xfe>
|
|
14a2: 8c 36 cpi r24, 0x6C ; 108
|
|
14a4: 11 f4 brne .+4 ; 0x14aa <vfprintf+0xfa>
|
|
14a6: 20 68 ori r18, 0x80 ; 128
|
|
14a8: 02 c0 rjmp .+4 ; 0x14ae <vfprintf+0xfe>
|
|
14aa: 88 36 cpi r24, 0x68 ; 104
|
|
14ac: 49 f4 brne .+18 ; 0x14c0 <vfprintf+0x110>
|
|
14ae: f1 01 movw r30, r2
|
|
14b0: 93 fd sbrc r25, 3
|
|
14b2: 85 91 lpm r24, Z+
|
|
14b4: 93 ff sbrs r25, 3
|
|
14b6: 81 91 ld r24, Z+
|
|
14b8: 1f 01 movw r2, r30
|
|
14ba: 88 23 and r24, r24
|
|
14bc: 09 f0 breq .+2 ; 0x14c0 <vfprintf+0x110>
|
|
14be: ba cf rjmp .-140 ; 0x1434 <vfprintf+0x84>
|
|
14c0: 98 2f mov r25, r24
|
|
14c2: 95 54 subi r25, 0x45 ; 69
|
|
14c4: 93 30 cpi r25, 0x03 ; 3
|
|
14c6: 18 f0 brcs .+6 ; 0x14ce <vfprintf+0x11e>
|
|
14c8: 90 52 subi r25, 0x20 ; 32
|
|
14ca: 93 30 cpi r25, 0x03 ; 3
|
|
14cc: 28 f4 brcc .+10 ; 0x14d8 <vfprintf+0x128>
|
|
14ce: 0c 5f subi r16, 0xFC ; 252
|
|
14d0: 1f 4f sbci r17, 0xFF ; 255
|
|
14d2: ff e3 ldi r31, 0x3F ; 63
|
|
14d4: f9 83 std Y+1, r31 ; 0x01
|
|
14d6: 0d c0 rjmp .+26 ; 0x14f2 <vfprintf+0x142>
|
|
14d8: 83 36 cpi r24, 0x63 ; 99
|
|
14da: 31 f0 breq .+12 ; 0x14e8 <vfprintf+0x138>
|
|
14dc: 83 37 cpi r24, 0x73 ; 115
|
|
14de: 71 f0 breq .+28 ; 0x14fc <vfprintf+0x14c>
|
|
14e0: 83 35 cpi r24, 0x53 ; 83
|
|
14e2: 09 f0 breq .+2 ; 0x14e6 <vfprintf+0x136>
|
|
14e4: 5c c0 rjmp .+184 ; 0x159e <vfprintf+0x1ee>
|
|
14e6: 21 c0 rjmp .+66 ; 0x152a <vfprintf+0x17a>
|
|
14e8: f8 01 movw r30, r16
|
|
14ea: 80 81 ld r24, Z
|
|
14ec: 89 83 std Y+1, r24 ; 0x01
|
|
14ee: 0e 5f subi r16, 0xFE ; 254
|
|
14f0: 1f 4f sbci r17, 0xFF ; 255
|
|
14f2: 42 01 movw r8, r4
|
|
14f4: 71 e0 ldi r23, 0x01 ; 1
|
|
14f6: a7 2e mov r10, r23
|
|
14f8: b1 2c mov r11, r1
|
|
14fa: 15 c0 rjmp .+42 ; 0x1526 <vfprintf+0x176>
|
|
14fc: 62 e0 ldi r22, 0x02 ; 2
|
|
14fe: 66 2e mov r6, r22
|
|
1500: 71 2c mov r7, r1
|
|
1502: 60 0e add r6, r16
|
|
1504: 71 1e adc r7, r17
|
|
1506: f8 01 movw r30, r16
|
|
1508: 80 80 ld r8, Z
|
|
150a: 91 80 ldd r9, Z+1 ; 0x01
|
|
150c: 26 ff sbrs r18, 6
|
|
150e: 03 c0 rjmp .+6 ; 0x1516 <vfprintf+0x166>
|
|
1510: 6e 2d mov r22, r14
|
|
1512: 70 e0 ldi r23, 0x00 ; 0
|
|
1514: 02 c0 rjmp .+4 ; 0x151a <vfprintf+0x16a>
|
|
1516: 6f ef ldi r22, 0xFF ; 255
|
|
1518: 7f ef ldi r23, 0xFF ; 255
|
|
151a: c4 01 movw r24, r8
|
|
151c: 2c 87 std Y+12, r18 ; 0x0c
|
|
151e: 56 d1 rcall .+684 ; 0x17cc <strnlen>
|
|
1520: 5c 01 movw r10, r24
|
|
1522: 83 01 movw r16, r6
|
|
1524: 2c 85 ldd r18, Y+12 ; 0x0c
|
|
1526: 2f 77 andi r18, 0x7F ; 127
|
|
1528: 16 c0 rjmp .+44 ; 0x1556 <vfprintf+0x1a6>
|
|
152a: 52 e0 ldi r21, 0x02 ; 2
|
|
152c: 65 2e mov r6, r21
|
|
152e: 71 2c mov r7, r1
|
|
1530: 60 0e add r6, r16
|
|
1532: 71 1e adc r7, r17
|
|
1534: f8 01 movw r30, r16
|
|
1536: 80 80 ld r8, Z
|
|
1538: 91 80 ldd r9, Z+1 ; 0x01
|
|
153a: 26 ff sbrs r18, 6
|
|
153c: 03 c0 rjmp .+6 ; 0x1544 <vfprintf+0x194>
|
|
153e: 6e 2d mov r22, r14
|
|
1540: 70 e0 ldi r23, 0x00 ; 0
|
|
1542: 02 c0 rjmp .+4 ; 0x1548 <vfprintf+0x198>
|
|
1544: 6f ef ldi r22, 0xFF ; 255
|
|
1546: 7f ef ldi r23, 0xFF ; 255
|
|
1548: c4 01 movw r24, r8
|
|
154a: 2c 87 std Y+12, r18 ; 0x0c
|
|
154c: 34 d1 rcall .+616 ; 0x17b6 <strnlen_P>
|
|
154e: 5c 01 movw r10, r24
|
|
1550: 2c 85 ldd r18, Y+12 ; 0x0c
|
|
1552: 20 68 ori r18, 0x80 ; 128
|
|
1554: 83 01 movw r16, r6
|
|
1556: 23 fd sbrc r18, 3
|
|
1558: 1e c0 rjmp .+60 ; 0x1596 <vfprintf+0x1e6>
|
|
155a: 07 c0 rjmp .+14 ; 0x156a <vfprintf+0x1ba>
|
|
155c: 80 e2 ldi r24, 0x20 ; 32
|
|
155e: 90 e0 ldi r25, 0x00 ; 0
|
|
1560: b6 01 movw r22, r12
|
|
1562: 2c 87 std Y+12, r18 ; 0x0c
|
|
1564: 3e d1 rcall .+636 ; 0x17e2 <fputc>
|
|
1566: fa 94 dec r15
|
|
1568: 2c 85 ldd r18, Y+12 ; 0x0c
|
|
156a: 8f 2d mov r24, r15
|
|
156c: 90 e0 ldi r25, 0x00 ; 0
|
|
156e: a8 16 cp r10, r24
|
|
1570: b9 06 cpc r11, r25
|
|
1572: a0 f3 brcs .-24 ; 0x155c <vfprintf+0x1ac>
|
|
1574: 10 c0 rjmp .+32 ; 0x1596 <vfprintf+0x1e6>
|
|
1576: f4 01 movw r30, r8
|
|
1578: 27 fd sbrc r18, 7
|
|
157a: 85 91 lpm r24, Z+
|
|
157c: 27 ff sbrs r18, 7
|
|
157e: 81 91 ld r24, Z+
|
|
1580: 4f 01 movw r8, r30
|
|
1582: 90 e0 ldi r25, 0x00 ; 0
|
|
1584: b6 01 movw r22, r12
|
|
1586: 2c 87 std Y+12, r18 ; 0x0c
|
|
1588: 2c d1 rcall .+600 ; 0x17e2 <fputc>
|
|
158a: 2c 85 ldd r18, Y+12 ; 0x0c
|
|
158c: f1 10 cpse r15, r1
|
|
158e: fa 94 dec r15
|
|
1590: 08 94 sec
|
|
1592: a1 08 sbc r10, r1
|
|
1594: b1 08 sbc r11, r1
|
|
1596: a1 14 cp r10, r1
|
|
1598: b1 04 cpc r11, r1
|
|
159a: 69 f7 brne .-38 ; 0x1576 <vfprintf+0x1c6>
|
|
159c: e9 c0 rjmp .+466 ; 0x1770 <vfprintf+0x3c0>
|
|
159e: 84 36 cpi r24, 0x64 ; 100
|
|
15a0: 11 f0 breq .+4 ; 0x15a6 <vfprintf+0x1f6>
|
|
15a2: 89 36 cpi r24, 0x69 ; 105
|
|
15a4: 41 f5 brne .+80 ; 0x15f6 <vfprintf+0x246>
|
|
15a6: 27 ff sbrs r18, 7
|
|
15a8: 08 c0 rjmp .+16 ; 0x15ba <vfprintf+0x20a>
|
|
15aa: f8 01 movw r30, r16
|
|
15ac: 60 81 ld r22, Z
|
|
15ae: 71 81 ldd r23, Z+1 ; 0x01
|
|
15b0: 82 81 ldd r24, Z+2 ; 0x02
|
|
15b2: 93 81 ldd r25, Z+3 ; 0x03
|
|
15b4: 0c 5f subi r16, 0xFC ; 252
|
|
15b6: 1f 4f sbci r17, 0xFF ; 255
|
|
15b8: 09 c0 rjmp .+18 ; 0x15cc <vfprintf+0x21c>
|
|
15ba: f8 01 movw r30, r16
|
|
15bc: 60 81 ld r22, Z
|
|
15be: 71 81 ldd r23, Z+1 ; 0x01
|
|
15c0: 88 27 eor r24, r24
|
|
15c2: 77 fd sbrc r23, 7
|
|
15c4: 80 95 com r24
|
|
15c6: 98 2f mov r25, r24
|
|
15c8: 0e 5f subi r16, 0xFE ; 254
|
|
15ca: 1f 4f sbci r17, 0xFF ; 255
|
|
15cc: 4f e6 ldi r20, 0x6F ; 111
|
|
15ce: b4 2e mov r11, r20
|
|
15d0: b2 22 and r11, r18
|
|
15d2: 97 ff sbrs r25, 7
|
|
15d4: 09 c0 rjmp .+18 ; 0x15e8 <vfprintf+0x238>
|
|
15d6: 90 95 com r25
|
|
15d8: 80 95 com r24
|
|
15da: 70 95 com r23
|
|
15dc: 61 95 neg r22
|
|
15de: 7f 4f sbci r23, 0xFF ; 255
|
|
15e0: 8f 4f sbci r24, 0xFF ; 255
|
|
15e2: 9f 4f sbci r25, 0xFF ; 255
|
|
15e4: f0 e8 ldi r31, 0x80 ; 128
|
|
15e6: bf 2a or r11, r31
|
|
15e8: a2 01 movw r20, r4
|
|
15ea: 2a e0 ldi r18, 0x0A ; 10
|
|
15ec: 30 e0 ldi r19, 0x00 ; 0
|
|
15ee: 25 d1 rcall .+586 ; 0x183a <__ultoa_invert>
|
|
15f0: 78 2e mov r7, r24
|
|
15f2: 74 18 sub r7, r4
|
|
15f4: 44 c0 rjmp .+136 ; 0x167e <vfprintf+0x2ce>
|
|
15f6: 85 37 cpi r24, 0x75 ; 117
|
|
15f8: 31 f4 brne .+12 ; 0x1606 <vfprintf+0x256>
|
|
15fa: 3f ee ldi r19, 0xEF ; 239
|
|
15fc: b3 2e mov r11, r19
|
|
15fe: b2 22 and r11, r18
|
|
1600: 2a e0 ldi r18, 0x0A ; 10
|
|
1602: 30 e0 ldi r19, 0x00 ; 0
|
|
1604: 25 c0 rjmp .+74 ; 0x1650 <vfprintf+0x2a0>
|
|
1606: 99 ef ldi r25, 0xF9 ; 249
|
|
1608: b9 2e mov r11, r25
|
|
160a: b2 22 and r11, r18
|
|
160c: 8f 36 cpi r24, 0x6F ; 111
|
|
160e: c1 f0 breq .+48 ; 0x1640 <vfprintf+0x290>
|
|
1610: 80 37 cpi r24, 0x70 ; 112
|
|
1612: 20 f4 brcc .+8 ; 0x161c <vfprintf+0x26c>
|
|
1614: 88 35 cpi r24, 0x58 ; 88
|
|
1616: 09 f0 breq .+2 ; 0x161a <vfprintf+0x26a>
|
|
1618: ae c0 rjmp .+348 ; 0x1776 <vfprintf+0x3c6>
|
|
161a: 0d c0 rjmp .+26 ; 0x1636 <vfprintf+0x286>
|
|
161c: 80 37 cpi r24, 0x70 ; 112
|
|
161e: 21 f0 breq .+8 ; 0x1628 <vfprintf+0x278>
|
|
1620: 88 37 cpi r24, 0x78 ; 120
|
|
1622: 09 f0 breq .+2 ; 0x1626 <vfprintf+0x276>
|
|
1624: a8 c0 rjmp .+336 ; 0x1776 <vfprintf+0x3c6>
|
|
1626: 02 c0 rjmp .+4 ; 0x162c <vfprintf+0x27c>
|
|
1628: 20 e1 ldi r18, 0x10 ; 16
|
|
162a: b2 2a or r11, r18
|
|
162c: b4 fe sbrs r11, 4
|
|
162e: 0b c0 rjmp .+22 ; 0x1646 <vfprintf+0x296>
|
|
1630: 84 e0 ldi r24, 0x04 ; 4
|
|
1632: b8 2a or r11, r24
|
|
1634: 08 c0 rjmp .+16 ; 0x1646 <vfprintf+0x296>
|
|
1636: b4 fe sbrs r11, 4
|
|
1638: 09 c0 rjmp .+18 ; 0x164c <vfprintf+0x29c>
|
|
163a: e6 e0 ldi r30, 0x06 ; 6
|
|
163c: be 2a or r11, r30
|
|
163e: 06 c0 rjmp .+12 ; 0x164c <vfprintf+0x29c>
|
|
1640: 28 e0 ldi r18, 0x08 ; 8
|
|
1642: 30 e0 ldi r19, 0x00 ; 0
|
|
1644: 05 c0 rjmp .+10 ; 0x1650 <vfprintf+0x2a0>
|
|
1646: 20 e1 ldi r18, 0x10 ; 16
|
|
1648: 30 e0 ldi r19, 0x00 ; 0
|
|
164a: 02 c0 rjmp .+4 ; 0x1650 <vfprintf+0x2a0>
|
|
164c: 20 e1 ldi r18, 0x10 ; 16
|
|
164e: 32 e0 ldi r19, 0x02 ; 2
|
|
1650: b7 fe sbrs r11, 7
|
|
1652: 08 c0 rjmp .+16 ; 0x1664 <vfprintf+0x2b4>
|
|
1654: f8 01 movw r30, r16
|
|
1656: 60 81 ld r22, Z
|
|
1658: 71 81 ldd r23, Z+1 ; 0x01
|
|
165a: 82 81 ldd r24, Z+2 ; 0x02
|
|
165c: 93 81 ldd r25, Z+3 ; 0x03
|
|
165e: 0c 5f subi r16, 0xFC ; 252
|
|
1660: 1f 4f sbci r17, 0xFF ; 255
|
|
1662: 07 c0 rjmp .+14 ; 0x1672 <vfprintf+0x2c2>
|
|
1664: f8 01 movw r30, r16
|
|
1666: 60 81 ld r22, Z
|
|
1668: 71 81 ldd r23, Z+1 ; 0x01
|
|
166a: 80 e0 ldi r24, 0x00 ; 0
|
|
166c: 90 e0 ldi r25, 0x00 ; 0
|
|
166e: 0e 5f subi r16, 0xFE ; 254
|
|
1670: 1f 4f sbci r17, 0xFF ; 255
|
|
1672: a2 01 movw r20, r4
|
|
1674: e2 d0 rcall .+452 ; 0x183a <__ultoa_invert>
|
|
1676: 78 2e mov r7, r24
|
|
1678: 74 18 sub r7, r4
|
|
167a: ff e7 ldi r31, 0x7F ; 127
|
|
167c: bf 22 and r11, r31
|
|
167e: b6 fe sbrs r11, 6
|
|
1680: 0b c0 rjmp .+22 ; 0x1698 <vfprintf+0x2e8>
|
|
1682: 2e ef ldi r18, 0xFE ; 254
|
|
1684: b2 22 and r11, r18
|
|
1686: 7e 14 cp r7, r14
|
|
1688: 38 f4 brcc .+14 ; 0x1698 <vfprintf+0x2e8>
|
|
168a: b4 fe sbrs r11, 4
|
|
168c: 07 c0 rjmp .+14 ; 0x169c <vfprintf+0x2ec>
|
|
168e: b2 fc sbrc r11, 2
|
|
1690: 05 c0 rjmp .+10 ; 0x169c <vfprintf+0x2ec>
|
|
1692: 8f ee ldi r24, 0xEF ; 239
|
|
1694: b8 22 and r11, r24
|
|
1696: 02 c0 rjmp .+4 ; 0x169c <vfprintf+0x2ec>
|
|
1698: a7 2c mov r10, r7
|
|
169a: 01 c0 rjmp .+2 ; 0x169e <vfprintf+0x2ee>
|
|
169c: ae 2c mov r10, r14
|
|
169e: 8b 2d mov r24, r11
|
|
16a0: 90 e0 ldi r25, 0x00 ; 0
|
|
16a2: b4 fe sbrs r11, 4
|
|
16a4: 0d c0 rjmp .+26 ; 0x16c0 <vfprintf+0x310>
|
|
16a6: fe 01 movw r30, r28
|
|
16a8: e7 0d add r30, r7
|
|
16aa: f1 1d adc r31, r1
|
|
16ac: 20 81 ld r18, Z
|
|
16ae: 20 33 cpi r18, 0x30 ; 48
|
|
16b0: 19 f4 brne .+6 ; 0x16b8 <vfprintf+0x308>
|
|
16b2: e9 ee ldi r30, 0xE9 ; 233
|
|
16b4: be 22 and r11, r30
|
|
16b6: 09 c0 rjmp .+18 ; 0x16ca <vfprintf+0x31a>
|
|
16b8: a3 94 inc r10
|
|
16ba: b2 fe sbrs r11, 2
|
|
16bc: 06 c0 rjmp .+12 ; 0x16ca <vfprintf+0x31a>
|
|
16be: 04 c0 rjmp .+8 ; 0x16c8 <vfprintf+0x318>
|
|
16c0: 86 78 andi r24, 0x86 ; 134
|
|
16c2: 90 70 andi r25, 0x00 ; 0
|
|
16c4: 00 97 sbiw r24, 0x00 ; 0
|
|
16c6: 09 f0 breq .+2 ; 0x16ca <vfprintf+0x31a>
|
|
16c8: a3 94 inc r10
|
|
16ca: 8b 2c mov r8, r11
|
|
16cc: 99 24 eor r9, r9
|
|
16ce: b3 fc sbrc r11, 3
|
|
16d0: 13 c0 rjmp .+38 ; 0x16f8 <vfprintf+0x348>
|
|
16d2: b0 fe sbrs r11, 0
|
|
16d4: 0e c0 rjmp .+28 ; 0x16f2 <vfprintf+0x342>
|
|
16d6: af 14 cp r10, r15
|
|
16d8: 28 f4 brcc .+10 ; 0x16e4 <vfprintf+0x334>
|
|
16da: e7 2c mov r14, r7
|
|
16dc: ef 0c add r14, r15
|
|
16de: ea 18 sub r14, r10
|
|
16e0: af 2c mov r10, r15
|
|
16e2: 07 c0 rjmp .+14 ; 0x16f2 <vfprintf+0x342>
|
|
16e4: e7 2c mov r14, r7
|
|
16e6: 05 c0 rjmp .+10 ; 0x16f2 <vfprintf+0x342>
|
|
16e8: 80 e2 ldi r24, 0x20 ; 32
|
|
16ea: 90 e0 ldi r25, 0x00 ; 0
|
|
16ec: b6 01 movw r22, r12
|
|
16ee: 79 d0 rcall .+242 ; 0x17e2 <fputc>
|
|
16f0: a3 94 inc r10
|
|
16f2: af 14 cp r10, r15
|
|
16f4: c8 f3 brcs .-14 ; 0x16e8 <vfprintf+0x338>
|
|
16f6: 04 c0 rjmp .+8 ; 0x1700 <vfprintf+0x350>
|
|
16f8: af 14 cp r10, r15
|
|
16fa: 10 f4 brcc .+4 ; 0x1700 <vfprintf+0x350>
|
|
16fc: fa 18 sub r15, r10
|
|
16fe: 01 c0 rjmp .+2 ; 0x1702 <vfprintf+0x352>
|
|
1700: ff 24 eor r15, r15
|
|
1702: 84 fe sbrs r8, 4
|
|
1704: 0e c0 rjmp .+28 ; 0x1722 <vfprintf+0x372>
|
|
1706: 80 e3 ldi r24, 0x30 ; 48
|
|
1708: 90 e0 ldi r25, 0x00 ; 0
|
|
170a: b6 01 movw r22, r12
|
|
170c: 6a d0 rcall .+212 ; 0x17e2 <fputc>
|
|
170e: 82 fe sbrs r8, 2
|
|
1710: 1d c0 rjmp .+58 ; 0x174c <vfprintf+0x39c>
|
|
1712: 81 fe sbrs r8, 1
|
|
1714: 03 c0 rjmp .+6 ; 0x171c <vfprintf+0x36c>
|
|
1716: 88 e5 ldi r24, 0x58 ; 88
|
|
1718: 90 e0 ldi r25, 0x00 ; 0
|
|
171a: 10 c0 rjmp .+32 ; 0x173c <vfprintf+0x38c>
|
|
171c: 88 e7 ldi r24, 0x78 ; 120
|
|
171e: 90 e0 ldi r25, 0x00 ; 0
|
|
1720: 0d c0 rjmp .+26 ; 0x173c <vfprintf+0x38c>
|
|
1722: c4 01 movw r24, r8
|
|
1724: 86 78 andi r24, 0x86 ; 134
|
|
1726: 90 70 andi r25, 0x00 ; 0
|
|
1728: 00 97 sbiw r24, 0x00 ; 0
|
|
172a: 81 f0 breq .+32 ; 0x174c <vfprintf+0x39c>
|
|
172c: 81 fc sbrc r8, 1
|
|
172e: 02 c0 rjmp .+4 ; 0x1734 <vfprintf+0x384>
|
|
1730: 80 e2 ldi r24, 0x20 ; 32
|
|
1732: 01 c0 rjmp .+2 ; 0x1736 <vfprintf+0x386>
|
|
1734: 8b e2 ldi r24, 0x2B ; 43
|
|
1736: b7 fc sbrc r11, 7
|
|
1738: 8d e2 ldi r24, 0x2D ; 45
|
|
173a: 90 e0 ldi r25, 0x00 ; 0
|
|
173c: b6 01 movw r22, r12
|
|
173e: 51 d0 rcall .+162 ; 0x17e2 <fputc>
|
|
1740: 05 c0 rjmp .+10 ; 0x174c <vfprintf+0x39c>
|
|
1742: 80 e3 ldi r24, 0x30 ; 48
|
|
1744: 90 e0 ldi r25, 0x00 ; 0
|
|
1746: b6 01 movw r22, r12
|
|
1748: 4c d0 rcall .+152 ; 0x17e2 <fputc>
|
|
174a: ea 94 dec r14
|
|
174c: 7e 14 cp r7, r14
|
|
174e: c8 f3 brcs .-14 ; 0x1742 <vfprintf+0x392>
|
|
1750: 7a 94 dec r7
|
|
1752: f2 01 movw r30, r4
|
|
1754: e7 0d add r30, r7
|
|
1756: f1 1d adc r31, r1
|
|
1758: 80 81 ld r24, Z
|
|
175a: 90 e0 ldi r25, 0x00 ; 0
|
|
175c: b6 01 movw r22, r12
|
|
175e: 41 d0 rcall .+130 ; 0x17e2 <fputc>
|
|
1760: 77 20 and r7, r7
|
|
1762: b1 f7 brne .-20 ; 0x1750 <vfprintf+0x3a0>
|
|
1764: 05 c0 rjmp .+10 ; 0x1770 <vfprintf+0x3c0>
|
|
1766: 80 e2 ldi r24, 0x20 ; 32
|
|
1768: 90 e0 ldi r25, 0x00 ; 0
|
|
176a: b6 01 movw r22, r12
|
|
176c: 3a d0 rcall .+116 ; 0x17e2 <fputc>
|
|
176e: fa 94 dec r15
|
|
1770: ff 20 and r15, r15
|
|
1772: c9 f7 brne .-14 ; 0x1766 <vfprintf+0x3b6>
|
|
1774: 44 ce rjmp .-888 ; 0x13fe <vfprintf+0x4e>
|
|
1776: f6 01 movw r30, r12
|
|
1778: 26 81 ldd r18, Z+6 ; 0x06
|
|
177a: 37 81 ldd r19, Z+7 ; 0x07
|
|
177c: 02 c0 rjmp .+4 ; 0x1782 <vfprintf+0x3d2>
|
|
177e: 2f ef ldi r18, 0xFF ; 255
|
|
1780: 3f ef ldi r19, 0xFF ; 255
|
|
1782: c9 01 movw r24, r18
|
|
1784: 2c 96 adiw r28, 0x0c ; 12
|
|
1786: 0f b6 in r0, 0x3f ; 63
|
|
1788: f8 94 cli
|
|
178a: de bf out 0x3e, r29 ; 62
|
|
178c: 0f be out 0x3f, r0 ; 63
|
|
178e: cd bf out 0x3d, r28 ; 61
|
|
1790: cf 91 pop r28
|
|
1792: df 91 pop r29
|
|
1794: 1f 91 pop r17
|
|
1796: 0f 91 pop r16
|
|
1798: ff 90 pop r15
|
|
179a: ef 90 pop r14
|
|
179c: df 90 pop r13
|
|
179e: cf 90 pop r12
|
|
17a0: bf 90 pop r11
|
|
17a2: af 90 pop r10
|
|
17a4: 9f 90 pop r9
|
|
17a6: 8f 90 pop r8
|
|
17a8: 7f 90 pop r7
|
|
17aa: 6f 90 pop r6
|
|
17ac: 5f 90 pop r5
|
|
17ae: 4f 90 pop r4
|
|
17b0: 3f 90 pop r3
|
|
17b2: 2f 90 pop r2
|
|
17b4: 08 95 ret
|
|
|
|
000017b6 <strnlen_P>:
|
|
17b6: fc 01 movw r30, r24
|
|
17b8: 05 90 lpm r0, Z+
|
|
17ba: 61 50 subi r22, 0x01 ; 1
|
|
17bc: 70 40 sbci r23, 0x00 ; 0
|
|
17be: 01 10 cpse r0, r1
|
|
17c0: d8 f7 brcc .-10 ; 0x17b8 <strnlen_P+0x2>
|
|
17c2: 80 95 com r24
|
|
17c4: 90 95 com r25
|
|
17c6: 8e 0f add r24, r30
|
|
17c8: 9f 1f adc r25, r31
|
|
17ca: 08 95 ret
|
|
|
|
000017cc <strnlen>:
|
|
17cc: fc 01 movw r30, r24
|
|
17ce: 61 50 subi r22, 0x01 ; 1
|
|
17d0: 70 40 sbci r23, 0x00 ; 0
|
|
17d2: 01 90 ld r0, Z+
|
|
17d4: 01 10 cpse r0, r1
|
|
17d6: d8 f7 brcc .-10 ; 0x17ce <strnlen+0x2>
|
|
17d8: 80 95 com r24
|
|
17da: 90 95 com r25
|
|
17dc: 8e 0f add r24, r30
|
|
17de: 9f 1f adc r25, r31
|
|
17e0: 08 95 ret
|
|
|
|
000017e2 <fputc>:
|
|
17e2: 0f 93 push r16
|
|
17e4: 1f 93 push r17
|
|
17e6: cf 93 push r28
|
|
17e8: df 93 push r29
|
|
17ea: 8c 01 movw r16, r24
|
|
17ec: eb 01 movw r28, r22
|
|
17ee: 8b 81 ldd r24, Y+3 ; 0x03
|
|
17f0: 81 ff sbrs r24, 1
|
|
17f2: 1b c0 rjmp .+54 ; 0x182a <fputc+0x48>
|
|
17f4: 82 ff sbrs r24, 2
|
|
17f6: 0d c0 rjmp .+26 ; 0x1812 <fputc+0x30>
|
|
17f8: 2e 81 ldd r18, Y+6 ; 0x06
|
|
17fa: 3f 81 ldd r19, Y+7 ; 0x07
|
|
17fc: 8c 81 ldd r24, Y+4 ; 0x04
|
|
17fe: 9d 81 ldd r25, Y+5 ; 0x05
|
|
1800: 28 17 cp r18, r24
|
|
1802: 39 07 cpc r19, r25
|
|
1804: 64 f4 brge .+24 ; 0x181e <fputc+0x3c>
|
|
1806: e8 81 ld r30, Y
|
|
1808: f9 81 ldd r31, Y+1 ; 0x01
|
|
180a: 01 93 st Z+, r16
|
|
180c: f9 83 std Y+1, r31 ; 0x01
|
|
180e: e8 83 st Y, r30
|
|
1810: 06 c0 rjmp .+12 ; 0x181e <fputc+0x3c>
|
|
1812: e8 85 ldd r30, Y+8 ; 0x08
|
|
1814: f9 85 ldd r31, Y+9 ; 0x09
|
|
1816: 80 2f mov r24, r16
|
|
1818: 09 95 icall
|
|
181a: 00 97 sbiw r24, 0x00 ; 0
|
|
181c: 31 f4 brne .+12 ; 0x182a <fputc+0x48>
|
|
181e: 8e 81 ldd r24, Y+6 ; 0x06
|
|
1820: 9f 81 ldd r25, Y+7 ; 0x07
|
|
1822: 01 96 adiw r24, 0x01 ; 1
|
|
1824: 9f 83 std Y+7, r25 ; 0x07
|
|
1826: 8e 83 std Y+6, r24 ; 0x06
|
|
1828: 02 c0 rjmp .+4 ; 0x182e <fputc+0x4c>
|
|
182a: 0f ef ldi r16, 0xFF ; 255
|
|
182c: 1f ef ldi r17, 0xFF ; 255
|
|
182e: c8 01 movw r24, r16
|
|
1830: df 91 pop r29
|
|
1832: cf 91 pop r28
|
|
1834: 1f 91 pop r17
|
|
1836: 0f 91 pop r16
|
|
1838: 08 95 ret
|
|
|
|
0000183a <__ultoa_invert>:
|
|
183a: fa 01 movw r30, r20
|
|
183c: aa 27 eor r26, r26
|
|
183e: 28 30 cpi r18, 0x08 ; 8
|
|
1840: 51 f1 breq .+84 ; 0x1896 <__ultoa_invert+0x5c>
|
|
1842: 20 31 cpi r18, 0x10 ; 16
|
|
1844: 81 f1 breq .+96 ; 0x18a6 <__ultoa_invert+0x6c>
|
|
1846: e8 94 clt
|
|
1848: 6f 93 push r22
|
|
184a: 6e 7f andi r22, 0xFE ; 254
|
|
184c: 6e 5f subi r22, 0xFE ; 254
|
|
184e: 7f 4f sbci r23, 0xFF ; 255
|
|
1850: 8f 4f sbci r24, 0xFF ; 255
|
|
1852: 9f 4f sbci r25, 0xFF ; 255
|
|
1854: af 4f sbci r26, 0xFF ; 255
|
|
1856: b1 e0 ldi r27, 0x01 ; 1
|
|
1858: 3e d0 rcall .+124 ; 0x18d6 <__ultoa_invert+0x9c>
|
|
185a: b4 e0 ldi r27, 0x04 ; 4
|
|
185c: 3c d0 rcall .+120 ; 0x18d6 <__ultoa_invert+0x9c>
|
|
185e: 67 0f add r22, r23
|
|
1860: 78 1f adc r23, r24
|
|
1862: 89 1f adc r24, r25
|
|
1864: 9a 1f adc r25, r26
|
|
1866: a1 1d adc r26, r1
|
|
1868: 68 0f add r22, r24
|
|
186a: 79 1f adc r23, r25
|
|
186c: 8a 1f adc r24, r26
|
|
186e: 91 1d adc r25, r1
|
|
1870: a1 1d adc r26, r1
|
|
1872: 6a 0f add r22, r26
|
|
1874: 71 1d adc r23, r1
|
|
1876: 81 1d adc r24, r1
|
|
1878: 91 1d adc r25, r1
|
|
187a: a1 1d adc r26, r1
|
|
187c: 20 d0 rcall .+64 ; 0x18be <__ultoa_invert+0x84>
|
|
187e: 09 f4 brne .+2 ; 0x1882 <__ultoa_invert+0x48>
|
|
1880: 68 94 set
|
|
1882: 3f 91 pop r19
|
|
1884: 2a e0 ldi r18, 0x0A ; 10
|
|
1886: 26 9f mul r18, r22
|
|
1888: 11 24 eor r1, r1
|
|
188a: 30 19 sub r19, r0
|
|
188c: 30 5d subi r19, 0xD0 ; 208
|
|
188e: 31 93 st Z+, r19
|
|
1890: de f6 brtc .-74 ; 0x1848 <__ultoa_invert+0xe>
|
|
1892: cf 01 movw r24, r30
|
|
1894: 08 95 ret
|
|
1896: 46 2f mov r20, r22
|
|
1898: 47 70 andi r20, 0x07 ; 7
|
|
189a: 40 5d subi r20, 0xD0 ; 208
|
|
189c: 41 93 st Z+, r20
|
|
189e: b3 e0 ldi r27, 0x03 ; 3
|
|
18a0: 0f d0 rcall .+30 ; 0x18c0 <__ultoa_invert+0x86>
|
|
18a2: c9 f7 brne .-14 ; 0x1896 <__ultoa_invert+0x5c>
|
|
18a4: f6 cf rjmp .-20 ; 0x1892 <__ultoa_invert+0x58>
|
|
18a6: 46 2f mov r20, r22
|
|
18a8: 4f 70 andi r20, 0x0F ; 15
|
|
18aa: 40 5d subi r20, 0xD0 ; 208
|
|
18ac: 4a 33 cpi r20, 0x3A ; 58
|
|
18ae: 18 f0 brcs .+6 ; 0x18b6 <__ultoa_invert+0x7c>
|
|
18b0: 49 5d subi r20, 0xD9 ; 217
|
|
18b2: 31 fd sbrc r19, 1
|
|
18b4: 40 52 subi r20, 0x20 ; 32
|
|
18b6: 41 93 st Z+, r20
|
|
18b8: 02 d0 rcall .+4 ; 0x18be <__ultoa_invert+0x84>
|
|
18ba: a9 f7 brne .-22 ; 0x18a6 <__ultoa_invert+0x6c>
|
|
18bc: ea cf rjmp .-44 ; 0x1892 <__ultoa_invert+0x58>
|
|
18be: b4 e0 ldi r27, 0x04 ; 4
|
|
18c0: a6 95 lsr r26
|
|
18c2: 97 95 ror r25
|
|
18c4: 87 95 ror r24
|
|
18c6: 77 95 ror r23
|
|
18c8: 67 95 ror r22
|
|
18ca: ba 95 dec r27
|
|
18cc: c9 f7 brne .-14 ; 0x18c0 <__ultoa_invert+0x86>
|
|
18ce: 00 97 sbiw r24, 0x00 ; 0
|
|
18d0: 61 05 cpc r22, r1
|
|
18d2: 71 05 cpc r23, r1
|
|
18d4: 08 95 ret
|
|
18d6: 9b 01 movw r18, r22
|
|
18d8: ac 01 movw r20, r24
|
|
18da: 0a 2e mov r0, r26
|
|
18dc: 06 94 lsr r0
|
|
18de: 57 95 ror r21
|
|
18e0: 47 95 ror r20
|
|
18e2: 37 95 ror r19
|
|
18e4: 27 95 ror r18
|
|
18e6: ba 95 dec r27
|
|
18e8: c9 f7 brne .-14 ; 0x18dc <__ultoa_invert+0xa2>
|
|
18ea: 62 0f add r22, r18
|
|
18ec: 73 1f adc r23, r19
|
|
18ee: 84 1f adc r24, r20
|
|
18f0: 95 1f adc r25, r21
|
|
18f2: a0 1d adc r26, r0
|
|
18f4: 08 95 ret
|
|
|
|
000018f6 <_exit>:
|
|
18f6: f8 94 cli
|
|
|
|
000018f8 <__stop_program>:
|
|
18f8: ff cf rjmp .-2 ; 0x18f8 <__stop_program>
|