@ -54,7 +54,8 @@ int main(void)
for ( ; ; )
for ( ; ; )
{
{
MassStorage_Task ( ) ;
MassStorageHost_Task ( ) ;
USB_USBTask ( ) ;
USB_USBTask ( ) ;
}
}
}
}
@ -102,6 +103,35 @@ void EVENT_USB_Host_DeviceUnattached(void)
*/
*/
void EVENT_USB_Host_DeviceEnumerationComplete ( void )
void EVENT_USB_Host_DeviceEnumerationComplete ( void )
{
{
puts_P ( PSTR ( " Getting Config Data. \r \n " ) ) ;
uint8_t ErrorCode ;
/* Get and process the configuration descriptor data */
if ( ( ErrorCode = ProcessConfigurationDescriptor ( ) ) ! = SuccessfulConfigRead )
{
if ( ErrorCode = = ControlError )
puts_P ( PSTR ( ESC_FG_RED " Control Error (Get Configuration). \r \n " ) ) ;
else
puts_P ( PSTR ( ESC_FG_RED " Invalid Device. \r \n " ) ) ;
printf_P ( PSTR ( " -- Error Code: %d \r \n " ESC_FG_WHITE ) , ErrorCode ) ;
LEDs_SetAllLEDs ( LEDMASK_USB_ERROR ) ;
return ;
}
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
if ( ( ErrorCode = USB_Host_SetDeviceConfiguration ( 1 ) ) ! = HOST_SENDCONTROL_Successful )
{
printf_P ( PSTR ( ESC_FG_RED " Control Error (Set Configuration). \r \n "
" -- Error Code: %d \r \n " ESC_FG_WHITE ) , ErrorCode ) ;
LEDs_SetAllLEDs ( LEDMASK_USB_ERROR ) ;
return ;
}
puts_P ( PSTR ( " Mass Storage Disk Enumerated. \r \n " ) ) ;
LEDs_SetAllLEDs ( LEDMASK_USB_READY ) ;
LEDs_SetAllLEDs ( LEDMASK_USB_READY ) ;
}
}
@ -134,62 +164,22 @@ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
/** Task to set the configuration of the attached device after it has been enumerated, and to read in blocks from
/** Task to set the configuration of the attached device after it has been enumerated, and to read in blocks from
* the device and print them to the serial port .
* the device and print them to the serial port .
*/
*/
void MassStorage_Task ( void )
void MassStorageHost_Task ( void )
{
uint8_t ErrorCode ;
switch ( USB_HostState )
{
case HOST_STATE_Addressed :
puts_P ( PSTR ( " Getting Config Data. \r \n " ) ) ;
/* Get and process the configuration descriptor data */
if ( ( ErrorCode = ProcessConfigurationDescriptor ( ) ) ! = SuccessfulConfigRead )
{
if ( ErrorCode = = ControlError )
puts_P ( PSTR ( ESC_FG_RED " Control Error (Get Configuration). \r \n " ) ) ;
else
puts_P ( PSTR ( ESC_FG_RED " Invalid Device. \r \n " ) ) ;
printf_P ( PSTR ( " -- Error Code: %d \r \n " ESC_FG_WHITE ) , ErrorCode ) ;
/* Indicate error via status LEDs */
LEDs_SetAllLEDs ( LEDMASK_USB_ERROR ) ;
/* Wait until USB device disconnected */
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
break ;
}
/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
if ( ( ErrorCode = USB_Host_SetDeviceConfiguration ( 1 ) ) ! = HOST_SENDCONTROL_Successful )
{
{
printf_P ( PSTR ( ESC_FG_RED " Control Error (Set Configuration). \r \n "
if ( USB_HostState ! = HOST_STATE_Configured )
" -- Error Code: %d \r \n " ESC_FG_WHITE ) , ErrorCode ) ;
return ;
/* Indicate error via status LEDs */
LEDs_SetAllLEDs ( LEDMASK_USB_ERROR ) ;
/* Wait until USB device disconnected */
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
break ;
}
puts_P ( PSTR ( " Mass Storage Disk Enumerated. \r \n " ) ) ;
USB_HostState = HOST_STATE_Configured ;
break ;
case HOST_STATE_Configured :
/* Indicate device busy via the status LEDs */
/* Indicate device busy via the status LEDs */
LEDs_SetAllLEDs ( LEDMASK_USB_BUSY ) ;
LEDs_SetAllLEDs ( LEDMASK_USB_BUSY ) ;
uint8_t ErrorCode ;
/* Send the request, display error and wait for device detach if request fails */
/* Send the request, display error and wait for device detach if request fails */
if ( ( ErrorCode = MassStore_GetMaxLUN ( & MassStore_MaxLUNIndex ) ) ! = HOST_SENDCONTROL_Successful )
if ( ( ErrorCode = MassStore_GetMaxLUN ( & MassStore_MaxLUNIndex ) ) ! = HOST_SENDCONTROL_Successful )
{
{
ShowDiskReadError ( PSTR ( " Get Max LUN " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Get Max LUN " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
/* Print number of LUNs detected in the attached device */
/* Print number of LUNs detected in the attached device */
@ -199,9 +189,8 @@ void MassStorage_Task(void)
if ( ( ErrorCode = MassStore_MassStorageReset ( ) ) ! = HOST_SENDCONTROL_Successful )
if ( ( ErrorCode = MassStore_MassStorageReset ( ) ) ! = HOST_SENDCONTROL_Successful )
{
{
ShowDiskReadError ( PSTR ( " Mass Storage Reset " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Mass Storage Reset " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
/* Get sense data from the device - many devices will not accept any other commands until the sense data
/* Get sense data from the device - many devices will not accept any other commands until the sense data
@ -210,17 +199,16 @@ void MassStorage_Task(void)
if ( ( ErrorCode = MassStore_RequestSense ( 0 , & SenseData ) ) ! = 0 )
if ( ( ErrorCode = MassStore_RequestSense ( 0 , & SenseData ) ) ! = 0 )
{
{
ShowDiskReadError ( PSTR ( " Request Sense " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Request Sense " ) , ErrorCode ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
break ;
return ;
}
}
/* Set the prevent removal flag for the device, allowing it to be accessed */
/* Set the prevent removal flag for the device, allowing it to be accessed */
if ( ( ErrorCode = MassStore_PreventAllowMediumRemoval ( 0 , true ) ) ! = 0 )
if ( ( ErrorCode = MassStore_PreventAllowMediumRemoval ( 0 , true ) ) ! = 0 )
{
{
ShowDiskReadError ( PSTR ( " Prevent/Allow Medium Removal " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Prevent/Allow Medium Removal " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
/* Get inquiry data from the device */
/* Get inquiry data from the device */
@ -228,9 +216,8 @@ void MassStorage_Task(void)
if ( ( ErrorCode = MassStore_Inquiry ( 0 , & InquiryData ) ) ! = 0 )
if ( ( ErrorCode = MassStore_Inquiry ( 0 , & InquiryData ) ) ! = 0 )
{
{
ShowDiskReadError ( PSTR ( " Inquiry " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Inquiry " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
/* Print vendor and product names of attached device */
/* Print vendor and product names of attached device */
@ -258,9 +245,8 @@ void MassStorage_Task(void)
if ( ErrorCode ! = MASS_STORE_SCSI_COMMAND_FAILED )
if ( ErrorCode ! = MASS_STORE_SCSI_COMMAND_FAILED )
{
{
ShowDiskReadError ( PSTR ( " Test Unit Ready " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Test Unit Ready " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
}
}
@ -273,9 +259,8 @@ void MassStorage_Task(void)
if ( ( ErrorCode = MassStore_ReadCapacity ( 0 , & DiskCapacity ) ) ! = 0 )
if ( ( ErrorCode = MassStore_ReadCapacity ( 0 , & DiskCapacity ) ) ! = 0 )
{
{
ShowDiskReadError ( PSTR ( " Read Capacity " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Read Capacity " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
/* Display the disk capacity in blocks * block size bytes */
/* Display the disk capacity in blocks * block size bytes */
@ -288,9 +273,8 @@ void MassStorage_Task(void)
if ( ( ErrorCode = MassStore_ReadDeviceBlock ( 0 , 0x00000000 , 1 , DiskCapacity . BlockSize , BlockBuffer ) ) ! = 0 )
if ( ( ErrorCode = MassStore_ReadDeviceBlock ( 0 , 0x00000000 , 1 , DiskCapacity . BlockSize , BlockBuffer ) ) ! = 0 )
{
{
ShowDiskReadError ( PSTR ( " Read Device Block " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Read Device Block " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
puts_P ( PSTR ( " \r \n Contents of first block: \r \n " ) ) ;
puts_P ( PSTR ( " \r \n Contents of first block: \r \n " ) ) ;
@ -329,13 +313,9 @@ void MassStorage_Task(void)
{
{
/* Abort if device removed */
/* Abort if device removed */
if ( USB_HostState = = HOST_STATE_Unattached )
if ( USB_HostState = = HOST_STATE_Unattached )
break ;
return ;
}
}
/* Abort if device removed */
if ( USB_HostState = = HOST_STATE_Unattached )
break ;
/* Print out the entire disk contents in ASCII format */
/* Print out the entire disk contents in ASCII format */
for ( uint32_t CurrBlockAddress = 0 ; CurrBlockAddress < DiskCapacity . Blocks ; CurrBlockAddress + + )
for ( uint32_t CurrBlockAddress = 0 ; CurrBlockAddress < DiskCapacity . Blocks ; CurrBlockAddress + + )
{
{
@ -343,9 +323,8 @@ void MassStorage_Task(void)
if ( ( ErrorCode = MassStore_ReadDeviceBlock ( 0 , CurrBlockAddress , 1 , DiskCapacity . BlockSize , BlockBuffer ) ) ! = 0 )
if ( ( ErrorCode = MassStore_ReadDeviceBlock ( 0 , CurrBlockAddress , 1 , DiskCapacity . BlockSize , BlockBuffer ) ) ! = 0 )
{
{
ShowDiskReadError ( PSTR ( " Read Device Block " ) , ErrorCode ) ;
ShowDiskReadError ( PSTR ( " Read Device Block " ) , ErrorCode ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
return ;
break ;
}
}
/* Send the ASCII data in the read in block to the serial port */
/* Send the ASCII data in the read in block to the serial port */
@ -355,19 +334,11 @@ void MassStorage_Task(void)
putchar ( isprint ( CurrByte ) ? CurrByte : ' . ' ) ;
putchar ( isprint ( CurrByte ) ? CurrByte : ' . ' ) ;
}
}
/* Abort if device removed */
if ( USB_HostState = = HOST_STATE_Unattached )
break ;
}
}
/* Indicate device no longer busy */
/* Indicate device no longer busy */
LEDs_SetAllLEDs ( LEDMASK_USB_READY ) ;
LEDs_SetAllLEDs ( LEDMASK_USB_READY ) ;
USB_Host_SetDeviceConfiguration ( 0 ) ;
/* Wait until USB device disconnected */
USB_HostState = HOST_STATE_WaitForDeviceRemoval ;
break ;
}
}
}
/** Indicates that a communication error has occurred with the attached Mass Storage Device,
/** Indicates that a communication error has occurred with the attached Mass Storage Device,