📄 usb.lss
字号:
58c: 99 1f adc r25, r25
58e: 61 e0 ldi r22, 0x01 ; 1
590: 86 0f add r24, r22
592: 06 c0 rjmp .+12 ; 0x5a0
else
/* clear RX stall for OUT on EPn. */
D12_SetEndpointStatus(endp*2, 1);
594: 61 e0 ldi r22, 0x01 ; 1
596: 06 2e mov r0, r22
598: 01 c0 rjmp .+2 ; 0x59c
59a: 88 0f add r24, r24
59c: 0a 94 dec r0
59e: ea f7 brpl .-6 ; 0x59a
5a0: 0e 94 10 01 call 0x220
single_transmit(0, 0);
5a4: 60 e0 ldi r22, 0x00 ; 0
5a6: 80 e0 ldi r24, 0x00 ; 0
5a8: 90 e0 ldi r25, 0x00 ; 0
5aa: 0e 94 15 02 call 0x42a
5ae: 08 95 ret
} else
stall_ep0();
5b0: 0e 94 0c 02 call 0x418
5b4: 08 95 ret
5b6: 08 95 ret
000005b8 <set_address>:
}
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
5b8: 80 91 08 01 lds r24, 0x0108
5bc: 61 e0 ldi r22, 0x01 ; 1
5be: 8f 77 andi r24, 0x7F ; 127
5c0: 0e 94 76 00 call 0xec
DEVICE_ADDRESS_MASK), 1);
single_transmit(0, 0);
5c4: 60 e0 ldi r22, 0x00 ; 0
5c6: 80 e0 ldi r24, 0x00 ; 0
5c8: 90 e0 ldi r25, 0x00 ; 0
5ca: 0e 94 15 02 call 0x42a
5ce: 08 95 ret
000005d0 <D12_ReadChipID>:
}
unsigned short D12_ReadChipID(void)
{
5d0: cf 93 push r28
5d2: df 93 push r29
unsigned short i,j;
if(bEPPflags.bits.in_isr == 0)
5d4: 80 91 c0 00 lds r24, 0x00C0
5d8: 84 fd sbrc r24, 4
5da: 01 c0 rjmp .+2 ; 0x5de
DISABLE;
5dc: f8 94 cli
outportb(D12_COMMAND, 0xFD);
5de: 6d ef ldi r22, 0xFD ; 253
5e0: 83 e0 ldi r24, 0x03 ; 3
5e2: 0e 94 52 00 call 0xa4
i=inportb(D12_DATA);
5e6: 82 e0 ldi r24, 0x02 ; 2
5e8: 0e 94 64 00 call 0xc8
5ec: c8 2f mov r28, r24
5ee: dd 27 eor r29, r29
j=inportb(D12_DATA);
5f0: 82 e0 ldi r24, 0x02 ; 2
5f2: 0e 94 64 00 call 0xc8
5f6: 99 27 eor r25, r25
i += (j<<8);
5f8: 98 2f mov r25, r24
5fa: 88 27 eor r24, r24
5fc: c8 0f add r28, r24
5fe: d9 1f adc r29, r25
if(bEPPflags.bits.in_isr == 0)
600: 80 91 c0 00 lds r24, 0x00C0
604: 84 fd sbrc r24, 4
606: 01 c0 rjmp .+2 ; 0x60a
ENABLE;
608: 78 94 sei
return i;
}
60a: ce 01 movw r24, r28
60c: df 91 pop r29
60e: cf 91 pop r28
610: 08 95 ret
00000612 <code_transmit>:
void code_transmit(unsigned char *pRomData, unsigned short len)
{
612: ac 01 movw r20, r24
ControlData.wCount = 0;
614: 10 92 11 01 sts 0x0111, r1
618: 10 92 10 01 sts 0x0110, r1
if(ControlData.wLength > len)
61c: 80 91 0e 01 lds r24, 0x010E
620: 90 91 0f 01 lds r25, 0x010F
624: 68 17 cp r22, r24
626: 79 07 cpc r23, r25
628: 20 f4 brcc .+8 ; 0x632
ControlData.wLength = len;
62a: 70 93 0f 01 sts 0x010F, r23
62e: 60 93 0e 01 sts 0x010E, r22
ControlData.pData = pRomData;
632: 50 93 13 01 sts 0x0113, r21
636: 40 93 12 01 sts 0x0112, r20
if( ControlData.wLength >= EP0_PACKET_SIZE) {
63a: 80 91 0e 01 lds r24, 0x010E
63e: 90 91 0f 01 lds r25, 0x010F
642: 40 97 sbiw r24, 0x10 ; 16
644: b0 f0 brcs .+44 ; 0x672
D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
646: 60 e1 ldi r22, 0x10 ; 16
648: 81 e0 ldi r24, 0x01 ; 1
64a: 0e 94 86 01 call 0x30c
ControlData.wCount += EP0_PACKET_SIZE;
64e: 80 91 10 01 lds r24, 0x0110
652: 90 91 11 01 lds r25, 0x0111
656: 40 96 adiw r24, 0x10 ; 16
658: 90 93 11 01 sts 0x0111, r25
65c: 80 93 10 01 sts 0x0110, r24
DISABLE;
660: f8 94 cli
bEPPflags.bits.control_state = USB_TRANSMIT;
662: 80 91 c0 00 lds r24, 0x00C0
666: 8f 79 andi r24, 0x9F ; 159
668: 80 62 ori r24, 0x20 ; 32
66a: 80 93 c0 00 sts 0x00C0, r24
ENABLE;
66e: 78 94 sei
670: 08 95 ret
}
else {
D12_WriteEndpoint(1, ControlData.wLength, pRomData);
672: 60 91 0e 01 lds r22, 0x010E
676: 81 e0 ldi r24, 0x01 ; 1
678: 0e 94 86 01 call 0x30c
ControlData.wCount += ControlData.wLength;
67c: 80 91 10 01 lds r24, 0x0110
680: 90 91 11 01 lds r25, 0x0111
684: 20 91 0e 01 lds r18, 0x010E
688: 30 91 0f 01 lds r19, 0x010F
68c: 82 0f add r24, r18
68e: 93 1f adc r25, r19
690: 90 93 11 01 sts 0x0111, r25
694: 80 93 10 01 sts 0x0110, r24
DISABLE;
698: f8 94 cli
bEPPflags.bits.control_state = USB_IDLE;
69a: 80 91 c0 00 lds r24, 0x00C0
69e: 8f 79 andi r24, 0x9F ; 159
6a0: 80 93 c0 00 sts 0x00C0, r24
ENABLE;
6a4: 78 94 sei
6a6: 08 95 ret
6a8: 08 95 ret
000006aa <get_descriptor>:
}
}
void get_descriptor(void)
{
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
6aa: 80 91 09 01 lds r24, 0x0109
// put_c('g');
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
6ae: 81 30 cpi r24, 0x01 ; 1
6b0: 29 f4 brne .+10 ; 0x6bc
{
// put_c('d');
code_transmit((unsigned char *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
6b2: 62 e1 ldi r22, 0x12 ; 18
6b4: 70 e0 ldi r23, 0x00 ; 0
6b6: 8e ea ldi r24, 0xAE ; 174
6b8: 90 e0 ldi r25, 0x00 ; 0
6ba: 06 c0 rjmp .+12 ; 0x6c8
}
else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
6bc: 82 30 cpi r24, 0x02 ; 2
6be: 39 f4 brne .+14 ; 0x6ce
{
// put_c('c');
code_transmit((unsigned char *)&TRANFER_DESC, CONFIG_DESCRIPTOR_LENGTH);
6c0: 6e e2 ldi r22, 0x2E ; 46
6c2: 70 e0 ldi r23, 0x00 ; 0
6c4: 80 e8 ldi r24, 0x80 ; 128
6c6: 90 e0 ldi r25, 0x00 ; 0
6c8: 0e 94 09 03 call 0x612
6cc: 08 95 ret
}
else
stall_ep0();
6ce: 0e 94 0c 02 call 0x418
6d2: 08 95 ret
6d4: 08 95 ret
000006d6 <get_configuration>:
}
void get_configuration(void)
{
6d6: cf 93 push r28
6d8: df 93 push r29
6da: cd b7 in r28, 0x3d ; 61
6dc: de b7 in r29, 0x3e ; 62
6de: 21 97 sbiw r28, 0x01 ; 1
6e0: 0f b6 in r0, 0x3f ; 63
6e2: f8 94 cli
6e4: de bf out 0x3e, r29 ; 62
6e6: 0f be out 0x3f, r0 ; 63
6e8: cd bf out 0x3d, r28 ; 61
unsigned char c = bEPPflags.bits.configuration;
6ea: 80 91 c0 00 lds r24, 0x00C0
6ee: 88 1f adc r24, r24
6f0: 88 27 eor r24, r24
6f2: 88 1f adc r24, r24
6f4: 89 83 std Y+1, r24 ; 0x01
single_transmit(&c, 1);
6f6: 61 e0 ldi r22, 0x01 ; 1
6f8: ce 01 movw r24, r28
6fa: 01 96 adiw r24, 0x01 ; 1
6fc: 0e 94 15 02 call 0x42a
700: 21 96 adiw r28, 0x01 ; 1
702: 0f b6 in r0, 0x3f ; 63
704: f8 94 cli
706: de bf out 0x3e, r29 ; 62
708: 0f be out 0x3f, r0 ; 63
70a: cd bf out 0x3d, r28 ; 61
70c: df 91 pop r29
70e: cf 91 pop r28
710: 08 95 ret
00000712 <set_configuration>:
}
void set_configuration(void)
{
if (ControlData.DeviceRequest.wValue == 0) {
712: 80 91 08 01 lds r24, 0x0108
716: 90 91 09 01 lds r25, 0x0109
71a: 00 97 sbiw r24, 0x00 ; 0
71c: 69 f4 brne .+26 ; 0x738
/* put device in unconfigured state */
single_transmit(0, 0);
71e: 60 e0 ldi r22, 0x00 ; 0
720: 0e 94 15 02 call 0x42a
DISABLE;
724: f8 94 cli
bEPPflags.bits.configuration = 0;
726: 80 91 c0 00 lds r24, 0x00C0
72a: 8f 77 andi r24, 0x7F ; 127
72c: 80 93 c0 00 sts 0x00C0, r24
ENABLE;
730: 78 94 sei
init_unconfig();
732: 0e 94 20 02 call 0x440
736: 08 95 ret
} else if (ControlData.DeviceRequest.wValue == 1) {
738: 01 97 sbiw r24, 0x01 ; 1
73a: 89 f4 brne .+34 ; 0x75e
/* Configure device */
single_transmit(0, 0);
73c: 60 e0 ldi r22, 0x00 ; 0
73e: 80 e0 ldi r24, 0x00 ; 0
740: 90 e0 ldi r25, 0x00 ; 0
742: 0e 94 15 02 call 0x42a
init_unconfig();
746: 0e 94 20 02 call 0x440
init_config();
74a: 0e 94 24 02 call 0x448
DISABLE;
74e: f8 94 cli
bEPPflags.bits.configuration = 1;
750: 80 91 c0 00 lds r24, 0x00C0
754: 80 68 ori r24, 0x80 ; 128
756: 80 93 c0 00 sts 0x00C0, r24
ENABLE;
75a: 78 94 sei
75c: 08 95 ret
} else
stall_ep0();
75e: 0e 94 0c 02 call 0x418
762: 08 95 ret
764: 08 95 ret
00000766 <get_interface>:
}
void get_interface(void)
{
766: cf 93 push r28
768: df 93 push r29
76a: cd b7 in r28, 0x3d ; 61
76c: de b7 in r29, 0x3e ; 62
76e: 21 97 sbiw r28, 0x01 ; 1
770: 0f b6 in r0, 0x3f ; 63
772: f8 94 cli
774: de bf out 0x3e, r29 ; 62
776: 0f be out 0x3f, r0 ; 63
778: cd bf out 0x3d, r28 ; 61
unsigned char txdat = 0; /* Only/Current interface = 0 */
77a: 19 82 std Y+1, r1 ; 0x01
single_transmit(&txdat, 1);
77c: 61 e0 ldi r22, 0x01 ; 1
77e: ce 01 movw r24, r28
780: 01 96 adiw r24, 0x01 ; 1
782: 0e 94 15 02 call 0x42a
786: 21 96 adiw r28, 0x01 ; 1
788: 0f b6 in r0, 0x3f ; 63
78a: f8 94 cli
78c: de bf out 0x3e, r29 ; 62
78e: 0f be out 0x3f, r0 ; 63
790: cd bf out 0x3d, r28 ; 61
792: df 91 pop r29
794: cf 91 pop r28
796: 08 95 ret
00000798 <set_interface>:
}
void set_interface(void)
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
798: 80 91 08 01 lds r24, 0x0108
79c: 90 91 09 01 lds r25, 0x0109
7a0: 89 2b or r24, r25
7a2: 51 f4 brne .+20 ; 0x7b8
7a4: 80 91 0a 01 lds r24, 0x010A
7a8: 90 91 0b 01 lds r25, 0x010B
7ac: 00 97 sbiw r24, 0x00 ; 0
7ae: 21 f4 brne .+8 ; 0x7b8
single_transmit(0, 0);
7b0: 60 e0 ldi r22, 0x00 ; 0
7b2: 0e 94 15 02 call 0x42a
7b6: 08 95 ret
else
stall_ep0();
7b8: 0e 94 0c 02 call 0x418
7bc: 08 95 ret
7be: 08 95 ret
000007c0 <control_handler>:
}
void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};
void control_handler(void)
{
unsigned char type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
7c0: 80 91 06 01 lds r24, 0x0106
7c4: 80 76 andi r24, 0x60 ; 96
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
7c6: e0 91 07 01 lds r30, 0x0107
7ca: ef 70 andi r30, 0x0F ; 15
if (type == USB_STANDARD_REQUEST)
7cc: 88 23 and r24, r24
7ce: 51 f4 brne .+20 ; 0x7e4
(*StandardDeviceRequest[req])();
7d0: ff 27 eor r31, r31
7d2: ee 0f add r30, r30
7d4: ff 1f adc r31, r31
7d6: e0 5a subi r30, 0xA0 ; 160
7d8: ff 4f sbci r31, 0xFF ; 255
7da: 01 90 ld r0, Z+
7dc: f0 81 ld r31, Z
7de: e0 2d mov r30, r0
7e0: 09 95 icall
7e2: 08 95 ret
else
stall_ep0();
7e4: 0e 94 0c 02 call 0x418
7e8: 08 95 ret
7ea: 08 95 ret
000007ec <disconnect_USB>:
}
void disconnect_USB(void)
{
// Initialize D12 configuration
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
7ec: 63 e4 ldi r22, 0x43 ; 67
7ee: 82 e0 ldi r24, 0x02 ; 2
7f0: 0e 94 ab 00 call 0x156
7f4: 08 95 ret
000007f6 <connect_USB>:
}
void connect_USB(void)
{
D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
7f6: 80 ec ldi r24, 0xC0 ; 192
7f8: 0e 94 c8 00 call 0x190
D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
7fc: 63 e4 ldi r22, 0x43 ; 67
7fe: 82 e1 ldi r24, 0x12 ; 18
800: 0e 94 ab 00 call 0x156
804: 08 95 ret
00000806 <reconnect_USB>:
}
void reconnect_USB(void)
{
disconnect_USB();
806: 0e 94 f6 03 call 0x7ec
connect_USB();
80a: 0e 94 fb 03 call 0x7f6
80e: 08 95 ret
00000810 <bus_reset>:
}
//this part from isr.c
void bus_reset(void)
{
810: 08 95 ret
00000812 <ep0_rxdone>:
}
void ep0_rxdone(void)
{
unsigned char ep_last, i;
ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
812: 80 e0 ldi r24, 0x00 ; 0
814: 0e 94 06 01 call 0x20c
if (ep_last & D12_SETUPPACKET) {
818: 85 ff sbrs r24, 5
81a: 4f c0 rjmp .+158 ; 0x8ba
ControlData.wLength = 0;
81c: 10 92 0f 01 sts 0x010F, r1
820: 10 92 0e 01 sts 0x010E, r1
ControlData.wCount = 0;
824: 10 92 11 01 sts 0x0111, r1
828: 10 92 10 01 sts 0x0110, r1
if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
82c: 46 e0 ldi r20, 0x06 ; 6
82e: 51 e0 ldi r21, 0x01 ; 1
830: 68 e0 ldi r22, 0x08 ; 8
832: 80 e0 ldi r24, 0x00 ; 0
834: 0e 94 40 01 call 0x280
838: 88 30 cpi r24, 0x08 ; 8
83a: 59 f0 breq .+22 ; 0x852
(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
//setup包出错,返回
D12_SetEndpointStatusIsr(0, 1);
83c: 61 e0 ldi r22, 0x01 ; 1
83e: 80 e0 ldi r24, 0x00 ; 0
840: 0e 94 28 01 call 0x250
D12_SetEndpointStatusIsr(1, 1);
844: 61 e0 ldi r22, 0x01 ; 1
846: 86 2f mov r24, r22
848: 0e 94 28 01 call 0x250
bEPPflags.bits.control_state = USB_IDLE;
84c: 80 91 c0 00 lds r24, 0x00C0
850: 5b c0 rjmp .+182 ; 0x908
return;
}
ControlData.DeviceRequest.wValue = ControlData.DeviceRequest.wValue;
ControlData.DeviceRequest.wIndex = ControlData.DeviceRequest.wIndex;
ControlData.DeviceRequest.wLength = ControlData.DeviceRequest.wLength;
// Acknowledge setup here to unlock in/out endp
D12_AcknowledgeEndpoint(0);
852: 80 e0 ldi r24, 0x00 ; 0
854: 0e 94 fa 01 call 0x3f4
D12_AcknowledgeEndpoint(1);
858: 81 e0 ldi r24, 0x01 ; 1
85a: 0e 94 fa 01 call 0x3f4
ControlData.wLength = ControlData.DeviceRequest.wLength;
85e: 20 91 0c 01 lds r18, 0x010C
862: 30 91 0d 01 lds r19, 0x010D
866: 30 93 0f 01 sts 0x010F, r19
86a: 20 93 0e 01 sts 0x010E, r18
ControlData.wCount = 0;
86e: 10 92 11 01 sts 0x0111, r1
872: 10 92 10 01 sts 0x0110, r1
if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
876: 80 91 06 01 lds r24, 0x0106
87a: 87 ff sbrs r24, 7
87c: 07 c0 rjmp .+14 ; 0x88c
bEPPflags.bits.setup_packet = 1;
87e: 80 91 c0 00 lds r24, 0x00C0
bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
882: 8f 7b andi r24, 0xBF ; 191
884: 84 62 ori r24, 0x24 ; 36
886: 80 93 c0 00 sts 0x00C0, r24
88a: 08 95 ret
}
else {
if (ControlData.DeviceRequest.wLength == 0) {
88c: 21 15 cp r18, r1
88e: 31 05 cpc r19, r1
890: c1 f1 breq .+112 ; 0x902
892: 80 91 c0 00 lds r24, 0x00C0
bEPPflags.bits.setup_packet = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -