📄 avr_usb.lst
字号:
03B9 0000 NOP
03BA 0000 NOP
(0016) i=D12_DATA;
03BB 91407F00 LDS R20,0x7F00
(0017) csram;
03BD 9360FC01 STS 0xFC01,R22
(0018) if(i & 0x01) //ENDP0_OUT
03BF FF40 SBRS R20,0
03C0 C00D RJMP 0x03CE
(0019) {
(0020) D12_COMMAND = 0x40; //读 OUT 最后状态
03C1 E480 LDI R24,0x40
03C2 93807F01 STS 0x7F01,R24
(0021) cwait1;
03C4 0000 NOP
03C5 0000 NOP
(0022) i= D12_DATA;
03C6 91407F00 LDS R20,0x7F00
(0023) csram;
03C8 9360FC01 STS 0xFC01,R22
(0024) if (i & 0x20) //收到 SETUP 包
03CA FF45 SBRS R20,5
03CB C07D RJMP 0x0449
(0025) {
(0026) Setup_control();
03CC DDD7 RCALL _Setup_control
(0027) }
(0028) }
03CD C07B RJMP 0x0449
(0029) else if(i & 0x02) //ENDP0_IN
03CE FF41 SBRS R20,1
03CF C00B RJMP 0x03DB
(0030) {
(0031) D12_COMMAND = 0x41;//读 in 最后状态
03D0 E481 LDI R24,0x41
03D1 93807F01 STS 0x7F01,R24
(0032) cwait1;
03D3 0000 NOP
03D4 0000 NOP
(0033) i = D12_DATA;
03D5 91407F00 LDS R20,0x7F00
(0034) csram;
03D7 9360FC01 STS 0xFC01,R22
(0035) USB_submit();
03D9 DF7E RCALL _USB_submit
(0036) }
03DA C06E RJMP 0x0449
(0037) else if(i & 0x04)//ENDP1_OUT
03DB FF42 SBRS R20,2
03DC C00E RJMP 0x03EB
(0038) {
(0039) D12_COMMAND = 0x42;//读 out 最后状态
03DD E482 LDI R24,0x42
03DE 93807F01 STS 0x7F01,R24
(0040) cwait;
03E0 0000 NOP
(0041) i = D12_DATA;
03E1 91407F00 LDS R20,0x7F00
(0042) csram;
03E3 9360FC01 STS 0xFC01,R22
(0043) ReadEndpoint1(3,Rshu);
03E5 EC22 LDI R18,0xC2
03E6 E030 LDI R19,0
03E7 E003 LDI R16,3
03E8 E010 LDI R17,0
03E9 D065 RCALL _ReadEndpoint1
(0044)
(0045) }
03EA C05E RJMP 0x0449
(0046) else if(i & 0x08)//ENDP1_IN
03EB FF43 SBRS R20,3
03EC C019 RJMP 0x0406
(0047) {
(0048) D12_COMMAND = 0x43;//读 in 最后状态
03ED E483 LDI R24,0x43
03EE 93807F01 STS 0x7F01,R24
(0049) cwait1;
03F0 0000 NOP
03F1 0000 NOP
(0050) i = D12_DATA;
03F2 91407F00 LDS R20,0x7F00
(0051) cwait1;
03F4 0000 NOP
03F5 0000 NOP
(0052) csram;
03F6 9360FC01 STS 0xFC01,R22
(0053) D12_COMMAND = 3;// 选择 IN 端点(指针指向0位置)
03F8 E083 LDI R24,3
03F9 93807F01 STS 0x7F01,R24
(0054) cwait;
03FB 0000 NOP
(0055) D12_COMMAND = 0xf0;// 写缓冲区
03FC EF80 LDI R24,0xF0
03FD 93807F01 STS 0x7F01,R24
(0056) cwait;
03FF 0000 NOP
(0057) D12_DATA = 0;
0400 2422 CLR R2
0401 92207F00 STS 0x7F00,R2
(0058) csram;
0403 9360FC01 STS 0xFC01,R22
(0059) // WriteEndpoint1();
(0060)
(0061) }
0405 C043 RJMP 0x0449
(0062) else if(i & 0x10)//ENDP2_out 对应管道2
0406 FF44 SBRS R20,4
0407 C01B RJMP 0x0423
(0063) {
(0064) D12_COMMAND = 0x44;//读 in 最后状态
0408 E484 LDI R24,0x44
0409 93807F01 STS 0x7F01,R24
(0065) cwait1;
040B 0000 NOP
040C 0000 NOP
(0066) i = D12_DATA;
040D 91407F00 LDS R20,0x7F00
(0067) cwait1;
040F 0000 NOP
0410 0000 NOP
(0068) D12_COMMAND = 4;// 选择 IN 端点(指针指向0位置)
0411 E084 LDI R24,4
0412 93807F01 STS 0x7F01,R24
(0069) cwait;
0414 0000 NOP
(0070) D12_COMMAND = 0xf0;// 读缓冲区
0415 EF80 LDI R24,0xF0
0416 93807F01 STS 0x7F01,R24
(0071) cwait1;
0418 0000 NOP
0419 0000 NOP
(0072) j=D12_DATA;
041A 91607F00 LDS R22,0x7F00
(0073) cwait1;
041C 0000 NOP
041D 0000 NOP
(0074) j=D12_DATA; //数据字节的长度
041E 91607F00 LDS R22,0x7F00
(0075) csram;
0420 9360FC01 STS 0xFC01,R22
(0076) // flashWrite(j);
(0077) }
0422 C026 RJMP 0x0449
(0078) else if(i & 0x20)//ENDP2_IN 对应管道3
0423 FF45 SBRS R20,5
0424 C018 RJMP 0x043D
(0079) {
(0080) D12_COMMAND = 0x45;//读 in 最后状态
0425 E485 LDI R24,0x45
0426 93807F01 STS 0x7F01,R24
(0081) cwait1;
0428 0000 NOP
0429 0000 NOP
(0082) i = D12_DATA;
042A 91407F00 LDS R20,0x7F00
(0083) cwait1;
042C 0000 NOP
042D 0000 NOP
(0084) D12_COMMAND = 5;// 选择 IN 端点(指针指向0位置)
042E E085 LDI R24,5
042F 93807F01 STS 0x7F01,R24
(0085) cwait;
0431 0000 NOP
(0086) D12_COMMAND = 0xf0;// 写缓冲区
0432 EF80 LDI R24,0xF0
0433 93807F01 STS 0x7F01,R24
(0087) cwait;
0435 0000 NOP
(0088) D12_DATA = 0;
0436 2422 CLR R2
0437 92207F00 STS 0x7F00,R2
(0089) csram;
0439 9360FC01 STS 0xFC01,R22
(0090) flashRead();
043B DC6A RCALL _flashRead
(0091) }
043C C00C RJMP 0x0449
(0092) else if(i & 0x80)//D12_INT_SUSPENDCHANGE D12挂起
043D FF47 SBRS R20,7
043E C001 RJMP 0x0440
(0093) {
(0094) //if(D12_suspend)
(0095) {
(0096) /** /
(0097) D12_suspend = 0;//处理挂起事务
(0098) D12_COMMAND = 0xf6;//发送恢复命令
(0099) D12_suspend = 1;//复位51输入引脚
(0100) /**/
(0101) }
(0102) }
043F C009 RJMP 0x0449
(0103) else if(i & 0x40)//D12_INT_BUSRESET 总线复位
0440 FF46 SBRS R20,6
0441 C002 RJMP 0x0444
(0104) {
(0105) bus_reset();
0442 D00A RCALL _bus_reset
(0106) }
0443 C005 RJMP 0x0449
(0107) else
(0108) {
(0109) i=D12_DATA; //D12_INT_EOT DMA操作已结束
0444 91407F00 LDS R20,0x7F00
(0110) if(i & 0x01)
0446 FF40 SBRS R20,0
0447 C001 RJMP 0x0449
(0111) {
(0112) dma_eot();
0448 D005 RCALL _dma_eot
(0113) }
(0114) }
(0115)
(0116) SREG = 0x80;//全局中断使能
0449 E880 LDI R24,0x80
044A BF8F OUT 0x3F,R24
(0117) }
044B D08E RCALL pop_gset2
044C 9508 RET
(0118)
(0119) void bus_reset(void)
(0120) {
(0121) }
_bus_reset:
044D 9508 RET
(0122)
(0123) void dma_eot(void)
(0124) {
(0125) }
_dma_eot:
044E 9508 RET
_ReadEndpoint1:
n --> R20
j --> R20
i --> R22
buf --> R10
len --> R22
044F D0A8 RCALL push_gset3
0450 0159 MOVW R10,R18
0451 01B8 MOVW R22,R16
(0126)
(0127) void ReadEndpoint1(unsigned int len,unsigned int * buf)
(0128) {
(0129) unsigned int i,j,n;
(0130) D12_COMMAND=2;
0452 E082 LDI R24,2
0453 93807F01 STS 0x7F01,R24
(0131) D12_COMMAND=0xf0;
0455 EF80 LDI R24,0xF0
0456 93807F01 STS 0x7F01,R24
(0132) j= D12_DATA;
0458 91407F00 LDS R20,0x7F00
045A 2755 CLR R21
(0133) j = D12_DATA;
045B 91407F00 LDS R20,0x7F00
045D 2755 CLR R21
(0134) if(j>len)
045E 1764 CP R22,R20
045F 0775 CPC R23,R21
0460 F408 BCC 0x0462
(0135) j=len;
0461 01AB MOVW R20,R22
(0136) for(i=0; i<j; i++)
0462 2766 CLR R22
0463 2777 CLR R23
0464 C00E RJMP 0x0473
(0137) *(buf+i) = D12_DATA;
0465 E002 LDI R16,2
0466 E010 LDI R17,0
0467 019B MOVW R18,R22
0468 D061 RCALL empy16s
0469 01F8 MOVW R30,R16
046A 0DEA ADD R30,R10
046B 1DFB ADC R31,R11
046C 90207F00 LDS R2,0x7F00
046E 2433 CLR R3
046F 8231 STD Z+1,R3
0470 8220 STD Z+0,R2
0471 5F6F SUBI R22,0xFF
0472 4F7F SBCI R23,0xFF
0473 1764 CP R22,R20
0474 0775 CPC R23,R21
0475 F378 BCS 0x0465
(0138) if(Rshu[0]==0xa1 && Rshu[1]==0xa2 && Rshu[2]==0xa3)
0476 918000C2 LDS R24,_Rshu
0478 919000C3 LDS R25,_Rshu+1
047A 3A81 CPI R24,0xA1
047B E0E0 LDI R30,0
047C 079E CPC R25,R30
047D F4A1 BNE 0x0492
047E 918000C4 LDS R24,_Rshu+2
0480 919000C5 LDS R25,_Rshu+3
0482 3A82 CPI R24,0xA2
0483 E0E0 LDI R30,0
0484 079E CPC R25,R30
0485 F461 BNE 0x0492
0486 918000C6 LDS R24,0xC6
0488 919000C7 LDS R25,0xC7
048A 3A83 CPI R24,0xA3
048B E0E0 LDI R30,0
048C 079E CPC R25,R30
048D F421 BNE 0x0492
(0139) {
(0140)
(0141) adrstart=0xcc;
048E EC8C LDI R24,0xCC
048F 9380FF50 STS 0xFF50,R24
(0142) }
0491 C033 RJMP 0x04C5
(0143) else if(Rshu[0]==0xb1 && Rshu[1]==0xb2 && Rshu[2]==0xb3)
0492 918000C2 LDS R24,_Rshu
0494 919000C3 LDS R25,_Rshu+1
0496 3B81 CPI R24,0xB1
0497 E0E0 LDI R30,0
0498 079E CPC R25,R30
0499 F541 BNE 0x04C2
049A 918000C4 LDS R24,_Rshu+2
049C 919000C5 LDS R25,_Rshu+3
049E 3B82 CPI R24,0xB2
049F E0E0 LDI R30,0
04A0 079E CPC R25,R30
04A1 F501 BNE 0x04C2
04A2 918000C6 LDS R24,0xC6
04A4 919000C7 LDS R25,0xC7
04A6 3B83 CPI R24,0xB3
04A7 E0E0 LDI R30,0
04A8 079E CPC R25,R30
04A9 F4C1 BNE 0x04C2
(0144) {
(0145) adrstop=0xee;
04AA EE8E LDI R24,0xEE
04AB 9380FF45 STS 0xFF45,R24
(0146) Fifo1_Flag=0x00;
04AD 2422 CLR R2
04AE 92200062 STS 0x62,R2
(0147) Fifo2_Flag=0x00;
04B0 92200063 STS 0x63,R2
(0148) //DDRD=0xfb;
(0149) PORTD=0xdd;
04B2 ED8D LDI R24,0xDD
04B3 BB82 OUT 0x12,R24
(0150) for(n=0;n<6;n++)
04B4 2744 CLR R20
04B5 2755 CLR R21
04B6 C003 RJMP 0x04BA
(0151) cwait1;
04B7 0000 NOP
04B8 5F4F SUBI R20,0xFF
04B9 4F5F SBCI R21,0xFF
04BA 3046 CPI R20,6
04BB E0E0 LDI R30,0
04BC 075E CPC R21,R30
04BD F3C8 BCS 0x04B7
04BE 0000 NOP
(0152) PORTD=0xdf;
04BF ED8F LDI R24,0xDF
04C0 BB82 OUT 0x12,R24
(0153)
(0154) }
04C1 C003 RJMP 0x04C5
(0155) else
(0156) {
(0157) D12_COMMAND=0xf2;
04C2 EF82 LDI R24,0xF2
04C3 93807F01 STS 0x7F01,R24
(0158) }
(0159)
(0160) D12_COMMAND=0xf2;
04C5 EF82 LDI R24,0xF2
04C6 93807F01 STS 0x7F01,R24
(0161)
(0162) }
FILE: <library>
04C8 D013 RCALL pop_gset3
04C9 9508 RET
empy16s:
04CA 920A ST R0,-Y
04CB 921A ST R1,-Y
04CC 938A ST R24,-Y
04CD 939A ST R25,-Y
04CE 9F02 MUL R16,R18
04CF 01C0 MOVW R24,R0
04D0 9F12 MUL R17,R18
04D1 0D90 ADD R25,R0
04D2 9F03 MUL R16,R19
04D3 0D90 ADD R25,R0
04D4 018C MOVW R16,R24
04D5 9199 LD R25,Y+
04D6 9189 LD R24,Y+
04D7 9019 LD R1,Y+
04D8 9009 LD R0,Y+
04D9 9508 RET
pop_gset2:
04DA E0E2 LDI R30,2
04DB C006 RJMP pop
pop_gset3:
04DC E0E4 LDI R30,4
04DD C004 RJMP pop
push_gset1:
04DE 935A ST R21,-Y
04DF 934A ST R20,-Y
04E0 9508 RET
pop_gset1:
04E1 E0E1 LDI R30,1
pop:
04E2 9149 LD R20,Y+
04E3 9159 LD R21,Y+
04E4 FDE0 SBRC R30,0
04E5 9508 RET
04E6 9169 LD R22,Y+
04E7 9179 LD R23,Y+
04E8 FDE1 SBRC R30,1
04E9 9508 RET
04EA 90A9 LD R10,Y+
04EB 90B9 LD R11,Y+
04EC FDE2 SBRC R30,2
04ED 9508 RET
04EE 90C9 LD R12,Y+
04EF 90D9 LD R13,Y+
04F0 FDE3 SBRC R30,3
04F1 9508 RET
04F2 90E9 LD R14,Y+
04F3 90F9 LD R15,Y+
04F4 9508 RET
push_gset2:
04F5 937A ST R23,-Y
04F6 936A ST R22,-Y
04F7 CFE6 RJMP push_gset1
push_gset3:
04F8 92BA ST R11,-Y
04F9 92AA ST R10,-Y
04FA CFFA RJMP push_gset2
xicall:
04FB 920A ST R0,-Y
04FC 95C8 LPM
04FD 920A ST R0,-Y
04FE 9631 ADIW R30,1
04FF 95C8 LPM
0500 2DF0 MOV R31,R0
0501 91E9 LD R30,Y+
0502 9009 LD R0,Y+
0503 9409 IJMP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -