mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Significantly reduce the size of the Mass Storage class bootloader, by removing dependencies on large LUFA internal functions.
This commit is contained in:
		
							parent
							
								
									6e8642185a
								
							
						
					
					
						commit
						199cf8f183
					
				| @ -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
 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera