📄 protodma.lst
字号:
C51 COMPILER V7.04 PROTODMA 12/18/2005 18:05:20 PAGE 1
C51 COMPILER V7.04, COMPILATION OF MODULE PROTODMA
OBJECT MODULE PLACED IN Protodma.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Protodma.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <reg51.h> /* special function register declarations */
5 #include "epphal.h"
6
7 #include "d12ci.h"
8 #include "mainloop.h"
9 #include "usb100.h"
10 #include "chap_9.h"
11
12 extern CONTROL_XFER ControlData;
13 extern IO_REQUEST idata ioRequest;
14 extern EPPFLAGS bEPPflags;
15 extern BOOL bNoRAM;
16 extern unsigned char idata EpBuf[EP2_PACKET_SIZE];
17
18
19 void RxWrite24C02OneByte(unsigned char TempAddress, unsigned char TempData);
20
21 extern unsigned char TempValue;
22 extern unsigned short TempShort;
23 extern unsigned long TempLong;
24
25 extern unsigned long UsedMinuteTime;
26 extern unsigned short WriteUseMinuteTime;
27
28 extern unsigned char OutputPulseValue;
29 extern unsigned short OutputPulseFrequency;
30
31
32 //获取固件版本号
33 void get_firmware_version()
34 {
35 1 unsigned char i;
36 1
37 1 i = 0x30; // firmware version number
38 1 single_transmit((unsigned char *)&i, 1);
39 1 }
40
41 //获取端点2缓存区大小
42 void get_buffer_size()
43 {
44 1 unsigned char i[4];
45 1
46 1 if(bNoRAM == TRUE) {
47 2 i[0] = EP2_PACKET_SIZE;
48 2 i[1] = 0;
49 2 i[2] = 0;
50 2 i[3] = 0;
51 2 } else {
52 2 i[0] = 0;
53 2 i[1] = 1;
54 2 i[2] = 0;
55 2 i[3] = 0;
C51 COMPILER V7.04 PROTODMA 12/18/2005 18:05:20 PAGE 2
56 2 }
57 1 single_transmit((unsigned char *)&i, 4);
58 1 }
59
60 //DMA请求响应子程序
61 void setup_dma_request()
62 {
63 1 memcpy((unsigned char *)&ioRequest + ControlData.DeviceRequest.wValue,
64 1 ControlData.dataBuffer,
65 1 ControlData.DeviceRequest.wLength);
66 1
67 1 ioRequest.uSize = SWAP(ioRequest.uSize);
68 1 ioRequest.uAddressL = SWAP(ioRequest.uAddressL);
69 1
70 1 if(ioRequest.uSize > DMA_BUFFER_SIZE) { // Unaccepted request
71 2 stall_ep0();//DMA设置出错
72 2 }
73 1 else if(bNoRAM == TRUE && ioRequest.uSize > EP2_PACKET_SIZE) {
74 2 stall_ep0();//DMA缓冲区出错
75 2 }
76 1 else {
77 2 if(bEPPflags.bits.dma_state == DMA_IDLE) {
78 3 DISABLE;
79 3 bEPPflags.bits.setup_dma ++;
80 3 ENABLE;
81 3 }
82 2 else {
83 3 DISABLE;
84 3 bEPPflags.bits.dma_state = DMA_PENDING;
85 3 ENABLE;
86 3 }
87 2
88 2 } // else if accepted request
89 1 }
90
91 //厂商请求处理
92 void read_write_register(void)
93 {
94 1 unsigned char i,len,epstatus;
95 1
96 1 if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
97 2
98 2 if(bEPPflags.bits.verbose)
99 2 printf("Read Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
100 2 ControlData.DeviceRequest.wValue,
101 2 ControlData.DeviceRequest.wLength,
102 2 ControlData.DeviceRequest.wIndex);
103 2
104 2 if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
105 2 ControlData.DeviceRequest.wValue == 0 &&
106 2 ControlData.DeviceRequest.wLength == 1)
107 2 get_firmware_version();//获取固件版本号
108 2 else
109 2 if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE &&
110 2 ControlData.DeviceRequest.wValue == 0 &&
111 2 ControlData.DeviceRequest.wLength == 4)
112 2 get_buffer_size();//获取缓冲区大小
113 2 else
114 2 stall_ep0();
115 2
116 2 } // if read register
117 1 else{
C51 COMPILER V7.04 PROTODMA 12/18/2005 18:05:20 PAGE 3
118 2 if(bEPPflags.bits.verbose) {
119 3
120 3 printf("Write Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
121 3 ControlData.DeviceRequest.wValue,
122 3 ControlData.DeviceRequest.wLength,
123 3 ControlData.DeviceRequest.wIndex);
124 3
125 3 printf("Data: ");
126 3 for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
127 3 printf("0x%bx, ", *((ControlData.dataBuffer)+i));
128 3 printf("\n");
129 3 }
130 2
131 2 if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
132 2 ControlData.DeviceRequest.wValue == 0 &&
133 2 ControlData.DeviceRequest.wLength == 6)
134 2 {
135 3 if(ControlData.dataBuffer[5]==0x81)
136 3 {
137 4 // D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);//发送数据
138 4
139 4 if ((EpBuf[0] != 0x55) || (EpBuf[1] != 0xAA) || (EpBuf[2] != 0x55)){
140 5 D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);//发送数据
141 5 }
142 4 else{
143 5 switch(EpBuf[3]){
144 6 case 0x01: // Clear Time Count
145 6 TempLong = 0;
146 6 TempLong = ((unsigned long)EpBuf[4]) * 256 * 256 * 256;
147 6 TempLong = TempLong + ((unsigned long)EpBuf[5]) * 256 * 256;
148 6 TempLong = TempLong + ((unsigned long)EpBuf[6]) * 256;
149 6 TempLong = TempLong + ((unsigned long)EpBuf[7]);
150 6
151 6 UsedMinuteTime = TempLong;
152 6
153 6 TempValue = (unsigned char)((UsedMinuteTime / 256 / 256 / 256) & 0xFF);
154 6 RxWrite24C02OneByte(0,TempValue);
155 6 TempValue = (unsigned char)((UsedMinuteTime / 256 / 256) & 0xFF);
156 6 RxWrite24C02OneByte(1,TempValue);
157 6 TempValue = (unsigned char)((UsedMinuteTime / 256) & 0xFF);
158 6 RxWrite24C02OneByte(2,TempValue);
159 6 TempValue = (unsigned char)(UsedMinuteTime & 0xFF);
160 6 RxWrite24C02OneByte(3,TempValue);
161 6 break;
162 6
163 6 case 0x02: // Set write 24C02 frequency
164 6 TempShort = ((unsigned long)EpBuf[4]) * 256;
165 6 TempShort = TempShort + ((unsigned long)EpBuf[5]);
166 6 if (TempShort != 0){
167 7 WriteUseMinuteTime = TempShort;
168 7 TempValue = (unsigned char)((TempShort / 256) & 0xFF);
169 7 RxWrite24C02OneByte(4,TempValue);
170 7 TempValue = (unsigned char)(TempShort & 0xFF);
171 7 RxWrite24C02OneByte(5,TempValue);
172 7 }
173 6 break;
174 6
175 6 case 0x03: // Set output pulse frequency
176 6 TempShort = ((unsigned long)EpBuf[4]) * 256;
177 6 TempShort = TempShort + ((unsigned long)EpBuf[5]);
178 6 if (TempShort != 0){
179 7 OutputPulseFrequency = TempShort;
C51 COMPILER V7.04 PROTODMA 12/18/2005 18:05:20 PAGE 4
180 7 TempValue = (unsigned char)((TempShort / 256) & 0xFF);
181 7 RxWrite24C02OneByte(6,TempValue);
182 7 TempValue = (unsigned char)(TempShort & 0xFF);
183 7 RxWrite24C02OneByte(7,TempValue);
184 7 }
185 6 break;
186 6
187 6 case 0x04: // Set output pulse value
188 6 OutputPulseValue = EpBuf[4];
189 6 RxWrite24C02OneByte(8,OutputPulseValue);
190 6 break;
191 6
192 6 case 0x05: // Read used time value
193 6 TempValue = (unsigned char)((UsedMinuteTime / 256 / 256 / 256) & 0xFF);
194 6 EpBuf[4] = TempValue;
195 6 TempValue = (unsigned char)((UsedMinuteTime / 256 / 256) & 0xFF);
196 6 EpBuf[5] = TempValue;
197 6 TempValue = (unsigned char)((UsedMinuteTime / 256) & 0xFF);
198 6 EpBuf[6] = TempValue;
199 6 TempValue = (unsigned char)(UsedMinuteTime & 0xFF);
200 6 EpBuf[7] = TempValue;
201 6 break;
202 6 }
203 5 D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);//发送数据
204 5 }
205 4 }
206 3 if(ControlData.dataBuffer[5]==0x80)
207 3 {
208 4 epstatus=D12_ReadEndpointStatus(4);
209 4 epstatus &= 0x60;
210 4 if (epstatus == 0x60)
211 4 len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
212 4 }
213 3 single_transmit(0, 0);
214 3 //setup_dma_request();//DMA设置处理,因为未使用DMA所以屏蔽掉
215 3 }
216 2 else
217 2 stall_ep0();
218 2 } // if write register
219 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1407 ----
CONSTANT SIZE = 140 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -