mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 13:22:31 +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" | #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 = | static const FATBootBlock_t BootBlock = | ||||||
| 	{ | 	{ | ||||||
| 		.Bootstrap               = {0xEB, 0x3C, 0x90}, | 		.Bootstrap               = {0xEB, 0x3C, 0x90}, | ||||||
| 		.Description             = "mkdosfs", | 		.Description             = "mkdosfs", | ||||||
| 		.BlockSize               = VIRTUAL_MEMORY_BLOCK_SIZE, | 		.SectorSize              = SECTOR_SIZE_BYTES, | ||||||
| 		.BlocksPerAllocationUnit = ALLOCATION_UNIT_BLOCKS, | 		.SectorsPerCluster       = SECTOR_PER_CLUSTER, | ||||||
| 		.ReservedBlocks          = 1, | 		.ReservedSectors         = 1, | ||||||
| 		.FATCopies               = 2, | 		.FATCopies               = 2, | ||||||
| 		.RootDirectoryEntries    = 512, | 		.RootDirectoryEntries    = SECTOR_SIZE_BYTES / sizeof(FATDirectoryEntry_t), | ||||||
| 		.TotalBlocks16           = LUN_MEDIA_BLOCKS, | 		.TotalSectors16          = LUN_MEDIA_BLOCKS, | ||||||
| 		.MediaDescriptor         = 0xF8, | 		.MediaDescriptor         = 0xF8, | ||||||
| 		.BlocksPerFAT            = 1, | 		.SectorsPerFAT           = 1, | ||||||
| 		.BlocksPerTrack          = 32, | 		.SectorsPerTrack         = 32, | ||||||
| 		.Heads                   = 64, | 		.Heads                   = 64, | ||||||
| 		.HiddenBlocks            = 0, | 		.HiddenSectors           = 0, | ||||||
| 		.TotalBlocks32           = 0, | 		.TotalSectors32          = 0, | ||||||
| 		.PhysicalDriveNum        = 0, | 		.PhysicalDriveNum        = 0, | ||||||
| 		.ExtendedBootRecordSig   = 0x29, | 		.ExtendedBootRecordSig   = 0x29, | ||||||
| 		.VolumeSerialNumber      = 0x12345678, | 		.VolumeSerialNumber      = 0x12345678, | ||||||
| @ -57,14 +66,14 @@ static const FATBootBlock_t BootBlock = | |||||||
| 
 | 
 | ||||||
| static FATDirectoryEntry_t FirmwareFileEntry = | static FATDirectoryEntry_t FirmwareFileEntry = | ||||||
| 	{ | 	{ | ||||||
| 		.Filename        = "Firmware", | 		.Filename        = "FIRMWARE", | ||||||
| 		.Extension       = "bin", | 		.Extension       = "BIN", | ||||||
| 		.Attributes      = 0, | 		.Attributes      = 0, | ||||||
| 		.Reserved        = {0}, | 		.Reserved        = {0}, | ||||||
| 		.CreationTime    = (1 << 11) | (1 << 5), | 		.CreationTime    = FAT_TIME(1, 1, 0), | ||||||
| 		.CreationDate    = (9 << 9)  | (2 << 5) | (14 << 0), | 		.CreationDate    = FAT_DATE(14, 2, 1989), | ||||||
| 		.StartingCluster = 4, | 		.StartingCluster = 2, | ||||||
| 		.FileSize        = (FLASHEND + 1UL), | 		.FileSizeBytes   = 2049, | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| static void WriteBlock(uint16_t BlockNumber) | 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_Read_Stream_LE(BlockBuffer, sizeof(BlockBuffer), NULL); | ||||||
| 	Endpoint_ClearOUT(); | 	Endpoint_ClearOUT(); | ||||||
| 
 | 
 | ||||||
|  | 	printf("WRITE %d\r\n", BlockNumber); | ||||||
| 	// TODO: Write to FLASH
 | 	// TODO: Write to FLASH
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -86,41 +96,49 @@ static void ReadBlock(uint16_t BlockNumber) | |||||||
| 	uint8_t BlockBuffer[512]; | 	uint8_t BlockBuffer[512]; | ||||||
| 	memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); | 	memset(BlockBuffer, 0x00, sizeof(BlockBuffer)); | ||||||
| 
 | 
 | ||||||
|  | 	printf("READ %d", BlockNumber); | ||||||
|  | 
 | ||||||
| 	switch (BlockNumber) | 	switch (BlockNumber) | ||||||
| 	{ | 	{ | ||||||
| 		case 0: | 		case 0: | ||||||
| 			memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t)); | 			memcpy(BlockBuffer, &BootBlock, sizeof(FATBootBlock_t)); | ||||||
|  | 			printf(" <B>\r\n"); | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case 1: | 		case 1: | ||||||
| 		case 2: | 		case 2: | ||||||
|  | 			printf(" <F>\r\n"); | ||||||
|  | 
 | ||||||
| 			/* Cluster 0: Media type/Reserved */ | 			/* Cluster 0: Media type/Reserved */ | ||||||
| 			((uint16_t*)&BlockBuffer)[0] = 0xFF00 | BootBlock.MediaDescriptor; | 			((uint16_t*)&BlockBuffer)[0] = 0xFF00 | BootBlock.MediaDescriptor; | ||||||
| 
 | 
 | ||||||
| 			/* Cluster 1: Reserved */ | 			/* Cluster 1: Reserved */ | ||||||
| 			((uint16_t*)&BlockBuffer)[1] = 0xFFFF; | 			((uint16_t*)&BlockBuffer)[1] = 0xFFFF; | ||||||
| 
 | 
 | ||||||
| 			/* Cluster 2: Reserved */ | 			/* Cluster 2 onwards: Cluster chain of FIRMWARE.BIN */ | ||||||
| 			((uint16_t*)&BlockBuffer)[2] = 0xFFFF; | 			for (uint16_t i = 0; i < FILE_CLUSTERS(2049); i++) | ||||||
| 
 |  | ||||||
| 			/* 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++) |  | ||||||
| 			{ | 			{ | ||||||
| 				((uint16_t*)&BlockBuffer)[i + 4] = i + 5; | 				((uint16_t*)&BlockBuffer)[i + 2] = i + 3; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			/* Mark last cluster as end of file */ | 			/* 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; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case 3: | 		case 3: | ||||||
|  | 			printf("<R>\r\n"); | ||||||
| 			memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t)); | 			memcpy(BlockBuffer, &FirmwareFileEntry, sizeof(FATDirectoryEntry_t)); | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		default: | 		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; | 			break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -39,26 +39,28 @@ | |||||||
| 
 | 
 | ||||||
| 	/* Macros: */ | 	/* Macros: */ | ||||||
| 		#define VIRTUAL_MEMORY_BLOCK_SIZE 512 | 		#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: */ | 	/* Type Definitions: */ | ||||||
| 		typedef struct | 		typedef struct | ||||||
| 		{ | 		{ | ||||||
| 			uint8_t  Bootstrap[3]; | 			uint8_t  Bootstrap[3]; | ||||||
| 			uint8_t  Description[8]; | 			uint8_t  Description[8]; | ||||||
| 			uint16_t BlockSize; | 			uint16_t SectorSize; | ||||||
| 			uint8_t  BlocksPerAllocationUnit; | 			uint8_t  SectorsPerCluster; | ||||||
| 			uint16_t ReservedBlocks; | 			uint16_t ReservedSectors; | ||||||
| 			uint8_t  FATCopies; | 			uint8_t  FATCopies; | ||||||
| 			uint16_t RootDirectoryEntries; | 			uint16_t RootDirectoryEntries; | ||||||
| 			uint16_t TotalBlocks16; | 			uint16_t TotalSectors16; | ||||||
| 			uint8_t  MediaDescriptor; | 			uint8_t  MediaDescriptor; | ||||||
| 			uint16_t BlocksPerFAT; | 			uint16_t SectorsPerFAT; | ||||||
| 			uint16_t BlocksPerTrack; | 			uint16_t SectorsPerTrack; | ||||||
| 			uint16_t Heads; | 			uint16_t Heads; | ||||||
| 			uint32_t HiddenBlocks; | 			uint32_t HiddenSectors; | ||||||
| 			uint32_t TotalBlocks32; | 			uint32_t TotalSectors32; | ||||||
| 			uint16_t PhysicalDriveNum; | 			uint16_t PhysicalDriveNum; | ||||||
| 			uint8_t  ExtendedBootRecordSig; | 			uint8_t  ExtendedBootRecordSig; | ||||||
| 			uint32_t VolumeSerialNumber; | 			uint32_t VolumeSerialNumber; | ||||||
| @ -70,14 +72,14 @@ | |||||||
| 
 | 
 | ||||||
| 		typedef struct | 		typedef struct | ||||||
| 		{ | 		{ | ||||||
| 			uint8_t Filename[8]; | 			uint8_t  Filename[8]; | ||||||
| 			uint8_t Extension[3]; | 			uint8_t  Extension[3]; | ||||||
| 			uint8_t Attributes; | 			uint8_t  Attributes; | ||||||
| 			uint8_t Reserved[10]; | 			uint8_t  Reserved[10]; | ||||||
| 			uint16_t CreationTime; | 			uint16_t CreationTime; | ||||||
| 			uint16_t CreationDate; | 			uint16_t CreationDate; | ||||||
| 			uint16_t StartingCluster; | 			uint16_t StartingCluster; | ||||||
| 			uint32_t FileSize; | 			uint32_t FileSizeBytes; | ||||||
| 		} FATDirectoryEntry_t; | 		} FATDirectoryEntry_t; | ||||||
| 
 | 
 | ||||||
| 	/* Function Prototypes: */ | 	/* Function Prototypes: */ | ||||||
|  | |||||||
| @ -95,6 +95,8 @@ void SetupHardware(void) | |||||||
| 
 | 
 | ||||||
| 	/* Hardware Initialization */ | 	/* Hardware Initialization */ | ||||||
| 	LEDs_Init(); | 	LEDs_Init(); | ||||||
|  | 	Serial_Init(9600, false); | ||||||
|  | 	Serial_CreateStream(NULL); | ||||||
| 	USB_Init(); | 	USB_Init(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -48,6 +48,7 @@ | |||||||
| 		#include "Lib/SCSI.h" | 		#include "Lib/SCSI.h" | ||||||
| 
 | 
 | ||||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | 		#include <LUFA/Drivers/Board/LEDs.h> | ||||||
|  | 		#include <LUFA/Drivers/Peripheral/Serial.h> | ||||||
| 		#include <LUFA/Drivers/USB/USB.h> | 		#include <LUFA/Drivers/USB/USB.h> | ||||||
| 
 | 
 | ||||||
| 	/* Macros: */ | 	/* Macros: */ | ||||||
|  | |||||||
| @ -14,11 +14,11 @@ | |||||||
| MCU          = at90usb1287 | MCU          = at90usb1287 | ||||||
| ARCH         = AVR8 | ARCH         = AVR8 | ||||||
| BOARD        = USBKEY | BOARD        = USBKEY | ||||||
| F_CPU        = 8000000 | F_CPU        = 16000000 | ||||||
| F_USB        = $(F_CPU) | F_USB        = $(F_CPU) | ||||||
| OPTIMIZATION = s | OPTIMIZATION = s | ||||||
| TARGET       = MassStorage | 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 | LUFA_PATH    = ../../../LUFA | ||||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET) | 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) | 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