📄 mscuser.lst
字号:
294 1 BulkBuf[ 3] = 0x00;
295 1 BulkBuf[ 4] = 0x00;
296 1 BulkBuf[ 5] = 0x00;
297 1 BulkBuf[ 6] = 0x00;
298 1 BulkBuf[ 7] = 0x0A; /* Additional Length */
299 1 BulkBuf[ 8] = 0x00;
300 1 BulkBuf[ 9] = 0x00;
301 1 BulkBuf[10] = 0x00;
302 1 BulkBuf[11] = 0x00;
303 1 BulkBuf[12] = 0x30; /* ASC */
304 1 BulkBuf[13] = 0x01; /* ASCQ */
305 1 BulkBuf[14] = 0x00;
306 1 BulkBuf[15] = 0x00;
307 1 BulkBuf[16] = 0x00;
308 1 BulkBuf[17] = 0x00;
309 1
310 1 BulkLen = 18;
311 1 DataInTransfer();
312 1 }
313
314
315 /*
316 * MSC SCSI Inquiry Callback
317 * Parameters: None (global variables)
318 * Return Value: None
319 */
320
321 void MSC_Inquiry (void) {
322 1
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 6
323 1 if (!DataInFormat()) return;
324 1
325 1 BulkBuf[ 0] = 0x00; /* Direct Access Device */
326 1 BulkBuf[ 1] = 0x80; /* RMB = 1: Removable Medium */
327 1 BulkBuf[ 2] = 0x00; /* Version: No conformance claim to standard */
328 1 BulkBuf[ 3] = 0x01;
329 1
330 1 BulkBuf[ 4] = 36-4; /* Additional Length */
331 1 BulkBuf[ 5] = 0x80; /* SCCS = 1: Storage Controller Component */
332 1 BulkBuf[ 6] = 0x00;
333 1 BulkBuf[ 7] = 0x00;
334 1
335 1 BulkBuf[ 8] = 'K'; /* Vendor Identification */
336 1 BulkBuf[ 9] = 'e';
337 1 BulkBuf[10] = 'i';
338 1 BulkBuf[11] = 'l';
339 1 BulkBuf[12] = ' ';
340 1 BulkBuf[13] = ' ';
341 1 BulkBuf[14] = ' ';
342 1 BulkBuf[15] = ' ';
343 1
344 1 BulkBuf[16] = 'A'; /* Product Identification */
345 1 BulkBuf[17] = 'T';
346 1 BulkBuf[18] = '9';
347 1 BulkBuf[19] = '1';
348 1 BulkBuf[20] = 'S';
349 1 BulkBuf[21] = 'A';
350 1 BulkBuf[22] = 'M';
351 1 BulkBuf[23] = '7';
352 1 BulkBuf[24] = 'S';
353 1 BulkBuf[25] = ' ';
354 1 BulkBuf[26] = 'D';
355 1 BulkBuf[27] = 'i';
356 1 BulkBuf[28] = 's';
357 1 BulkBuf[29] = 'k';
358 1 BulkBuf[30] = ' ';
359 1 BulkBuf[31] = ' ';
360 1
361 1 BulkBuf[32] = '1'; /* Product Revision Level */
362 1 BulkBuf[33] = '.';
363 1 BulkBuf[34] = '0';
364 1 BulkBuf[35] = ' ';
365 1
366 1 BulkLen = 36;
367 1 DataInTransfer();
368 1 }
369
370
371 /*
372 * MSC SCSI Mode Sense (6-Byte) Callback
373 * Parameters: None (global variables)
374 * Return Value: None
375 */
376
377 void MSC_ModeSense6 (void) {
378 1
379 1 if (!DataInFormat()) return;
380 1
381 1 BulkBuf[ 0] = 0x03;
382 1 BulkBuf[ 1] = 0x00;
383 1 BulkBuf[ 2] = 0x00;
384 1 BulkBuf[ 3] = 0x00;
385 1
386 1 BulkLen = 4;
387 1 DataInTransfer();
388 1 }
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 7
389
390
391 /*
392 * MSC SCSI Mode Sense (10-Byte) Callback
393 * Parameters: None (global variables)
394 * Return Value: None
395 */
396
397 void MSC_ModeSense10 (void) {
398 1
399 1 if (!DataInFormat()) return;
400 1
401 1 BulkBuf[ 0] = 0x00;
402 1 BulkBuf[ 1] = 0x06;
403 1 BulkBuf[ 2] = 0x00;
404 1 BulkBuf[ 3] = 0x00;
405 1 BulkBuf[ 4] = 0x00;
406 1 BulkBuf[ 5] = 0x00;
407 1 BulkBuf[ 6] = 0x00;
408 1 BulkBuf[ 7] = 0x00;
409 1
410 1 BulkLen = 8;
411 1 DataInTransfer();
412 1 }
413
414
415 /*
416 * MSC SCSI Read Capacity Callback
417 * Parameters: None (global variables)
418 * Return Value: None
419 */
420
421 void MSC_ReadCapacity (void) {
422 1
423 1 if (!DataInFormat()) return;
424 1
425 1 /* Last Logical Block */
426 1 BulkBuf[ 0] = ((MSC_BlockCount - 1) >> 24) & 0xFF;
427 1 BulkBuf[ 1] = ((MSC_BlockCount - 1) >> 16) & 0xFF;
428 1 BulkBuf[ 2] = ((MSC_BlockCount - 1) >> 8) & 0xFF;
429 1 BulkBuf[ 3] = ((MSC_BlockCount - 1) >> 0) & 0xFF;
430 1
431 1 /* Block Length */
432 1 BulkBuf[ 4] = (MSC_BlockSize >> 24) & 0xFF;
433 1 BulkBuf[ 5] = (MSC_BlockSize >> 16) & 0xFF;
434 1 BulkBuf[ 6] = (MSC_BlockSize >> 8) & 0xFF;
435 1 BulkBuf[ 7] = (MSC_BlockSize >> 0) & 0xFF;
436 1
437 1 BulkLen = 8;
438 1 DataInTransfer();
439 1 }
440
441
442 /*
443 * MSC SCSI Read Format Capacity Callback
444 * Parameters: None (global variables)
445 * Return Value: None
446 */
447
448 void MSC_ReadFormatCapacity (void) {
449 1
450 1 if (!DataInFormat()) return;
451 1
452 1 BulkBuf[ 0] = 0x00;
453 1 BulkBuf[ 1] = 0x00;
454 1 BulkBuf[ 2] = 0x00;
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 8
455 1 BulkBuf[ 3] = 0x08; /* Capacity List Length */
456 1
457 1 /* Block Count */
458 1 BulkBuf[ 4] = (MSC_BlockCount >> 24) & 0xFF;
459 1 BulkBuf[ 5] = (MSC_BlockCount >> 16) & 0xFF;
460 1 BulkBuf[ 6] = (MSC_BlockCount >> 8) & 0xFF;
461 1 BulkBuf[ 7] = (MSC_BlockCount >> 0) & 0xFF;
462 1
463 1 /* Block Length */
464 1 BulkBuf[ 8] = 0x02; /* Descriptor Code: Formatted Media */
465 1 BulkBuf[ 9] = (MSC_BlockSize >> 16) & 0xFF;
466 1 BulkBuf[10] = (MSC_BlockSize >> 8) & 0xFF;
467 1 BulkBuf[11] = (MSC_BlockSize >> 0) & 0xFF;
468 1
469 1 BulkLen = 12;
470 1 DataInTransfer();
471 1 }
472
473
474 /*
475 * MSC Get Command Block Wrapper Callback
476 * Parameters: None (global variables)
477 * Return Value: None
478 */
479
480 void MSC_GetCBW (void) {
481 1 DWORD n;
482 1
483 1 for (n = 0; n < BulkLen; n++) {
484 2 *((BYTE *)&CBW + n) = BulkBuf[n];
485 2 }
486 1 if ((BulkLen == sizeof(CBW)) && (CBW.dSignature == MSC_CBW_Signature)) {
487 2 /* Valid CBW */
488 2 CSW.dTag = CBW.dTag;
489 2 CSW.dDataResidue = CBW.dDataLength;
490 2 if ((CBW.bLUN != 0) || (CBW.bCBLength < 1) || CBW.bCBLength > 16) {
491 3 fail: CSW.bStatus = CSW_CMD_FAILED;
492 3 MSC_SetCSW();
493 3 } else {
494 3 switch (CBW.CB[0]) {
495 4 case SCSI_TEST_UNIT_READY:
496 4 MSC_TestUnitReady();
497 4 break;
498 4 case SCSI_REQUEST_SENSE:
499 4 MSC_RequestSense();
500 4 break;
501 4 case SCSI_FORMAT_UNIT:
502 4 goto fail;
503 4 case SCSI_INQUIRY:
504 4 MSC_Inquiry();
505 4 break;
506 4 case SCSI_START_STOP_UNIT:
507 4 goto fail;
508 4 case SCSI_MEDIA_REMOVAL:
509 4 goto fail;
510 4 case SCSI_MODE_SELECT6:
511 4 goto fail;
512 4 case SCSI_MODE_SENSE6:
513 4 MSC_ModeSense6();
514 4 break;
515 4 case SCSI_MODE_SELECT10:
516 4 goto fail;
517 4 case SCSI_MODE_SENSE10:
518 4 MSC_ModeSense10();
519 4 break;
520 4 case SCSI_READ_FORMAT_CAPACITIES:
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 9
521 4 MSC_ReadFormatCapacity();
522 4 break;
523 4 case SCSI_READ_CAPACITY:
524 4 MSC_ReadCapacity();
525 4 break;
526 4 case SCSI_READ10:
527 4 if (MSC_RWSetup()) {
528 5 if ((CBW.bmFlags & 0x80) != 0) {
529 6 AT91C_BASE_PIOA->PIO_CODR = LED1; /* Turn On Read LED */
530 6 BulkStage = MSC_BS_DATA_IN;
531 6 MSC_MemoryRead();
532 6 } else {
533 6 USB_SetStallEP(MSC_EP_OUT);
534 6 CSW.bStatus = CSW_PHASE_ERROR;
535 6 MSC_SetCSW();
536 6 }
537 5 }
538 4 break;
539 4 case SCSI_WRITE10:
540 4 if (MSC_RWSetup()) {
541 5 if ((CBW.bmFlags & 0x80) == 0) {
542 6 AT91C_BASE_PIOA->PIO_CODR = LED2; /* Turn On Write LED */
543 6 BulkStage = MSC_BS_DATA_OUT;
544 6 } else {
545 6 USB_SetStallEP(MSC_EP_IN);
546 6 CSW.bStatus = CSW_PHASE_ERROR;
547 6 MSC_SetCSW();
548 6 }
549 5 }
550 4 break;
551 4 case SCSI_VERIFY10:
552 4 if (MSC_RWSetup()) {
553 5 if ((CBW.bmFlags & 0x80) == 0) {
554 6 BulkStage = MSC_BS_DATA_OUT;
555 6 MemOK = TRUE;
556 6 } else {
557 6 USB_SetStallEP(MSC_EP_IN);
558 6 CSW.bStatus = CSW_PHASE_ERROR;
559 6 MSC_SetCSW();
560 6 }
561 5 }
562 4 break;
563 4 default:
564 4 goto fail;
565 4 }
566 3 }
567 2 } else {
568 2 /* Invalid CBW */
569 2 USB_SetStallEP(MSC_EP_IN);
570 2 USB_SetStallEP(MSC_EP_OUT);
571 2 BulkStage = MSC_BS_ERROR;
572 2 }
573 1 }
574
575
576 /*
577 * MSC Set Command Status Wrapper Callback
578 * Parameters: None (global variables)
579 * Return Value: None
580 */
581
582 void MSC_SetCSW (void) {
583 1
584 1 CSW.dSignature = MSC_CSW_Signature;
585 1 USB_WriteEP(MSC_EP_IN, (BYTE *)&CSW, sizeof(CSW));
586 1 BulkStage = MSC_BS_CSW;
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 10
587 1 }
588
589
590 /*
591 * MSC Bulk In Callback
592 * Parameters: None (global variables)
593 * Return Value: None
594 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -