📄 usb.lss
字号:
2e4: 81 93 st Z+, r24
2e6: 8f 01 movw r16, r30
2e8: c1 50 subi r28, 0x01 ; 1
2ea: c1 f7 brne .-16 ; 0x2dc
outportb(D12_COMMAND, 0xF2);
2ec: 62 ef ldi r22, 0xF2 ; 242
2ee: 83 e0 ldi r24, 0x03 ; 3
2f0: 0e 94 52 00 call 0xa4
if(bEPPflags.bits.in_isr == 0)
2f4: 80 91 c0 00 lds r24, 0x00C0
2f8: 84 fd sbrc r24, 4
2fa: 01 c0 rjmp .+2 ; 0x2fe
ENABLE;
2fc: 78 94 sei
return j;
2fe: 8f 2d mov r24, r15
300: 99 27 eor r25, r25
302: cf 91 pop r28
304: 1f 91 pop r17
306: 0f 91 pop r16
308: ff 90 pop r15
30a: 08 95 ret
0000030c <D12_WriteEndpoint>:
}
/*写端点缓冲区同时使缓冲区有效,包含写缓冲区命令:F0H*/
/*以及使缓冲区有效命令:FAH*/
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len,unsigned char * buf)
{
30c: ff 92 push r15
30e: 0f 93 push r16
310: 1f 93 push r17
312: cf 93 push r28
314: 98 2f mov r25, r24
316: f6 2e mov r15, r22
318: 8a 01 movw r16, r20
unsigned char i;
if(bEPPflags.bits.in_isr == 0)
31a: 80 91 c0 00 lds r24, 0x00C0
31e: 84 fd sbrc r24, 4
320: 01 c0 rjmp .+2 ; 0x324
DISABLE;
322: f8 94 cli
outportb(D12_COMMAND, endp);
324: 69 2f mov r22, r25
326: 83 e0 ldi r24, 0x03 ; 3
328: 0e 94 52 00 call 0xa4
inportb(D12_DATA);
32c: 82 e0 ldi r24, 0x02 ; 2
32e: 0e 94 64 00 call 0xc8
outportb(D12_COMMAND, 0xF0);
332: 60 ef ldi r22, 0xF0 ; 240
334: 83 e0 ldi r24, 0x03 ; 3
336: 0e 94 52 00 call 0xa4
outportb(D12_DATA, 0);
33a: 60 e0 ldi r22, 0x00 ; 0
33c: 82 e0 ldi r24, 0x02 ; 2
33e: 0e 94 52 00 call 0xa4
outportb(D12_DATA, len);
342: 6f 2d mov r22, r15
344: 82 e0 ldi r24, 0x02 ; 2
346: 0e 94 52 00 call 0xa4
for(i=0; i<len; i++)
34a: ff 20 and r15, r15
34c: 49 f0 breq .+18 ; 0x360
34e: cf 2d mov r28, r15
outportb(D12_DATA, *(buf+i));
350: f8 01 movw r30, r16
352: 61 91 ld r22, Z+
354: 8f 01 movw r16, r30
356: 82 e0 ldi r24, 0x02 ; 2
358: 0e 94 52 00 call 0xa4
35c: c1 50 subi r28, 0x01 ; 1
35e: c1 f7 brne .-16 ; 0x350
outportb(D12_COMMAND, 0xFA);
360: 6a ef ldi r22, 0xFA ; 250
362: 83 e0 ldi r24, 0x03 ; 3
364: 0e 94 52 00 call 0xa4
if(bEPPflags.bits.in_isr == 0)
368: 80 91 c0 00 lds r24, 0x00C0
36c: 84 fd sbrc r24, 4
36e: 01 c0 rjmp .+2 ; 0x372
ENABLE;
370: 78 94 sei
return len;
}
372: 8f 2d mov r24, r15
374: 99 27 eor r25, r25
376: cf 91 pop r28
378: 1f 91 pop r17
37a: 0f 91 pop r16
37c: ff 90 pop r15
37e: 08 95 ret
00000380 <D12_WriteEndpointIsr>:
/*写端点缓冲区同时使缓冲区有效,专用于中断函数*/
unsigned char D12_WriteEndpointIsr(unsigned char endp, unsigned char len,unsigned char * buf)
{
380: ff 92 push r15
382: 0f 93 push r16
384: 1f 93 push r17
386: cf 93 push r28
388: 98 2f mov r25, r24
38a: f6 2e mov r15, r22
38c: 8a 01 movw r16, r20
unsigned char i;
if(bEPPflags.bits.in_isr == 0)
38e: 80 91 c0 00 lds r24, 0x00C0
392: 84 fd sbrc r24, 4
394: 01 c0 rjmp .+2 ; 0x398
DISABLE;
396: f8 94 cli
outportb(D12_COMMAND, endp);
398: 69 2f mov r22, r25
39a: 83 e0 ldi r24, 0x03 ; 3
39c: 0e 94 52 00 call 0xa4
inportb(D12_DATA);
3a0: 82 e0 ldi r24, 0x02 ; 2
3a2: 0e 94 64 00 call 0xc8
outportb(D12_COMMAND, 0xF0);
3a6: 60 ef ldi r22, 0xF0 ; 240
3a8: 83 e0 ldi r24, 0x03 ; 3
3aa: 0e 94 52 00 call 0xa4
outportb(D12_DATA, 0);
3ae: 60 e0 ldi r22, 0x00 ; 0
3b0: 82 e0 ldi r24, 0x02 ; 2
3b2: 0e 94 52 00 call 0xa4
outportb(D12_DATA, len);
3b6: 6f 2d mov r22, r15
3b8: 82 e0 ldi r24, 0x02 ; 2
3ba: 0e 94 52 00 call 0xa4
for(i=0; i<len; i++)
3be: ff 20 and r15, r15
3c0: 49 f0 breq .+18 ; 0x3d4
3c2: cf 2d mov r28, r15
outportb(D12_DATA, *(buf+i));
3c4: f8 01 movw r30, r16
3c6: 61 91 ld r22, Z+
3c8: 8f 01 movw r16, r30
3ca: 82 e0 ldi r24, 0x02 ; 2
3cc: 0e 94 52 00 call 0xa4
3d0: c1 50 subi r28, 0x01 ; 1
3d2: c1 f7 brne .-16 ; 0x3c4
outportb(D12_COMMAND, 0xFA);
3d4: 6a ef ldi r22, 0xFA ; 250
3d6: 83 e0 ldi r24, 0x03 ; 3
3d8: 0e 94 52 00 call 0xa4
if(bEPPflags.bits.in_isr == 0)
3dc: 80 91 c0 00 lds r24, 0x00C0
3e0: 84 fd sbrc r24, 4
3e2: 01 c0 rjmp .+2 ; 0x3e6
ENABLE;
3e4: 78 94 sei
return len;
}
3e6: 8f 2d mov r24, r15
3e8: 99 27 eor r25, r25
3ea: cf 91 pop r28
3ec: 1f 91 pop r17
3ee: 0f 91 pop r16
3f0: ff 90 pop r15
3f2: 08 95 ret
000003f4 <D12_AcknowledgeEndpoint>:
/*应答SETUP命令:F1H*/
void D12_AcknowledgeEndpoint(unsigned char endp)
{
3f4: 1f 93 push r17
3f6: 18 2f mov r17, r24
outportb(D12_COMMAND, endp);
3f8: 68 2f mov r22, r24
3fa: 83 e0 ldi r24, 0x03 ; 3
3fc: 0e 94 52 00 call 0xa4
outportb(D12_COMMAND, 0xF1);
400: 61 ef ldi r22, 0xF1 ; 241
402: 83 e0 ldi r24, 0x03 ; 3
404: 0e 94 52 00 call 0xa4
if(endp == 0)
408: 11 23 and r17, r17
40a: 21 f4 brne .+8 ; 0x414
outportb(D12_COMMAND, 0xF2);
40c: 62 ef ldi r22, 0xF2 ; 242
40e: 83 e0 ldi r24, 0x03 ; 3
410: 0e 94 52 00 call 0xa4
414: 1f 91 pop r17
416: 08 95 ret
00000418 <stall_ep0>:
}
//this part from chap_9.c
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
sizeof(USB_DEVICE_DESCRIPTOR),
USB_DEVICE_DESCRIPTOR_TYPE,
0x0110,
USB_CLASS_CODE_TEST_CLASS_DEVICE,
0, 0,
EP0_PACKET_SIZE,
0x0471,//0x0471,
0x0691,
0x0100,
0, 0, 0,
1
};
CON_INT_ENDP_DESCRIPTOR_STRUCT TRANFER_DESC =
{
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
CONFIG_DESCRIPTOR_LENGTH,
1,
1,
0,
0x60,//0x9F, // 0x80,
0xC8//0x32
},
{
sizeof(USB_INTERFACE_DESCRIPTOR),
USB_INTERFACE_DESCRIPTOR_TYPE,
0,
0,
NUM_ENDPOINTS,
USB_CLASS_CODE_TEST_CLASS_DEVICE,
USB_SUBCLASS_CODE_TEST_CLASS_D12,
USB_PROTOCOL_CODE_TEST_CLASS_D12,
0
},
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x81,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,
10
},
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x1,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,
10
},
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
10
},
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x2,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,
10
}
};
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
418: 61 e0 ldi r22, 0x01 ; 1
41a: 80 e0 ldi r24, 0x00 ; 0
41c: 0e 94 10 01 call 0x220
D12_SetEndpointStatus(1, 1);
420: 61 e0 ldi r22, 0x01 ; 1
422: 86 2f mov r24, r22
424: 0e 94 10 01 call 0x220
428: 08 95 ret
0000042a <single_transmit>:
}
void single_transmit(unsigned char * buf, unsigned char len)
{
42a: ac 01 movw r20, r24
if( len <= EP0_PACKET_SIZE) {
42c: 61 31 cpi r22, 0x11 ; 17
42e: 18 f4 brcc .+6 ; 0x436
D12_WriteEndpoint(1, len, buf);
430: 81 e0 ldi r24, 0x01 ; 1
432: 0e 94 86 01 call 0x30c
436: 08 95 ret
438: 08 95 ret
0000043a <reserved>:
}
}
void reserved(void)
{
stall_ep0();
43a: 0e 94 0c 02 call 0x418
43e: 08 95 ret
00000440 <init_unconfig>:
}
void init_unconfig(void)
{
D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
440: 80 e0 ldi r24, 0x00 ; 0
442: 0e 94 91 00 call 0x122
446: 08 95 ret
00000448 <init_config>:
}
void init_config(void)
{
D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
448: 81 e0 ldi r24, 0x01 ; 1
44a: 0e 94 91 00 call 0x122
44e: 08 95 ret
00000450 <get_status>:
}
void get_status(void)
{
450: cf 93 push r28
452: df 93 push r29
454: cd b7 in r28, 0x3d ; 61
456: de b7 in r29, 0x3e ; 62
458: 22 97 sbiw r28, 0x02 ; 2
45a: 0f b6 in r0, 0x3f ; 63
45c: f8 94 cli
45e: de bf out 0x3e, r29 ; 62
460: 0f be out 0x3f, r0 ; 63
462: cd bf out 0x3d, r28 ; 61
unsigned char endp, txdat[2];
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
464: 80 91 06 01 lds r24, 0x0106
468: 8f 71 andi r24, 0x1F ; 31
unsigned char c;
if (bRecipient == USB_RECIPIENT_DEVICE) {
46a: 49 f4 brne .+18 ; 0x47e
if(bEPPflags.bits.remote_wakeup == 1)
46c: 80 91 c0 00 lds r24, 0x00C0
470: 83 ff sbrs r24, 3
472: 02 c0 rjmp .+4 ; 0x478
txdat[0] = 3;
474: 83 e0 ldi r24, 0x03 ; 3
476: 01 c0 rjmp .+2 ; 0x47a
else
txdat[0] = 1;
478: 81 e0 ldi r24, 0x01 ; 1
47a: 89 83 std Y+1, r24 ; 0x01
47c: 18 c0 rjmp .+48 ; 0x4ae
txdat[1]=0;
single_transmit(txdat, 2);
} else if (bRecipient == USB_RECIPIENT_INTERFACE) {
47e: 81 30 cpi r24, 0x01 ; 1
480: a9 f0 breq .+42 ; 0x4ac
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2);
} else if (bRecipient == USB_RECIPIENT_ENDPOINT) {
482: 82 30 cpi r24, 0x02 ; 2
484: e1 f4 brne .+56 ; 0x4be
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
486: 80 91 0a 01 lds r24, 0x010A
48a: 83 70 andi r24, 0x03 ; 3
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
48c: 20 91 0a 01 lds r18, 0x010A
490: 30 91 0b 01 lds r19, 0x010B
494: 99 27 eor r25, r25
496: 27 ff sbrs r18, 7
498: 04 c0 rjmp .+8 ; 0x4a2
c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
49a: 88 0f add r24, r24
49c: 99 1f adc r25, r25
49e: 8f 5f subi r24, 0xFF ; 255
4a0: 01 c0 rjmp .+2 ; 0x4a4
else
c = D12_SelectEndpoint(endp*2); /* Control-out */
4a2: 88 0f add r24, r24
4a4: 0e 94 f1 00 call 0x1e2
if(c & D12_STALL)
4a8: 81 fd sbrc r24, 1
4aa: e6 cf rjmp .-52 ; 0x478
txdat[0] = 1;
else
txdat[0] = 0;
4ac: 19 82 std Y+1, r1 ; 0x01
txdat[1] = 0;
4ae: fe 01 movw r30, r28
4b0: 31 96 adiw r30, 0x01 ; 1
4b2: 11 82 std Z+1, r1 ; 0x01
single_transmit(txdat, 2);
4b4: 62 e0 ldi r22, 0x02 ; 2
4b6: cf 01 movw r24, r30
4b8: 0e 94 15 02 call 0x42a
4bc: 02 c0 rjmp .+4 ; 0x4c2
} else
stall_ep0();
4be: 0e 94 0c 02 call 0x418
4c2: 22 96 adiw r28, 0x02 ; 2
4c4: 0f b6 in r0, 0x3f ; 63
4c6: f8 94 cli
4c8: de bf out 0x3e, r29 ; 62
4ca: 0f be out 0x3f, r0 ; 63
4cc: cd bf out 0x3d, r28 ; 61
4ce: df 91 pop r29
4d0: cf 91 pop r28
4d2: 08 95 ret
000004d4 <clear_feature>:
}
void clear_feature(void)
{
unsigned char endp;
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
4d4: 80 91 06 01 lds r24, 0x0106
4d8: 8f 71 andi r24, 0x1F ; 31
if (bRecipient == USB_RECIPIENT_DEVICE
4da: 71 f4 brne .+28 ; 0x4f8
4dc: 80 91 08 01 lds r24, 0x0108
4e0: 90 91 09 01 lds r25, 0x0109
4e4: 01 97 sbiw r24, 0x01 ; 1
4e6: 49 f5 brne .+82 ; 0x53a
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
DISABLE;
4e8: f8 94 cli
bEPPflags.bits.remote_wakeup = 0;
4ea: 80 91 c0 00 lds r24, 0x00C0
4ee: 87 7f andi r24, 0xF7 ; 247
4f0: 80 93 c0 00 sts 0x00C0, r24
ENABLE;
4f4: 78 94 sei
4f6: 1b c0 rjmp .+54 ; 0x52e
single_transmit(0, 0);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
4f8: 82 30 cpi r24, 0x02 ; 2
4fa: f9 f4 brne .+62 ; 0x53a
4fc: 80 91 08 01 lds r24, 0x0108
500: 90 91 09 01 lds r25, 0x0109
504: 89 2b or r24, r25
506: c9 f4 brne .+50 ; 0x53a
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
508: 80 91 0a 01 lds r24, 0x010A
50c: 83 70 andi r24, 0x03 ; 3
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
50e: 20 91 0a 01 lds r18, 0x010A
512: 30 91 0b 01 lds r19, 0x010B
516: 99 27 eor r25, r25
518: 27 ff sbrs r18, 7
51a: 05 c0 rjmp .+10 ; 0x526
/* clear TX stall for IN on EPn. */
D12_SetEndpointStatus(endp*2 + 1, 0);
51c: 88 0f add r24, r24
51e: 99 1f adc r25, r25
520: 60 e0 ldi r22, 0x00 ; 0
522: 8f 5f subi r24, 0xFF ; 255
524: 02 c0 rjmp .+4 ; 0x52a
else
/* clear RX stall for OUT on EPn. */
D12_SetEndpointStatus(endp*2, 0);
526: 60 e0 ldi r22, 0x00 ; 0
528: 88 0f add r24, r24
52a: 0e 94 10 01 call 0x220
single_transmit(0, 0);
52e: 60 e0 ldi r22, 0x00 ; 0
530: 80 e0 ldi r24, 0x00 ; 0
532: 90 e0 ldi r25, 0x00 ; 0
534: 0e 94 15 02 call 0x42a
538: 08 95 ret
} else
stall_ep0();
53a: 0e 94 0c 02 call 0x418
53e: 08 95 ret
540: 08 95 ret
00000542 <set_feature>:
}
void set_feature(void)
{
unsigned char endp;
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
542: 80 91 06 01 lds r24, 0x0106
546: 8f 71 andi r24, 0x1F ; 31
if (bRecipient == USB_RECIPIENT_DEVICE
548: 71 f4 brne .+28 ; 0x566
54a: 80 91 08 01 lds r24, 0x0108
54e: 90 91 09 01 lds r25, 0x0109
552: 01 97 sbiw r24, 0x01 ; 1
554: 69 f5 brne .+90 ; 0x5b0
&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
DISABLE;
556: f8 94 cli
bEPPflags.bits.remote_wakeup = 1;
558: 80 91 c0 00 lds r24, 0x00C0
55c: 88 60 ori r24, 0x08 ; 8
55e: 80 93 c0 00 sts 0x00C0, r24
ENABLE;
562: 78 94 sei
564: 1f c0 rjmp .+62 ; 0x5a4
single_transmit(0, 0);
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
566: 82 30 cpi r24, 0x02 ; 2
568: 19 f5 brne .+70 ; 0x5b0
56a: 80 91 08 01 lds r24, 0x0108
56e: 90 91 09 01 lds r25, 0x0109
572: 89 2b or r24, r25
574: e9 f4 brne .+58 ; 0x5b0
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
576: 80 91 0a 01 lds r24, 0x010A
57a: 83 70 andi r24, 0x03 ; 3
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
57c: 20 91 0a 01 lds r18, 0x010A
580: 30 91 0b 01 lds r19, 0x010B
584: 99 27 eor r25, r25
586: 27 ff sbrs r18, 7
588: 05 c0 rjmp .+10 ; 0x594
/* clear TX stall for IN on EPn. */
D12_SetEndpointStatus(endp*2 + 1, 1);
58a: 88 0f add r24, r24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -