X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/8f6b4ddf764c3a54e42d00a7502c82c5c3e71b1c..bf041e8bbf67222e1c899b8df96f8220d5a0d9d2:/Demos/Host/MassStorageHost/MassStorageHost.c diff --git a/Demos/Host/MassStorageHost/MassStorageHost.c b/Demos/Host/MassStorageHost/MassStorageHost.c index 1c56e6eed..a2e6631e2 100644 --- a/Demos/Host/MassStorageHost/MassStorageHost.c +++ b/Demos/Host/MassStorageHost/MassStorageHost.c @@ -39,8 +39,8 @@ /* Scheduler Task List */ TASK_LIST { - { Task: USB_USBTask , TaskStatus: TASK_STOP }, - { Task: USB_MassStore_Host , TaskStatus: TASK_STOP }, + { .Task = USB_USBTask , .TaskStatus = TASK_STOP }, + { .Task = USB_MassStore_Host , .TaskStatus = TASK_STOP }, }; /* Globals */ @@ -63,7 +63,7 @@ int main(void) /* Hardware Initialization */ SerialStream_Init(9600, false); LEDs_Init(); - HWB_Init(); + Buttons_Init(); /* Indicate USB not ready */ UpdateStatus(Status_USBNotReady); @@ -85,7 +85,7 @@ int main(void) /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and * starts the library USB task to begin the enumeration and USB management process. */ -EVENT_HANDLER(USB_DeviceAttached) +void EVENT_USB_DeviceAttached(void) { puts_P(PSTR("Device Attached.\r\n")); UpdateStatus(Status_USBEnumerating); @@ -97,7 +97,7 @@ EVENT_HANDLER(USB_DeviceAttached) /** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and * stops the library USB task management process. */ -EVENT_HANDLER(USB_DeviceUnattached) +void EVENT_USB_DeviceUnattached(void) { /* Stop USB management and Mass Storage tasks */ Scheduler_SetTaskMode(USB_USBTask, TASK_STOP); @@ -110,7 +110,7 @@ EVENT_HANDLER(USB_DeviceUnattached) /** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully * enumerated by the host and is now ready to be used by the application. */ -EVENT_HANDLER(USB_DeviceEnumerationComplete) +void EVENT_USB_DeviceEnumerationComplete(void) { /* Once device is fully enumerated, start the Mass Storage Host task */ Scheduler_SetTaskMode(USB_MassStore_Host, TASK_RUN); @@ -120,7 +120,7 @@ EVENT_HANDLER(USB_DeviceEnumerationComplete) } /** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */ -EVENT_HANDLER(USB_HostError) +void EVENT_USB_HostError(const uint8_t ErrorCode) { USB_ShutDown(); @@ -134,7 +134,7 @@ EVENT_HANDLER(USB_HostError) /** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while * enumerating an attached USB device. */ -EVENT_HANDLER(USB_DeviceEnumerationFailed) +void EVENT_USB_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode) { puts_P(PSTR(ESC_BG_RED "Dev Enum Error\r\n")); printf_P(PSTR(" -- Error Code %d\r\n"), ErrorCode); @@ -155,13 +155,13 @@ TASK(USB_MassStore_Host) { case HOST_STATE_Addressed: /* Standard request to set the device configuration to configuration 1 */ - USB_HostRequest = (USB_Host_Request_Header_t) + USB_ControlRequest = (USB_Request_Header_t) { - bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), - bRequest: REQ_SetConfiguration, - wValue: 1, - wIndex: 0, - wLength: 0, + .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), + .bRequest = REQ_SetConfiguration, + .wValue = 1, + .wIndex = 0, + .wLength = 0, }; /* Select the control pipe for the request transfer */ @@ -212,46 +212,51 @@ TASK(USB_MassStore_Host) /* Indicate device busy via the status LEDs */ UpdateStatus(Status_Busy); - /* Reset the Mass Storage device interface, ready for use */ - if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful) - { - ShowDiskReadError(PSTR("Mass Storage Reset"), ErrorCode); - break; - } - /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = MassStore_GetMaxLUN(&MassStore_MaxLUNIndex)) != HOST_SENDCONTROL_Successful) { - ShowDiskReadError(PSTR("Get Max LUN"), ErrorCode); + ShowDiskReadError(PSTR("Get Max LUN"), false, ErrorCode); break; } /* Print number of LUNs detected in the attached device */ printf_P(PSTR("Total LUNs: %d.\r\n"), (MassStore_MaxLUNIndex + 1)); - - /* Set the prevent removal flag for the device, allowing it to be accessed */ - if ((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0) + + /* Reset the Mass Storage device interface, ready for use */ + if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful) { - ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), ErrorCode); + ShowDiskReadError(PSTR("Mass Storage Reset"), false, ErrorCode); break; } /* Get sense data from the device - many devices will not accept any other commands until the sense data * is read - both on start-up and after a failed command */ SCSI_Request_Sense_Response_t SenseData; - if ((ErrorCode = MassStore_RequestSense(0, &SenseData)) != 0) + if (((ErrorCode = MassStore_RequestSense(0, &SenseData)) != 0) || (SCSICommandStatus.Status != Command_Pass)) + { + ShowDiskReadError(PSTR("Request Sense"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); + break; + } + + /* Set the prevent removal flag for the device, allowing it to be accessed */ + if (((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0) || (SCSICommandStatus.Status != Command_Pass)) { - ShowDiskReadError(PSTR("Request Sense"), ErrorCode); + ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); break; } - puts_P(PSTR("Waiting until ready")); + puts_P(PSTR("Waiting until ready..")); /* Wait until disk ready */ do { Serial_TxByte('.'); - MassStore_TestUnitReady(0); + + if ((ErrorCode = MassStore_TestUnitReady(0)) != 0) + { + ShowDiskReadError(PSTR("Test Unit Ready"), false, ErrorCode); + break; + } } while ((SCSICommandStatus.Status != Command_Pass) && USB_IsConnected); @@ -265,28 +270,26 @@ TASK(USB_MassStore_Host) SCSI_Capacity_t DiskCapacity; /* Retrieve disk capacity */ - if ((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0) + if (((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0) || (SCSICommandStatus.Status != Command_Pass)) { - ShowDiskReadError(PSTR("Read Capacity"), ErrorCode); + ShowDiskReadError(PSTR("Read Capacity"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); break; } /* Display the disk capacity in blocks * block size bytes */ printf_P(PSTR("%lu blocks of %lu bytes.\r\n"), DiskCapacity.Blocks, DiskCapacity.BlockSize); - + /* Create a new buffer capabable of holding a single block from the device */ uint8_t BlockBuffer[DiskCapacity.BlockSize]; /* Read in the first 512 byte block from the device */ - if ((ErrorCode = MassStore_ReadDeviceBlock(0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0) + if (((ErrorCode = MassStore_ReadDeviceBlock(0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0) || + (SCSICommandStatus.Status != Command_Pass)) { - ShowDiskReadError(PSTR("Read Device Block"), ErrorCode); + ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); break; } - /* Show the number of bytes not transferred in the previous command */ - printf_P(PSTR("Transfer Residue: %lu\r\n"), SCSICommandStatus.DataTransferResidue); - puts_P(PSTR("\r\nContents of first block:\r\n")); /* Print out the first block in both HEX and ASCII, 16 bytes per line */ @@ -316,10 +319,10 @@ TASK(USB_MassStore_Host) puts_P(PSTR("\r\n")); } - puts_P(PSTR("\r\n\r\nPress HWB to read entire ASCII contents of disk...\r\n\r\n")); + puts_P(PSTR("\r\n\r\nPress board button to read entire ASCII contents of disk...\r\n\r\n")); - /* Wait for HWB to be pressed */ - while (!(HWB_GetStatus())) + /* Wait for the board button to be pressed */ + while (!(Buttons_GetStatus() & BUTTONS_BUTTON1)) { /* Abort if device removed */ if (!(USB_IsConnected)) @@ -330,9 +333,10 @@ TASK(USB_MassStore_Host) for (uint32_t CurrBlock = 0; CurrBlock < DiskCapacity.Blocks; CurrBlock++) { /* Read in the next block of data from the device */ - if ((ErrorCode = MassStore_ReadDeviceBlock(0, CurrBlock, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0) + if (((ErrorCode = MassStore_ReadDeviceBlock(0, CurrBlock, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0) || + (SCSICommandStatus.Status != Command_Pass)) { - ShowDiskReadError(PSTR("Read Device Block"), ErrorCode); + ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); break; } @@ -399,14 +403,24 @@ void UpdateStatus(uint8_t CurrentStatus) * continuing. * * \param CommandString ASCII string located in PROGMEM space indicating what operation failed + * \param FailedAtSCSILayer Indicates if the command failed at the (logical) SCSI layer or at the physical USB layer * \param ErrorCode Error code of the function which failed to complete successfully */ -void ShowDiskReadError(char* CommandString, uint8_t ErrorCode) +void ShowDiskReadError(char* CommandString, bool FailedAtSCSILayer, uint8_t ErrorCode) { - /* Display the error code */ - printf_P(PSTR(ESC_BG_RED "Command error (%S).\r\n"), CommandString); - printf_P(PSTR(" -- Error Code: %d"), ErrorCode); - + if (FailedAtSCSILayer) + { + /* Display the error code */ + printf_P(PSTR(ESC_BG_RED "SCSI command error (%S).\r\n"), CommandString); + printf_P(PSTR(" -- Status Code: %d"), ErrorCode); + } + else + { + /* Display the error code */ + printf_P(PSTR(ESC_BG_RED "Command error (%S).\r\n"), CommandString); + printf_P(PSTR(" -- Error Code: %d"), ErrorCode); + } + Pipe_Freeze(); /* Indicate device error via the status LEDs */