📄 usb_task.lst
字号:
203 1 {
204 2 cbw_error = TRUE;
205 2 }
206 1 if (0x43 != Usb_read_byte()) /* check if dCBWSignature is correct */
207 1 {
208 2 cbw_error = TRUE;
209 2 }
210 1
211 1 dCBWTag[0] = Usb_read_byte(); /* Store Tag to be repeated in CSW */
212 1 dCBWTag[1] = Usb_read_byte();
213 1 dCBWTag[2] = Usb_read_byte();
214 1 dCBWTag[3] = Usb_read_byte();
215 1 ((Byte*)&dCBWDataTransferLength)[3] = Usb_read_byte();
216 1 ((Byte*)&dCBWDataTransferLength)[2] = Usb_read_byte();
217 1 ((Byte*)&dCBWDataTransferLength)[1] = Usb_read_byte();
218 1 ((Byte*)&dCBWDataTransferLength)[0] = Usb_read_byte();
219 1 if (Usb_read_byte() != 0x00) /* store bmCBWFlags.bit7 */
220 1 {
221 2 Usb_CBWFlag_in(); //(bmCBWFlag7 = 1)
222 2 if (cbw_error)
223 2 {
224 3 Usb_clear_RXOUT_PP(); //{if(rx_bank){UEPSTAX&=~MSK_RXOUTB1;}else{UEPSTAX&=(~MSK_RXOUTB0);}rx_bank=~r
-x_bank;}
225 3 Usb_select_ep(EP_IN);
226 3 Usb_set_STALLRQ();
227 3 return;
228 3 }
229 2 }
230 1 else
231 1 {
232 2 Usb_CBWFlag_out(); //(bmCBWFlag7 = 0)
233 2 if (cbw_error)
234 2 {
235 3 Usb_clear_RXOUT_PP();
236 3 Usb_set_STALLRQ();
237 3 return;
238 3 }
239 2 }
C51 COMPILER V7.50 USB_TASK 06/03/2006 10:32:53 PAGE 5
240 1 /* only 1 drive supported */
241 1 ACC = Usb_read_byte(); /* dummy LUN read */
242 1 ACC = Usb_read_byte(); /* dummy CBWCBLength read */
243 1 Usb_clear_no_data_phase();
244 1 /* on-board memory */
245 1 Sbc_command_chip();
246 1
247 1
248 1
249 1 }
250
251
252 /*F**************************************************************************
253 * NAME: usb_mass_storage_csw
254 *----------------------------------------------------------------------------
255 * PARAMS:
256 *
257 * return:
258 *----------------------------------------------------------------------------
259 * PURPOSE:
260 * Command Status Wrapper management
261 *----------------------------------------------------------------------------
262 * EXAMPLE:
263 *----------------------------------------------------------------------------
264 * NOTE:
265 *
266 * REQUIREMENTS:
267 *****************************************************************************/
268 void usb_mass_storage_csw (void)
269 {
270 1 Usb_select_ep(EP_IN);
271 1 while (Usb_STALL_requested())
272 1 {
273 2 Usb_select_ep(EP_CONTROL);
274 2 if (Usb_setup_received())
275 2 {
276 3 usb_enumeration_process();
277 3 }
278 2 Usb_select_ep(EP_IN);
279 2 }
280 1
281 1 Usb_select_ep(EP_OUT);
282 1 while (Usb_STALL_requested())
283 1 {
284 2 Usb_select_ep(EP_CONTROL);
285 2 if (Usb_setup_received())
286 2 {
287 3 usb_enumeration_process();
288 3 }
289 2 Usb_select_ep(EP_OUT);
290 2 }
291 1
292 1 Usb_clear_no_data_phase();
293 1 Usb_clear_status_ready();
294 1 Usb_select_ep(EP_IN);
295 1 Usb_write_byte(0x55);
296 1 Usb_write_byte(0x53);
297 1 Usb_write_byte(0x42);
298 1 Usb_write_byte(0x53);
299 1
300 1 Usb_write_byte(dCBWTag[0]);
301 1 Usb_write_byte(dCBWTag[1]);
C51 COMPILER V7.50 USB_TASK 06/03/2006 10:32:53 PAGE 6
302 1 Usb_write_byte(dCBWTag[2]);
303 1 Usb_write_byte(dCBWTag[3]);
304 1 Usb_write_byte(((Byte*)&dCBWDataTransferLength)[3]);
305 1 Usb_write_byte(((Byte*)&dCBWDataTransferLength)[2]);
306 1 Usb_write_byte(((Byte*)&dCBWDataTransferLength)[1]);
307 1 Usb_write_byte(((Byte*)&dCBWDataTransferLength)[0]);
308 1 Usb_write_byte(status);
309 1 Usb_set_TXRDY();
310 1
311 1 Usb_select_ep(EP_IN);
312 1 while (!Usb_tx_complete());
313 1 Usb_clear_TXCMPL();
314 1
315 1 }
316
317
318 /*F**************************************************************************
319 * NAME: usb_mass_storage_reset
320 *----------------------------------------------------------------------------
321 * PARAMS:
322 *
323 * return:
324 *----------------------------------------------------------------------------
325 * PURPOSE:
326 * This function handles the mass storage reset command
327 *----------------------------------------------------------------------------
328 * EXAMPLE:
329 *----------------------------------------------------------------------------
330 * NOTE:
331 *----------------------------------------------------------------------------
332 * REQUIREMENTS:
333 *****************************************************************************/
334 void usb_mass_storage_reset (void)
335 {
336 1 Usb_clear_RXSETUP();
337 1 Usb_set_TXRDY();
338 1 while (!(Usb_tx_complete()));
339 1 Usb_clear_TXCMPL();
340 1 }
341
342
343 /*F**************************************************************************
344 * NAME: usb_mass_storage_get_lun
345 *----------------------------------------------------------------------------
346 * PARAMS:
347 *
348 * return:
349 *----------------------------------------------------------------------------
350 * PURPOSE:
351 * This function returns the mass storage class specific Logical Unit Number.
352 *----------------------------------------------------------------------------
353 * EXAMPLE:
354 *----------------------------------------------------------------------------
355 * NOTE:
356 *----------------------------------------------------------------------------
357 * REQUIREMENTS:
358 *****************************************************************************/
359 void usb_mass_storage_get_lun (void)
360 {
361 1 Usb_clear_RXSETUP();
362 1 Usb_set_DIR();
363 1 Usb_write_byte(MS_MAX_LUN);
C51 COMPILER V7.50 USB_TASK 06/03/2006 10:32:53 PAGE 7
364 1 Usb_set_TXRDY();
365 1 while (!(Usb_tx_complete()));
366 1 Usb_clear_TXCMPL();
367 1 while (!(Usb_rx_complete()));
368 1 Usb_clear_RXOUT();
369 1 Usb_clear_DIR();
370 1 }
371
372
373 /*F**************************************************************************
374 * NAME: usb_it_suspend
375 *----------------------------------------------------------------------------
376 * PARAMS:
377 *
378 * return:
379 *----------------------------------------------------------------------------
380 * PURPOSE:
381 * USB suspend interrupt function -> reset
382 *----------------------------------------------------------------------------
383 * EXAMPLE:
384 *----------------------------------------------------------------------------
385 * NOTE:
386 * IRQ_USB defined in extsnd1.h
387 *----------------------------------------------------------------------------
388 * REQUIREMENTS:
389 *****************************************************************************/
390 Interrupt (usb_it_suspend(void), IRQ_USB)
391 {
392 1 if (Usb_suspend())
393 1 {
394 2 // while (1);
395 2 }
396 1 }
397
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 401 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = 5 ----
BIT SIZE = 5 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -