From 576f40f5aec3d7e48ed949fd24494b6cfb3ec93f Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Tue, 22 Sep 2009 07:53:57 +0000
Subject: [PATCH] Move Dataflash operational checking code out from SCSI.c into
 the DataflashManager.c in the Device mode Mass Storage demos.

---
 .../MassStorage/Lib/DataflashManager.c        | 33 +++++++++++++++++++
 .../MassStorage/Lib/DataflashManager.h        |  1 +
 .../Device/ClassDriver/MassStorage/Lib/SCSI.c | 31 ++---------------
 .../MassStorage/Lib/DataflashManager.c        | 33 +++++++++++++++++++
 .../MassStorage/Lib/DataflashManager.h        |  1 +
 Demos/Device/LowLevel/MassStorage/Lib/SCSI.c  | 33 +++----------------
 LUFA/ManPages/FutureChanges.txt               |  1 +
 7 files changed, 75 insertions(+), 58 deletions(-)

diff --git a/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c b/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c
index 3858d3873..257f3b656 100644
--- a/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c
+++ b/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.c
@@ -490,3 +490,36 @@ void DataflashManager_ResetDataflashProtections(void)
 	/* Deselect current dataflash chip */
 	Dataflash_DeselectChip();
 }
+
+/** Performs a simple test on the attached Dataflash IC(s) to ensure that they are working.
+ *
+ *  \return Boolean true if all media chips are working, false otherwise
+ */
+bool DataflashManager_CheckDataflashOperation(void)
+{
+	uint8_t ReturnByte;
+
+	/* Test first Dataflash IC is present and responding to commands */
+	Dataflash_SelectChip(DATAFLASH_CHIP1);
+	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
+	ReturnByte = Dataflash_ReceiveByte();
+	Dataflash_DeselectChip();
+
+	/* If returned data is invalid, fail the command */
+	if (ReturnByte != DF_MANUFACTURER_ATMEL)
+	  return false;
+
+	#if (DATAFLASH_TOTALCHIPS == 2)
+	/* Test second Dataflash IC is present and responding to commands */
+	Dataflash_SelectChip(DATAFLASH_CHIP2);
+	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
+	ReturnByte = Dataflash_ReceiveByte();
+	Dataflash_DeselectChip();
+
+	/* If returned data is invalid, fail the command */
+	if (ReturnByte != DF_MANUFACTURER_ATMEL)
+	  return false;
+	#endif
+	
+	return true;
+}
diff --git a/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.h b/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.h
index ace6231db..89e21bbaf 100644
--- a/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.h
+++ b/Demos/Device/ClassDriver/MassStorage/Lib/DataflashManager.h
@@ -73,5 +73,6 @@
 		void DataflashManager_ReadBlocks_RAM(const uint32_t BlockAddress, uint16_t TotalBlocks,
 		                                     uint8_t* BufferPtr) ATTR_NON_NULL_PTR_ARG(3);
 		void DataflashManager_ResetDataflashProtections(void);
+		bool DataflashManager_CheckDataflashOperation(void);
 		
 #endif
diff --git a/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c b/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
index f400e20e3..771773bb7 100644
--- a/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
+++ b/Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
@@ -237,8 +237,6 @@ static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* MSInterface
  */
 static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
 {
-	uint8_t ReturnByte;
-
 	/* Check to see if the SELF TEST bit is not set */
 	if (!(MSInterfaceInfo->State.CommandBlock.SCSICommandData[1] & (1 << 2)))
 	{
@@ -250,14 +248,8 @@ static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceI
 		return false;
 	}
 	
-	/* Test first Dataflash IC is present and responding to commands */
-	Dataflash_SelectChip(DATAFLASH_CHIP1);
-	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
-	ReturnByte = Dataflash_ReceiveByte();
-	Dataflash_DeselectChip();
-
-	/* If returned data is invalid, fail the command */
-	if (ReturnByte != DF_MANUFACTURER_ATMEL)
+	/* Check to see if all attached Dataflash ICs are functional */
+	if (!(DataflashManager_CheckDataflashOperation()))
 	{
 		/* Update SENSE key with a hardware error condition and return command fail */
 		SCSI_SET_SENSE(SCSI_SENSE_KEY_HARDWARE_ERROR,
@@ -266,25 +258,6 @@ static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceI
 	
 		return false;
 	}
-
-	#if (DATAFLASH_TOTALCHIPS == 2)
-	/* Test second Dataflash IC is present and responding to commands */
-	Dataflash_SelectChip(DATAFLASH_CHIP2);
-	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
-	ReturnByte = Dataflash_ReceiveByte();
-	Dataflash_DeselectChip();
-
-	/* If returned data is invalid, fail the command */
-	if (ReturnByte != DF_MANUFACTURER_ATMEL)
-	{
-		/* Update SENSE key with a hardware error condition and return command fail */
-		SCSI_SET_SENSE(SCSI_SENSE_KEY_HARDWARE_ERROR,
-		               SCSI_ASENSE_NO_ADDITIONAL_INFORMATION,
-		               SCSI_ASENSEQ_NO_QUALIFIER);	
-	
-		return false;
-	}
-	#endif
 	
 	/* Succeed the command and update the bytes transferred counter */
 	MSInterfaceInfo->State.CommandBlock.DataTransferLength = 0;
diff --git a/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c b/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c
index 9cd0279d6..7d070f37c 100644
--- a/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c
+++ b/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.c
@@ -488,3 +488,36 @@ void DataflashManager_ResetDataflashProtections(void)
 	/* Deselect current dataflash chip */
 	Dataflash_DeselectChip();
 }
+
+/** Performs a simple test on the attached Dataflash IC(s) to ensure that they are working.
+ *
+ *  \return Boolean true if all media chips are working, false otherwise
+ */
+bool DataflashManager_CheckDataflashOperation(void)
+{
+	uint8_t ReturnByte;
+
+	/* Test first Dataflash IC is present and responding to commands */
+	Dataflash_SelectChip(DATAFLASH_CHIP1);
+	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
+	ReturnByte = Dataflash_ReceiveByte();
+	Dataflash_DeselectChip();
+
+	/* If returned data is invalid, fail the command */
+	if (ReturnByte != DF_MANUFACTURER_ATMEL)
+	  return false;
+
+	#if (DATAFLASH_TOTALCHIPS == 2)
+	/* Test second Dataflash IC is present and responding to commands */
+	Dataflash_SelectChip(DATAFLASH_CHIP2);
+	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
+	ReturnByte = Dataflash_ReceiveByte();
+	Dataflash_DeselectChip();
+
+	/* If returned data is invalid, fail the command */
+	if (ReturnByte != DF_MANUFACTURER_ATMEL)
+	  return false;
+	#endif
+	
+	return true;
+}
diff --git a/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.h b/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.h
index 1332fd3a3..b7b5a1e78 100644
--- a/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.h
+++ b/Demos/Device/LowLevel/MassStorage/Lib/DataflashManager.h
@@ -71,5 +71,6 @@
 		void DataflashManager_ReadBlocks_RAM(const uint32_t BlockAddress, uint16_t TotalBlocks,
 		                                     uint8_t* BufferPtr) ATTR_NON_NULL_PTR_ARG(3);
 		void DataflashManager_ResetDataflashProtections(void);
+		bool DataflashManager_CheckDataflashOperation(void);
 		
 #endif
diff --git a/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c b/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
index 53d773ffb..d0840d36e 100644
--- a/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
+++ b/Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
@@ -239,12 +239,12 @@ static bool SCSI_Command_Read_Capacity_10(void)
  *  board, and indicates if they are present and functioning correctly. Only the Self-Test portion of the diagnostic command is
  *  supported.
  *
+ *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with
+ *
  *  \return Boolean true if the command completed successfully, false otherwise.
  */
 static bool SCSI_Command_Send_Diagnostic(void)
 {
-	uint8_t ReturnByte;
-
 	/* Check to see if the SELF TEST bit is not set */
 	if (!(CommandBlock.SCSICommandData[1] & (1 << 2)))
 	{
@@ -256,14 +256,8 @@ static bool SCSI_Command_Send_Diagnostic(void)
 		return false;
 	}
 	
-	/* Test first Dataflash IC is present and responding to commands */
-	Dataflash_SelectChip(DATAFLASH_CHIP1);
-	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
-	ReturnByte = Dataflash_ReceiveByte();
-	Dataflash_DeselectChip();
-
-	/* If returned data is invalid, fail the command */
-	if (ReturnByte != DF_MANUFACTURER_ATMEL)
+	/* Check to see if all attached Dataflash ICs are functional */
+	if (!(DataflashManager_CheckDataflashOperation()))
 	{
 		/* Update SENSE key with a hardware error condition and return command fail */
 		SCSI_SET_SENSE(SCSI_SENSE_KEY_HARDWARE_ERROR,
@@ -272,25 +266,6 @@ static bool SCSI_Command_Send_Diagnostic(void)
 	
 		return false;
 	}
-
-	#if (DATAFLASH_TOTALCHIPS == 2)
-	/* Test second Dataflash IC is present and responding to commands */
-	Dataflash_SelectChip(DATAFLASH_CHIP2);
-	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO);
-	ReturnByte = Dataflash_ReceiveByte();
-	Dataflash_DeselectChip();
-
-	/* If returned data is invalid, fail the command */
-	if (ReturnByte != DF_MANUFACTURER_ATMEL)
-	{
-		/* Update SENSE key with a hardware error condition and return command fail */
-		SCSI_SET_SENSE(SCSI_SENSE_KEY_HARDWARE_ERROR,
-		               SCSI_ASENSE_NO_ADDITIONAL_INFORMATION,
-		               SCSI_ASENSEQ_NO_QUALIFIER);	
-	
-		return false;
-	}
-	#endif
 	
 	/* Succeed the command and update the bytes transferred counter */
 	CommandBlock.DataTransferLength = 0;
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index c5fcbc586..c5f6fe22a 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -21,6 +21,7 @@
   *  - Add detailed overviews of how each demo works
   *  - Master LUFA include file rather than per-module includes
   *  - Change makefiles to allow for absolute LUFA location to be used
+  *  - Abstract out the physical media from the Mass Storage device demos
   *  - Make new demos
   *      -# Multiple-report HID device
   *      -# Dual Role Mouse Host/Keyboard Device
-- 
GitLab