📄 protodma.lst
字号:
1 .file "protodma.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
106 .global VendorDeviceRequest
107 .data
110 VendorDeviceRequest:
111 0000 0000 .word pm(reserved)
112 0002 0000 .word pm(reserved)
113 0004 0000 .word pm(reserved)
114 0006 0000 .word pm(reserved)
115 0008 0000 .word pm(reserved)
116 000a 0000 .word pm(reserved)
117 000c 0000 .word pm(reserved)
118 000e 0000 .word pm(reserved)
119 0010 0000 .word pm(reserved)
120 0012 0000 .word pm(reserved)
121 0014 0000 .word pm(reserved)
122 0016 0000 .word pm(reserved)
123 0018 0000 .word pm(read_write_register)
124 001a 0000 .word pm(reserved)
125 001c 0000 .word pm(reserved)
126 001e 0000 .word pm(reserved)
127 .text
129 .global get_firmware_version
131 get_firmware_version:
1:protodma.c **** //********************************
2:protodma.c **** //厂商请求处理protodma.c
3:protodma.c **** //编译环境WinAVRGCC
4:protodma.c **** //2007-01-11
5:protodma.c **** //Hjxiang
6:protodma.c **** //********************************
7:protodma.c **** //标准C头文件
8:protodma.c **** #include <stdint.h>
9:protodma.c **** #include <stdlib.h>
10:protodma.c **** //AVR头文件
11:protodma.c **** #include <avr/io.h>
12:protodma.c **** #include <avr/signal.h>
13:protodma.c **** #include <avr/delay.h>
14:protodma.c **** //自定义头文件
15:protodma.c **** #include "usb.h"
16:protodma.c **** #include "protodma.h"
17:protodma.c ****
18:protodma.c **** //获取固件版本号
19:protodma.c **** void get_firmware_version(void)
20:protodma.c **** {
133 .LM1:
134 /* prologue: frame size=1 */
135 0000 CF93 push r28
136 0002 DF93 push r29
137 0004 CDB7 in r28,__SP_L__
138 0006 DEB7 in r29,__SP_H__
139 0008 2197 sbiw r28,1
140 000a 0FB6 in __tmp_reg__,__SREG__
141 000c F894 cli
142 000e DEBF out __SP_H__,r29
143 0010 0FBE out __SREG__,__tmp_reg__
144 0012 CDBF out __SP_L__,r28
145 /* prologue end (size=10) */
21:protodma.c **** unsigned char i;
22:protodma.c **** i=0x30; //固件版本号
147 .LM2:
148 0014 80E3 ldi r24,lo8(48)
149 0016 8983 std Y+1,r24
23:protodma.c **** D12_WriteEndpoint(1,1,(unsigned char *) &i); //发送数据
151 .LM3:
152 0018 AE01 movw r20,r28
153 001a 4F5F subi r20,lo8(-(1))
154 001c 5F4F sbci r21,hi8(-(1))
155 001e 61E0 ldi r22,lo8(1)
156 0020 70E0 ldi r23,hi8(1)
157 0022 CB01 movw r24,r22
158 0024 0E94 0000 call D12_WriteEndpoint
159 /* epilogue: frame size=1 */
160 0028 2196 adiw r28,1
161 002a 0FB6 in __tmp_reg__,__SREG__
162 002c F894 cli
163 002e DEBF out __SP_H__,r29
164 0030 0FBE out __SREG__,__tmp_reg__
165 0032 CDBF out __SP_L__,r28
166 0034 DF91 pop r29
167 0036 CF91 pop r28
168 0038 0895 ret
169 /* epilogue end (size=9) */
170 /* function get_firmware_version size 29 (10) */
175 .Lscope0:
177 .global ger_buffer_size
179 ger_buffer_size:
24:protodma.c **** }
25:protodma.c **** //获取端点2缓存区大小
26:protodma.c **** void ger_buffer_size(void)
27:protodma.c **** {
181 .LM4:
182 /* prologue: frame size=4 */
183 003a CF93 push r28
184 003c DF93 push r29
185 003e CDB7 in r28,__SP_L__
186 0040 DEB7 in r29,__SP_H__
187 0042 2497 sbiw r28,4
188 0044 0FB6 in __tmp_reg__,__SREG__
189 0046 F894 cli
190 0048 DEBF out __SP_H__,r29
191 004a 0FBE out __SREG__,__tmp_reg__
192 004c CDBF out __SP_L__,r28
193 /* prologue end (size=10) */
28:protodma.c **** unsigned char i[4];
29:protodma.c **** i[0]=EP2_PACKET_SIZE; //断电2缓冲区大小
195 .LM5:
196 004e 80E4 ldi r24,lo8(64)
197 0050 8983 std Y+1,r24
30:protodma.c **** i[1]=0;
199 .LM6:
200 0052 FE01 movw r30,r28
201 0054 3196 adiw r30,1
202 0056 1182 std Z+1,__zero_reg__
31:protodma.c **** i[2]=0;
204 .LM7:
205 0058 1B82 std Y+3,__zero_reg__
32:protodma.c **** i[3]=0;
207 .LM8:
208 005a 1C82 std Y+4,__zero_reg__
33:protodma.c **** D12_WriteEndpoint(1,4,i); //发送数据
210 .LM9:
211 005c AF01 movw r20,r30
212 005e 64E0 ldi r22,lo8(4)
213 0060 70E0 ldi r23,hi8(4)
214 0062 81E0 ldi r24,lo8(1)
215 0064 90E0 ldi r25,hi8(1)
216 0066 0E94 0000 call D12_WriteEndpoint
217 /* epilogue: frame size=4 */
218 006a 2496 adiw r28,4
219 006c 0FB6 in __tmp_reg__,__SREG__
220 006e F894 cli
221 0070 DEBF out __SP_H__,r29
222 0072 0FBE out __SREG__,__tmp_reg__
223 0074 CDBF out __SP_L__,r28
224 0076 DF91 pop r29
225 0078 CF91 pop r28
226 007a 0895 ret
227 /* epilogue end (size=9) */
228 /* function ger_buffer_size size 33 (14) */
233 .Lscope1:
235 .global trans_data
237 trans_data:
34:protodma.c **** }
35:protodma.c **** //数据传输操作
36:protodma.c **** void trans_data(void)
37:protodma.c **** {
239 .LM10:
240 /* prologue: frame size=0 */
241 /* prologue end (size=0) */
38:protodma.c **** unsigned char len,epstatus;
39:protodma.c **** if(ControlData.dataBuffer[5] ==0x81) //从单片机发送数据到主机
243 .LM11:
244 007c 8091 0000 lds r24,ControlData+19
245 0080 8138 cpi r24,lo8(-127)
246 0082 61F4 brne .L4
247 .LBB2:
40:protodma.c **** {
41:protodma.c **** D12_WriteEndpoint(5,ControlData.dataBuffer[3],EpBuf); //发送数据
249 .LM12:
250 0084 8091 0000 lds r24,ControlData+17
251 0088 9927 clr r25
252 008a 4091 0000 lds r20,EpBuf
253 008e 5091 0000 lds r21,(EpBuf)+1
254 0092 BC01 movw r22,r24
255 0094 85E0 ldi r24,lo8(5)
256 0096 90E0 ldi r25,hi8(5)
257 0098 0E94 0000 call D12_WriteEndpoint
258 .L4:
259 .LBE2:
42:protodma.c **** }
43:protodma.c **** if(ControlData.dataBuffer[5] ==0x80) //从主机发送数据到单片机
261 .LM13:
262 009c 8091 0000 lds r24,ControlData+19
263 00a0 8038 cpi r24,lo8(-128)
264 00a2 89F4 brne .L5
265 .LBB3:
44:protodma.c **** {
45:protodma.c **** epstatus=D12_ReadEndpointStatus(4); //读取端点状态
267 .LM14:
268 00a4 84E0 ldi r24,lo8(4)
269 00a6 90E0 ldi r25,hi8(4)
270 00a8 0E94 0000 call D12_ReadEndpointStatus
46:protodma.c **** epstatus &= 0x60;
272 .LM15:
273 00ac 8076 andi r24,lo8(96)
47:protodma.c **** if(epstatus == 0x60)
275 .LM16:
276 00ae 8036 cpi r24,lo8(96)
277 00b0 51F4 brne .L5
48:protodma.c **** D12_ReadEndpointStatus(4,64,EpBuf); //读取双缓冲区数据
279 .LM17:
280 00b2 4091 0000 lds r20,EpBuf
281 00b6 5091 0000 lds r21,(EpBuf)+1
282 00ba 60E4 ldi r22,lo8(64)
283 00bc 70E0 ldi r23,hi8(64)
284 00be 84E0 ldi r24,lo8(4)
285 00c0 90E0 ldi r25,hi8(4)
286 00c2 0E94 0000 call D12_ReadEndpointStatus
287 .L5:
288 .LBE3:
49:protodma.c **** }
50:protodma.c **** single_transmit(0,0); //发送应答
290 .LM18:
291 00c6 60E0 ldi r22,lo8(0)
292 00c8 70E0 ldi r23,hi8(0)
293 00ca CB01 movw r24,r22
294 00cc 0E94 0000 call single_transmit
295 /* epilogue: frame size=0 */
296 00d0 0895 ret
297 /* epilogue end (size=1) */
298 /* function trans_data size 43 (42) */
303 .Lscope2:
305 .global read_write_register
307 read_write_register:
51:protodma.c **** }
52:protodma.c **** //厂商请求处理
53:protodma.c **** void read_write_register(void)
54:protodma.c **** {
309 .LM19:
310 /* prologue: frame size=0 */
311 /* prologue end (size=0) */
55:protodma.c **** unsigned char i,len,epstatus;
56:protodma.c **** if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
313 .LM20:
314 00d2 8091 0000 lds r24,ControlData
315 00d6 2091 0000 lds r18,ControlData+4
316 00da 3091 0000 lds r19,(ControlData+4)+1
317 00de 87FF sbrs r24,7
318 00e0 25C0 rjmp .L8
57:protodma.c **** {
58:protodma.c **** if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION && ControlData.DeviceRequest.wValue =
320 .LM21:
321 00e2 84E0 ldi r24,hi8(1138)
322 00e4 2237 cpi r18,lo8(1138)
323 00e6 3807 cpc r19,r24
324 00e8 79F4 brne .L9
325 00ea 8091 0000 lds r24,ControlData+2
326 00ee 9091 0000 lds r25,(ControlData+2)+1
327 00f2 892B or r24,r25
328 00f4 49F4 brne .L9
329 00f6 8091 0000 lds r24,ControlData+6
330 00fa 9091 0000 lds r25,(ControlData+6)+1
331 00fe 0197 sbiw r24,1
332 0100 19F4 brne .L9
59:protodma.c **** get_firmware_version(); //获取固件版本号
334 .LM22:
335 0102 0E94 0000 call get_firmware_version
336 0106 0895 ret
337 .L9:
60:protodma.c **** else
61:protodma.c **** if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE && ControlData.DeviceRequest.wValue ==0 &
339 .LM23:
340 0108 2457 subi r18,lo8(1140)
341 010a 3440 sbci r19,hi8(1140)
342 010c 09F5 brne .L14
343 010e 8091 0000 lds r24,ControlData+2
344 0112 9091 0000 lds r25,(ControlData+2)+1
345 0116 892B or r24,r25
346 0118 D9F4 brne .L14
347 011a 8091 0000 lds r24,ControlData+6
348 011e 9091 0000 lds r25,(ControlData+6)+1
349 0122 0497 sbiw r24,4
350 0124 A9F4 brne .L14
62:protodma.c **** ger_buffer_size();
352 .LM24:
353 0126 0E94 0000 call ger_buffer_size
354 012a 0895 ret
355 .L8:
63:protodma.c **** else
64:protodma.c **** stall_ep0(); //获取缓冲区大小
65:protodma.c **** } //if read register
66:protodma.c **** else
67:protodma.c **** {
68:protodma.c **** if(ControlData.DeviceRequest.wIndex == TRANS_REQUEST && ControlData.DeviceRequest.wValue ==0 && C
357 .LM25:
358 012c 2157 subi r18,lo8(1137)
359 012e 3440 sbci r19,hi8(1137)
360 0130 79F4 brne .L14
361 0132 8091 0000 lds r24,ControlData+2
362 0136 9091 0000 lds r25,(ControlData+2)+1
363 013a 892B or r24,r25
364 013c 49F4 brne .L14
365 013e 8091 0000 lds r24,ControlData+6
366 0142 9091 0000 lds r25,(ControlData+6)+1
367 0146 0697 sbiw r24,6
368 0148 19F4 brne .L14
69:protodma.c **** trans_data(); //数据传输处理
370 .LM26:
371 014a 0E94 0000 call trans_data
372 014e 0895 ret
373 .L14:
374 .LBB4:
70:protodma.c **** else
71:protodma.c **** stall_ep0(); // 无效命令,返回Stall
376 .LM27:
377 0150 0E94 0000 call stall_ep0
378 0154 0895 ret
379 .LBE4:
380 /* epilogue: frame size=0 */
381 /* epilogue: noreturn */
382 /* epilogue end (size=0) */
383 /* function read_write_register size 71 (71) */
385 .Lscope3:
386 .comm EpBuf,2,1
387 .comm GenEpBuf,64,1
388 .comm bEPPflags,2,1
389 .comm ControlData,22,1
395 .text
397 Letext:
398 /* File "protodma.c": code 176 = 0x00b0 ( 137), prologues 20, epilogues 19 */
DEFINED SYMBOLS
*ABS*:00000000 protodma.c
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:3 *ABS*:0000003f __SREG__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:4 *ABS*:0000003e __SP_H__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:5 *ABS*:0000003d __SP_L__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:6 *ABS*:00000000 __tmp_reg__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:7 *ABS*:00000001 __zero_reg__
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:110 .data:00000000 VendorDeviceRequest
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:307 .text:000000d2 read_write_register
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:131 .text:00000000 get_firmware_version
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:179 .text:0000003a ger_buffer_size
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:237 .text:0000007c trans_data
*COM*:00000016 ControlData
*COM*:00000002 EpBuf
*COM*:00000040 GenEpBuf
*COM*:00000002 bEPPflags
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/cc2Xaaaa.s:397 .text:00000156 Letext
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
reserved
D12_WriteEndpoint
D12_ReadEndpointStatus
single_transmit
stall_ep0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -