📄 descriptor.lst
字号:
149 // The rest is identical to Configuration Desc.
150 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32 };
151
152 code BYTE OtherSpeedConfigDescLen = sizeof(OtherSpeedConfigDesc);
153 --------------------------------------------------------------------*/
154
155 //--------------------------------------------------------------------
156 // Prepare Descriptor
157 //--------------------------------------------------------------------
158 void CtrlDescPrepare()
159 {
160 1 xdata PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
161 1 xdata BYTE DescType, DescIndex;
162 1
163 1 DescType = ((TDataCast *)&(pReq->wValue))->ucByte[1];
164 1 DescIndex = ((TDataCast *)&(pReq->wValue))->ucByte[0];
165 1
166 1 switch (DescType)
167 1 {
168 2 case DEVICE_DESC_TYPE:
169 2
170 2 CtrlXferLen = DeviceDescLen;
171 2 memcpy((BYTE xdata *)UsbBuf,
172 2 (BYTE code *)DeviceDesc,
173 2 CtrlXferLen);
174 2 break;
175 2
176 2 case STRING_DESC_TYPE:
177 2
178 2 if((DescIndex >= 0)&&(DescIndex <= 3))
C51 COMPILER V7.02b DESCRIPTOR 02/01/2007 10:35:43 PAGE 4
179 2 {
180 3 CtrlXferLen = StrCtrlXferLen[DescIndex];
181 3 memcpy((BYTE xdata *)UsbBuf,
182 3 (BYTE code *)StrDescPtr[DescIndex],
183 3 CtrlXferLen);
184 3 }
185 2 else
186 2 CtrlXferLen = 0;
187 2 break;
188 2
189 2 case DEVICE_QUALIFIER_DESC_TYPE:
190 2
191 2 CtrlXferLen = DeviceQualifierDescLen;
192 2 memcpy((BYTE xdata *)UsbBuf,
193 2 (BYTE code *)DeviceQualifierDesc,
194 2 CtrlXferLen);
195 2 break;
196 2
197 2 case CONFIGURATION_DESC_TYPE:
198 2
199 2 CtrlXferLen = ConfigDescLen;
200 2 memcpy((BYTE xdata *)UsbBuf,
201 2 (BYTE code *)ConfigDesc,
202 2 CtrlXferLen);
203 2 if(CSRRead(USB_BASE + USB_SPEED) & SPEED) // High Speed
204 2 {
205 3 UsbBuf[22] = (BYTE)(USB20_MAX_PKT_SIZE);
206 3 UsbBuf[23] = (BYTE)(USB20_MAX_PKT_SIZE >> 8);
207 3 UsbBuf[29] = (BYTE)(USB20_MAX_PKT_SIZE);
208 3 UsbBuf[30] = (BYTE)(USB20_MAX_PKT_SIZE >> 8);
209 3 }
210 2 break;
211 2
212 2 case OTHER_SPEED_CONFIG_DESC_TYPE:
213 2
214 2 CtrlXferLen = ConfigDescLen;
215 2 memcpy((BYTE xdata *)UsbBuf,
216 2 (BYTE code *)ConfigDesc,
217 2 CtrlXferLen);
218 2 UsbBuf[1] = OTHER_SPEED_CONFIG_DESC_TYPE;
219 2 if(CSRRead(USB_BASE + USB_SPEED) & SPEED) // High Speed
220 2 {
221 3 UsbBuf[22] = (BYTE)(USB20_MAX_PKT_SIZE);
222 3 UsbBuf[23] = (BYTE)(USB20_MAX_PKT_SIZE >> 8);
223 3 UsbBuf[29] = (BYTE)(USB20_MAX_PKT_SIZE);
224 3 UsbBuf[30] = (BYTE)(USB20_MAX_PKT_SIZE >> 8);
225 3 }
226 2 break;
227 2
228 2
229 2 default:
230 2 // Error Condition, Stall transactions.
231 2 pSotaUsbRequest->InProgress = false;
232 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
233 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
234 2 }
235 1
236 1 if(pReq->wLength < CtrlXferLen)
237 1 CtrlXferLen = pReq->wLength;
238 1 }
239
240 //----------------------------------------------------------------------------
C51 COMPILER V7.02b DESCRIPTOR 02/01/2007 10:35:43 PAGE 5
241 // Get Descriptor Request
242 //----------------------------------------------------------------------------
243 void CtrlReqGetDescriptor()
244 {
245 1 BYTE Token = pSotaUsbRequest->Token;
246 1
247 1 switch(Token)
248 1 {
249 2 case SETUP_TOKEN:
250 2 Fifo2ClkCpu(); // need ?
251 2 CtrlDescPrepare();
252 2 Fifo2ClkUsb(); // need ?
253 2 pSotaUsbRequest->LoadInDataOk = true;
254 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
255 2 break;
256 2
257 2 case IN_TOKEN:
258 2 {
259 3 BYTE i;
260 3
261 3 if (pSotaUsbRequest->LoadInDataOk)
262 3 {
263 4 for(i = 0; i < CtrlXferLen; i++)
264 4 CSRWrite(USB_BASE + EP0_TXDATA, UsbBuf[i]);
265 4 CSRWrite(USB_BASE + EP0_TXCNT, CtrlXferLen);
266 4 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
267 4 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
268 4 pSotaUsbRequest->FinishedDataLen += CtrlXferLen;
269 4 pSotaUsbRequest->LoadInDataOk = false;
270 4 }
271 3 break;
272 3 }
273 2
274 2 case IN_OK_TOKEN:
275 2 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);
276 2 if (pSotaUsbRequest->FinishedDataLen <= (BYTE)CtrlXferLen) // Keep sending descriptor data.
277 2 pSotaUsbRequest->LoadInDataOk = true;
278 2 else
279 2 CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
280 2 break;
281 2
282 2 case OUT_TOKEN:
283 2 default:
284 2 // Ctrl Read End
285 2 pSotaUsbRequest->InProgress = false;
286 2 break;
287 2 }
288 1 }
289
290
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 518 ----
CONSTANT SIZE = 135 ----
XDATA SIZE = 2 5
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
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 + -