From 199cf8f1830ef1a8db14d311d6bfff26b82ef623 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 20 Mar 2013 19:02:29 +0000 Subject: Significantly reduce the size of the Mass Storage class bootloader, by removing dependencies on large LUFA internal functions. --- Bootloaders/MassStorage/BootloaderAPITable.S | 2 -- Bootloaders/MassStorage/Lib/SCSI.c | 13 +++++-------- Bootloaders/MassStorage/Lib/VirtualFAT.c | 8 ++------ Bootloaders/MassStorage/Lib/VirtualFAT.h | 6 ++---- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/Bootloaders/MassStorage/BootloaderAPITable.S b/Bootloaders/MassStorage/BootloaderAPITable.S index 2d7610b58..7efe8b4b1 100644 --- a/Bootloaders/MassStorage/BootloaderAPITable.S +++ b/Bootloaders/MassStorage/BootloaderAPITable.S @@ -29,7 +29,6 @@ */ #if AUX_BOOT_SECTION_SIZE > 0 - #warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation). ; Trampoline to jump over the AUX bootloader section to the start of the bootloader, @@ -38,7 +37,6 @@ .global Boot_AUX_Trampoline Boot_AUX_Trampoline: jmp BOOT_START_ADDR - #endif ; Trampolines to actual API implementations if the target address is outside the diff --git a/Bootloaders/MassStorage/Lib/SCSI.c b/Bootloaders/MassStorage/Lib/SCSI.c index 3df8d3001..ea0700a27 100644 --- a/Bootloaders/MassStorage/Lib/SCSI.c +++ b/Bootloaders/MassStorage/Lib/SCSI.c @@ -212,11 +212,8 @@ static bool SCSI_Command_Request_Sense(USB_ClassInfo_MS_Device_t* const MSInterf */ static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) { - uint32_t LastBlockAddressInLUN = (LUN_MEDIA_BLOCKS - 1); - uint32_t MediaBlockSize = SECTOR_SIZE_BYTES; - - Endpoint_Write_Stream_BE(&LastBlockAddressInLUN, sizeof(LastBlockAddressInLUN), NULL); - Endpoint_Write_Stream_BE(&MediaBlockSize, sizeof(MediaBlockSize), NULL); + Endpoint_Write_32_BE(LUN_MEDIA_BLOCKS - 1); + Endpoint_Write_32_BE(SECTOR_SIZE_BYTES); Endpoint_ClearIN(); /* Succeed the command and update the bytes transferred counter */ @@ -237,7 +234,7 @@ static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* const MSInt static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, const bool IsDataRead) { - uint32_t BlockAddress; + uint16_t BlockAddress; uint16_t TotalBlocks; /* Load in the 32-bit block address (SCSI uses big-endian, so have to reverse the byte order) */ @@ -259,9 +256,9 @@ static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* const MSInterfa /* Determine if the packet is a READ (10) or WRITE (10) command, call appropriate function */ if (IsDataRead == DATA_READ) - VirtualFAT_ReadBlocks(MSInterfaceInfo, BlockAddress, TotalBlocks); + VirtualFAT_ReadBlocks(BlockAddress, TotalBlocks); else - VirtualFAT_WriteBlocks(MSInterfaceInfo, BlockAddress, TotalBlocks); + VirtualFAT_WriteBlocks(BlockAddress, TotalBlocks); /* Update the bytes transferred counter and succeed the command */ MSInterfaceInfo->State.CommandBlock.DataTransferLength -= ((uint32_t)TotalBlocks * SECTOR_SIZE_BYTES); diff --git a/Bootloaders/MassStorage/Lib/VirtualFAT.c b/Bootloaders/MassStorage/Lib/VirtualFAT.c index 41c661ed3..e0541f436 100644 --- a/Bootloaders/MassStorage/Lib/VirtualFAT.c +++ b/Bootloaders/MassStorage/Lib/VirtualFAT.c @@ -245,12 +245,10 @@ static void ReadVirtualBlock(const uint16_t BlockNumber) /** Writes a number of blocks to the virtual FAT file system, from the host * PC via the USB Mass Storage interface. * - * \param[in] MSInterfaceInfo Pointer to a structure containing a Mass Storage Class configuration and state * \param[in] BlockAddress Data block starting address for the write sequence * \param[in] TotalBlocks Number of blocks of data to write */ -void VirtualFAT_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, - const uint32_t BlockAddress, +void VirtualFAT_WriteBlocks(const uint16_t BlockAddress, uint16_t TotalBlocks) { uint16_t CurrentBlock = (uint16_t)BlockAddress; @@ -264,12 +262,10 @@ void VirtualFAT_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, /** Reads a number of blocks from the virtual FAT file system, and sends them * to the host PC via the USB Mass Storage interface. * - * \param[in] MSInterfaceInfo Pointer to a structure containing a Mass Storage Class configuration and state * \param[in] BlockAddress Data block starting address for the read sequence * \param[in] TotalBlocks Number of blocks of data to read */ -void VirtualFAT_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, - const uint32_t BlockAddress, +void VirtualFAT_ReadBlocks(const uint16_t BlockAddress, uint16_t TotalBlocks) { uint16_t CurrentBlock = (uint16_t)BlockAddress; diff --git a/Bootloaders/MassStorage/Lib/VirtualFAT.h b/Bootloaders/MassStorage/Lib/VirtualFAT.h index 8019691dc..7eacdd952 100644 --- a/Bootloaders/MassStorage/Lib/VirtualFAT.h +++ b/Bootloaders/MassStorage/Lib/VirtualFAT.h @@ -151,11 +151,9 @@ static void ReadVirtualBlock(const uint16_t BlockNumber) AUX_BOOT_SECTION; #endif - void VirtualFAT_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, - const uint32_t BlockAddress, + void VirtualFAT_WriteBlocks(const uint16_t BlockAddress, uint16_t TotalBlocks) AUX_BOOT_SECTION; - void VirtualFAT_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, - const uint32_t BlockAddress, + void VirtualFAT_ReadBlocks(const uint16_t BlockAddress, uint16_t TotalBlocks) AUX_BOOT_SECTION; #endif -- cgit v1.2.3