void USB_EndPoint2 (U32 event) { switch (event) { case USB_EVT_OUT: MSC_BulkOut(); break; case USB_EVT_IN: MSC_BulkIn(); break; } }
void USB_EndPoint2 (uint32_t event) { #if USB_DMA USB_DMA_DESCRIPTOR DD; #endif switch (event) { case USB_EVT_OUT: MSC_BulkOut(); break; case USB_EVT_IN: MSC_BulkIn(); break; #if USB_DMA case USB_EVT_OUT_DMA_EOT: MSC_BulkOut(); // USB_DMA_Enable(MSC_EP_OUT); /* 11.08.09 USB_DMA_Enable is not necessary at this point */ break; case USB_EVT_OUT_DMA_NDR: // new DMA Descriptor request DD.BufAdr = (uint32_t)BulkBuf; // DMA Buffer Address DD.BufLen = MSC_MAX_PACKET; // DMA Buffer Length in bytes DD.MaxSize = MSC_MAX_PACKET; // Maximum packet size DD.Cfg.Val = 0; // Initial DMA Configuration DD.Cfg.Type.IsoEP = 0; // Non-Iso Endpoint USB_DMA_Setup (MSC_EP_OUT, &DD); // Setup DMA USB_DMA_Enable(MSC_EP_OUT); // Enable DMA break; case USB_EVT_IN_DMA_NDR: // new DMA Descriptor request MSC_BulkIn(); break; case USB_EVT_IN_DMA_EOT: // End of Transfer request // MSC_BulkIn(); /* 11.08.09 MSC_BulkIn must only be called upon a DMA_NDR interrupt */ break; #endif } }
void USB_EndPoint1 (uint32_t event) { switch (event) { case USB_EVT_OUT_NAK: MSC_BulkOutNak(); break; case USB_EVT_OUT: MSC_BulkOut(); break; case USB_EVT_IN: MSC_BulkIn(); break; } }
void MSC_ProcessCmd(void) { uint32_t i; if (g_u8BulkState == BULK_NORMAL) { g_u8BulkState = BULK_OUT; MSC_ReceiveCBW(g_u32MassBase); } if (g_u8BulkState == BULK_CBW) { /* Check Signature of CBW */ if ((*(uint32_t *)(g_u32MassBase) != CBW_SIGNATURE)) { g_u8BulkState = BULK_NORMAL; return; } /* Get the CBW */ for (i = 0; i < 31; i++) *((uint8_t *) (&g_sCBW.dCBWSignature) + i) = *(uint8_t *)(g_u32MassBase + i); /* Prepare to echo the tag from CBW to CSW */ g_sCSW.dCSWTag = g_sCBW.dCBWTag; /* Parse Op-Code of CBW */ switch (g_sCBW.u8OPCode) { case UFI_READ_10: { /* Get LBA address */ g_u32LbaAddress = get_be32(&g_sCBW.au8Data[0]) * USBD_SECTOR_SIZE; //MSC_ReadMedia(g_u32LbaAddress, g_sCBW.dCBWDataTransferLength, (uint8_t *)g_u32StorageBase); MSC_BulkIn(g_u32StorageBase+g_u32LbaAddress, g_sCBW.dCBWDataTransferLength); MSC_AckCmd(0); break; } case UFI_WRITE_10: { g_u32LbaAddress = get_be32(&g_sCBW.au8Data[0]) * USBD_SECTOR_SIZE; MSC_BulkOut(g_u32StorageBase+g_u32LbaAddress, g_sCBW.dCBWDataTransferLength); MSC_AckCmd(0); break; } case UFI_PREVENT_ALLOW_MEDIUM_REMOVAL: { if (g_sCBW.au8Data[2] & 0x01) { g_au8SenseKey[0] = 0x05; //INVALID COMMAND g_au8SenseKey[1] = 0x24; g_au8SenseKey[2] = 0; g_u8Prevent = 1; } else g_u8Prevent = 0; MSC_AckCmd(0); break; } case UFI_VERIFY_10: case UFI_START_STOP: case UFI_TEST_UNIT_READY: { MSC_AckCmd(0); break; } case UFI_REQUEST_SENSE: { MSC_RequestSense(); MSC_AckCmd(0); break; } case UFI_READ_FORMAT_CAPACITY: { MSC_ReadFormatCapacity(); MSC_AckCmd(0); break; } case UFI_READ_CAPACITY: { MSC_ReadCapacity(); MSC_AckCmd(0); break; } case UFI_MODE_SELECT_10: { MSC_BulkOut(g_u32StorageBase, g_sCBW.dCBWDataTransferLength); MSC_AckCmd(0); break; } case UFI_MODE_SENSE_10: { MSC_ModeSense10(); MSC_AckCmd(0); break; } case UFI_MODE_SENSE_6: { MSC_ModeSense6(); MSC_AckCmd(0); break; } case UFI_INQUIRY: { /* Bulk IN buffer */ USBD_MemCopy((uint8_t *)(g_u32MassBase), (uint8_t *)g_au8InquiryID, 36); MSC_BulkIn(g_u32MassBase, g_sCBW.dCBWDataTransferLength); MSC_AckCmd(0); break; } default: { /* Unsupported command */ g_au8SenseKey[0] = 0x05; g_au8SenseKey[1] = 0x20; g_au8SenseKey[2] = 0x00; /* If CBW request for data phase, just return zero packet to end data phase */ if (g_sCBW.dCBWDataTransferLength > 0) MSC_AckCmd(g_sCBW.dCBWDataTransferLength); else MSC_AckCmd(0); } } } }