mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Corrections and debug channel in the Incomplete Mass Storage class bootloader.
This commit is contained in:
		
							parent
							
								
									4753528b9e
								
							
						
					
					
						commit
						f0c7a11670
					
				| @ -30,22 +30,31 @@ | ||||
| 
 | ||||
| #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}, | ||||
| 		.Description             = "mkdosfs", | ||||
| 		.BlockSize               = VIRTUAL_MEMORY_BLOCK_SIZE, | ||||
| 		.BlocksPerAllocationUnit = ALLOCATION_UNIT_BLOCKS, | ||||
| 		.ReservedBlocks          = 1, | ||||
| 		.SectorSize              = SECTOR_SIZE_BYTES, | ||||
| 		.SectorsPerCluster       = SECTOR_PER_CLUSTER, | ||||
| 		.ReservedSectors         = 1, | ||||
| 		.FATCopies               = 2, | ||||
| 		.RootDirectoryEntries    = 512, | ||||
| 		.TotalBlocks16           = LUN_MEDIA_BLOCKS, | ||||
| 		.RootDirectoryEntries    = SECTOR_SIZE_BYTES / sizeof(FATDirectoryEntry_t), | ||||
| 		.TotalSectors16          = LUN_MEDIA_BLOCKS, | ||||
| 		.MediaDescriptor         = 0xF8, | ||||
| 		.BlocksPerFAT            = 1, | ||||
| 		.BlocksPerTrack          = 32, | ||||
| 		.SectorsPerFAT           = 1, | ||||
| 		.SectorsPerTrack         = 32, | ||||
| 		.Heads                   = 64, | ||||
| 		.HiddenBlocks            = 0, | ||||
| 		.TotalBlocks32           = 0, | ||||
| 		.HiddenSectors           = 0, | ||||
| 		.TotalSectors32          = 0, | ||||
| 		.PhysicalDriveNum        = 0, | ||||
| 		.ExtendedBootRecordSig   = 0x29, | ||||
| 		.VolumeSerialNumber      = 0x12345678, | ||||
| @ -57,14 +66,14 @@ static const FATBootBlock_t BootBlock = | ||||
| 
 | ||||
| static FATDirectoryEntry_t FirmwareFileEntry = | ||||
| 	{ | ||||
| 		.Filename        = "Firmware", | ||||
| 		.Extension       = "bin", | ||||
| 		.Filename        = "FIRMWARE", | ||||
| 		.Extension       = "BIN", | ||||
| 		.Attributes      = 0, | ||||
| 		.Reserved        = {0}, | ||||
| 		.CreationTime    = (1 << 11) | (1 << 5), | ||||
| 		.CreationDate    = (9 << 9)  | (2 << 5) | (14 << 0), | ||||
| 		.StartingCluster = 4, | ||||
| 		.FileSize        = (FLASHEND + 1UL), | ||||
| 		.CreationTime    = FAT_TIME(1, 1, 0), | ||||
| 		.CreationDate    = FAT_DATE(14, 2, 1989), | ||||
| 		.StartingCluster = 2, | ||||
| 		.FileSizeBytes   = 2049, | ||||
| 	}; | ||||
| 
 | ||||
| static void WriteBlock(uint16_t BlockNumber) | ||||
| @ -78,6 +87,7 @@ static void WriteBlock(uint16_t BlockNumber) | ||||
| 	Endpoint_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); | ||||
| 	Endpoint_ClearOUT(); | ||||
| 
 | ||||
| 	printf("WRITE %d\r\n", BlockNumber); | ||||
| 	// TODO: Write to FLASH
 | ||||
| } | ||||
| 
 | ||||
| @ -86,41 +96,49 @@ static void ReadBlock(uint16_t BlockNumber) | ||||
| 	uint8_t BlockBuffer[512]; | ||||
| 	memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); | ||||
| 
 | ||||
| 	printf("READ %d", BlockNumber); | ||||
| 
 | ||||
| 	switch (BlockNumber) | ||||
| 	{ | ||||
| 		case 0: | ||||
| 			memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t)); | ||||
| 			printf(" <B>\r\n"); | ||||
| 			break; | ||||
| 
 | ||||
| 		case 1: | ||||
| 		case 2: | ||||
| 			printf(" <F>\r\n"); | ||||
| 
 | ||||
| 			/* Cluster 0: Media type/Reserved */ | ||||
| 			((uint16_t*)&BlockBuffer)[0] = 0xFF00 | BootBlock.MediaDescriptor; | ||||
| 
 | ||||
| 			/* Cluster 1: Reserved */ | ||||
| 			((uint16_t*)&BlockBuffer)[1] = 0xFFFF; | ||||
| 
 | ||||
| 			/* Cluster 2: Reserved */ | ||||
| 			((uint16_t*)&BlockBuffer)[2] = 0xFFFF; | ||||
| 
 | ||||
| 			/* Cluster 3: FIRMWARE.BIN File Entry */ | ||||
| 			((uint16_t*)&BlockBuffer)[3] = 0xFFFF; | ||||
| 
 | ||||
| 			/* Cluster 4 onwards: Cluster chain of FIRMWARE.BIN */ | ||||
| 			for (uint16_t i = 0; i < ((FLASHEND + 1) / (VIRTUAL_MEMORY_BLOCK_SIZE * ALLOCATION_UNIT_BLOCKS)); i++) | ||||
| 			/* Cluster 2 onwards: Cluster chain of FIRMWARE.BIN */ | ||||
| 			for (uint16_t i = 0; i < FILE_CLUSTERS(2049); i++) | ||||
| 			{ | ||||
| 				((uint16_t*)&BlockBuffer)[i + 4] = i + 5; | ||||
| 				((uint16_t*)&BlockBuffer)[i + 2] = i + 3; | ||||
| 			} | ||||
| 
 | ||||
