@ -42,15 +42,15 @@ static const FATBootBlock_t BootBlock =
 
			
		
	
		
			
				
							. TotalSectors16           =  LUN_MEDIA_BLOCKS , 
 
			
		
	
		
			
				
							. MediaDescriptor          =  0xF8 , 
 
			
		
	
		
			
				
							. SectorsPerFAT            =  1 , 
 
			
		
	
		
			
				
							. SectorsPerTrack          =  32 , 
 
			
		
	
		
			
				
							. Heads                    =  64 , 
 
			
		
	
		
			
				
							. SectorsPerTrack          =  LUN_MEDIA_BLOCKS  %  64 , 
 
			
		
	
		
			
				
							. Heads                    =  LUN_MEDIA_BLOCKS  /  64 , 
 
			
		
	
		
			
				
							. HiddenSectors            =  0 , 
 
			
		
	
		
			
				
							. TotalSectors32           =  0 , 
 
			
		
	
		
			
				
							. PhysicalDriveNum         =  0 , 
 
			
		
	
		
			
				
							. ExtendedBootRecordSig    =  0x29 , 
 
			
		
	
		
			
				
							. VolumeSerialNumber       =  0x12345678 , 
 
			
		
	
		
			
				
							. VolumeLabel              =  " LUFA BOOT   " , 
 
			
		
	
		
			
				
							. FilesystemIdentifier     =  " FAT1 6    " , 
 
			
		
	
		
			
				
							. FilesystemIdentifier     =  " FAT1 2    " , 
 
			
		
	
		
			
				
							. BootstrapProgram         =  { 0 } , 
 
			
		
	
		
			
				
							. MagicSignature           =  0xAA55 , 
 
			
		
	
		
			
				
						} ; 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -67,7 +67,6 @@ static FATDirectoryEntry_t FirmwareFileEntry =
 
			
		
	
		
			
				
							. FileSizeBytes    =  2049 , 
 
			
		
	
		
			
				
						} ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  WriteBlock ( uint16_t  BlockNumber )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						uint8_t  BlockBuffer [ 512 ] ; 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -83,6 +82,23 @@ static void WriteBlock(uint16_t BlockNumber)
 
			
		
	
		
			
				
						// TODO: Write to FLASH
 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					void  WriteFAT12ClusterEntry ( uint8_t *  FATTable ,  uint8_t  Index ,  uint16_t  NextEntry )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						uint8_t  StartOffset  =  ( ( uint16_t ) Index  *  3 )  /  2 ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Check if the start of the entry is at an upper nibble of the byte */ 
 
			
		
	
		
			
				
						if  ( ( ( uint16_t ) Index  *  3 )  %  2 ) 
 
			
		
	
		
			
				
						{ 
 
			
		
	
		
			
				
							FATTable [ StartOffset ]      | =  ( ( NextEntry  &  0x0F )  < <  4 ) ; 
 
			
		
	
		
			
				
							FATTable [ StartOffset  +  1 ]   =   ( NextEntry  > >  4 ) ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
						else 
 
			
		
	
		
			
				
						{ 
 
			
		
	
		
			
				
							FATTable [ StartOffset ]       =   NextEntry ; 
 
			
		
	
		
			
				
							FATTable [ StartOffset  +  1 ]   =  ( NextEntry  > >  8 ) ; 
 
			
		
	
		
			
				
						} 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  ReadBlock ( uint16_t  BlockNumber )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						uint8_t  BlockBuffer [ 512 ] ; 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -102,19 +118,17 @@ static void ReadBlock(uint16_t BlockNumber)
 
			
		
	
		
			
				
								printf ( "  <F> \r \n " ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								/* Cluster 0: Media type/Reserved */ 
 
			
		
	
		
			
				
								( ( uint16_t * ) & BlockBuffer ) [ 0 ]  =  0xF |  BootBlock . MediaDescriptor ; 
 
			
		
	
		
			
				
								WriteFAT12ClusterEntry ( BlockBuffer ,  0 ,  0x |  BootBlock . MediaDescriptor ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								/* Cluster 1: Reserved */ 
 
			
		
	
		
			
				
								( ( uint16_t * ) & BlockBuffer ) [ 1 ]  =  0xFFFF ; 
 
			
		
	
		
			
				
								WriteFAT12ClusterEntry ( BlockBuffer ,  1 ,  0xFFF ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								/* Cluster 2 onwards: Cluster chain of FIRMWARE.BIN */ 
 
			
		
	
		
			
				
								for  ( uint16_t  i  =  0 ;  i  <  FILE_CLUSTERS ( 2049 ) ;  i + + ) 
 
			
		
	
		
			
				
								{ 
 
			
		
	
		
			
				
									( ( uint16_t * ) & BlockBuffer ) [ i  +  2 ]  =  i  +  3 ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
								  WriteFAT12ClusterEntry ( BlockBuffer ,  i + 2 ,  i + 3 ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								/* Mark last cluster as end of file */ 
 
			
		
	
		
			
				
								( ( uint16_t * ) & BlockBuffer ) [ FILE_CLUSTERS ( 2049 )  +  1 ]  =  0xFFFF ; 
 
			
		
	
		
			
				
								WriteFAT12ClusterEntry ( BlockBuffer ,  FILE_CLUSTERS ( 2049 )  +  1 ,  0xFFF ) ; 
 
			
		
	
		
			
				
								break ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							case  3 :