📄 avr_usb.lst
字号:
015C E082 LDI R24,2
015D 93800063 STS 0x63,R24
(0087) Pixel_Count=0x00;
015F 2422 CLR R2
0160 2433 CLR R3
0161 92300065 STS 0x65,R3
0163 92200064 STS 0x64,R2
(0088) for(i=0;i<60;i++)
0165 2700 CLR R16
0166 C004 RJMP 0x016B
(0089) {
(0090) D12_DATA=0x00;
0167 2422 CLR R2
0168 92207F00 STS 0x7F00,R2
016A 9503 INC R16
016B 330C CPI R16,0x3C
016C F3D0 BCS 0x0167
(0091) }
(0092) break;
016D C01E RJMP 0x018C
016E 9503 INC R16
016F 3400 CPI R16,0x40
0170 F2D0 BCS 0x014B
(0093) }
(0094) }
(0095) }
0171 C01A RJMP 0x018C
(0096) else if (Fifo2_Flag==0x02)
0172 91800063 LDS R24,0x63
0174 3082 CPI R24,2
0175 F4B1 BNE 0x018C
(0097) {
(0098) for(i=0;i<64;i++)
0176 2700 CLR R16
0177 C004 RJMP 0x017C
(0099) {
(0100) D12_DATA=0x00;
0178 2422 CLR R2
0179 92207F00 STS 0x7F00,R2
017B 9503 INC R16
017C 3400 CPI R16,0x40
017D F3D0 BCS 0x0178
(0101) }
(0102) }
(0103) }
017E C00D RJMP 0x018C
(0104) else//
(0105) {
(0106) Fifo1_Flag=0x00;
017F 2422 CLR R2
0180 92200062 STS 0x62,R2
(0107) Fifo2_Flag=0x00;
0182 92200063 STS 0x63,R2
(0108) for(i=0;i<64;i++)
0184 2700 CLR R16
0185 C004 RJMP 0x018A
(0109) {
(0110) D12_DATA=0x00;
0186 2422 CLR R2
0187 92207F00 STS 0x7F00,R2
0189 9503 INC R16
018A 3400 CPI R16,0x40
018B F3D0 BCS 0x0186
(0111) }
(0112) }
(0113)
(0114) D12_COMMAND = 0xfa; // 设置 IN 缓冲区有效(满标志)
018C EF8A LDI R24,0xFA
018D 93807F01 STS 0x7F01,R24
(0115)
(0116)
(0117) }
018F 9508 RET
(0118)
(0119) /** /
(0120) 读取FLASH ID
(0121) 返回0xec 0x75
(0122) /**/
(0123) void flashID(void)
(0124) {
(0125) char i;
(0126) fCOMMAND = 0x90;
_flashID:
i --> R16
0190 E980 LDI R24,0x90
0191 9380A000 STS 0xA000,R24
(0127) fADD = 0x00;
0193 2422 CLR R2
0194 92209000 STS 0x9000,R2
(0128) i = fDATA;
0196 91008000 LDS R16,0x8000
(0129) XmtBuff.msg[0] = i;
0198 930000AA STS 0xAA,R16
(0130) i = fDATA;
019A 91008000 LDS R16,0x8000
(0131) XmtBuff.msg[1] = i;
019C 930000AB STS 0xAB,R16
(0132) XmtBuff.msgL = 2;
019E E082 LDI R24,2
019F 938000BA STS 0xBA,R24
(0133) csram;
01A1 9360FC01 STS 0xFC01,R22
(0134) }
01A3 9508 RET
_Setup_control:
p --> R10
j --> R22
i --> R20
01A4 D353 RCALL push_gset3
FILE: G:\Backup\6月1日flag置(认为接近最终)\ilx511_usb\D12_setup.c
(0001) #include "io8515v.h"
(0002) #include "d12head.h"
(0003) #include "d12setup.h"
(0004)
(0005) TRANSMIT_STRUCT XmtBuff;
(0006) ///int bconfig;
(0007)
(0008) void Setup_control(void)
(0009) {
(0010) char i,j,*p;
(0011) D12_COMMAND = 0x00;// 选择端点0(指针指向0位置)
01A5 2422 CLR R2
01A6 92207F01 STS 0x7F01,R2
(0012) cwait;
01A8 0000 NOP
(0013) D12_COMMAND = 0xf0;// 读标准控制码
01A9 EF80 LDI R24,0xF0
01AA 93807F01 STS 0x7F01,R24
(0014) cwait1;
01AC 0000 NOP
01AD 0000 NOP
(0015) i = D12_DATA;
01AE 91407F00 LDS R20,0x7F00
(0016) cwait1;
01B0 0000 NOP
01B1 0000 NOP
(0017) i = D12_DATA;//长度
01B2 91407F00 LDS R20,0x7F00
(0018) cwait1;
01B4 0000 NOP
01B5 0000 NOP
(0019) j = D12_DATA;
01B6 91607F00 LDS R22,0x7F00
(0020) csram;
01B8 9360FC01 STS 0xFC01,R22
(0021) p = XmtBuff.b;
01BA E9EA LDI R30,0x9A
01BB E0F0 LDI R31,0
(0022) *(p++) = j;
01BC 9361 ST R22,Z+
01BD 015F MOVW R10,R30
(0023) for(i=0;i<7;i++)
01BE 2744 CLR R20
01BF C006 RJMP 0x01C6
(0024) {
(0025) j = D12_DATA;
01C0 91607F00 LDS R22,0x7F00
(0026) csram;
01C2 9360FC01 STS 0xFC01,R22
(0027) asm("st Z+,%j");
01C4 9361 ST R22,Z+
01C5 9543 INC R20
01C6 3047 CPI R20,7
01C7 F3C0 BCS 0x01C0
(0028) }
(0029) D12_COMMAND = 0x01;// 选择端点 1(指针指向0位置)
01C8 E081 LDI R24,1
01C9 93807F01 STS 0x7F01,R24
(0030) cwait;
01CB 0000 NOP
(0031) D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
01CC EF81 LDI R24,0xF1
01CD 93807F01 STS 0x7F01,R24
(0032) csram;
01CF 9360FC01 STS 0xFC01,R22
(0033) i = XmtBuff.b[1];
01D1 9140009B LDS R20,_XmtBuff+1
(0034) if(XmtBuff.b[0] & 0x40)//厂商请求跳转表
01D3 9020009A LDS R2,_XmtBuff
01D5 FE26 SBRS R2,6
01D6 C001 RJMP 0x01D8
(0035) {
(0036) //if (i <= 0x0f)
(0037) {
(0038) //(*VendorDeviceRequest[i])();
(0039) }
(0040) }
01D7 C00E RJMP 0x01E6
(0041) else
(0042) {
(0043) if (i <= 0x0B)//标准请求跳转表
01D8 E08B LDI R24,0xB
01D9 1784 CP R24,R20
01DA F058 BCS 0x01E6
(0044) {
(0045) (*StandardDeviceRequest[i])();
01DB E082 LDI R24,2
01DC 9F84 MUL R24,R20
01DD 01F0 MOVW R30,R0
01DE E686 LDI R24,0x66
01DF E090 LDI R25,0
01E0 0FE8 ADD R30,R24
01E1 1FF9 ADC R31,R25
01E2 81A0 LDD R26,Z+0
01E3 81B1 LDD R27,Z+1
01E4 01FD MOVW R30,R26
01E5 D315 RCALL xicall
(0046) }
(0047) }
(0048) D12_COMMAND = 0x00;// 选择端点0(指针指向0位置)
01E6 2422 CLR R2
01E7 92207F01 STS 0x7F01,R2
(0049) cwait;
01E9 0000 NOP
(0050) D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
01EA EF81 LDI R24,0xF1
01EB 93807F01 STS 0x7F01,R24
(0051) cwait;
01ED 0000 NOP
(0052) D12_COMMAND = 0xf2;// 清 OUT 缓冲区
01EE EF82 LDI R24,0xF2
01EF 93807F01 STS 0x7F01,R24
(0053) }
01F1 D2EA RCALL pop_gset3
01F2 9508 RET
(0054)
(0055) void void_function(void)
(0056) {
(0057) D12_COMMAND = 0x40;// 0 端点停止(用于发送Stall包)
_void_function:
01F3 E480 LDI R24,0x40
01F4 93807F01 STS 0x7F01,R24
(0058) cwait;
01F6 0000 NOP
(0059) D12_DATA = 0x01;
01F7 E081 LDI R24,1
01F8 93807F00 STS 0x7F00,R24
(0060) cwait;
01FA 0000 NOP
(0061) D12_COMMAND = 0x41;// 1 端点停止(用于发送Stall包)
01FB E481 LDI R24,0x41
01FC 93807F01 STS 0x7F01,R24
(0062) cwait;
01FE 0000 NOP
(0063) D12_DATA = 0x01;
01FF E081 LDI R24,1
0200 93807F00 STS 0x7F00,R24
(0064) cwait;
0202 0000 NOP
(0065) D12_COMMAND = 0xf1;// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令
0203 EF81 LDI R24,0xF1
0204 93807F01 STS 0x7F01,R24
(0066) csram;
0206 9360FC01 STS 0xFC01,R22
(0067) }
0208 9508 RET
_get_status:
0209 D2D4 RCALL push_gset1
(0068)
(0069) void get_status(void)
(0070) {
(0071) XmtBuff.b[1] = 0x00;
020A 2422 CLR R2
020B 9220009B STS _XmtBuff+1,R2
(0072) switch (XmtBuff.b[0])
020D 9140009A LDS R20,_XmtBuff
020F 2755 CLR R21
0210 3840 CPI R20,0x80
0211 E0E0 LDI R30,0
0212 075E CPC R21,R30
0213 F049 BEQ 0x021D
0214 3841 CPI R20,0x81
0215 E0E0 LDI R30,0
0216 075E CPC R21,R30
0217 F049 BEQ 0x0221
0218 3842 CPI R20,0x82
0219 E0E0 LDI R30,0
021A 075E CPC R21,R30
021B F049 BEQ 0x0225
021C C00B RJMP 0x0228
(0073) {
(0074) case 0x80://返回设备状态
(0075) //发送两个字节数据:第一字节D1为1支持远程唤醒,D0为0是总线供电,其它位为0;第二字节为0。
(0076) XmtBuff.b[0] = 0x03;
021D E083 LDI R24,3
021E 9380009A STS _XmtBuff,R24
(0077) break;
0220 C007 RJMP 0x0228
(0078) case 0x81://返回接口状态
(0079) //发送两个字节数据:第一字节为0;第二字节为0。
(0080) //XmtBuff.b[5] 为接口号
(0081) XmtBuff.b[0] = 0x00;
0221 2422 CLR R2
0222 9220009A STS _XmtBuff,R2
(0082) break;
0224 C003 RJMP 0x0228
(0083) case 0x82://返回端点状态
(0084) //发送两个字节数据:第一字节D0为1端点处于暂停,否则D0为0,其它位为0;第二字节为0。
(0085) //XmtBuff.b[5] D7为方向,D3~0为端点号
(0086) XmtBuff.b[0] = 0x00;
0225 2422 CLR R2
0226 9220009A STS _XmtBuff,R2
(0087) break;
(0088) }
(0089) XmtBuff.p_p=0;
0228 2422 CLR R2
0229 922000C1 STS 0xC1,R2
(0090) XmtBuff.wrLength = 2;
022B E082 LDI R24,2
022C 938000BC STS 0xBC,R24
(0091) XmtBuff.p = XmtBuff.b;
022E E98A LDI R24,0x9A
022F E090 LDI R25,0
0230 939000C0 STS 0xC0,R25
0232 938000BF STS 0xBF,R24
(0092) USB_submit();
0234 D123 RCALL _USB_submit
(0093) }
0235 D2AB RCALL pop_gset1
0236 9508 RET
_clear_feature:
j --> R20
0237 D2A6 RCALL push_gset1
(0094)
(0095) void clear_feature(void)
(0096) {
(0097) char j;
(0098) switch (XmtBuff.b[0])
0238 9140009A LDS R20,_XmtBuff
023A 2755 CLR R21
023B 3040 CPI R20,0
023C 0745 CPC R20,R21
023D F129 BEQ 0x0263
023E 3041 CPI R20,1
023F E0E0 LDI R30,0
0240 075E CPC R21,R30
0241 F109 BEQ 0x0263
0242 3042 CPI R20,2
0243 E0E0 LDI R30,0
0244 075E CPC R21,R30
0245 F009 BEQ 0x0247
0246 C01C RJMP 0x0263
(0099) {
(0100) case 0x00://清设备唤醒功能
(0101) break;
(0102) case 0x01://清接口状态
(0103) break;
(0104) case 0x02://启用端点
(0105) //XmtBuff.b[5] D7为方向,D3~0为端点号
(0106) j = XmtBuff.b[5];
0247 9140009F LDS R20,0x9F
(0107) if(j<0x80)
0249 3840 CPI R20,0x80
024A F460 BCC 0x0257
(0108) {
(0109) j = 0x40+j*2;
024B E082 LDI R24,2
024C 9F84 MUL R24,R20
024D 2D40 MOV R20,R0
024E 5C40 SUBI R20,0xC0
(0110) D12_COMMAND = j;// 启用OUT端点
024F 93407F01 STS 0x7F01,R20
(0111) D12_DATA = 0x00;
0251 2422 CLR R2
0252 92207F00 STS 0x7F00,R2
(0112) csram;
0254 9360FC01 STS 0xFC01,R22
(0113) }
0256 C00C RJMP 0x0263
(0114) else
(0115) {
(0116) j = (j & 0x0f);
0257 704F ANDI R20,0xF
(0117) D12_COMMAND = 0x41+j*2;// 启用IN端点
0258 E082 LDI R24,2
0259 9F84 MUL R24,R20
025A 2D80 MOV R24,R0
025B 5B8F SUBI R24,0xBF
025C 93807F01 STS 0x7F01,R24
(0118) D12_DATA = 0x00;
025E 2422 CLR R2
025F 92207F00 STS 0x7F00,R2
(0119) csram;
0261 9360FC01 STS 0xFC01,R22
(0120) }
(0121) break;
(0122) }
(0123) XmtBuff.wrLength = 0;
0263 2422 CLR R2
0264 922000BC STS 0xBC,R2
(0124) USB_submit();
0266 D0F1 RCALL _USB_submit
(0125) }
0267 D279 RCALL pop_gset1
0268 9508 RET
_set_feature:
j --> R20
0269 D274 RCALL push_gset1
(0126)
(0127) void set_feature(void)
(0128) {
(0129) char j;
(0130) switch (XmtBuff.b[0])
026A 9140009A LDS R20,_XmtBuff
026C 2755 CLR R21
026D 3040 CPI R20,0
026E 0745 CPC R20,R21
026F F139 BEQ 0x0297
0270 3041 CPI R20,1
0271 E0E0 LDI R30,0
0272 075E CPC R21,R30
0273 F119 BEQ 0x0297
0274 3042 CPI R20,2
0275 E0E0 LDI R30,0
0276 075E CPC R21,R30
0277 F009 BEQ 0x0279
0278 C01E RJMP 0x0297
(0131) {
(0132) case 0x00://设置设备唤醒功能
(0133) break;
(0134) case 0x01://设置接口状态
(0135) break;
(0136) case 0x02://停止端点
(0137) //XmtBuff.b[5] D7为方向,D3~0为端点号
(0138) j = XmtBuff.b[5];
0279 9140009F LDS R20,0x9F
(0139) if(j<0x80)
027B 3840 CPI R20,0x80
027C F468 BCC 0x028A
(0140) {
(0141) j = 0x40+j * 2;
027D E082 LDI R24,2
027E 9F84 MUL R24,R20
027F 2D40 MOV R20,R0
0280 5C40 SUBI R20,0xC0
(0142) D12_COMMAND = j;// 停止OUT端点
0281 93407F01 STS 0x7F01,R20
(0143) cwait;
0283 0000 NOP
(0144) D12_DATA = 0x01;
0284 E081 LDI R24,1
0285 93807F00 STS 0x7F00,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -