Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
b7eead83
Commit
b7eead83
authored
Oct 02, 2009
by
Dean Camera
Browse files
Cleanups to the Device mode Mass Storage demo applications' SCSI routines.
parent
3ecc4629
Changes
7
Hide whitespace changes
Inline
Side-by-side
Demos/Device/ClassDriver/MassStorage/Lib/SCSI.c
View file @
b7eead83
...
...
@@ -88,34 +88,36 @@ SCSI_Request_Sense_Response_t SenseData =
*/
bool
SCSI_DecodeSCSICommand
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
{
bool
CommandSuccess
=
false
;
/* Set initial sense data, before the requested command is processed */
SCSI_SET_SENSE
(
SCSI_SENSE_KEY_GOOD
,
SCSI_ASENSE_NO_ADDITIONAL_INFORMATION
,
SCSI_ASENSEQ_NO_QUALIFIER
);
/* Run the appropriate SCSI command hander function based on the passed command */
switch
(
MSInterfaceInfo
->
State
.
CommandBlock
.
SCSICommandData
[
0
])
{
case
SCSI_CMD_INQUIRY
:
CommandSuccess
=
SCSI_Command_Inquiry
(
MSInterfaceInfo
);
SCSI_Command_Inquiry
(
MSInterfaceInfo
);
break
;
case
SCSI_CMD_REQUEST_SENSE
:
CommandSuccess
=
SCSI_Command_Request_Sense
(
MSInterfaceInfo
);
SCSI_Command_Request_Sense
(
MSInterfaceInfo
);
break
;
case
SCSI_CMD_READ_CAPACITY_10
:
CommandSuccess
=
SCSI_Command_Read_Capacity_10
(
MSInterfaceInfo
);
SCSI_Command_Read_Capacity_10
(
MSInterfaceInfo
);
break
;
case
SCSI_CMD_SEND_DIAGNOSTIC
:
CommandSuccess
=
SCSI_Command_Send_Diagnostic
(
MSInterfaceInfo
);
SCSI_Command_Send_Diagnostic
(
MSInterfaceInfo
);
break
;
case
SCSI_CMD_WRITE_10
:
CommandSuccess
=
SCSI_Command_ReadWrite_10
(
MSInterfaceInfo
,
DATA_WRITE
);
SCSI_Command_ReadWrite_10
(
MSInterfaceInfo
,
DATA_WRITE
);
break
;
case
SCSI_CMD_READ_10
:
CommandSuccess
=
SCSI_Command_ReadWrite_10
(
MSInterfaceInfo
,
DATA_READ
);
SCSI_Command_ReadWrite_10
(
MSInterfaceInfo
,
DATA_READ
);
break
;
case
SCSI_CMD_TEST_UNIT_READY
:
case
SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL
:
case
SCSI_CMD_VERIFY_10
:
/* These commands should just succeed, no handling required */
CommandSuccess
=
true
;
MSInterfaceInfo
->
State
.
CommandBlock
.
DataTransferLength
=
0
;
break
;
default:
...
...
@@ -126,27 +128,15 @@ bool SCSI_DecodeSCSICommand(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
break
;
}
/* Check if command was successfully processed */
if
(
CommandSuccess
)
{
SCSI_SET_SENSE
(
SCSI_SENSE_KEY_GOOD
,
SCSI_ASENSE_NO_ADDITIONAL_INFORMATION
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
true
;
}
return
false
;
return
(
SenseData
.
SenseKey
==
SCSI_SENSE_KEY_GOOD
);
}
/** Command processing for an issued SCSI INQUIRY command. This command returns information about the device's features
* and capabilities to the host.
*
* \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_Inquiry
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
static
void
SCSI_Command_Inquiry
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
{
uint16_t
AllocationLength
=
(((
uint16_t
)
MSInterfaceInfo
->
State
.
CommandBlock
.
SCSICommandData
[
3
]
<<
8
)
|
MSInterfaceInfo
->
State
.
CommandBlock
.
SCSICommandData
[
4
]);
...
...
@@ -162,7 +152,7 @@ static bool SCSI_Command_Inquiry(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
SCSI_ASENSE_INVALID_FIELD_IN_CDB
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
Endpoint_Write_Stream_LE
(
&
InquiryData
,
BytesTransferred
,
NO_STREAM_CALLBACK
);
...
...
@@ -177,18 +167,14 @@ static bool SCSI_Command_Inquiry(USB_ClassInfo_MS_Device_t* MSInterfaceInfo)
/* Succeed the command and update the bytes transferred counter */
MSInterfaceInfo
->
State
.
CommandBlock
.
DataTransferLength
-=
BytesTransferred
;
return
true
;
}
/** Command processing for an issued SCSI REQUEST SENSE command. This command returns information about the last issued command,
* including the error code and additional error information so that the host can determine why a command failed to complete.
*
* \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_Request_Sense
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
static
void
SCSI_Command_Request_Sense
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
{
uint8_t
AllocationLength
=
MSInterfaceInfo
->
State
.
CommandBlock
.
SCSICommandData
[
4
];
uint8_t
BytesTransferred
=
(
AllocationLength
<
sizeof
(
SenseData
))
?
AllocationLength
:
sizeof
(
SenseData
);
...
...
@@ -201,18 +187,14 @@ static bool SCSI_Command_Request_Sense(USB_ClassInfo_MS_Device_t* MSInterfaceInf
/* Succeed the command and update the bytes transferred counter */
MSInterfaceInfo
->
State
.
CommandBlock
.
DataTransferLength
-=
BytesTransferred
;
return
true
;
}
/** Command processing for an issued SCSI READ CAPACITY (10) command. This command returns information about the device's capacity
* on the selected Logical Unit (drive), as a number of OS-sized blocks.
*
* \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_Read_Capacity_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
static
void
SCSI_Command_Read_Capacity_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
{
uint32_t
LastBlockAddressInLUN
=
(
LUN_MEDIA_BLOCKS
-
1
);
uint32_t
MediaBlockSize
=
VIRTUAL_MEMORY_BLOCK_SIZE
;
...
...
@@ -223,8 +205,6 @@ static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* MSInterface
/* Succeed the command and update the bytes transferred counter */
MSInterfaceInfo
->
State
.
CommandBlock
.
DataTransferLength
-=
8
;
return
true
;
}
/** Command processing for an issued SCSI SEND DIAGNOSTIC command. This command performs a quick check of the Dataflash ICs on the
...
...
@@ -232,10 +212,8 @@ static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* MSInterface
* 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
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
static
void
SCSI_Command_Send_Diagnostic
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
)
{
/* Check to see if the SELF TEST bit is not set */
if
(
!
(
MSInterfaceInfo
->
State
.
CommandBlock
.
SCSICommandData
[
1
]
&
(
1
<<
2
)))
...
...
@@ -245,7 +223,7 @@ static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceI
SCSI_ASENSE_INVALID_FIELD_IN_CDB
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
/* Check to see if all attached Dataflash ICs are functional */
...
...
@@ -256,13 +234,13 @@ static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceI
SCSI_ASENSE_NO_ADDITIONAL_INFORMATION
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
/* Succeed the command and update the bytes transferred counter */
MSInterfaceInfo
->
State
.
CommandBlock
.
DataTransferLength
=
0
;
return
true
;
return
;
}
/** Command processing for an issued SCSI READ (10) or WRITE (10) command. This command reads in the block start address
...
...
@@ -271,10 +249,8 @@ static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* MSInterfaceI
*
* \param[in] MSInterfaceInfo Pointer to the Mass Storage class interface structure that the command is associated with
* \param[in] IsDataRead Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE)
*
* \return Boolean true if the command completed successfully, false otherwise.
*/
static
bool
SCSI_Command_ReadWrite_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
,
const
bool
IsDataRead
)
static
void
SCSI_Command_ReadWrite_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
,
const
bool
IsDataRead
)
{
uint32_t
BlockAddress
;
uint16_t
TotalBlocks
;
...
...
@@ -297,7 +273,7 @@ static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* MSInterfaceInfo
SCSI_ASENSE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
#if (TOTAL_LUNS > 1)
...
...
@@ -314,5 +290,5 @@ static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* MSInterfaceInfo
/* Update the bytes transferred counter and succeed the command */
MSInterfaceInfo
->
State
.
CommandBlock
.
DataTransferLength
-=
((
uint32_t
)
TotalBlocks
*
VIRTUAL_MEMORY_BLOCK_SIZE
);
return
true
;
return
;
}
Demos/Device/ClassDriver/MassStorage/Lib/SCSI.h
View file @
b7eead83
...
...
@@ -137,11 +137,11 @@
bool
SCSI_DecodeSCSICommand
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
#if defined(INCLUDE_FROM_SCSI_C)
static
bool
SCSI_Command_Inquiry
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
bool
SCSI_Command_Request_Sense
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
bool
SCSI_Command_Read_Capacity_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
bool
SCSI_Command_Send_Diagnostic
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
bool
SCSI_Command_ReadWrite_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
,
const
bool
IsDataRead
);
static
void
SCSI_Command_Inquiry
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
void
SCSI_Command_Request_Sense
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
void
SCSI_Command_Read_Capacity_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
void
SCSI_Command_Send_Diagnostic
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
);
static
void
SCSI_Command_ReadWrite_10
(
USB_ClassInfo_MS_Device_t
*
MSInterfaceInfo
,
const
bool
IsDataRead
);
#endif
#endif
Demos/Device/LowLevel/MassStorage/Lib/SCSI.c
View file @
b7eead83
...
...
@@ -83,37 +83,41 @@ SCSI_Request_Sense_Response_t SenseData =
/** Main routine to process the SCSI command located in the Command Block Wrapper read from the host. This dispatches
* to the appropriate SCSI command handling routine if the issued command is supported by the device, else it returns
* a command failure due to a ILLEGAL REQUEST.
*
* \return Boolean true if the command completed sucessfully, false otherwise
*/
void
SCSI_DecodeSCSICommand
(
void
)
bool
SCSI_DecodeSCSICommand
(
void
)
{
bool
CommandSuccess
=
false
;
/* Set initial sense data, before the requested command is processed */
SCSI_SET_SENSE
(
SCSI_SENSE_KEY_GOOD
,
SCSI_ASENSE_NO_ADDITIONAL_INFORMATION
,
SCSI_ASENSEQ_NO_QUALIFIER
);
/* Run the appropriate SCSI command hander function based on the passed command */
switch
(
CommandBlock
.
SCSICommandData
[
0
])
{
case
SCSI_CMD_INQUIRY
:
CommandSuccess
=
SCSI_Command_Inquiry
();
SCSI_Command_Inquiry
();
break
;
case
SCSI_CMD_REQUEST_SENSE
:
CommandSuccess
=
SCSI_Command_Request_Sense
();
SCSI_Command_Request_Sense
();
break
;
case
SCSI_CMD_READ_CAPACITY_10
:
CommandSuccess
=
SCSI_Command_Read_Capacity_10
();
SCSI_Command_Read_Capacity_10
();
break
;
case
SCSI_CMD_SEND_DIAGNOSTIC
:
CommandSuccess
=
SCSI_Command_Send_Diagnostic
();
SCSI_Command_Send_Diagnostic
();
break
;
case
SCSI_CMD_WRITE_10
:
CommandSuccess
=
SCSI_Command_ReadWrite_10
(
DATA_WRITE
);
SCSI_Command_ReadWrite_10
(
DATA_WRITE
);
break
;
case
SCSI_CMD_READ_10
:
CommandSuccess
=
SCSI_Command_ReadWrite_10
(
DATA_READ
);
SCSI_Command_ReadWrite_10
(
DATA_READ
);
break
;
case
SCSI_CMD_TEST_UNIT_READY
:
case
SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL
:
case
SCSI_CMD_VERIFY_10
:
/* These commands should just succeed, no handling required */
CommandSuccess
=
true
;
CommandBlock
.
DataTransferLength
=
0
;
break
;
default:
...
...
@@ -124,29 +128,13 @@ void SCSI_DecodeSCSICommand(void)
break
;
}
/* Check if command was successfully processed */
if
(
CommandSuccess
)
{
/* Command succeeded - set the CSW status and update the SENSE key */
CommandStatus
.
Status
=
Command_Pass
;
SCSI_SET_SENSE
(
SCSI_SENSE_KEY_GOOD
,
SCSI_ASENSE_NO_ADDITIONAL_INFORMATION
,
SCSI_ASENSEQ_NO_QUALIFIER
);
}
else
{
/* Command failed - set the CSW status - failed command function updates the SENSE key */
CommandStatus
.
Status
=
Command_Fail
;
}
return
(
SenseData
.
SenseKey
==
SCSI_SENSE_KEY_GOOD
);
}
/** Command processing for an issued SCSI INQUIRY command. This command returns information about the device's features
* and capabilities to the host.
*
* \return Boolean true if the command completed successfully, false otherwise.
*/
static
bool
SCSI_Command_Inquiry
(
void
)
static
void
SCSI_Command_Inquiry
(
void
)
{
uint16_t
AllocationLength
=
(((
uint16_t
)
CommandBlock
.
SCSICommandData
[
3
]
<<
8
)
|
CommandBlock
.
SCSICommandData
[
4
]);
...
...
@@ -162,7 +150,7 @@ static bool SCSI_Command_Inquiry(void)
SCSI_ASENSE_INVALID_FIELD_IN_CDB
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
/* Write the INQUIRY data to the endpoint */
...
...
@@ -178,16 +166,12 @@ static bool SCSI_Command_Inquiry(void)
/* Succeed the command and update the bytes transferred counter */
CommandBlock
.
DataTransferLength
-=
BytesTransferred
;
return
true
;
}
/** Command processing for an issued SCSI REQUEST SENSE command. This command returns information about the last issued command,
* including the error code and additional error information so that the host can determine why a command failed to complete.
*
* \return Boolean true if the command completed successfully, false otherwise.
*/
static
bool
SCSI_Command_Request_Sense
(
void
)
static
void
SCSI_Command_Request_Sense
(
void
)
{
uint8_t
AllocationLength
=
CommandBlock
.
SCSICommandData
[
4
];
uint8_t
BytesTransferred
=
(
AllocationLength
<
sizeof
(
SenseData
))
?
AllocationLength
:
sizeof
(
SenseData
);
...
...
@@ -205,16 +189,12 @@ static bool SCSI_Command_Request_Sense(void)
/* Succeed the command and update the bytes transferred counter */
CommandBlock
.
DataTransferLength
-=
BytesTransferred
;
return
true
;
}
/** Command processing for an issued SCSI READ CAPACITY (10) command. This command returns information about the device's capacity
* on the selected Logical Unit (drive), as a number of OS-sized blocks.
*
* \return Boolean true if the command completed successfully, false otherwise.
*/
static
bool
SCSI_Command_Read_Capacity_10
(
void
)
static
void
SCSI_Command_Read_Capacity_10
(
void
)
{
/* Send the total number of logical blocks in the current LUN */
Endpoint_Write_DWord_BE
(
LUN_MEDIA_BLOCKS
-
1
);
...
...
@@ -224,15 +204,13 @@ static bool SCSI_Command_Read_Capacity_10(void)
/* Check if the current command is being aborted by the host */
if
(
IsMassStoreReset
)
return
false
;
return
;
/* Send the endpoint data packet to the host */
Endpoint_ClearIN
();
/* Succeed the command and update the bytes transferred counter */
CommandBlock
.
DataTransferLength
-=
8
;
return
true
;
}
/** Command processing for an issued SCSI SEND DIAGNOSTIC command. This command performs a quick check of the Dataflash ICs on the
...
...
@@ -240,10 +218,8 @@ static bool SCSI_Command_Read_Capacity_10(void)
* 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
)
static
void
SCSI_Command_Send_Diagnostic
(
void
)
{
/* Check to see if the SELF TEST bit is not set */
if
(
!
(
CommandBlock
.
SCSICommandData
[
1
]
&
(
1
<<
2
)))
...
...
@@ -253,7 +229,7 @@ static bool SCSI_Command_Send_Diagnostic(void)
SCSI_ASENSE_INVALID_FIELD_IN_CDB
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
/* Check to see if all attached Dataflash ICs are functional */
...
...
@@ -264,13 +240,11 @@ static bool SCSI_Command_Send_Diagnostic(void)
SCSI_ASENSE_NO_ADDITIONAL_INFORMATION
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
/* Succeed the command and update the bytes transferred counter */
CommandBlock
.
DataTransferLength
=
0
;
return
true
;
}
/** Command processing for an issued SCSI READ (10) or WRITE (10) command. This command reads in the block start address
...
...
@@ -278,10 +252,8 @@ static bool SCSI_Command_Send_Diagnostic(void)
* reading and writing of the data.
*
* \param[in] IsDataRead Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE)
*
* \return Boolean true if the command completed successfully, false otherwise.
*/
static
bool
SCSI_Command_ReadWrite_10
(
const
bool
IsDataRead
)
static
void
SCSI_Command_ReadWrite_10
(
const
bool
IsDataRead
)
{
uint32_t
BlockAddress
;
uint16_t
TotalBlocks
;
...
...
@@ -304,7 +276,7 @@ static bool SCSI_Command_ReadWrite_10(const bool IsDataRead)
SCSI_ASENSE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE
,
SCSI_ASENSEQ_NO_QUALIFIER
);
return
false
;
return
;
}
#if (TOTAL_LUNS > 1)
...
...
@@ -320,6 +292,4 @@ static bool SCSI_Command_ReadWrite_10(const bool IsDataRead)
/* Update the bytes transferred counter and succeed the command */
CommandBlock
.
DataTransferLength
-=
((
uint32_t
)
TotalBlocks
*
VIRTUAL_MEMORY_BLOCK_SIZE
);
return
true
;
}
Demos/Device/LowLevel/MassStorage/Lib/SCSI.h
View file @
b7eead83
...
...
@@ -136,14 +136,14 @@
}
SCSI_Request_Sense_Response_t
;
/* Function Prototypes: */
void
SCSI_DecodeSCSICommand
(
void
);
bool
SCSI_DecodeSCSICommand
(
void
);
#if defined(INCLUDE_FROM_SCSI_C)
static
bool
SCSI_Command_Inquiry
(
void
);
static
bool
SCSI_Command_Request_Sense
(
void
);
static
bool
SCSI_Command_Read_Capacity_10
(
void
);
static
bool
SCSI_Command_Send_Diagnostic
(
void
);
static
bool
SCSI_Command_ReadWrite_10
(
const
bool
IsDataRead
);
static
void
SCSI_Command_Inquiry
(
void
);
static
void
SCSI_Command_Request_Sense
(
void
);
static
void
SCSI_Command_Read_Capacity_10
(
void
);
static
void
SCSI_Command_Send_Diagnostic
(
void
);
static
void
SCSI_Command_ReadWrite_10
(
const
bool
IsDataRead
);
#endif
#endif
Demos/Device/LowLevel/MassStorage/MassStorage.c
View file @
b7eead83
...
...
@@ -189,15 +189,15 @@ void MassStorage_Task(void)
if
(
CommandBlock
.
Flags
&
COMMAND_DIRECTION_DATA_IN
)
Endpoint_SelectEndpoint
(
MASS_STORAGE_IN_EPNUM
);
/* Decode the received SCSI command */
SCSI_DecodeSCSICommand
()
;
/* Decode the received SCSI command
, set returned status code
*/
CommandStatus
.
Status
=
SCSI_DecodeSCSICommand
()
?
Command_Pass
:
Command_Fail
;
/* Load in the CBW tag into the CSW to link them together */
CommandStatus
.
Tag
=
CommandBlock
.
Tag
;
/* Load in the data residue counter into the CSW */
CommandStatus
.
DataTransferResidue
=
CommandBlock
.
DataTransferLength
;
/* Stall the selected data pipe if command failed (if data is still to be transferred) */
if
((
CommandStatus
.
Status
==
Command_Fail
)
&&
(
CommandStatus
.
DataTransferResidue
))
Endpoint_StallTransaction
();
...
...
LUFA/ManPages/ChangeLog.txt
View file @
b7eead83
...
...
@@ -16,6 +16,7 @@
* <b>Changed:</b>
* - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library
* - MIDI device demos now receive MIDI events from the host and display note ON messages via the board LEDs
* - Cleanups to the Device mode Mass Storage demo applications' SCSI routines
*
* <b>Fixed:</b>
* - Fixed PrinterHost demo returning invalid Device ID data when the attached device does not have a
...
...
LUFA/ManPages/CompilingApps.txt
View file @
b7eead83
...
...
@@ -22,15 +22,9 @@
* This means that while a build inside a particular demo directory will build only that particular demo, a build stated
* from the /Demos/ directory will build all LUFA demo projects sequentially.
*
* \subsection SSec_CommandLine Via the Command Line
* To build a project from the source via the command line, the command <b>"make all"</b> should be executed from the command line in the directory
* of interest. To remove compiled files (including the binary output, all intermediately files and all diagnostic output
* files), execute <b>"make clean"</b>. Once a "make all" has been run and no errors were encountered, the resulting binary will
* be located in the generated ".HEX" file. If your project makes use of pre-initialized EEPROM variables, the generated ".EEP"
* file will contain the project's EEPROM data.
*
* \subsection SSec_AVRStudio Via AVRStudio
* Each demo, project and bootloader contains an AVRStudio project (.aps) which can be used to build each project. Once opened
* in AVRStudio, the project can be built and cleaned using the GUI buttons or menus. Note that the AVRStudio project files make
* use of the external project makefile, thus the procedure for configuring a demo remains the same regardless of the build environment.
*/
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment