X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/68c317c4e9b54843fdafa5b0ab1eb19e8ffc37c3..8cd249c34240c2189b520c088afde936ec9201b3:/Bootloaders/MassStorage/Lib/VirtualFAT.c diff --git a/Bootloaders/MassStorage/Lib/VirtualFAT.c b/Bootloaders/MassStorage/Lib/VirtualFAT.c index 024c4a6f0..2e90a8101 100644 --- a/Bootloaders/MassStorage/Lib/VirtualFAT.c +++ b/Bootloaders/MassStorage/Lib/VirtualFAT.c @@ -72,33 +72,67 @@ static const FATBootBlock_t BootBlock = }; /** FAT 8.3 style directory entry, for the virtual FLASH contents file. */ -static FATDirectoryEntry_t FirmwareFileEntries[2] = +static FATDirectoryEntry_t FirmwareFileEntries[] = { /* Root volume label entry; disk label is contained in the Filename and - * Extension fields (concantenated) with a special attribute flag - other + * Extension fields (concatenated) with a special attribute flag - other * fields are ignored. Should be the same as the label in the boot block. */ { - .Filename = "LUFA BOO", - .Extension = "T ", - .Attributes = (1 << 3), - .Reserved = {0}, - .CreationTime = 0, - .CreationDate = 0, - .StartingCluster = 0, - .FileSizeBytes = 0, + .MSDOS_Directory = + { + .Name = "LUFA BOOT ", + .Attributes = FAT_FLAG_VOLUME_NAME, + .Reserved = {0}, + .CreationTime = 0, + .CreationDate = 0, + .StartingCluster = 0, + .Reserved2 = 0, + } }, - /* File entry for the virtual Firmware image. */ + /* VFAT Long File Name entry for the virtual firmware file; required to + * prevent corruption from systems that are unable to detect the device + * as being a legacy MSDOS style FAT12 volume. */ { - .Filename = "FIRMWARE", - .Extension = "BIN", - .Attributes = 0, - .Reserved = {0}, - .CreationTime = FAT_TIME(1, 1, 0), - .CreationDate = FAT_DATE(14, 2, 1989), - .StartingCluster = 2, - .FileSizeBytes = FIRMWARE_FILE_SIZE_BYTES, + .VFAT_LongFileName = + { + .Ordinal = FAT_ORDINAL_LAST_ENTRY | 1, + .Attribute = FAT_FLAG_LONG_FILE_NAME, + .Reserved1 = 0, + .Reserved2 = 0, + + .Checksum = 0x57, + + .Unicode1 = 'F', + .Unicode2 = 'I', + .Unicode3 = 'R', + .Unicode4 = 'M', + .Unicode5 = 'W', + .Unicode6 = 'A', + .Unicode7 = 'R', + .Unicode8 = 'E', + .Unicode9 = '.', + .Unicode10 = 'B', + .Unicode11 = 'I', + .Unicode12 = 'N', + .Unicode13 = 0, + } + }, + + /* MSDOS file entry for the virtual Firmware image. */ + { + .MSDOS_File = + { + .Filename = "FIRMWARE", + .Extension = "BIN", + .Attributes = 0, + .Reserved = {0}, + .CreationTime = FAT_TIME(1, 1, 0), + .CreationDate = FAT_DATE(14, 2, 1989), + .StartingCluster = 2, + .FileSizeBytes = FIRMWARE_FILE_SIZE_BYTES, + } }, }; @@ -151,26 +185,28 @@ static void WriteVirtualBlock(const uint16_t BlockNumber) if ((BlockNumber >= 4) && (BlockNumber < (4 + FILE_SECTORS(FIRMWARE_FILE_SIZE_BYTES)))) { + #if (FLASHEND > 0xFFFF) uint32_t WriteFlashAddress = (uint32_t)(BlockNumber - 4) * SECTOR_SIZE_BYTES; + #else + uint16_t WriteFlashAddress = (uint16_t)(BlockNumber - 4) * SECTOR_SIZE_BYTES; + #endif for (uint16_t i = 0; i < SECTOR_SIZE_BYTES; i += 2) { if ((WriteFlashAddress % SPM_PAGESIZE) == 0) { /* Erase the given FLASH page, ready to be programmed */ - boot_page_erase(WriteFlashAddress); - boot_spm_busy_wait(); + BootloaderAPI_ErasePage(WriteFlashAddress); } /* Write the next data word to the FLASH page */ - boot_page_fill(WriteFlashAddress, (BlockBuffer[i + 1] << 8) | BlockBuffer[i]); + BootloaderAPI_FillWord(WriteFlashAddress, (BlockBuffer[i + 1] << 8) | BlockBuffer[i]); WriteFlashAddress += 2; if ((WriteFlashAddress % SPM_PAGESIZE) == 0) { /* Write the filled FLASH page to memory */ - boot_page_write(WriteFlashAddress - SPM_PAGESIZE); - boot_spm_busy_wait(); + BootloaderAPI_WritePage(WriteFlashAddress - SPM_PAGESIZE); } } } @@ -219,10 +255,17 @@ static void ReadVirtualBlock(const uint16_t BlockNumber) default: /* Blocks 4 onwards: Data allocation section */ if ((BlockNumber >= 4) && (BlockNumber < (4 + FILE_SECTORS(FIRMWARE_FILE_SIZE_BYTES)))) { + #if (FLASHEND > 0xFFFF) uint32_t ReadFlashAddress = (uint32_t)(BlockNumber - 4) * SECTOR_SIZE_BYTES; for (uint16_t i = 0; i < SECTOR_SIZE_BYTES; i++) BlockBuffer[i] = pgm_read_byte_far(ReadFlashAddress++); + #else + uint16_t ReadFlashAddress = (uint16_t)(BlockNumber - 4) * SECTOR_SIZE_BYTES; + + for (uint16_t i = 0; i < SECTOR_SIZE_BYTES; i++) + BlockBuffer[i] = pgm_read_byte(ReadFlashAddress++); + #endif } break; @@ -236,12 +279,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 + * \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; @@ -255,12 +296,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 + * \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;