| 			/* Mark last cluster as end of file */ | ||||
| 			((uint16_t*)&BlockBuffer)[((FLASHEND + 1) / (VIRTUAL_MEMORY_BLOCK_SIZE * ALLOCATION_UNIT_BLOCKS)) + 4] = 0xFFFF; | ||||
| 			((uint16_t*)&BlockBuffer)[FILE_CLUSTERS(2049) + 3] = 0xFFFF; | ||||
| 			break; | ||||
| 
 | ||||
| 		case 3: | ||||
| 			printf("<R>\r\n"); | ||||
| 			memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t)); | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			if ((BlockNumber >= 4) && (BlockNumber < (4 + FILE_CLUSTERS(FIRMWARE_FILE_SIZE)))) | ||||
| 			{ | ||||
| 				printf("<D>\r\n"); | ||||
| 
 | ||||
| 				for (uint16_t i = 0; i < 512; i++) | ||||
| 				  BlockBuffer[i] = '0' + BlockNumber; //A' + (i % 26);
 | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -39,26 +39,28 @@ | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		#define VIRTUAL_MEMORY_BLOCK_SIZE 512 | ||||
| 		#define ALLOCATION_UNIT_BLOCKS    4 | ||||
| 		#define LUN_MEDIA_BLOCKS          ((FLASHEND + 1) / VIRTUAL_MEMORY_BLOCK_SIZE) + 16 | ||||
| 
 | ||||
| 		#define FIRMWARE_FILE_SIZE        (FLASHEND + 1UL) | ||||
| 
 | ||||
| 		#define LUN_MEDIA_BLOCKS          ((FIRMWARE_FILE_SIZE / VIRTUAL_MEMORY_BLOCK_SIZE) + 32) | ||||
| 
 | ||||
| 	/* Type Definitions: */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			uint8_t  Bootstrap[3]; | ||||
| 			uint8_t  Description[8]; | ||||
| 			uint16_t BlockSize; | ||||
| 			uint8_t  BlocksPerAllocationUnit; | ||||
| 			uint16_t ReservedBlocks; | ||||
| 			uint16_t SectorSize; | ||||
| 			uint8_t  SectorsPerCluster; | ||||
| 			uint16_t ReservedSectors; | ||||
| 			uint8_t  FATCopies; | ||||
| 			uint16_t RootDirectoryEntries; | ||||
| 			uint16_t TotalBlocks16; | ||||
| 			uint16_t TotalSectors16; | ||||
| 			uint8_t  MediaDescriptor; | ||||
| 			uint16_t BlocksPerFAT; | ||||
| 			uint16_t BlocksPerTrack; | ||||
| 			uint16_t SectorsPerFAT; | ||||
| 			uint16_t SectorsPerTrack; | ||||
| 			uint16_t Heads; | ||||
| 			uint32_t HiddenBlocks; | ||||
| 			uint32_t TotalBlocks32; | ||||
| 			uint32_t HiddenSectors; | ||||
| 			uint32_t TotalSectors32; | ||||
| 			uint16_t PhysicalDriveNum; | ||||
| 			uint8_t  ExtendedBootRecordSig; | ||||
| 			uint32_t VolumeSerialNumber; | ||||
| @ -70,14 +72,14 @@ | ||||
| 
 | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			uint8_t Filename[8]; | ||||
| 			uint8_t Extension[3]; | ||||
| 			uint8_t Attributes; | ||||
| 			uint8_t Reserved[10]; | ||||
| 			uint8_t  Filename[8]; | ||||
| 			uint8_t  Extension[3]; | ||||
| 			uint8_t  Attributes; | ||||
| 			uint8_t  Reserved[10]; | ||||
| 			uint16_t CreationTime; | ||||
| 			uint16_t CreationDate; | ||||
| 			uint16_t StartingCluster; | ||||
| 			uint32_t FileSize; | ||||
| 			uint32_t FileSizeBytes; | ||||
| 		} FATDirectoryEntry_t; | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
|  | ||||
| @ -95,6 +95,8 @@ void SetupHardware(void) | ||||
| 
 | ||||
| 	/* Hardware Initialization */ | ||||
| 	LEDs_Init(); | ||||
| 	Serial_Init(9600, false); | ||||
| 	Serial_CreateStream(NULL); | ||||
| 	USB_Init(); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -48,6 +48,7 @@ | ||||
| 		#include "Lib/SCSI.h" | ||||
| 
 | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Peripheral/Serial.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
|  | ||||
| @ -14,11 +14,11 @@ | ||||
| MCU          = at90usb1287 | ||||
| ARCH         = AVR8 | ||||
| BOARD        = USBKEY | ||||
| F_CPU        = 8000000 | ||||
| F_CPU        = 16000000 | ||||
| F_USB        = $(F_CPU) | ||||
| OPTIMIZATION = s | ||||
| TARGET       = MassStorage | ||||
| SRC          = $(TARGET).c Descriptors.c Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| SRC          = $(TARGET).c Descriptors.c Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) $(LUFA_SRC_SERIAL) | ||||
| LUFA_PATH    = ../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET) | ||||
| LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera