We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi my friends!
I've used RL-ARM mass storage code from sample codes of KEIL 4.03 on AT91SAM7S256. when I attach it to PC , the system recognizes it as a flash disk, correctly;
now I want to change it to apear as a CD-ROM in windows.
I want to know any changes in code.
can anyone help me?
thanks for your help!
> first question is that in mscuser.c , we have SCSI_READ10 in definition of function MSC_BulkIn() , we must change it to 12 or not?
READ10 or READ12? USB MSC compliance (*1) defines READ12 is required, and READ10 is optional for CD/DVD. But Major OS (Windows/Linux/MacOSX) issues READ10 first. When READ10 fails, READ12 is applied. Therefore, you may support both of them; READ12 for compliance, READ10 for performance.
The difference of READ10 and READ12 lies in the size and location of TRANSFER LENGTH parameter. READ10: two bytes (byte 7, 8 - starting from 0) READ12: four bytes (byte 6, 7, 8, 9) In the KEIL MSC implementation, MSC_RWSetup() picks up TRANSFER LENGTH from the CB (Command Block)
To support both of READ10 and READ12, - Don't need to touch to SCSI_READ10 label and MSC_RWSetup() - Add extra SCSI_READ12 label and MSC_RWSetup12(), which are copied from READ10 implementation, and modified.
mscuser.c void MSC_GetCBW (void) { ... ... switch (CBW.CB[0]) { ... ... case SCSI_READ10: // <--- don't need to touch to ... // no change ... case SCSI_READ12: // <--- Add this label and contents if (MSC_RWSetup12()) { // <--- replace to MSC_RWSetup12, the rest is same as READ10 if ((CBW.bmFlags & 0x80) != 0) { AT91C_BASE_PIOA->PIO_CODR = LED1; /* Turn On Read LED */ BulkStage = MSC_BS_DATA_IN; MSC_MemoryRead(); } else { USB_SetStallEP(MSC_EP_OUT); CSW.bStatus = CSW_PHASE_ERROR; MSC_SetCSW(); } } break;
BOOL MSC_RWSetup (void) { ... // no change ... } BOOL MSC_RWSetup12 (void) { ... // <--- copy the contents of MSC_RWSetup() ... /* Number of Blocks to transfer */ // n = (CBW.CB[7] << 8) | // <--- modify these lines // (CBW.CB[8] << 0); n = (CBW.CB[6] << 24) | (CBW.CB[7] << 16) | (CBW.CB[8] << 8) | (CBW.CB[9] << 0); ... }
(*1) USB Mass Storage Class Compliance Test Specification www.singlix.org/.../MSC-compliance-0_9a.pdf 4.2 Command Set Information
Tsuneo