📄 avr_usb.lst
字号:
(0145) csram;
0287 9360FC01 STS 0xFC01,R22
(0146) }
0289 C00D RJMP 0x0297
(0147) else
(0148) {
(0149) j = j & 0x0f;
028A 704F ANDI R20,0xF
(0150) j = 0x41+j*2;
028B E082 LDI R24,2
028C 9F84 MUL R24,R20
028D 2D40 MOV R20,R0
028E 5B4F SUBI R20,0xBF
(0151) D12_COMMAND = j;// 停止IN端点
028F 93407F01 STS 0x7F01,R20
(0152) cwait;
0291 0000 NOP
(0153) D12_DATA = 0x01;
0292 E081 LDI R24,1
0293 93807F00 STS 0x7F00,R24
(0154) csram;
0295 9360FC01 STS 0xFC01,R22
(0155) }
(0156) break;
(0157) }
(0158) XmtBuff.wrLength = 0;
0297 2422 CLR R2
0298 922000BC STS 0xBC,R2
(0159) USB_submit();
029A D0BD RCALL _USB_submit
(0160) }
029B D245 RCALL pop_gset1
029C 9508 RET
_set_address:
j --> R20
029D D240 RCALL push_gset1
(0161) void set_address(void)
(0162) {
(0163) char j;
(0164) j = 0x80 | XmtBuff.b[2];
029E 9140009C LDS R20,_XmtBuff+2
02A0 6840 ORI R20,0x80
(0165) D12_COMMAND = 0xd0;//设置新地址使能
02A1 ED80 LDI R24,0xD0
02A2 93807F01 STS 0x7F01,R24
(0166) cwait;
02A4 0000 NOP
(0167) D12_DATA = j;
02A5 93407F00 STS 0x7F00,R20
(0168) csram;
02A7 9360FC01 STS 0xFC01,R22
(0169) XmtBuff.wrLength = 0;
02A9 2422 CLR R2
02AA 922000BC STS 0xBC,R2
(0170) USB_submit();
02AC D0AB RCALL _USB_submit
(0171) }
02AD D233 RCALL pop_gset1
02AE 9508 RET
_get_descriptor:
i --> R20
02AF D22E RCALL push_gset1
(0172)
(0173) void get_descriptor(void)
(0174) {
(0175) unsigned int i;
(0176) XmtBuff.p_p=1;
02B0 E081 LDI R24,1
02B1 938000C1 STS 0xC1,R24
(0177) switch (XmtBuff.b[3])
02B3 9140009D LDS R20,_XmtBuff+3
02B5 2755 CLR R21
02B6 3041 CPI R20,1
02B7 E0E0 LDI R30,0
02B8 075E CPC R21,R30
02B9 F049 BEQ 0x02C3
02BA 3042 CPI R20,2
02BB E0E0 LDI R30,0
02BC 075E CPC R21,R30
02BD F079 BEQ 0x02CD
02BE 3043 CPI R20,3
02BF E0E0 LDI R30,0
02C0 075E CPC R21,R30
02C1 F121 BEQ 0x02E6
02C2 C034 RJMP 0x02F7
(0178) {
(0179) case 0x01: //USB_DEVICE
(0180) XmtBuff.pp = device_descriptor;
02C3 E28E LDI R24,0x2E
02C4 E090 LDI R25,0
02C5 939000BE STS 0xBE,R25
02C7 938000BD STS 0xBD,R24
(0181) XmtBuff.wrLength = sizeof(device_descriptor);
02C9 E182 LDI R24,0x12
02CA 938000BC STS 0xBC,R24
(0182) break;
02CC C02C RJMP 0x02F9
(0183) case 0x02:// USB_CONFIGURATION
(0184) i = XmtBuff.b[7];
02CD 914000A1 LDS R20,0xA1
02CF 2755 CLR R21
(0185) i = ((i<<8) | XmtBuff.b[6]);
02D0 902000A0 LDS R2,0xA0
02D2 2F54 MOV R21,R20
02D3 2D42 MOV R20,R2
(0186) XmtBuff.pp = Configuration_Descriptor;
02D4 E480 LDI R24,0x40
02D5 E090 LDI R25,0
02D6 939000BE STS 0xBE,R25
02D8 938000BD STS 0xBD,R24
(0187) XmtBuff.wrLength = *(XmtBuff.pp+2);
02DA 01FC MOVW R30,R24
02DB 9632 ADIW R30,2
02DC 91E4 LPM R30,0(Z)
02DD 93E000BC STS 0xBC,R30
(0188) if(i<16)
02DF 3140 CPI R20,0x10
02E0 E0E0 LDI R30,0
02E1 075E CPC R21,R30
02E2 F4B0 BCC 0x02F9
(0189) XmtBuff.wrLength = XmtBuff.b[6];
02E3 922000BC STS 0xBC,R2
(0190) break;
02E5 C013 RJMP 0x02F9
(0191) case 0x03: //USB_STRING
(0192) switch(XmtBuff.b[2])
02E6 9140009C LDS R20,_XmtBuff+2
02E8 2755 CLR R21
02E9 3040 CPI R20,0
02EA 0745 CPC R20,R21
02EB F069 BEQ 0x02F9
02EC 3041 CPI R20,1
02ED E0E0 LDI R30,0
02EE 075E CPC R21,R30
02EF F049 BEQ 0x02F9
02F0 3042 CPI R20,2
02F1 E0E0 LDI R30,0
02F2 075E CPC R21,R30
02F3 F029 BEQ 0x02F9
02F4 C000 RJMP 0x02F5
(0193) {
(0194) case 0x00 :
(0195) //?XmtBuff.wrLength = sizeof(USBStringLanguageDescription);
(0196) //?XmtBuff.p = USBStringLanguageDescription;
(0197) break;
(0198) case 0x01 :
(0199) //?XmtBuff.wrLength = sizeof(USBStringDescription1);
(0200) //?XmtBuff.p = USBStringDescription1;
(0201) break;
(0202) case 0x02 :
(0203) //?XmtBuff.wrLength = sizeof(USBStringDescription2);
(0204) //?XmtBuff.p = USBStringDescription2;
(0205) break;
(0206) default :
(0207) void_function();
02F5 DEFD RCALL _void_function
(0208) return;
02F6 C003 RJMP 0x02FA
(0209) }
(0210) break;
(0211) default :
(0212) void_function();
02F7 DEFB RCALL _void_function
(0213) return;
02F8 C001 RJMP 0x02FA
(0214) }
(0215) USB_submit();
02F9 D05E RCALL _USB_submit
(0216) }
02FA D1E6 RCALL pop_gset1
02FB 9508 RET
(0217)
(0218) void get_configuration(void)
(0219) {
(0220) XmtBuff.b[0] = 1;//返回是否被配置(非 0 为配置)
_get_configuration:
02FC E081 LDI R24,1
02FD 9380009A STS _XmtBuff,R24
(0221) XmtBuff.wrLength = 16;
02FF E180 LDI R24,0x10
0300 938000BC STS 0xBC,R24
(0222) XmtBuff.p_p=0;
0302 2422 CLR R2
0303 922000C1 STS 0xC1,R2
(0223) XmtBuff.p = XmtBuff.b;
0305 E98A LDI R24,0x9A
0306 E090 LDI R25,0
0307 939000C0 STS 0xC0,R25
0309 938000BF STS 0xBF,R24
(0224) USB_submit();
(0225) ///D12_COMMAND = 0x05;
(0226) ///cwait;
(0227) ///D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
(0228) }
030B C04C RJMP _USB_submit
_set_configuration:
j --> R20
u --> R20
030C D1D1 RCALL push_gset1
(0229)
(0230) void set_configuration(void)
(0231) {
(0232) char j;
(0233) int u;
(0234) if (XmtBuff.b[0] == 0x00)
030D 9020009A LDS R2,_XmtBuff
030F 2022 TST R2
0310 F589 BNE 0x0342
(0235) {
(0236) XmtBuff.wrLength = 0;
0311 2422 CLR R2
0312 922000BC STS 0xBC,R2
(0237) USB_submit();
0314 D043 RCALL _USB_submit
(0238) j = XmtBuff.b[2];
0315 9140009C LDS R20,_XmtBuff+2
(0239) D12_COMMAND = 0xd8;
0317 ED88 LDI R24,0xD8
0318 93807F01 STS 0x7F01,R24
(0240) if(j == 0x00)
031A 2344 TST R20
031B F421 BNE 0x0320
(0241) {
(0242) D12_DATA = 0x00; // 停止普通/同步端点
031C 2422 CLR R2
031D 92207F00 STS 0x7F00,R2
(0243) }else if(j == 0x01)
031F C01F RJMP 0x033F
0320 3041 CPI R20,1
0321 F4E9 BNE 0x033F
(0244) {
(0245) D12_DATA = 0x01; // 使能普通/同步端点
0322 E081 LDI R24,1
0323 93807F00 STS 0x7F00,R24
(0246) cwait;
0325 0000 NOP
(0247) /// bconfig=1;
(0248)
(0249) D12_COMMAND=0x05;
0326 E085 LDI R24,5
0327 93807F01 STS 0x7F01,R24
(0250) D12_COMMAND=0xf0;
0329 EF80 LDI R24,0xF0
032A 93807F01 STS 0x7F01,R24
(0251) D12_DATA=0;
032C 2422 CLR R2
032D 92207F00 STS 0x7F00,R2
(0252) D12_DATA=64;
032F E480 LDI R24,0x40
0330 93807F00 STS 0x7F00,R24
(0253) for( u=0;u<64;u++)
0332 2744 CLR R20
0333 2755 CLR R21
(0254) D12_DATA=u;
0334 93407F00 STS 0x7F00,R20
0336 5F4F SUBI R20,0xFF
0337 4F5F SBCI R21,0xFF
0338 3440 CPI R20,0x40
0339 E0E0 LDI R30,0
033A 075E CPC R21,R30
033B F3C4 BLT 0x0334
(0255) D12_COMMAND=0xfa;
033C EF8A LDI R24,0xFA
033D 93807F01 STS 0x7F01,R24
(0256) //D12_COMMAND = 0x05;
(0257) //cwait;
(0258) //D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
(0259)
(0260) }
(0261) csram;
033F 9360FC01 STS 0xFC01,R22
(0262) }
0341 C001 RJMP 0x0343
(0263) else
(0264) void_function();
0342 DEB0 RCALL _void_function
(0265) }
0343 D19D RCALL pop_gset1
0344 9508 RET
(0266)
(0267) void get_interface(void)
(0268) {
(0269) XmtBuff.b[0] = 0;
_get_interface:
0345 2422 CLR R2
0346 9220009A STS _XmtBuff,R2
(0270) XmtBuff.wrLength = 1;
0348 E081 LDI R24,1
0349 938000BC STS 0xBC,R24
(0271) XmtBuff.p_p=0;
034B 922000C1 STS 0xC1,R2
(0272) XmtBuff.p = XmtBuff.b;
034D E98A LDI R24,0x9A
034E E090 LDI R25,0
034F 939000C0 STS 0xC0,R25
0351 938000BF STS 0xBF,R24
(0273) USB_submit();
(0274) }
0353 C004 RJMP _USB_submit
(0275)
(0276) void set_interface(void)
(0277) {
(0278) XmtBuff.wrLength = 0;
_set_interface:
0354 2422 CLR R2
0355 922000BC STS 0xBC,R2
(0279) USB_submit();
(0280) }
0357 C000 RJMP _USB_submit
0358 D185 RCALL push_gset1
(0281)
(0282) void USB_submit(void)
(0283) {
(0284) char i,j,k;
(0285) if(16>XmtBuff.wrLength)
0359 902000BC LDS R2,0xBC
035B E180 LDI R24,0x10
035C 1628 CP R2,R24
035D F410 BCC 0x0360
(0286) {
(0287) j = XmtBuff.wrLength;
035E 2D02 MOV R16,R2
(0288) }else
035F C001 RJMP 0x0361
(0289) {
(0290) j = 16;
0360 E100 LDI R16,0x10
(0291) }
(0292) D12_COMMAND = 1;// 选择 IN 端点(指针指向0位置)
0361 E081 LDI R24,1
0362 93807F01 STS 0x7F01,R24
(0293) cwait;
0364 0000 NOP
(0294) D12_COMMAND = 0xf0;// 写缓冲区
0365 EF80 LDI R24,0xF0
0366 93807F01 STS 0x7F01,R24
(0295) cwait;
0368 0000 NOP
(0296) D12_DATA = 0x00;
0369 2422 CLR R2
036A 92207F00 STS 0x7F00,R2
(0297) cwait;
036C 0000 NOP
(0298) D12_DATA = j;
036D 93007F00 STS 0x7F00,R16
(0299) csram;
036F 9360FC01 STS 0xFC01,R22
(0300) if(XmtBuff.p_p)
0371 902000C1 LDS R2,0xC1
0373 2022 TST R2
0374 F0F9 BEQ 0x0394
(0301) {
(0302) for(i=0;i<j ;i++)
0375 2744 CLR R20
0376 C00E RJMP 0x0385
(0303) {
(0304) k = *(XmtBuff.pp+i);
0377 902000BD LDS R2,0xBD
0379 903000BE LDS R3,0xBE
037B 2FE4 MOV R30,R20
037C 27FF CLR R31
037D 0DE2 ADD R30,R2
037E 1DF3 ADC R31,R3
037F 9124 LPM R18,0(Z)
(0305) D12_DATA = k;
0380 93207F00 STS 0x7F00,R18
(0306) csram;
0382 9360FC01 STS 0xFC01,R22
0384 9543 INC R20
0385 1740 CP R20,R16
0386 F380 BCS 0x0377
(0307) }
(0308) XmtBuff.pp += j;
0387 902000BD LDS R2,0xBD
0389 903000BE LDS R3,0xBE
038B 2E40 MOV R4,R16
038C 2455 CLR R5
038D 0C42 ADD R4,R2
038E 1C53 ADC R5,R3
038F 925000BE STS 0xBE,R5
0391 924000BD STS 0xBD,R4
(0309) }else
0393 C012 RJMP 0x03A6
(0310) {
(0311) for(i=0;i<j;i++)
0394 2744 CLR R20
0395 C00E RJMP 0x03A4
(0312) {
(0313) k = *(XmtBuff.p++);
0396 91E000BF LDS R30,0xBF
0398 91F000C0 LDS R31,0xC0
039A 9121 LD R18,Z+
039B 93F000C0 STS 0xC0,R31
039D 93E000BF STS 0xBF,R30
(0314) D12_DATA = k;
039F 93207F00 STS 0x7F00,R18
(0315) csram;
03A1 9360FC01 STS 0xFC01,R22
03A3 9543 INC R20
03A4 1740 CP R20,R16
03A5 F380 BCS 0x0396
(0316) }
(0317) }
(0318) XmtBuff.wrLength -= j;
03A6 902000BC LDS R2,0xBC
03A8 1A20 SUB R2,R16
03A9 922000BC STS 0xBC,R2
(0319) D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
03AB EF8A LDI R24,0xFA
03AC 93807F01 STS 0x7F01,R24
(0320) csram;
03AE 9360FC01 STS 0xFC01,R22
(0321) }
03B0 D130 RCALL pop_gset1
03B1 9508 RET
_D12_int:
k --> Y+1
c --> Y+1
j --> R22
i --> R20
03B2 D142 RCALL push_gset2
FILE: G:\Backup\6月1日flag置(认为接近最终)\ilx511_usb\D12-AVR.c
(0001) #include "io8515v.h"
(0002) #include "d12head.h"
(0003)
(0004) unsigned int Rshu[3];
(0005) int q=0;
(0006) //#define D12_suspend (PINB & 0x01)
(0007)
(0008) void D12_int(void)
(0009) {
(0010) unsigned char i=0,j,c,*k;//三个变量,一个指针
03B3 2744 CLR R20
(0011)
(0012) SREG = 0x00;//全局中断使能
03B4 2422 CLR R2
03B5 BE2F OUT 0x3F,R2
(0013)
(0014) D12_COMMAND = 0xf4; // 读中断寄存器
03B6 EF84 LDI R24,0xF4
03B7 93807F01 STS 0x7F01,R24
(0015) cwait1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -