From 7f5dab4f261e08972d3f31512c970c29e54707d1 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 9 Mar 2013 08:00:22 +0000 Subject: [PATCH] Refactor macros in the VirtualFAT implementation of the incomplete Mass Storage bootloader. --- Bootloaders/Incomplete/MassStorage/Lib/SCSI.c | 4 ++-- .../Incomplete/MassStorage/Lib/VirtualFAT.c | 16 ++++++---------- .../Incomplete/MassStorage/Lib/VirtualFAT.h | 12 +++++++++--- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Bootloaders/Incomplete/MassStorage/Lib/SCSI.c b/Bootloaders/Incomplete/MassStorage/Lib/SCSI.c index c6596d41a1..7ab149ccd2 100644 --- a/Bootloaders/Incomplete/MassStorage/Lib/SCSI.c +++ b/Bootloaders/Incomplete/MassStorage/Lib/SCSI.c @@ -214,7 +214,7 @@ 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 = VIRTUAL_MEMORY_BLOCK_SIZE; + uint32_t MediaBlockSize = SECTOR_SIZE_BYTES; Endpoint_Write_Stream_BE(&LastBlockAddressInLUN, sizeof(LastBlockAddressInLUN), NULL); Endpoint_Write_Stream_BE(&MediaBlockSize, sizeof(MediaBlockSize), NULL); @@ -292,7 +292,7 @@ static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* const MSInterfa VirtualFAT_WriteBlocks(MSInterfaceInfo, BlockAddress, TotalBlocks); /* Update the bytes transferred counter and succeed the command */ - MSInterfaceInfo->State.CommandBlock.DataTransferLength -= ((uint32_t)TotalBlocks * VIRTUAL_MEMORY_BLOCK_SIZE); + MSInterfaceInfo->State.CommandBlock.DataTransferLength -= ((uint32_t)TotalBlocks * SECTOR_SIZE_BYTES); return true; } diff --git a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c index 2365ba5839..883586c3d6 100644 --- a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c +++ b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.c @@ -30,15 +30,6 @@ #include "VirtualFAT.h" -#define FAT_TIME(h, m, s) ((h << 11) | (m << 5) | (s >> 1)) -#define FAT_DATE(d, m, y) (((y - 1980) << 9) | (m << 5) | (d << 0)) - -#define SECTOR_SIZE_BYTES VIRTUAL_MEMORY_BLOCK_SIZE -#define SECTOR_PER_CLUSTER 4 -#define CLUSTER_SIZE_BYTES (SECTOR_PER_CLUSTER * SECTOR_SIZE_BYTES) - -#define FILE_CLUSTERS(size) (size / CLUSTER_SIZE_BYTES) - static const FATBootBlock_t BootBlock = { .Bootstrap = {0xEB, 0x3C, 0x90}, @@ -47,7 +38,7 @@ static const FATBootBlock_t BootBlock = .SectorsPerCluster = SECTOR_PER_CLUSTER, .ReservedSectors = 1, .FATCopies = 2, - .RootDirectoryEntries = SECTOR_SIZE_BYTES / sizeof(FATDirectoryEntry_t), + .RootDirectoryEntries = (SECTOR_SIZE_BYTES / sizeof(FATDirectoryEntry_t)), .TotalSectors16 = LUN_MEDIA_BLOCKS, .MediaDescriptor = 0xF8, .SectorsPerFAT = 1, @@ -76,6 +67,7 @@ static FATDirectoryEntry_t FirmwareFileEntry = .FileSizeBytes = 2049, }; + static void WriteBlock(uint16_t BlockNumber) { uint8_t BlockBuffer[512]; @@ -156,6 +148,8 @@ void VirtualFAT_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, { uint16_t CurrentBlock = (uint16_t)BlockAddress; + /* Emulated FAT is performed per-block, pass each requested block index + * to the emulation function */ while (TotalBlocks--) WriteBlock(CurrentBlock++); } @@ -166,6 +160,8 @@ void VirtualFAT_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, { uint16_t CurrentBlock = (uint16_t)BlockAddress; + /* Emulated FAT is performed per-block, pass each requested block index + * to the emulation function */ while (TotalBlocks--) ReadBlock(CurrentBlock++); } diff --git a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.h b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.h index 760fb40646..156760afd8 100644 --- a/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.h +++ b/Bootloaders/Incomplete/MassStorage/Lib/VirtualFAT.h @@ -38,11 +38,17 @@ #include /* Macros: */ - #define VIRTUAL_MEMORY_BLOCK_SIZE 512 + #define FIRMWARE_FILE_SIZE (FLASHEND + 1UL) + #define FILE_CLUSTERS(size) ((size / CLUSTER_SIZE_BYTES) + ((size % CLUSTER_SIZE_BYTES) ? 1 : 0)) - #define FIRMWARE_FILE_SIZE (FLASHEND + 1UL) + #define SECTOR_SIZE_BYTES 512 + #define SECTOR_PER_CLUSTER 4 + #define CLUSTER_SIZE_BYTES (SECTOR_PER_CLUSTER * SECTOR_SIZE_BYTES) - #define LUN_MEDIA_BLOCKS ((FIRMWARE_FILE_SIZE / VIRTUAL_MEMORY_BLOCK_SIZE) + 32) + #define LUN_MEDIA_BLOCKS ((FIRMWARE_FILE_SIZE / SECTOR_SIZE_BYTES) + 32) + + #define FAT_TIME(h, m, s) ((h << 11) | (m << 5) | (s >> 1)) + #define FAT_DATE(d, m, y) (((y - 1980) << 9) | (m << 5) | (d << 0)) /* Type Definitions: */ typedef struct