📄 chap9.lst
字号:
77:chap9.c **** unsigned char c;
78:chap9.c **** if(bRecipient == USB_RECIPIENT_DEVICE)
418 .LM28:
419 00d4 49F4 brne .L11
79:chap9.c **** { //返回设备状态
80:chap9.c **** if(bEPPflags.bits.remote_wakeup==1)
421 .LM29:
422 00d6 8091 0000 lds r24,bEPPflags
423 00da 84FF sbrs r24,4
424 00dc 02C0 rjmp .L12
81:chap9.c **** txdat[0]=3; //支持远程唤醒,自供电
426 .LM30:
427 00de 83E0 ldi r24,lo8(3)
428 00e0 01C0 rjmp .L23
429 .L12:
82:chap9.c **** else
83:chap9.c **** txdat[0]=1;
431 .LM31:
432 00e2 81E0 ldi r24,lo8(1)
433 .L23:
434 00e4 8983 std Y+1,r24
435 00e6 18C0 rjmp .L21
436 .L11:
84:chap9.c **** txdat[1]=0;
85:chap9.c **** single_transmit(txdat,2); //发送数据
86:chap9.c **** }
87:chap9.c **** else
88:chap9.c **** if(bRecipient == USB_RECIPIENT_INTERFACE)
438 .LM32:
439 00e8 8130 cpi r24,lo8(1)
440 00ea A9F0 breq .L20
89:chap9.c **** { //返回接口状态
90:chap9.c **** txdat[0]=0;
91:chap9.c **** txdat[1]=0;
92:chap9.c **** single_transmit(txdat,2); //发送数据
93:chap9.c **** }
94:chap9.c **** else
95:chap9.c **** if(bRecipient == USB_RECIPIENT_ENDPOINT)
442 .LM33:
443 00ec 8230 cpi r24,lo8(2)
444 00ee E1F4 brne .L17
96:chap9.c **** { //返回端点状态
97:chap9.c **** endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
446 .LM34:
447 00f0 9091 0000 lds r25,ControlData+4
448 00f4 892F mov r24,r25
449 00f6 8370 andi r24,lo8(3)
450 00f8 282F mov r18,r24
451 00fa 3327 clr r19
98:chap9.c **** if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
453 .LM35:
454 00fc 97FF sbrs r25,7
455 00fe 05C0 rjmp .L18
99:chap9.c **** c=D12_SelectEndpoint(endp*2+1); //读取输入端点状态
457 .LM36:
458 0100 220F add r18,r18
459 0102 331F adc r19,r19
460 0104 822F mov r24,r18
461 0106 8F5F subi r24,lo8(-(1))
462 0108 02C0 rjmp .L24
463 .L18:
100:chap9.c **** else
101:chap9.c **** c=D12_SelectEndpoint(endp*2); //读取输出端点状态
465 .LM37:
466 010a 822F mov r24,r18
467 010c 880F lsl r24
468 .L24:
469 010e 0E94 0000 call D12_SelectEndpoint
102:chap9.c **** if(c & D12_STALL)
471 .LM38:
472 0112 81FD sbrc r24,1
473 0114 E6CF rjmp .L12
474 .L20:
103:chap9.c **** txdat[0]=1; //端点禁止
104:chap9.c **** else
105:chap9.c **** txdat[0]=0; //端点有效
476 .LM39:
477 0116 1982 std Y+1,__zero_reg__
478 .L21:
106:chap9.c **** txdat[1]=0;
480 .LM40:
481 0118 FE01 movw r30,r28
482 011a 3196 adiw r30,1
483 011c 1182 std Z+1,__zero_reg__
107:chap9.c **** single_transmit(txdat,2); //发送数据
485 .LM41:
486 011e 62E0 ldi r22,lo8(2)
487 0120 CF01 movw r24,r30
488 0122 0E94 0000 call single_transmit
489 0126 02C0 rjmp .L10
490 .L17:
108:chap9.c **** }
109:chap9.c **** else
110:chap9.c **** stall_ep0(); //非标准请求,发STALL
492 .LM42:
493 0128 0E94 0000 call stall_ep0
494 .L10:
495 /* epilogue: frame size=2 */
496 012c 2296 adiw r28,2
497 012e 0FB6 in __tmp_reg__,__SREG__
498 0130 F894 cli
499 0132 DEBF out __SP_H__,r29
500 0134 0FBE out __SREG__,__tmp_reg__
501 0136 CDBF out __SP_L__,r28
502 0138 DF91 pop r29
503 013a CF91 pop r28
504 013c 0895 ret
505 /* epilogue end (size=9) */
506 /* function get_status size 67 (48) */
514 .Lscope5:
516 .global clear_feature
518 clear_feature:
111:chap9.c **** }
112:chap9.c **** //清除特性
113:chap9.c **** void clear_feature(void)
114:chap9.c **** {
520 .LM43:
521 /* prologue: frame size=0 */
522 /* prologue end (size=0) */
115:chap9.c **** unsigned char endp; //读取请求类型中的接收方
116:chap9.c **** unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
524 .LM44:
525 013e 8091 0000 lds r24,ControlData
526 0142 8F71 andi r24,lo8(31)
117:chap9.c **** if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKE
528 .LM45:
529 0144 71F4 brne .L26
531 .LM46:
532 0146 8091 0000 lds r24,ControlData+2
533 014a 9091 0000 lds r25,(ControlData+2)+1
534 014e 0197 sbiw r24,1
535 0150 31F5 brne .L28
118:chap9.c **** {//清除远程唤醒特性
119:chap9.c **** DISABLE;
537 .LM47:
538 /* #APP */
539 0152 F894 cli
120:chap9.c **** bEPPflags.bits.remote_wakeup=0;
541 .LM48:
542 /* #NOAPP */
543 0154 8091 0000 lds r24,bEPPflags
544 0158 8F7E andi r24,lo8(-17)
545 015a 8093 0000 sts bEPPflags,r24
121:chap9.c **** ENABLE;
547 .LM49:
548 /* #APP */
549 015e 7894 sei
550 /* #NOAPP */
551 0160 18C0 rjmp .L33
552 .L26:
122:chap9.c **** single_transmit(0,0); //返回应答
123:chap9.c **** }
124:chap9.c **** else
125:chap9.c **** if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT
554 .LM50:
555 0162 8230 cpi r24,lo8(2)
556 0164 E1F4 brne .L28
557 0166 8091 0000 lds r24,ControlData+2
558 016a 9091 0000 lds r25,(ControlData+2)+1
559 016e 892B or r24,r25
560 0170 B1F4 brne .L28
126:chap9.c **** { //清除端点禁止特性,恢复其使用
127:chap9.c **** endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
562 .LM51:
563 0172 8091 0000 lds r24,ControlData+4
128:chap9.c **** if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
565 .LM52:
566 0176 682F mov r22,r24
567 0178 6078 andi r22,lo8(-128)
568 017a 8370 andi r24,lo8(3)
569 017c 9927 clr r25
570 017e 6623 tst r22
571 0180 29F0 breq .L29
129:chap9.c **** D12_SetEndpointStatus(endp*2+1,0); //清除输入端点STALL特性
573 .LM53:
574 0182 880F add r24,r24
575 0184 991F adc r25,r25
576 0186 60E0 ldi r22,lo8(0)
577 0188 8F5F subi r24,lo8(-(1))
578 018a 01C0 rjmp .L32
579 .L29:
130:chap9.c **** else
131:chap9.c **** D12_SetEndpointStatus(endp*2,0); //清除输出端点STALL特性
581 .LM54:
582 018c 880F lsl r24
583 .L32:
584 018e 0E94 0000 call D12_SetEndpointStatus
585 .L33:
132:chap9.c **** single_transmit(0,0); //发送响应
587 .LM55:
588 0192 60E0 ldi r22,lo8(0)
589 0194 80E0 ldi r24,lo8(0)
590 0196 90E0 ldi r25,hi8(0)
591 0198 0E94 0000 call single_transmit
592 019c 0895 ret
593 .L28:
133:chap9.c **** }
134:chap9.c **** else
135:chap9.c **** stall_ep0(); //没有该请求,返回STALL
595 .LM56:
596 019e 0E94 0000 call stall_ep0
597 01a2 0895 ret
598 /* epilogue: frame size=0 */
599 /* epilogue: noreturn */
600 /* epilogue end (size=0) */
601 /* function clear_feature size 55 (55) */
606 .Lscope6:
608 .global set_feature
610 set_feature:
136:chap9.c **** }
137:chap9.c **** //设置特性
138:chap9.c **** void set_feature(void)
139:chap9.c **** {
612 .LM57:
613 /* prologue: frame size=0 */
614 /* prologue end (size=0) */
140:chap9.c **** unsigned char endp;
141:chap9.c **** //读取设备请求中的接收方
142:chap9.c **** unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
616 .LM58:
617 01a4 8091 0000 lds r24,ControlData
618 01a8 8F71 andi r24,lo8(31)
143:chap9.c **** if(bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKE
620 .LM59:
621 01aa 71F4 brne .L35
623 .LM60:
624 01ac 8091 0000 lds r24,ControlData+2
625 01b0 9091 0000 lds r25,(ControlData+2)+1
626 01b4 0197 sbiw r24,1
627 01b6 69F5 brne .L37
144:chap9.c **** {//设置远程唤醒特性
145:chap9.c **** DISABLE;
629 .LM61:
630 /* #APP */
631 01b8 F894 cli
146:chap9.c **** bEPPflags.bits.remote_wakeup=1;
633 .LM62:
634 /* #NOAPP */
635 01ba 8091 0000 lds r24,bEPPflags
636 01be 8061 ori r24,lo8(16)
637 01c0 8093 0000 sts bEPPflags,r24
147:chap9.c **** ENABLE;
639 .LM63:
640 /* #APP */
641 01c4 7894 sei
642 /* #NOAPP */
643 01c6 1FC0 rjmp .L42
644 .L35:
148:chap9.c **** single_transmit(0,0); //返回应答
149:chap9.c **** }
150:chap9.c **** else
151:chap9.c **** if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT
646 .LM64:
647 01c8 8230 cpi r24,lo8(2)
648 01ca 19F5 brne .L37
649 01cc 8091 0000 lds r24,ControlData+2
650 01d0 9091 0000 lds r25,(ControlData+2)+1
651 01d4 892B or r24,r25
652 01d6 E9F4 brne .L37
152:chap9.c **** {
153:chap9.c **** endp=(unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
654 .LM65:
655 01d8 9091 0000 lds r25,ControlData+4
656 01dc 892F mov r24,r25
657 01de 8370 andi r24,lo8(3)
658 01e0 282F mov r18,r24
659 01e2 3327 clr r19
154:chap9.c **** if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
661 .LM66:
662 01e4 97FF sbrs r25,7
663 01e6 06C0 rjmp .L38
155:chap9.c **** D12_SetEndpointStatus(endp*2+1,1);
665 .LM67:
666 01e8 220F add r18,r18
667 01ea 331F adc r19,r19
668 01ec 61E0 ldi r22,lo8(1)
669 01ee 822F mov r24,r18
670 01f0 860F add r24,r22
671 01f2 07C0 rjmp .L41
672 .L38:
156:chap9.c **** else
157:chap9.c **** D12_SetEndpointStatus(endp*2,1); //设置输出端点禁止
674 .LM68:
675 01f4 61E0 ldi r22,lo8(1)
676 01f6 822F mov r24,r18
677 01f8 062E mov r0,r22
678 01fa 01C0 rjmp 2f
679 01fc 880F 1: lsl r24
680 01fe 0A94 2: dec r0
681 0200 EAF7 brpl 1b
682 .L41:
683 0202 0E94 0000 call D12_SetEndpointStatus
684 .L42:
158:chap9.c **** single_transmit(0,0); //发送响应
686 .LM69:
687 0206 60E0 ldi r22,lo8(0)
688 0208 80E0 ldi r24,lo8(0)
689 020a 90E0 ldi r25,hi8(0)
690 020c 0E94 0000 call single_transmit
691 0210 0895 ret
692 .L37:
159:chap9.c **** }
160:chap9.c **** else
161:chap9.c **** stall_ep0(); //没有该请求,返回STALL
694 .LM70:
695 0212 0E94 0000 call stall_ep0
696 0216 0895 ret
697 /* epilogue: frame size=0 */
698 /* epilogue: noreturn */
699 /* epilogue end (size=0) */
700 /* function set_feature size 62 (62) */
706 .Lscope7:
708 .global set_address
710 set_address:
162:chap9.c **** }
163:chap9.c **** //设置地址
164:chap9.c **** void set_address(void)
165:chap9.c **** {
712 .LM71:
713 /* prologue: frame size=0 */
714 /* prologue end (size=0) */
166:chap9.c **** D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);
716 .LM72:
717 0218 8091 0000 lds r24,ControlData+2
718 021c 61E0 ldi r22,lo8(1)
719 021e 8F77 andi r24,lo8(127)
720 0220 0E94 0000 call D12_SetAddressEnable
167:chap9.c **** single_transmit(0,0); //发送响应
722 .LM73:
723 0224 60E0 ldi r22,lo8(0)
724 0226 80E0 ldi r24,lo8(0)
725 0228 90E0 ldi r25,hi8(0)
726 022a 0E94 0000 call single_transmit
727 /* epilogue: frame size=0 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -