diff options
Diffstat (limited to 'Projects/Incomplete/StandaloneProgrammer/Lib')
12 files changed, 0 insertions, 2660 deletions
diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/DataflashManager.c b/Projects/Incomplete/StandaloneProgrammer/Lib/DataflashManager.c deleted file mode 100644 index efaf8b096..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/DataflashManager.c +++ /dev/null @@ -1,536 +0,0 @@ -/* -             LUFA Library -     Copyright (C) Dean Camera, 2012. - -  dean [at] fourwalledcubicle [dot] com -           www.lufa-lib.org -*/ - -/* -  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) - -  Permission to use, copy, modify, distribute, and sell this -  software and its documentation for any purpose is hereby granted -  without fee, provided that the above copyright notice appear in -  all copies and that both that the copyright notice and this -  permission notice and warranty disclaimer appear in supporting -  documentation, and that the name of the author not be used in -  advertising or publicity pertaining to distribution of the -  software without specific, written prior permission. - -  The author disclaim all warranties with regard to this -  software, including all implied warranties of merchantability -  and fitness.  In no event shall the author be liable for any -  special, indirect or consequential damages or any damages -  whatsoever resulting from loss of use, data or profits, whether -  in an action of contract, negligence or other tortious action, -  arising out of or in connection with the use or performance of -  this software. -*/ - -/** \file - * - *  Functions to manage the physical Dataflash media, including reading and writing of - *  blocks of data. These functions are called by the SCSI layer when data must be stored - *  or retrieved to/from the physical storage media. If a different media is used (such - *  as a SD card or EEPROM), functions similar to these will need to be generated. - */ - -#define  INCLUDE_FROM_DATAFLASHMANAGER_C -#include "DataflashManager.h" - -#if defined(USB_CAN_BE_DEVICE) -/** Writes blocks (OS blocks, not Dataflash pages) to the storage medium, the board Dataflash IC(s), from - *  the pre-selected data OUT endpoint. This routine reads in OS sized blocks from the endpoint and writes - *  them to the Dataflash in Dataflash page sized blocks. - * - *  \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 DataflashManager_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, -                                  const uint32_t BlockAddress, -                                  uint16_t TotalBlocks) -{ -	uint16_t CurrDFPage          = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) / DATAFLASH_PAGE_SIZE); -	uint16_t CurrDFPageByte      = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) % DATAFLASH_PAGE_SIZE); -	uint8_t  CurrDFPageByteDiv16 = (CurrDFPageByte >> 4); -	bool     UsingSecondBuffer   = false; - -	/* Select the correct starting Dataflash IC for the block requested */ -	Dataflash_SelectChipFromPage(CurrDFPage); - -#if (DATAFLASH_PAGE_SIZE > VIRTUAL_MEMORY_BLOCK_SIZE) -	/* Copy selected dataflash's current page contents to the Dataflash buffer */ -	Dataflash_SendByte(DF_CMD_MAINMEMTOBUFF1); -	Dataflash_SendAddressBytes(CurrDFPage, 0); -	Dataflash_WaitWhileBusy(); -#endif - -	/* Send the Dataflash buffer write command */ -	Dataflash_SendByte(DF_CMD_BUFF1WRITE); -	Dataflash_SendAddressBytes(0, CurrDFPageByte); - -	/* Wait until endpoint is ready before continuing */ -	if (Endpoint_WaitUntilReady()) -	  return; - -	while (TotalBlocks) -	{ -		uint8_t BytesInBlockDiv16 = 0; - -		/* Write an endpoint packet sized data block to the Dataflash */ -		while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) -		{ -			/* Check if the endpoint is currently empty */ -			if (!(Endpoint_IsReadWriteAllowed())) -			{ -				/* Clear the current endpoint bank */ -				Endpoint_ClearOUT(); - -				/* Wait until the host has sent another packet */ -				if (Endpoint_WaitUntilReady()) -				  return; -			} - -			/* Check if end of Dataflash page reached */ -			if (CurrDFPageByteDiv16 == (DATAFLASH_PAGE_SIZE >> 4)) -			{ -				/* Write the Dataflash buffer contents back to the Dataflash page */ -				Dataflash_WaitWhileBusy(); -				Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_BUFF2TOMAINMEMWITHERASE : DF_CMD_BUFF1TOMAINMEMWITHERASE); -				Dataflash_SendAddressBytes(CurrDFPage, 0); - -				/* Reset the Dataflash buffer counter, increment the page counter */ -				CurrDFPageByteDiv16 = 0; -				CurrDFPage++; - -				/* Once all the Dataflash ICs have had their first buffers filled, switch buffers to maintain throughput */ -				if (Dataflash_GetSelectedChip() == DATAFLASH_CHIP_MASK(DATAFLASH_TOTALCHIPS)) -				  UsingSecondBuffer = !(UsingSecondBuffer); - -				/* Select the next Dataflash chip based on the new Dataflash page index */ -				Dataflash_SelectChipFromPage(CurrDFPage); - -#if (DATAFLASH_PAGE_SIZE > VIRTUAL_MEMORY_BLOCK_SIZE) -				/* If less than one Dataflash page remaining, copy over the existing page to preserve trailing data */ -				if ((TotalBlocks * (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) < (DATAFLASH_PAGE_SIZE >> 4)) -				{ -					/* Copy selected dataflash's current page contents to the Dataflash buffer */ -					Dataflash_WaitWhileBusy(); -					Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_MAINMEMTOBUFF2 : DF_CMD_MAINMEMTOBUFF1); -					Dataflash_SendAddressBytes(CurrDFPage, 0); -					Dataflash_WaitWhileBusy(); -				} -#endif - -				/* Send the Dataflash buffer write command */ -				Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_BUFF2WRITE : DF_CMD_BUFF1WRITE); -				Dataflash_SendAddressBytes(0, 0); -			} - -			/* Write one 16-byte chunk of data to the Dataflash */ -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); -			Dataflash_SendByte(Endpoint_Read_8()); - -			/* Increment the Dataflash page 16 byte block counter */ -			CurrDFPageByteDiv16++; - -			/* Increment the block 16 byte block counter */ -			BytesInBlockDiv16++; - -			/* Check if the current command is being aborted by the host */ -			if (MSInterfaceInfo->State.IsMassStoreReset) -			  return; -		} - -		/* Decrement the blocks remaining counter */ -		TotalBlocks--; -	} - -	/* Write the Dataflash buffer contents back to the Dataflash page */ -	Dataflash_WaitWhileBusy(); -	Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_BUFF2TOMAINMEMWITHERASE : DF_CMD_BUFF1TOMAINMEMWITHERASE); -	Dataflash_SendAddressBytes(CurrDFPage, 0x00); -	Dataflash_WaitWhileBusy(); - -	/* If the endpoint is empty, clear it ready for the next packet from the host */ -	if (!(Endpoint_IsReadWriteAllowed())) -	  Endpoint_ClearOUT(); - -	/* Deselect all Dataflash chips */ -	Dataflash_DeselectChip(); -} - -/** Reads blocks (OS blocks, not Dataflash pages) from the storage medium, the board Dataflash IC(s), into - *  the pre-selected data IN endpoint. This routine reads in Dataflash page sized blocks from the Dataflash - *  and writes them in OS sized blocks to the endpoint. - * - *  \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 DataflashManager_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, -                                 const uint32_t BlockAddress, -                                 uint16_t TotalBlocks) -{ -	uint16_t CurrDFPage          = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) / DATAFLASH_PAGE_SIZE); -	uint16_t CurrDFPageByte      = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) % DATAFLASH_PAGE_SIZE); -	uint8_t  CurrDFPageByteDiv16 = (CurrDFPageByte >> 4); - -	/* Select the correct starting Dataflash IC for the block requested */ -	Dataflash_SelectChipFromPage(CurrDFPage); - -	/* Send the Dataflash main memory page read command */ -	Dataflash_SendByte(DF_CMD_MAINMEMPAGEREAD); -	Dataflash_SendAddressBytes(CurrDFPage, CurrDFPageByte); -	Dataflash_SendByte(0x00); -	Dataflash_SendByte(0x00); -	Dataflash_SendByte(0x00); -	Dataflash_SendByte(0x00); - -	/* Wait until endpoint is ready before continuing */ -	if (Endpoint_WaitUntilReady()) -	  return; - -	while (TotalBlocks) -	{ -		uint8_t BytesInBlockDiv16 = 0; - -		/* Write an endpoint packet sized data block to the Dataflash */ -		while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) -		{ -			/* Check if the endpoint is currently full */ -			if (!(Endpoint_IsReadWriteAllowed())) -			{ -				/* Clear the endpoint bank to send its contents to the host */ -				Endpoint_ClearIN(); - -				/* Wait until the endpoint is ready for more data */ -				if (Endpoint_WaitUntilReady()) -				  return; -			} - -			/* Check if end of Dataflash page reached */ -			if (CurrDFPageByteDiv16 == (DATAFLASH_PAGE_SIZE >> 4)) -			{ -				/* Reset the Dataflash buffer counter, increment the page counter */ -				CurrDFPageByteDiv16 = 0; -				CurrDFPage++; - -				/* Select the next Dataflash chip based on the new Dataflash page index */ -				Dataflash_SelectChipFromPage(CurrDFPage); - -				/* Send the Dataflash main memory page read command */ -				Dataflash_SendByte(DF_CMD_MAINMEMPAGEREAD); -				Dataflash_SendAddressBytes(CurrDFPage, 0); -				Dataflash_SendByte(0x00); -				Dataflash_SendByte(0x00); -				Dataflash_SendByte(0x00); -				Dataflash_SendByte(0x00); -			} - -			/* Read one 16-byte chunk of data from the Dataflash */ -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); -			Endpoint_Write_8(Dataflash_ReceiveByte()); - -			/* Increment the Dataflash page 16 byte block counter */ -			CurrDFPageByteDiv16++; - -			/* Increment the block 16 byte block counter */ -			BytesInBlockDiv16++; - -			/* Check if the current command is being aborted by the host */ -			if (MSInterfaceInfo->State.IsMassStoreReset) -			  return; -		} - -		/* Decrement the blocks remaining counter */ -		TotalBlocks--; -	} - -	/* If the endpoint is full, send its contents to the host */ -	if (!(Endpoint_IsReadWriteAllowed())) -	  Endpoint_ClearIN(); - -	/* Deselect all Dataflash chips */ -	Dataflash_DeselectChip(); -} - -/** Writes blocks (OS blocks, not Dataflash pages) to the storage medium, the board Dataflash IC(s), from - *  the given RAM buffer. This routine reads in OS sized blocks from the buffer and writes them to the - *  Dataflash in Dataflash page sized blocks. This can be linked to FAT libraries to write files to the - *  Dataflash. - * - *  \param[in] BlockAddress  Data block starting address for the write sequence - *  \param[in] TotalBlocks   Number of blocks of data to write - *  \param[in] BufferPtr     Pointer to the data source RAM buffer - */ -void DataflashManager_WriteBlocks_RAM(const uint32_t BlockAddress, -                                      uint16_t TotalBlocks, -                                      const uint8_t* BufferPtr) -{ -	uint16_t CurrDFPage          = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) / DATAFLASH_PAGE_SIZE); -	uint16_t CurrDFPageByte      = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) % DATAFLASH_PAGE_SIZE); -	uint8_t  CurrDFPageByteDiv16 = (CurrDFPageByte >> 4); -	bool     UsingSecondBuffer   = false; - -	/* Select the correct starting Dataflash IC for the block requested */ -	Dataflash_SelectChipFromPage(CurrDFPage); - -#if (DATAFLASH_PAGE_SIZE > VIRTUAL_MEMORY_BLOCK_SIZE) -	/* Copy selected dataflash's current page contents to the Dataflash buffer */ -	Dataflash_SendByte(DF_CMD_MAINMEMTOBUFF1); -	Dataflash_SendAddressBytes(CurrDFPage, 0); -	Dataflash_WaitWhileBusy(); -#endif - -	/* Send the Dataflash buffer write command */ -	Dataflash_SendByte(DF_CMD_BUFF1WRITE); -	Dataflash_SendAddressBytes(0, CurrDFPageByte); - -	while (TotalBlocks) -	{ -		uint8_t BytesInBlockDiv16 = 0; - -		/* Write an endpoint packet sized data block to the Dataflash */ -		while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) -		{ -			/* Check if end of Dataflash page reached */ -			if (CurrDFPageByteDiv16 == (DATAFLASH_PAGE_SIZE >> 4)) -			{ -				/* Write the Dataflash buffer contents back to the Dataflash page */ -				Dataflash_WaitWhileBusy(); -				Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_BUFF2TOMAINMEMWITHERASE : DF_CMD_BUFF1TOMAINMEMWITHERASE); -				Dataflash_SendAddressBytes(CurrDFPage, 0); - -				/* Reset the Dataflash buffer counter, increment the page counter */ -				CurrDFPageByteDiv16 = 0; -				CurrDFPage++; - -				/* Once all the Dataflash ICs have had their first buffers filled, switch buffers to maintain throughput */ -				if (Dataflash_GetSelectedChip() == DATAFLASH_CHIP_MASK(DATAFLASH_TOTALCHIPS)) -				  UsingSecondBuffer = !(UsingSecondBuffer); - -				/* Select the next Dataflash chip based on the new Dataflash page index */ -				Dataflash_SelectChipFromPage(CurrDFPage); - -#if (DATAFLASH_PAGE_SIZE > VIRTUAL_MEMORY_BLOCK_SIZE) -				/* If less than one Dataflash page remaining, copy over the existing page to preserve trailing data */ -				if ((TotalBlocks * (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) < (DATAFLASH_PAGE_SIZE >> 4)) -				{ -					/* Copy selected dataflash's current page contents to the Dataflash buffer */ -					Dataflash_WaitWhileBusy(); -					Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_MAINMEMTOBUFF2 : DF_CMD_MAINMEMTOBUFF1); -					Dataflash_SendAddressBytes(CurrDFPage, 0); -					Dataflash_WaitWhileBusy(); -				} -#endif - -				/* Send the Dataflash buffer write command */ -				Dataflash_ToggleSelectedChipCS(); -				Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_BUFF2WRITE : DF_CMD_BUFF1WRITE); -				Dataflash_SendAddressBytes(0, 0); -			} - -			/* Write one 16-byte chunk of data to the Dataflash */ -			for (uint8_t ByteNum = 0; ByteNum < 16; ByteNum++) -			  Dataflash_SendByte(*(BufferPtr++)); - -			/* Increment the Dataflash page 16 byte block counter */ -			CurrDFPageByteDiv16++; - -			/* Increment the block 16 byte block counter */ -			BytesInBlockDiv16++; -		} - -		/* Decrement the blocks remaining counter */ -		TotalBlocks--; -	} - -	/* Write the Dataflash buffer contents back to the Dataflash page */ -	Dataflash_WaitWhileBusy(); -	Dataflash_SendByte(UsingSecondBuffer ? DF_CMD_BUFF2TOMAINMEMWITHERASE : DF_CMD_BUFF1TOMAINMEMWITHERASE); -	Dataflash_SendAddressBytes(CurrDFPage, 0x00); -	Dataflash_WaitWhileBusy(); - -	/* Deselect all Dataflash chips */ -	Dataflash_DeselectChip(); -} - -/** Reads blocks (OS blocks, not Dataflash pages) from the storage medium, the board Dataflash IC(s), into - *  the preallocated RAM buffer. This routine reads in Dataflash page sized blocks from the Dataflash - *  and writes them in OS sized blocks to the given buffer. This can be linked to FAT libraries to read - *  the files stored on the Dataflash. - * - *  \param[in] BlockAddress  Data block starting address for the read sequence - *  \param[in] TotalBlocks   Number of blocks of data to read - *  \param[out] BufferPtr    Pointer to the data destination RAM buffer - */ -void DataflashManager_ReadBlocks_RAM(const uint32_t BlockAddress, -                                     uint16_t TotalBlocks, -                                     uint8_t* BufferPtr) -{ -	uint16_t CurrDFPage          = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) / DATAFLASH_PAGE_SIZE); -	uint16_t CurrDFPageByte      = ((BlockAddress * VIRTUAL_MEMORY_BLOCK_SIZE) % DATAFLASH_PAGE_SIZE); -	uint8_t  CurrDFPageByteDiv16 = (CurrDFPageByte >> 4); - -	/* Select the correct starting Dataflash IC for the block requested */ -	Dataflash_SelectChipFromPage(CurrDFPage); - -	/* Send the Dataflash main memory page read command */ -	Dataflash_SendByte(DF_CMD_MAINMEMPAGEREAD); -	Dataflash_SendAddressBytes(CurrDFPage, CurrDFPageByte); -	Dataflash_SendByte(0x00); -	Dataflash_SendByte(0x00); -	Dataflash_SendByte(0x00); -	Dataflash_SendByte(0x00); - -	while (TotalBlocks) -	{ -		uint8_t BytesInBlockDiv16 = 0; - -		/* Write an endpoint packet sized data block to the Dataflash */ -		while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) -		{ -			/* Check if end of Dataflash page reached */ -			if (CurrDFPageByteDiv16 == (DATAFLASH_PAGE_SIZE >> 4)) -			{ -				/* Reset the Dataflash buffer counter, increment the page counter */ -				CurrDFPageByteDiv16 = 0; -				CurrDFPage++; - -				/* Select the next Dataflash chip based on the new Dataflash page index */ -				Dataflash_SelectChipFromPage(CurrDFPage); - -				/* Send the Dataflash main memory page read command */ -				Dataflash_SendByte(DF_CMD_MAINMEMPAGEREAD); -				Dataflash_SendAddressBytes(CurrDFPage, 0); -				Dataflash_SendByte(0x00); -				Dataflash_SendByte(0x00); -				Dataflash_SendByte(0x00); -				Dataflash_SendByte(0x00); -			} - -			/* Read one 16-byte chunk of data from the Dataflash */ -			for (uint8_t ByteNum = 0; ByteNum < 16; ByteNum++) -			  *(BufferPtr++) = Dataflash_ReceiveByte(); - -			/* Increment the Dataflash page 16 byte block counter */ -			CurrDFPageByteDiv16++; - -			/* Increment the block 16 byte block counter */ -			BytesInBlockDiv16++; -		} - -		/* Decrement the blocks remaining counter */ -		TotalBlocks--; -	} - -	/* Deselect all Dataflash chips */ -	Dataflash_DeselectChip(); -} - -/** Disables the Dataflash memory write protection bits on the board Dataflash ICs, if enabled. */ -void DataflashManager_ResetDataflashProtections(void) -{ -	/* Select first Dataflash chip, send the read status register command */ -	Dataflash_SelectChip(DATAFLASH_CHIP1); -	Dataflash_SendByte(DF_CMD_GETSTATUS); - -	/* Check if sector protection is enabled */ -	if (Dataflash_ReceiveByte() & DF_STATUS_SECTORPROTECTION_ON) -	{ -		Dataflash_ToggleSelectedChipCS(); - -		/* Send the commands to disable sector protection */ -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[0]); -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[1]); -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[2]); -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[3]); -	} - -	/* Select second Dataflash chip (if present on selected board), send read status register command */ -	#if (DATAFLASH_TOTALCHIPS == 2) -	Dataflash_SelectChip(DATAFLASH_CHIP2); -	Dataflash_SendByte(DF_CMD_GETSTATUS); - -	/* Check if sector protection is enabled */ -	if (Dataflash_ReceiveByte() & DF_STATUS_SECTORPROTECTION_ON) -	{ -		Dataflash_ToggleSelectedChipCS(); - -		/* Send the commands to disable sector protection */ -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[0]); -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[1]); -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[2]); -		Dataflash_SendByte(DF_CMD_SECTORPROTECTIONOFF[3]); -	} -	#endif - -	/* Deselect current Dataflash chip */ -	Dataflash_DeselectChip(); -} - -/** Performs a simple test on the attached Dataflash IC(s) to ensure that they are working. - * - *  \return Boolean true if all media chips are working, false otherwise - */ -bool DataflashManager_CheckDataflashOperation(void) -{ -	uint8_t ReturnByte; - -	/* Test first Dataflash IC is present and responding to commands */ -	Dataflash_SelectChip(DATAFLASH_CHIP1); -	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO); -	ReturnByte = Dataflash_ReceiveByte(); -	Dataflash_DeselectChip(); - -	/* If returned data is invalid, fail the command */ -	if (ReturnByte != DF_MANUFACTURER_ATMEL) -	  return false; - -	#if (DATAFLASH_TOTALCHIPS == 2) -	/* Test second Dataflash IC is present and responding to commands */ -	Dataflash_SelectChip(DATAFLASH_CHIP2); -	Dataflash_SendByte(DF_CMD_READMANUFACTURERDEVICEINFO); -	ReturnByte = Dataflash_ReceiveByte(); -	Dataflash_DeselectChip(); - -	/* If returned data is invalid, fail the command */ -	if (ReturnByte != DF_MANUFACTURER_ATMEL) -	  return false; -	#endif - -	return true; -} -#endif - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/DataflashManager.h b/Projects/Incomplete/StandaloneProgrammer/Lib/DataflashManager.h deleted file mode 100644 index d353477da..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/DataflashManager.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -             LUFA Library -     Copyright (C) Dean Camera, 2012. - -  dean [at] fourwalledcubicle [dot] com -           www.lufa-lib.org -*/ - -/* -  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) - -  Permission to use, copy, modify, distribute, and sell this -  software and its documentation for any purpose is hereby granted -  without fee, provided that the above copyright notice appear in -  all copies and that both that the copyright notice and this -  permission notice and warranty disclaimer appear in supporting -  documentation, and that the name of the author not be used in -  advertising or publicity pertaining to distribution of the -  software without specific, written prior permission. - -  The author disclaim all warranties with regard to this -  software, including all implied warranties of merchantability -  and fitness.  In no event shall the author be liable for any -  special, indirect or consequential damages or any damages -  whatsoever resulting from loss of use, data or profits, whether -  in an action of contract, negligence or other tortious action, -  arising out of or in connection with the use or performance of -  this software. -*/ - -/** \file - * - *  Header file for DataflashManager.c. - */ - -#ifndef _DATAFLASH_MANAGER_H_ -#define _DATAFLASH_MANAGER_H_ - -	/* Includes: */ -		#include <avr/io.h> - -		#include "../StandaloneProgrammer.h" -		#include "../Descriptors.h" - -		#include <LUFA/Drivers/USB/USB.h> -		#include <LUFA/Drivers/Board/Dataflash.h> - -	/* Preprocessor Checks: */ -		#if (DATAFLASH_PAGE_SIZE % 16) -			#error Dataflash page size must be a multiple of 16 bytes. -		#endif - -	/* Defines: */ -		/** Total number of bytes of the storage medium, comprised of one or more dataflash ICs. */ -		#define VIRTUAL_MEMORY_BYTES        ((uint32_t)DATAFLASH_PAGES * DATAFLASH_PAGE_SIZE * DATAFLASH_TOTALCHIPS) - -		/** Block size of the device. This is kept at 512 to remain compatible with the OS despite the underlying -		 *  storage media (Dataflash) using a different native block size. Do not change this value. -		 */ -		#define VIRTUAL_MEMORY_BLOCK_SIZE   512 - -		/** Total number of blocks of the virtual memory for reporting to the host as the device's total capacity. Do not -		 *  change this value; change VIRTUAL_MEMORY_BYTES instead to alter the media size. -		 */ -		#define VIRTUAL_MEMORY_BLOCKS       (VIRTUAL_MEMORY_BYTES / VIRTUAL_MEMORY_BLOCK_SIZE) - -		/** Indicates if the disk is write protected or not. */ -		#define DISK_READ_ONLY              false - -	/* Function Prototypes: */ -		#if defined(USB_CAN_BE_DEVICE) -			void DataflashManager_WriteBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, -			                                  const uint32_t BlockAddress, -											  uint16_t TotalBlocks); -			void DataflashManager_ReadBlocks(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, -			                                 const uint32_t BlockAddress, -											 uint16_t TotalBlocks); -			void DataflashManager_WriteBlocks_RAM(const uint32_t BlockAddress, -			                                      uint16_t TotalBlocks, -												  const uint8_t* BufferPtr) ATTR_NON_NULL_PTR_ARG(3); -			void DataflashManager_ReadBlocks_RAM(const uint32_t BlockAddress, -			                                     uint16_t TotalBlocks, -												 uint8_t* BufferPtr) ATTR_NON_NULL_PTR_ARG(3); -			void DataflashManager_ResetDataflashProtections(void); -			bool DataflashManager_CheckDataflashOperation(void); -		#endif - -#endif - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/00readme.txt b/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/00readme.txt deleted file mode 100644 index 26816072d..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/00readme.txt +++ /dev/null @@ -1,42 +0,0 @@ -Petit FatFs Module Source Files R0.02a                (C)ChaN, 2010 - - -FILES - -  pff.h      Common include file for Petit FatFs and application module. -  pff.c      Petit FatFs module. -  diskio.h   Common include file for Petit FatFs and disk I/O module. -  diskio.c   Skeleton of low level disk I/O module. -  integer.h  Alternative type definitions for integer variables. - -  Low level disk I/O module is not included in this archive because the Petit -  FatFs module is only a generic file system layer and not depend on any -  specific storage device. You have to provide a low level disk I/O module that -  written to control your storage device. - - - -AGREEMENTS - - Petit FatFs module is an open source software to implement FAT file system to - small embedded systems. This is a free software and is opened for education, - research and commercial developments under license policy of following trems. - -  Copyright (C) 2010, ChaN, all right reserved. - - * The Petit FatFs module is a free software and there is NO WARRANTY. - * No restriction on use. You can use, modify and redistribute it for -   personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. - * Redistributions of source code must retain the above copyright notice. - - - -REVISION HISTORY - -  Jun 15, 2009  R0.01a  First release (Branched from FatFs R0.07b) -  Dec 14, 2009  R0.02   Added multiple code page support. -                        Added write funciton. -                        Changed stream read mode interface. -  Dec 07,'2010  R0.02a  Added some configuration options. -                        Fixed fails to open objects with DBCS character. - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/diskio.c b/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/diskio.c deleted file mode 100644 index d953875a2..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/diskio.c +++ /dev/null @@ -1,57 +0,0 @@ -/*-----------------------------------------------------------------------*/ -/* Low level disk I/O module skeleton for Petit FatFs (C)ChaN, 2009      */ -/*-----------------------------------------------------------------------*/ - -#include "diskio.h" - -#include <string.h> -#include <LUFA/Drivers/USB/USB.h> -#include "../DataflashManager.h" -#include "../../DiskHost.h" - -/*-----------------------------------------------------------------------*/ -/* Initialize Disk Drive                                                 */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_initialize (void) -{ -	return RES_OK; -} - - - -/*-----------------------------------------------------------------------*/ -/* Read Partial Sector                                                   */ -/*-----------------------------------------------------------------------*/ - -DRESULT disk_readp ( -	BYTE* dest,			/* Pointer to the destination object */ -	DWORD sector,		/* Sector number (LBA) */ -	WORD sofs,			/* Offset in the sector */ -	WORD count			/* Byte count (bit15:destination) */ -) -{ -	DRESULT ErrorCode = RES_OK; -	uint8_t BlockTemp[512]; - -	if (USB_CurrentMode == USB_MODE_Host) -	{ -		#if defined(USB_CAN_BE_HOST) -		if (USB_HostState != HOST_STATE_Configured) -		  ErrorCode = RES_NOTRDY; -		else if (MS_Host_ReadDeviceBlocks(&DiskHost_MS_Interface, 0, sector, 1, 512, BlockTemp)) -		  ErrorCode = RES_ERROR; -		#endif -	} -	else -	{ -		#if defined(USB_CAN_BE_DEVICE) -		DataflashManager_ReadBlocks_RAM(sector, 1, BlockTemp); -		#endif -	} - -	memcpy(dest, &BlockTemp[sofs], count); - -	return ErrorCode; -} - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/diskio.h b/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/diskio.h deleted file mode 100644 index 239d45913..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/diskio.h +++ /dev/null @@ -1,34 +0,0 @@ -/*----------------------------------------------------------------------- -/  PFF - Low level disk interface module include file    (C)ChaN, 2010 -/-----------------------------------------------------------------------*/ - -#ifndef _DISKIO - -#include "integer.h" - - -/* Status of Disk Functions */ -typedef BYTE	DSTATUS; - - -/* Results of Disk Functions */ -typedef enum { -	RES_OK = 0,		/* 0: Function succeeded */ -	RES_ERROR,		/* 1: Disk error */ -	RES_NOTRDY,		/* 2: Not ready */ -	RES_PARERR		/* 3: Invalid parameter */ -} DRESULT; - - -/*---------------------------------------*/ -/* Prototypes for disk control functions */ - -DSTATUS disk_initialize (void); -DRESULT disk_readp (BYTE*, DWORD, WORD, WORD); - -#define STA_NOINIT		0x01	/* Drive not initialized */ -#define STA_NODISK		0x02	/* No medium in the drive */ - -#define _DISKIO -#endif - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/integer.h b/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/integer.h deleted file mode 100644 index 5408fe6b3..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/integer.h +++ /dev/null @@ -1,38 +0,0 @@ -/*-------------------------------------------*/ -/* Integer type definitions for FatFs module */ -/*-------------------------------------------*/ - -#ifndef _INTEGER -#define _INTEGER - -#ifdef _WIN32	/* FatFs development platform */ - -#include <windows.h> -#include <tchar.h> - -#else			/* Embedded platform */ - -/* These types must be 16-bit, 32-bit or larger integer */ -typedef int				INT; -typedef unsigned int	UINT; - -/* These types must be 8-bit integer */ -typedef char			CHAR; -typedef unsigned char	UCHAR; -typedef unsigned char	BYTE; - -/* These types must be 16-bit integer */ -typedef short			SHORT; -typedef unsigned short	USHORT; -typedef unsigned short	WORD; -typedef unsigned short	WCHAR; - -/* These types must be 32-bit integer */ -typedef long			LONG; -typedef unsigned long	ULONG; -typedef unsigned long	DWORD; - -#endif - -#endif - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/pff.c b/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/pff.c deleted file mode 100644 index 29e44f620..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/pff.c +++ /dev/null @@ -1,1114 +0,0 @@ -/*----------------------------------------------------------------------------/ -/  Petit FatFs - FAT file system module  R0.02a                (C)ChaN, 2010 -/-----------------------------------------------------------------------------/ -/ Petit FatFs module is an open source software to implement FAT file system to -/ small embedded systems. This is a free software and is opened for education, -/ research and commercial developments under license policy of following trems. -/ -/  Copyright (C) 2010, ChaN, all right reserved. -/ -/ * The Petit FatFs module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/   personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. -/ -/-----------------------------------------------------------------------------/ -/ Jun 15,'09  R0.01a  First release. (Branched from FatFs R0.07b.) -/ -/ Dec 14,'09  R0.02   Added multiple code page support. -/                     Added write funciton. -/                     Changed stream read mode interface. -/ Dec 07,'10  R0.02a  Added some configuration options. -/                     Fixed fails to open objects with DBCS character. -/----------------------------------------------------------------------------*/ - -#include "pff.h"		/* Petit FatFs configurations and declarations */ -#include "diskio.h"		/* Declarations of low level disk I/O functions */ - - - -/*-------------------------------------------------------------------------- - -   Module Private Definitions - ----------------------------------------------------------------------------*/ - - -#if _FS_FAT32 -#define LD_CLUST(dir)	(((DWORD)LD_WORD(dir+DIR_FstClusHI)<<16) | LD_WORD(dir+DIR_FstClusLO)) -#else -#define LD_CLUST(dir)	LD_WORD(dir+DIR_FstClusLO) -#endif - - -/*--------------------------------------------------------*/ -/* DBCS code ranges and SBCS extend char conversion table */ - -#if _CODE_PAGE == 932	/* Japanese Shift-JIS */ -#define _DF1S	0x81	/* DBC 1st byte range 1 start */ -#define _DF1E	0x9F	/* DBC 1st byte range 1 end */ -#define _DF2S	0xE0	/* DBC 1st byte range 2 start */ -#define _DF2E	0xFC	/* DBC 1st byte range 2 end */ -#define _DS1S	0x40	/* DBC 2nd byte range 1 start */ -#define _DS1E	0x7E	/* DBC 2nd byte range 1 end */ -#define _DS2S	0x80	/* DBC 2nd byte range 2 start */ -#define _DS2E	0xFC	/* DBC 2nd byte range 2 end */ - -#elif _CODE_PAGE == 936	/* Simplified Chinese GBK */ -#define _DF1S	0x81 -#define _DF1E	0xFE -#define _DS1S	0x40 -#define _DS1E	0x7E -#define _DS2S	0x80 -#define _DS2E	0xFE - -#elif _CODE_PAGE == 949	/* Korean */ -#define _DF1S	0x81 -#define _DF1E	0xFE -#define _DS1S	0x41 -#define _DS1E	0x5A -#define _DS2S	0x61 -#define _DS2E	0x7A -#define _DS3S	0x81 -#define _DS3E	0xFE - -#elif _CODE_PAGE == 950	/* Traditional Chinese Big5 */ -#define _DF1S	0x81 -#define _DF1E	0xFE -#define _DS1S	0x40 -#define _DS1E	0x7E -#define _DS2S	0xA1 -#define _DS2E	0xFE - -#elif _CODE_PAGE == 437	/* U.S. (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 720	/* Arabic (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 737	/* Greek (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ -				0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 775	/* Baltic (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ -				0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 850	/* Multilingual Latin 1 (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ -				0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 852	/* Latin 2 (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ -				0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} - -#elif _CODE_PAGE == 855	/* Cyrillic (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ -				0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ -				0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 857	/* Turkish (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ -				0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 858	/* Multilingual Latin 1 + Euro (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ -				0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 862	/* Hebrew (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 866	/* Russian (OEM) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 874	/* Thai (OEM, Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ -				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} - -#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ -				0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} - -#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ -				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} - -#elif _CODE_PAGE == 1253 /* Greek (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ -				0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} - -#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ -				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} - -#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ -				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ -				0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} - -#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ -#define _DF1S	0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ -				0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ -				0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} - -#elif _CODE_PAGE == 1	/* ASCII (for only non-LFN cfg) */ -#define _DF1S	0 - -#else -#error Unknown code page - -#endif - - - -/* Character code support macros */ - -#define IsUpper(c)	(((c)>='A')&&((c)<='Z')) -#define IsLower(c)	(((c)>='a')&&((c)<='z')) - -#if _DF1S		/* DBCS configuration */ - -#ifdef _DF2S	/* Two 1st byte areas */ -#define IsDBCS1(c)	(((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) -#else			/* One 1st byte area */ -#define IsDBCS1(c)	((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) -#endif - -#ifdef _DS3S	/* Three 2nd byte areas */ -#define IsDBCS2(c)	(((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) -#else			/* Two 2nd byte areas */ -#define IsDBCS2(c)	(((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) -#endif - -#else			/* SBCS configuration */ - -#define IsDBCS1(c)	0 -#define IsDBCS2(c)	0 - -#endif /* _DF1S */ - - -/* FatFs refers the members in the FAT structures with byte offset instead -/ of structure member because there are incompatibility of the packing option -/ between various compilers. */ - -#define BS_jmpBoot			0 -#define BS_OEMName			3 -#define BPB_BytsPerSec		11 -#define BPB_SecPerClus		13 -#define BPB_RsvdSecCnt		14 -#define BPB_NumFATs			16 -#define BPB_RootEntCnt		17 -#define BPB_TotSec16		19 -#define BPB_Media			21 -#define BPB_FATSz16			22 -#define BPB_SecPerTrk		24 -#define BPB_NumHeads		26 -#define BPB_HiddSec			28 -#define BPB_TotSec32		32 -#define BS_55AA				510 - -#define BS_DrvNum			36 -#define BS_BootSig			38 -#define BS_VolID			39 -#define BS_VolLab			43 -#define BS_FilSysType		54 - -#define BPB_FATSz32			36 -#define BPB_ExtFlags		40 -#define BPB_FSVer			42 -#define BPB_RootClus		44 -#define BPB_FSInfo			48 -#define BPB_BkBootSec		50 -#define BS_DrvNum32			64 -#define BS_BootSig32		66 -#define BS_VolID32			67 -#define BS_VolLab32			71 -#define BS_FilSysType32		82 - -#define MBR_Table			446 - -#define	DIR_Name			0 -#define	DIR_Attr			11 -#define	DIR_NTres			12 -#define	DIR_CrtTime			14 -#define	DIR_CrtDate			16 -#define	DIR_FstClusHI		20 -#define	DIR_WrtTime			22 -#define	DIR_WrtDate			24 -#define	DIR_FstClusLO		26 -#define	DIR_FileSize		28 - - - -/*-------------------------------------------------------------------------- - -   Private Functions - ----------------------------------------------------------------------------*/ - - -static -FATFS *FatFs;	/* Pointer to the file system object (logical drive) */ - - -/* Fill memory */ -static -void mem_set (void* dst, int val, int cnt) { -	char *d = (char*)dst; -	while (cnt--) *d++ = (char)val; -} - -/* Compare memory to memory */ -static -int mem_cmp (const void* dst, const void* src, int cnt) { -	const char *d = (const char *)dst, *s = (const char *)src; -	int r = 0; -	while (cnt-- && (r = *d++ - *s++) == 0) ; -	return r; -} - - - -/*-----------------------------------------------------------------------*/ -/* FAT access - Read value of a FAT entry                                */ -/*-----------------------------------------------------------------------*/ - -static -CLUST get_fat (	/* 1:IO error, Else:Cluster status */ -	CLUST clst	/* Cluster# to get the link information */ -) -{ -	WORD wc, bc, ofs; -	BYTE buf[4]; -	FATFS *fs = FatFs; - - -	if (clst < 2 || clst >= fs->n_fatent)	/* Range check */ -		return 1; - -	switch (fs->fs_type) { -#if _FS_FAT12 -	case FS_FAT12 : -		bc = (WORD)clst; bc += bc / 2; -		ofs = bc % 512; bc /= 512; -		if (ofs != 511) { -			if (disk_readp(buf, fs->fatbase + bc, ofs, 2)) break; -		} else { -			if (disk_readp(buf, fs->fatbase + bc, 511, 1)) break; -			if (disk_readp(buf+1, fs->fatbase + bc + 1, 0, 1)) break; -		} -		wc = LD_WORD(buf); -		return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); -#endif -	case FS_FAT16 : -		if (disk_readp(buf, fs->fatbase + clst / 256, (WORD)(((WORD)clst % 256) * 2), 2)) break; -		return LD_WORD(buf); -#if _FS_FAT32 -	case FS_FAT32 : -		if (disk_readp(buf, fs->fatbase + clst / 128, (WORD)(((WORD)clst % 128) * 4), 4)) break; -		return LD_DWORD(buf) & 0x0FFFFFFF; -#endif -	} - -	return 1;	/* An error occured at the disk I/O layer */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Get sector# from cluster#                                             */ -/*-----------------------------------------------------------------------*/ - -static -DWORD clust2sect (	/* !=0: Sector number, 0: Failed - invalid cluster# */ -	CLUST clst		/* Cluster# to be converted */ -) -{ -	FATFS *fs = FatFs; - - -	clst -= 2; -	if (clst >= (fs->n_fatent - 2)) return 0;		/* Invalid cluster# */ -	return (DWORD)clst * fs->csize + fs->database; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Directory handling - Rewind directory index                           */ -/*-----------------------------------------------------------------------*/ - -static -FRESULT dir_rewind ( -	DIR *dj			/* Pointer to directory object */ -) -{ -	CLUST clst; -	FATFS *fs = FatFs; - - -	dj->index = 0; -	clst = dj->sclust; -	if (clst == 1 || clst >= fs->n_fatent)	/* Check start cluster range */ -		return FR_DISK_ERR; -	if (_FS_FAT32 && !clst && fs->fs_type == FS_FAT32)	/* Replace cluster# 0 with root cluster# if in FAT32 */ -		clst = (CLUST)fs->dirbase; -	dj->clust = clst;						/* Current cluster */ -	dj->sect = clst ? clust2sect(clst) : fs->dirbase;	/* Current sector */ - -	return FR_OK;	/* Seek succeeded */ -} - - - - -/*-----------------------------------------------------------------------*/ -/* Directory handling - Move directory index next                        */ -/*-----------------------------------------------------------------------*/ - -static -FRESULT dir_next (	/* FR_OK:Succeeded, FR_NO_FILE:End of table */ -	DIR *dj			/* Pointer to directory object */ -) -{ -	CLUST clst; -	WORD i; -	FATFS *fs = FatFs; - - -	i = dj->index + 1; -	if (!i || !dj->sect)	/* Report EOT when index has reached 65535 */ -		return FR_NO_FILE; - -	if (!(i % 16)) {		/* Sector changed? */ -		dj->sect++;			/* Next sector */ - -		if (dj->clust == 0) {	/* Static table */ -			if (i >= fs->n_rootdir)	/* Report EOT when end of table */ -				return FR_NO_FILE; -		} -		else {					/* Dynamic table */ -			if (((i / 16) & (fs->csize-1)) == 0) {	/* Cluster changed? */ -				clst = get_fat(dj->clust);		/* Get next cluster */ -				if (clst <= 1) return FR_DISK_ERR; -				if (clst >= fs->n_fatent)		/* When it reached end of dynamic table */ -					return FR_NO_FILE;			/* Report EOT */ -				dj->clust = clst;				/* Initialize data for new cluster */ -				dj->sect = clust2sect(clst); -			} -		} -	} - -	dj->index = i; - -	return FR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Directory handling - Find an object in the directory                  */ -/*-----------------------------------------------------------------------*/ - -static -FRESULT dir_find ( -	DIR *dj,		/* Pointer to the directory object linked to the file name */ -	BYTE *dir		/* 32-byte working buffer */ -) -{ -	FRESULT res; -	BYTE c; - - -	res = dir_rewind(dj);			/* Rewind directory object */ -	if (res != FR_OK) return res; - -	do { -		res = disk_readp(dir, dj->sect, (WORD)((dj->index % 16) * 32), 32)	/* Read an entry */ -			? FR_DISK_ERR : FR_OK; -		if (res != FR_OK) break; -		c = dir[DIR_Name];	/* First character */ -		if (c == 0) { res = FR_NO_FILE; break; }	/* Reached to end of table */ -		if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ -			break; -		res = dir_next(dj);					/* Next entry */ -	} while (res == FR_OK); - -	return res; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Read an object from the directory                                     */ -/*-----------------------------------------------------------------------*/ -#if _USE_DIR -static -FRESULT dir_read ( -	DIR *dj,		/* Pointer to the directory object to store read object name */ -	BYTE *dir		/* 32-byte working buffer */ -) -{ -	FRESULT res; -	BYTE a, c; - - -	res = FR_NO_FILE; -	while (dj->sect) { -		res = disk_readp(dir, dj->sect, (WORD)((dj->index % 16) * 32), 32)	/* Read an entry */ -			? FR_DISK_ERR : FR_OK; -		if (res != FR_OK) break; -		c = dir[DIR_Name]; -		if (c == 0) { res = FR_NO_FILE; break; }	/* Reached to end of table */ -		a = dir[DIR_Attr] & AM_MASK; -		if (c != 0xE5 && c != '.' && !(a & AM_VOL))	/* Is it a valid entry? */ -			break; -		res = dir_next(dj);			/* Next entry */ -		if (res != FR_OK) break; -	} - -	if (res != FR_OK) dj->sect = 0; - -	return res; -} -#endif - - - -/*-----------------------------------------------------------------------*/ -/* Pick a segment and create the object name in directory form           */ -/*-----------------------------------------------------------------------*/ - -#ifdef _EXCVT -	static const BYTE cvt[] = _EXCVT; -#endif - -static -FRESULT create_name ( -	DIR *dj,			/* Pointer to the directory object */ -	const char **path	/* Pointer to pointer to the segment in the path string */ -) -{ -	BYTE c, d, ni, si, i, *sfn; -	const char *p; - -	/* Create file name in directory form */ -	sfn = dj->fn; -	mem_set(sfn, ' ', 11); -	si = i = 0; ni = 8; -	p = *path; -	for (;;) { -		c = p[si++]; -		if (c <= ' ' || c == '/') break;	/* Break on end of segment */ -		if (c == '.' || i >= ni) { -			if (ni != 8 || c != '.') break; -			i = 8; ni = 11; -			continue; -		} -#ifdef _EXCVT -		if (c >= 0x80)					/* To upper extended char (SBCS) */ -			c = cvt[c - 0x80]; -#endif -		if (IsDBCS1(c) && i < ni - 1) {	/* DBC 1st byte? */ -			d = p[si++];				/* Get 2nd byte */ -			sfn[i++] = c; -			sfn[i++] = d; -		} else {						/* Single byte code */ -			if (IsLower(c)) c -= 0x20;	/* toupper */ -			sfn[i++] = c; -		} -	} -	*path = &p[si];						/* Rerurn pointer to the next segment */ - -	sfn[11] = (c <= ' ') ? 1 : 0;		/* Set last segment flag if end of path */ - -	return FR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Get file information from directory entry                             */ -/*-----------------------------------------------------------------------*/ -#if _USE_DIR -static -void get_fileinfo (		/* No return code */ -	DIR *dj,			/* Pointer to the directory object */ -	BYTE *dir,			/* 32-byte working buffer */ -	FILINFO *fno	 	/* Pointer to store the file information */ -) -{ -	BYTE i, c; -	char *p; - - -	p = fno->fname; -	if (dj->sect) { -		for (i = 0; i < 8; i++) {	/* Copy file name body */ -			c = dir[i]; -			if (c == ' ') break; -			if (c == 0x05) c = 0xE5; -			*p++ = c; -		} -		if (dir[8] != ' ') {		/* Copy file name extension */ -			*p++ = '.'; -			for (i = 8; i < 11; i++) { -				c = dir[i]; -				if (c == ' ') break; -				*p++ = c; -			} -		} -		fno->fattrib = dir[DIR_Attr];				/* Attribute */ -		fno->fsize = LD_DWORD(dir+DIR_FileSize);	/* Size */ -		fno->fdate = LD_WORD(dir+DIR_WrtDate);		/* Date */ -		fno->ftime = LD_WORD(dir+DIR_WrtTime);		/* Time */ -	} -	*p = 0; -} -#endif /* _USE_DIR */ - - - -/*-----------------------------------------------------------------------*/ -/* Follow a file path                                                    */ -/*-----------------------------------------------------------------------*/ - -static -FRESULT follow_path (	/* FR_OK(0): successful, !=0: error code */ -	DIR *dj,			/* Directory object to return last directory and found object */ -	BYTE *dir,			/* 32-byte working buffer */ -	const char *path	/* Full-path string to find a file or directory */ -) -{ -	FRESULT res; - - -	while (*path == ' ') path++;		/* Skip leading spaces */ -	if (*path == '/') path++;			/* Strip heading separator */ -	dj->sclust = 0;						/* Set start directory (always root dir) */ - -	if ((BYTE)*path <= ' ') {			/* Null path means the root directory */ -		res = dir_rewind(dj); -		dir[0] = 0; - -	} else {							/* Follow path */ -		for (;;) { -			res = create_name(dj, &path);	/* Get a segment */ -			if (res != FR_OK) break; -			res = dir_find(dj, dir);		/* Find it */ -			if (res != FR_OK) {				/* Could not find the object */ -				if (res == FR_NO_FILE && !*(dj->fn+11)) -					res = FR_NO_PATH; -				break; -			} -			if (*(dj->fn+11)) break;		/* Last segment match. Function completed. */ -			if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ -				res = FR_NO_PATH; break; -			} -			dj->sclust = LD_CLUST(dir); -		} -	} - -	return res; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Check a sector if it is an FAT boot record                            */ -/*-----------------------------------------------------------------------*/ - -static -BYTE check_fs (	/* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ -	BYTE *buf,	/* Working buffer */ -	DWORD sect	/* Sector# (lba) to check if it is an FAT boot record or not */ -) -{ -	if (disk_readp(buf, sect, 510, 2))		/* Read the boot sector */ -		return 3; -	if (LD_WORD(buf) != 0xAA55)				/* Check record signature */ -		return 2; - -	if (!disk_readp(buf, sect, BS_FilSysType, 2) && LD_WORD(buf) == 0x4146)	/* Check FAT12/16 */ -		return 0; -	if (_FS_FAT32 && !disk_readp(buf, sect, BS_FilSysType32, 2) && LD_WORD(buf) == 0x4146)	/* Check FAT32 */ -		return 0; -	return 1; -} - - - - -/*-------------------------------------------------------------------------- - -   Public Functions - ---------------------------------------------------------------------------*/ - - - -/*-----------------------------------------------------------------------*/ -/* Mount/Unmount a Locical Drive                                         */ -/*-----------------------------------------------------------------------*/ - -FRESULT pf_mount ( -	FATFS *fs		/* Pointer to new file system object (NULL: Unmount) */ -) -{ -	BYTE fmt, buf[36]; -	DWORD bsect, fsize, tsect, mclst; - - -	FatFs = 0; -	if (!fs) return FR_OK;				/* Unregister fs object */ - -	if (disk_initialize() & STA_NOINIT)	/* Check if the drive is ready or not */ -		return FR_NOT_READY; - -	/* Search FAT partition on the drive */ -	bsect = 0; -	fmt = check_fs(buf, bsect);			/* Check sector 0 as an SFD format */ -	if (fmt == 1) {						/* Not an FAT boot record, it may be FDISK format */ -		/* Check a partition listed in top of the partition table */ -		if (disk_readp(buf, bsect, MBR_Table, 16)) {	/* 1st partition entry */ -			fmt = 3; -		} else { -			if (buf[4]) {					/* Is the partition existing? */ -				bsect = LD_DWORD(&buf[8]);	/* Partition offset in LBA */ -				fmt = check_fs(buf, bsect);	/* Check the partition */ -			} -		} -	} -	if (fmt == 3) return FR_DISK_ERR; -	if (fmt) return FR_NO_FILESYSTEM;	/* No valid FAT patition is found */ - -	/* Initialize the file system object */ -	if (disk_readp(buf, bsect, 13, sizeof(buf))) return FR_DISK_ERR; - -	fsize = LD_WORD(buf+BPB_FATSz16-13);				/* Number of sectors per FAT */ -	if (!fsize) fsize = LD_DWORD(buf+BPB_FATSz32-13); - -	fsize *= buf[BPB_NumFATs-13];						/* Number of sectors in FAT area */ -	fs->fatbase = bsect + LD_WORD(buf+BPB_RsvdSecCnt-13); /* FAT start sector (lba) */ -	fs->csize = buf[BPB_SecPerClus-13];					/* Number of sectors per cluster */ -	fs->n_rootdir = LD_WORD(buf+BPB_RootEntCnt-13);		/* Nmuber of root directory entries */ -	tsect = LD_WORD(buf+BPB_TotSec16-13);				/* Number of sectors on the file system */ -	if (!tsect) tsect = LD_DWORD(buf+BPB_TotSec32-13); -	mclst = (tsect						/* Last cluster# + 1 */ -		- LD_WORD(buf+BPB_RsvdSecCnt-13) - fsize - fs->n_rootdir / 16 -		) / fs->csize + 2; -	fs->n_fatent = (CLUST)mclst; - -	fmt = FS_FAT16;							/* Determine the FAT sub type */ -	if (mclst < 0xFF7) 						/* Number of clusters < 0xFF5 */ -#if _FS_FAT12 -		fmt = FS_FAT12; -#else -		return FR_NO_FILESYSTEM; -#endif -	if (mclst >= 0xFFF7)					/* Number of clusters >= 0xFFF5 */ -#if _FS_FAT32 -		fmt = FS_FAT32; -#else -		return FR_NO_FILESYSTEM; -#endif - -	fs->fs_type = fmt;		/* FAT sub-type */ -	if (_FS_FAT32 && fmt == FS_FAT32) -		fs->dirbase = LD_DWORD(buf+(BPB_RootClus-13));	/* Root directory start cluster */ -	else -		fs->dirbase = fs->fatbase + fsize;				/* Root directory start sector (lba) */ -	fs->database = fs->fatbase + fsize + fs->n_rootdir / 16;	/* Data start sector (lba) */ - -	fs->flag = 0; -	FatFs = fs; - -	return FR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Open or Create a File                                                 */ -/*-----------------------------------------------------------------------*/ - -FRESULT pf_open ( -	const char *path	/* Pointer to the file name */ -) -{ -	FRESULT res; -	DIR dj; -	BYTE sp[12], dir[32]; -	FATFS *fs = FatFs; - - -	if (!fs)						/* Check file system */ -		return FR_NOT_ENABLED; - -	fs->flag = 0; -	dj.fn = sp; -	res = follow_path(&dj, dir, path);	/* Follow the file path */ -	if (res != FR_OK) return res;		/* Follow failed */ -	if (!dir[0] || (dir[DIR_Attr] & AM_DIR))	/* It is a directory */ -		return FR_NO_FILE; - -	fs->org_clust = LD_CLUST(dir);			/* File start cluster */ -	fs->fsize = LD_DWORD(dir+DIR_FileSize);	/* File size */ -	fs->fptr = 0;						/* File pointer */ -	fs->flag = FA_OPENED; - -	return FR_OK; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Read File                                                             */ -/*-----------------------------------------------------------------------*/ -#if _USE_READ - -FRESULT pf_read ( -	void* buff,		/* Pointer to the read buffer (NULL:Forward data to the stream)*/ -	WORD btr,		/* Number of bytes to read */ -	WORD* br		/* Pointer to number of bytes read */ -) -{ -	DRESULT dr; -	CLUST clst; -	DWORD sect, remain; -	WORD rcnt; -	BYTE cs, *rbuff = buff; -	FATFS *fs = FatFs; - - -	*br = 0; -	if (!fs) return FR_NOT_ENABLED;		/* Check file system */ -	if (!(fs->flag & FA_OPENED))		/* Check if opened */ -		return FR_NOT_OPENED; - -	remain = fs->fsize - fs->fptr; -	if (btr > remain) btr = (WORD)remain;			/* Truncate btr by remaining bytes */ - -	while (btr)	{									/* Repeat until all data transferred */ -		if ((fs->fptr % 512) == 0) {				/* On the sector boundary? */ -			cs = (BYTE)(fs->fptr / 512 & (fs->csize - 1));	/* Sector offset in the cluster */ -			if (!cs) {								/* On the cluster boundary? */ -				clst = (fs->fptr == 0) ?			/* On the top of the file? */ -					fs->org_clust : get_fat(fs->curr_clust); -				if (clst <= 1) goto fr_abort; -				fs->curr_clust = clst;				/* Update current cluster */ -			} -			sect = clust2sect(fs->curr_clust);		/* Get current sector */ -			if (!sect) goto fr_abort; -			fs->dsect = sect + cs; -		} -		rcnt = (WORD)(512 - (fs->fptr % 512));		/* Get partial sector data from sector buffer */ -		if (rcnt > btr) rcnt = btr; -		dr = disk_readp(!buff ? 0 : rbuff, fs->dsect, (WORD)(fs->fptr % 512), rcnt); -		if (dr) goto fr_abort; -		fs->fptr += rcnt; rbuff += rcnt;			/* Update pointers and counters */ -		btr -= rcnt; *br += rcnt; -	} - -	return FR_OK; - -fr_abort: -	fs->flag = 0; -	return FR_DISK_ERR; -} -#endif - - - -/*-----------------------------------------------------------------------*/ -/* Write File                                                            */ -/*-----------------------------------------------------------------------*/ -#if _USE_WRITE - -FRESULT pf_write ( -	const void* buff,	/* Pointer to the data to be written */ -	WORD btw,			/* Number of bytes to write (0:Finalize the current write operation) */ -	WORD* bw			/* Pointer to number of bytes written */ -) -{ -	CLUST clst; -	DWORD sect, remain; -	const BYTE *p = buff; -	BYTE cs; -	WORD wcnt; -	FATFS *fs = FatFs; - - -	*bw = 0; -	if (!fs) return FR_NOT_ENABLED;		/* Check file system */ -	if (!(fs->flag & FA_OPENED))		/* Check if opened */ -		return FR_NOT_OPENED; - -	if (!btw) {		/* Finalize request */ -		if ((fs->flag & FA__WIP) && disk_writep(0, 0)) goto fw_abort; -		fs->flag &= ~FA__WIP; -		return FR_OK; -	} else {		/* Write data request */ -		if (!(fs->flag & FA__WIP))		/* Round-down fptr to the sector boundary */ -			fs->fptr &= 0xFFFFFE00; -	} -	remain = fs->fsize - fs->fptr; -	if (btw > remain) btw = (WORD)remain;			/* Truncate btw by remaining bytes */ - -	while (btw)	{									/* Repeat until all data transferred */ -		if (((WORD)fs->fptr % 512) == 0) {			/* On the sector boundary? */ -			cs = (BYTE)(fs->fptr / 512 & (fs->csize - 1));	/* Sector offset in the cluster */ -			if (!cs) {								/* On the cluster boundary? */ -				clst = (fs->fptr == 0) ?			/* On the top of the file? */ -					fs->org_clust : get_fat(fs->curr_clust); -				if (clst <= 1) goto fw_abort; -				fs->curr_clust = clst;				/* Update current cluster */ -			} -			sect = clust2sect(fs->curr_clust);		/* Get current sector */ -			if (!sect) goto fw_abort; -			fs->dsect = sect + cs; -			if (disk_writep(0, fs->dsect)) goto fw_abort;	/* Initiate a sector write operation */ -			fs->flag |= FA__WIP; -		} -		wcnt = 512 - ((WORD)fs->fptr % 512);		/* Number of bytes to write to the sector */ -		if (wcnt > btw) wcnt = btw; -		if (disk_writep(p, wcnt)) goto fw_abort;	/* Send data to the sector */ -		fs->fptr += wcnt; p += wcnt;				/* Update pointers and counters */ -		btw -= wcnt; *bw += wcnt; -		if (((WORD)fs->fptr % 512) == 0) { -			if (disk_writep(0, 0)) goto fw_abort;	/* Finalize the currtent secter write operation */ -			fs->flag &= ~FA__WIP; -		} -	} - -	return FR_OK; - -fw_abort: -	fs->flag = 0; -	return FR_DISK_ERR; -} -#endif - - - -/*-----------------------------------------------------------------------*/ -/* Seek File R/W Pointer                                                 */ -/*-----------------------------------------------------------------------*/ -#if _USE_LSEEK - -FRESULT pf_lseek ( -	DWORD ofs		/* File pointer from top of file */ -) -{ -	CLUST clst; -	DWORD bcs, sect, ifptr; -	FATFS *fs = FatFs; - - -	if (!fs) return FR_NOT_ENABLED;		/* Check file system */ -	if (!(fs->flag & FA_OPENED))		/* Check if opened */ -			return FR_NOT_OPENED; - -	if (ofs > fs->fsize) ofs = fs->fsize;	/* Clip offset with the file size */ -	ifptr = fs->fptr; -	fs->fptr = 0; -	if (ofs > 0) { -		bcs = (DWORD)fs->csize * 512;	/* Cluster size (byte) */ -		if (ifptr > 0 && -			(ofs - 1) / bcs >= (ifptr - 1) / bcs) {	/* When seek to same or following cluster, */ -			fs->fptr = (ifptr - 1) & ~(bcs - 1);	/* start from the current cluster */ -			ofs -= fs->fptr; -			clst = fs->curr_clust; -		} else {							/* When seek to back cluster, */ -			clst = fs->org_clust;			/* start from the first cluster */ -			fs->curr_clust = clst; -		} -		while (ofs > bcs) {				/* Cluster following loop */ -			clst = get_fat(clst);		/* Follow cluster chain */ -			if (clst <= 1 || clst >= fs->n_fatent) goto fe_abort; -			fs->curr_clust = clst; -			fs->fptr += bcs; -			ofs -= bcs; -		} -		fs->fptr += ofs; -		sect = clust2sect(clst);		/* Current sector */ -		if (!sect) goto fe_abort; -		fs->dsect = sect + (fs->fptr / 512 & (fs->csize - 1)); -	} - -	return FR_OK; - -fe_abort: -	fs->flag = 0; -	return FR_DISK_ERR; -} -#endif - - - -/*-----------------------------------------------------------------------*/ -/* Create a Directroy Object                                             */ -/*-----------------------------------------------------------------------*/ -#if _USE_DIR - -FRESULT pf_opendir ( -	DIR *dj,			/* Pointer to directory object to create */ -	const char *path	/* Pointer to the directory path */ -) -{ -	FRESULT res; -	BYTE sp[12], dir[32]; -	FATFS *fs = FatFs; - - -	if (!fs) {				/* Check file system */ -		res = FR_NOT_ENABLED; -	} else { -		dj->fn = sp; -		res = follow_path(dj, dir, path);		/* Follow the path to the directory */ -		if (res == FR_OK) {						/* Follow completed */ -			if (dir[0]) {						/* It is not the root dir */ -				if (dir[DIR_Attr] & AM_DIR)		/* The object is a directory */ -					dj->sclust = LD_CLUST(dir); -				else							/* The object is not a directory */ -					res = FR_NO_PATH; -			} -			if (res == FR_OK) -				res = dir_rewind(dj);			/* Rewind dir */ -		} -		if (res == FR_NO_FILE) res = FR_NO_PATH; -	} - -	return res; -} - - - - -/*-----------------------------------------------------------------------*/ -/* Read Directory Entry in Sequense                                      */ -/*-----------------------------------------------------------------------*/ - -FRESULT pf_readdir ( -	DIR *dj,			/* Pointer to the open directory object */ -	FILINFO *fno		/* Pointer to file information to return */ -) -{ -	FRESULT res; -	BYTE sp[12], dir[32]; -	FATFS *fs = FatFs; - - -	if (!fs) {				/* Check file system */ -		res = FR_NOT_ENABLED; -	} else { -		dj->fn = sp; -		if (!fno) { -			res = dir_rewind(dj); -		} else { -			res = dir_read(dj, dir); -			if (res == FR_NO_FILE) { -				dj->sect = 0; -				res = FR_OK; -			} -			if (res == FR_OK) {				/* A valid entry is found */ -				get_fileinfo(dj, dir, fno);	/* Get the object information */ -				res = dir_next(dj);			/* Increment index for next */ -				if (res == FR_NO_FILE) { -					dj->sect = 0; -					res = FR_OK; -				} -			} -		} -	} - -	return res; -} - -#endif /* _USE_DIR */ - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/pff.h b/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/pff.h deleted file mode 100644 index 82f8832c7..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/PetiteFATFs/pff.h +++ /dev/null @@ -1,193 +0,0 @@ -/*---------------------------------------------------------------------------/ -/  Petit FatFs - FAT file system module include file  R0.02a   (C)ChaN, 2010 -/----------------------------------------------------------------------------/ -/ Petit FatFs module is an open source software to implement FAT file system to -/ small embedded systems. This is a free software and is opened for education, -/ research and commercial developments under license policy of following trems. -/ -/  Copyright (C) 2010, ChaN, all right reserved. -/ -/ * The Petit FatFs module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/   personal, non-profit or commercial use UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. -/ -/----------------------------------------------------------------------------*/ - -#include "integer.h" - -/*---------------------------------------------------------------------------/ -/ Petit FatFs Configuration Options -/ -/ CAUTION! Do not forget to make clean the project after any changes to -/ the configuration options. -/ -/----------------------------------------------------------------------------*/ -#ifndef _FATFS -#define _FATFS - -#define	_USE_READ	1	/* 1:Enable pf_read() */ - -#define	_USE_DIR	0	/* 1:Enable pf_opendir() and pf_readdir() */ - -#define	_USE_LSEEK	0	/* 1:Enable pf_lseek() */ - -#define	_USE_WRITE	0	/* 1:Enable pf_write() */ - -#define _FS_FAT12	1	/* 1:Enable FAT12 support */ -#define _FS_FAT32	0	/* 1:Enable FAT32 support */ - - -#define	_CODE_PAGE	1 -/* Defines which code page is used for path name. Supported code pages are: -/  932, 936, 949, 950, 437, 720, 737, 775, 850, 852, 855, 857, 858, 862, 866, -/  874, 1250, 1251, 1252, 1253, 1254, 1255, 1257, 1258 and 1 (ASCII only). -/  SBCS code pages except for 1 requiers a case conversion table. This -/  might occupy 128 bytes on the RAM on some platforms, e.g. avr-gcc. */ - - -#define _WORD_ACCESS	0 -/* The _WORD_ACCESS option defines which access method is used to the word -/  data in the FAT structure. -/ -/   0: Byte-by-byte access. Always compatible with all platforms. -/   1: Word access. Do not choose this unless following condition is met. -/ -/  When the byte order on the memory is big-endian or address miss-aligned -/  word access results incorrect behavior, the _WORD_ACCESS must be set to 0. -/  If it is not the case, the value can also be set to 1 to improve the -/  performance and code efficiency. */ - - -/* End of configuration options. Do not change followings without care.     */ -/*--------------------------------------------------------------------------*/ - - - -#if _FS_FAT32 -#define	CLUST	DWORD -#else -#define	CLUST	WORD -#endif - - -/* File system object structure */ - -typedef struct { -	BYTE	fs_type;	/* FAT sub type */ -	BYTE	flag;		/* File status flags */ -	BYTE	csize;		/* Number of sectors per cluster */ -	BYTE	pad1; -	WORD	n_rootdir;	/* Number of root directory entries (0 on FAT32) */ -	CLUST	n_fatent;	/* Number of FAT entries (= number of clusters + 2) */ -	DWORD	fatbase;	/* FAT start sector */ -	DWORD	dirbase;	/* Root directory start sector (Cluster# on FAT32) */ -	DWORD	database;	/* Data start sector */ -	DWORD	fptr;		/* File R/W pointer */ -	DWORD	fsize;		/* File size */ -	CLUST	org_clust;	/* File start cluster */ -	CLUST	curr_clust;	/* File current cluster */ -	DWORD	dsect;		/* File current data sector */ -} FATFS; - - - -/* Directory object structure */ - -typedef struct { -	WORD	index;		/* Current read/write index number */ -	BYTE*	fn;			/* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ -	CLUST	sclust;		/* Table start cluster (0:Static table) */ -	CLUST	clust;		/* Current cluster */ -	DWORD	sect;		/* Current sector */ -} DIR; - - - -/* File status structure */ - -typedef struct { -	DWORD	fsize;		/* File size */ -	WORD	fdate;		/* Last modified date */ -	WORD	ftime;		/* Last modified time */ -	BYTE	fattrib;	/* Attribute */ -	char	fname[13];	/* File name */ -} FILINFO; - - - -/* File function return code (FRESULT) */ - -typedef enum { -	FR_OK = 0,			/* 0 */ -	FR_DISK_ERR,		/* 1 */ -	FR_NOT_READY,		/* 2 */ -	FR_NO_FILE,			/* 3 */ -	FR_NO_PATH,			/* 4 */ -	FR_NOT_OPENED,		/* 5 */ -	FR_NOT_ENABLED,		/* 6 */ -	FR_NO_FILESYSTEM	/* 7 */ -} FRESULT; - - - -/*--------------------------------------------------------------*/ -/* Petit FatFs module application interface                     */ - -FRESULT pf_mount (FATFS*);						/* Mount/Unmount a logical drive */ -FRESULT pf_open (const char*);					/* Open a file */ -FRESULT pf_read (void*, WORD, WORD*);			/* Read data from the open file */ -FRESULT pf_write (const void*, WORD, WORD*);	/* Write data to the open file */ -FRESULT pf_lseek (DWORD);						/* Move file pointer of the open file */ -FRESULT pf_opendir (DIR*, const char*);			/* Open a directory */ -FRESULT pf_readdir (DIR*, FILINFO*);			/* Read a directory item from the open directory */ - - - -/*--------------------------------------------------------------*/ -/* Flags and offset address                                     */ - -/* File status flag (FATFS.flag) */ - -#define	FA_OPENED	0x01 -#define	FA_WPRT		0x02 -#define	FA__WIP		0x40 - - -/* FAT sub type (FATFS.fs_type) */ - -#define FS_FAT12	1 -#define FS_FAT16	2 -#define FS_FAT32	3 - - -/* File attribute bits for directory entry */ - -#define	AM_RDO	0x01	/* Read only */ -#define	AM_HID	0x02	/* Hidden */ -#define	AM_SYS	0x04	/* System */ -#define	AM_VOL	0x08	/* Volume label */ -#define AM_LFN	0x0F	/* LFN entry */ -#define AM_DIR	0x10	/* Directory */ -#define AM_ARC	0x20	/* Archive */ -#define AM_MASK	0x3F	/* Mask of defined bits */ - - -/*--------------------------------*/ -/* Multi-byte word access macros  */ - -#if _WORD_ACCESS == 1	/* Enable word access to the FAT structure */ -#define	LD_WORD(ptr)		(WORD)(*(WORD*)(BYTE*)(ptr)) -#define	LD_DWORD(ptr)		(DWORD)(*(DWORD*)(BYTE*)(ptr)) -#define	ST_WORD(ptr,val)	*(WORD*)(BYTE*)(ptr)=(WORD)(val) -#define	ST_DWORD(ptr,val)	*(DWORD*)(BYTE*)(ptr)=(DWORD)(val) -#else					/* Use byte-by-byte access to the FAT structure */ -#define	LD_WORD(ptr)		(WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) -#define	LD_DWORD(ptr)		(DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr)) -#define	ST_WORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8) -#define	ST_DWORD(ptr,val)	*(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8); *((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16); *((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24) -#endif - - -#endif /* _FATFS */ - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/ProgrammerConfig.c b/Projects/Incomplete/StandaloneProgrammer/Lib/ProgrammerConfig.c deleted file mode 100644 index 917523669..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/ProgrammerConfig.c +++ /dev/null @@ -1,78 +0,0 @@ -/* -             LUFA Library -     Copyright (C) Dean Camera, 2012. - -  dean [at] fourwalledcubicle [dot] com -           www.lufa-lib.org -*/ - -/* -  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) - -  Permission to use, copy, modify, distribute, and sell this -  software and its documentation for any purpose is hereby granted -  without fee, provided that the above copyright notice appear in -  all copies and that both that the copyright notice and this -  permission notice and warranty disclaimer appear in supporting -  documentation, and that the name of the author not be used in -  advertising or publicity pertaining to distribution of the -  software without specific, written prior permission. - -  The author disclaim all warranties with regard to this -  software, including all implied warranties of merchantability -  and fitness.  In no event shall the author be liable for any -  special, indirect or consequential damages or any damages -  whatsoever resulting from loss of use, data or profits, whether -  in an action of contract, negligence or other tortious action, -  arising out of or in connection with the use or performance of -  this software. -*/ - -#include "ProgrammerConfig.h" - -struct -{ -	uint16_t SigBytes[4]; -	bool EnforceSigBytes; - -	uint32_t ProgrammingSpeed; -} ProgrammerConfig; - -bool ProgrammerConfig_ProcessConfiguration(void) -{ -	memset(&ProgrammerConfig, 0x00, sizeof(ProgrammerConfig)); - -	if (!(pf_open("CONF.txt") == FR_OK)) -	{ -		puts(" >> ERROR: CONF.txt File Not Found.\r\n"); -		return false; -	} - -	char  LineBuff[100]; -	char* CurrentLine; - -	do -	{ -		CurrentLine = fgets(LineBuff, sizeof(LineBuff), &DiskStream); - -		if (CurrentLine) -		{ -			sscanf(CurrentLine, "SIGNATURE = %02x %02x %02x %02x", &ProgrammerConfig.SigBytes[0], -			                                                       &ProgrammerConfig.SigBytes[1], -			                                                       &ProgrammerConfig.SigBytes[2], -			                                                       &ProgrammerConfig.SigBytes[3]); -																    -			sscanf(CurrentLine, "SPEED = %08lu", &ProgrammerConfig.ProgrammingSpeed); -		} -	} while (CurrentLine); - -	printf(" >> *** Configuration: ***\r\n"); -	printf(" >> Device Signature: 0x%02x 0x%02x 0x%02x 0x%02x\r\n", ProgrammerConfig.SigBytes[0], -			                                                        ProgrammerConfig.SigBytes[1], -			                                                        ProgrammerConfig.SigBytes[2], -			                                                        ProgrammerConfig.SigBytes[3]); -	printf(" >> Programming Speed: %lu Hz\r\n", ProgrammerConfig.ProgrammingSpeed); - -	return true; -} - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/ProgrammerConfig.h b/Projects/Incomplete/StandaloneProgrammer/Lib/ProgrammerConfig.h deleted file mode 100644 index dbfd0d894..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/ProgrammerConfig.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -             LUFA Library -     Copyright (C) Dean Camera, 2012. - -  dean [at] fourwalledcubicle [dot] com -           www.lufa-lib.org -*/ - -/* -  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) - -  Permission to use, copy, modify, distribute, and sell this -  software and its documentation for any purpose is hereby granted -  without fee, provided that the above copyright notice appear in -  all copies and that both that the copyright notice and this -  permission notice and warranty disclaimer appear in supporting -  documentation, and that the name of the author not be used in -  advertising or publicity pertaining to distribution of the -  software without specific, written prior permission. - -  The author disclaim all warranties with regard to this -  software, including all implied warranties of merchantability -  and fitness.  In no event shall the author be liable for any -  special, indirect or consequential damages or any damages -  whatsoever resulting from loss of use, data or profits, whether -  in an action of contract, negligence or other tortious action, -  arising out of or in connection with the use or performance of -  this software. -*/ - -#ifndef _PROGRAMMER_CONFIG_H_ -#define _PROGRAMMER_CONFIG_H_ - -	/* Includes: */ -		#include <stdio.h> -		#include <string.h> -		#include <stdbool.h> - -		#include "../StandaloneProgrammer.h" - -	/* Function Prototypes: */ -		bool ProgrammerConfig_ProcessConfiguration(void); - -#endif - diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/SCSI.c b/Projects/Incomplete/StandaloneProgrammer/Lib/SCSI.c deleted file mode 100644 index 2d000b8ea..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/SCSI.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -             LUFA Library -     Copyright (C) Dean Camera, 2012. - -  dean [at] fourwalledcubicle [dot] com -           www.lufa-lib.org -*/ - -/* -  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) - -  Permission to use, copy, modify, distribute, and sell this -  software and its documentation for any purpose is hereby granted -  without fee, provided that the above copyright notice appear in -  all copies and that both that the copyright notice and this -  permission notice and warranty disclaimer appear in supporting -  documentation, and that the name of the author not be used in -  advertising or publicity pertaining to distribution of the -  software without specific, written prior permission. - -  The author disclaim all warranties with regard to this -  software, including all implied warranties of merchantability -  and fitness.  In no event shall the author be liable for any -  special, indirect or consequential damages or any damages -  whatsoever resulting from loss of use, data or profits, whether -  in an action of contract, negligence or other tortious action, -  arising out of or in connection with the use or performance of -  this software. -*/ - -/** \file - * - *  SCSI command processing routines, for SCSI commands issued by the host. Mass Storage - *  devices use a thin "Bulk-Only Transport" protocol for issuing commands and status information, - *  which wrap around standard SCSI device commands for controlling the actual storage medium. - */ - -#define  INCLUDE_FROM_SCSI_C -#include "SCSI.h" - -#if defined(USB_CAN_BE_DEVICE) -/** Structure to hold the SCSI response data to a SCSI INQUIRY command. This gives information about the device's - *  features and capabilities. - */ -static const SCSI_Inquiry_Response_t InquiryData = -	{ -		.DeviceType          = DEVICE_TYPE_BLOCK, -		.PeripheralQualifier = 0, - -		.Removable           = true, - -		.Version             = 0, - -		.ResponseDataFormat  = 2, -		.NormACA             = false, -		.TrmTsk              = false, -		.AERC                = false, - -		.AdditionalLength    = 0x1F, - -		.SoftReset           = false, -		.CmdQue              = false, -		.Linked              = false, -		.Sync                = false, -		.WideBus16Bit        = false, -		.WideBus32Bit        = false, -		.RelAddr             = false, - -		.VendorID            = "LUFA", -		.ProductID           = "Dataflash Disk", -		.RevisionID          = {'0','.','0','0'}, -	}; - -/** Structure to hold the sense data for the last issued SCSI command, which is returned to the host after a SCSI REQUEST SENSE - *  command is issued. This gives information on exactly why the last command failed to complete. - */ -static SCSI_Request_Sense_Response_t SenseData = -	{ -		.ResponseCode        = 0x70, -		.AdditionalLength    = 0x0A, -	}; - - -/** Main routine to process the SCSI command located in the Command Block Wrapper read from the host. This dispatches - *  to the appropriate SCSI command handling routine if the issued command is supported by the device, else it returns - *  a command failure due to a ILLEGAL REQUEST. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - * - *  \return Boolean true if the command completed successfully, false otherwise - */ -bool SCSI_DecodeSCSICommand(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) -{ -	bool CommandSuccess = false; - -	/* Run the appropriate SCSI command hander function based on the passed command */ -	switch (MSInterfaceInfo->State.CommandBlock.SCSICommandData[0]) -	{ -		case SCSI_CMD_INQUIRY: -			CommandSuccess = SCSI_Command_Inquiry(MSInterfaceInfo); -			break; -		case SCSI_CMD_REQUEST_SENSE: -			CommandSuccess = SCSI_Command_Request_Sense(MSInterfaceInfo); -			break; -		case SCSI_CMD_READ_CAPACITY_10: -			CommandSuccess = SCSI_Command_Read_Capacity_10(MSInterfaceInfo); -			break; -		case SCSI_CMD_SEND_DIAGNOSTIC: -			CommandSuccess = SCSI_Command_Send_Diagnostic(MSInterfaceInfo); -			break; -		case SCSI_CMD_WRITE_10: -			CommandSuccess = SCSI_Command_ReadWrite_10(MSInterfaceInfo, DATA_WRITE); -			break; -		case SCSI_CMD_READ_10: -			CommandSuccess = SCSI_Command_ReadWrite_10(MSInterfaceInfo, DATA_READ); -			break; -		case SCSI_CMD_MODE_SENSE_6: -			CommandSuccess = SCSI_Command_ModeSense_6(MSInterfaceInfo); -			break; -		case SCSI_CMD_TEST_UNIT_READY: -		case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: -		case SCSI_CMD_VERIFY_10: -			/* These commands should just succeed, no handling required */ -			CommandSuccess = true; -			MSInterfaceInfo->State.CommandBlock.DataTransferLength = 0; -			break; -		default: -			/* Update the SENSE key to reflect the invalid command */ -			SCSI_SET_SENSE(SCSI_SENSE_KEY_ILLEGAL_REQUEST, -		                   SCSI_ASENSE_INVALID_COMMAND, -		                   SCSI_ASENSEQ_NO_QUALIFIER); -			break; -	} - -	/* Check if command was successfully processed */ -	if (CommandSuccess) -	{ -		SCSI_SET_SENSE(SCSI_SENSE_KEY_GOOD, -		               SCSI_ASENSE_NO_ADDITIONAL_INFORMATION, -		               SCSI_ASENSEQ_NO_QUALIFIER); - -		return true; -	} - -	return false; -} - -/** Command processing for an issued SCSI INQUIRY command. This command returns information about the device's features - *  and capabilities to the host. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - * - *  \return Boolean true if the command completed successfully, false otherwise. - */ -static bool SCSI_Command_Inquiry(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) -{ -	uint16_t AllocationLength  = SwapEndian_16(*(uint16_t*)&MSInterfaceInfo->State.CommandBlock.SCSICommandData[3]); -	uint16_t BytesTransferred  = MIN(AllocationLength, sizeof(InquiryData)); - -	/* Only the standard INQUIRY data is supported, check if any optional INQUIRY bits set */ -	if ((MSInterfaceInfo->State.CommandBlock.SCSICommandData[1] & ((1 << 0) | (1 << 1))) || -	     MSInterfaceInfo->State.CommandBlock.SCSICommandData[2]) -	{ -		/* Optional but unsupported bits set - update the SENSE key and fail the request */ -		SCSI_SET_SENSE(SCSI_SENSE_KEY_ILLEGAL_REQUEST, -		               SCSI_ASENSE_INVALID_FIELD_IN_CDB, -		               SCSI_ASENSEQ_NO_QUALIFIER); - -		return false; -	} - -	Endpoint_Write_Stream_LE(&InquiryData, BytesTransferred, NULL); - -	/* Pad out remaining bytes with 0x00 */ -	Endpoint_Null_Stream((AllocationLength - BytesTransferred), NULL); - -	/* Finalize the stream transfer to send the last packet */ -	Endpoint_ClearIN(); - -	/* Succeed the command and update the bytes transferred counter */ -	MSInterfaceInfo->State.CommandBlock.DataTransferLength -= BytesTransferred; - -	return true; -} - -/** Command processing for an issued SCSI REQUEST SENSE command. This command returns information about the last issued command, - *  including the error code and additional error information so that the host can determine why a command failed to complete. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - * - *  \return Boolean true if the command completed successfully, false otherwise. - */ -static bool SCSI_Command_Request_Sense(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) -{ -	uint8_t  AllocationLength = MSInterfaceInfo->State.CommandBlock.SCSICommandData[4]; -	uint8_t  BytesTransferred = MIN(AllocationLength, sizeof(SenseData)); - -	Endpoint_Write_Stream_LE(&SenseData, BytesTransferred, NULL); -	Endpoint_Null_Stream((AllocationLength - BytesTransferred), NULL); -	Endpoint_ClearIN(); - -	/* Succeed the command and update the bytes transferred counter */ -	MSInterfaceInfo->State.CommandBlock.DataTransferLength -= BytesTransferred; - -	return true; -} - -/** Command processing for an issued SCSI READ CAPACITY (10) command. This command returns information about the device's capacity - *  on the selected Logical Unit (drive), as a number of OS-sized blocks. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - * - *  \return Boolean true if the command completed successfully, false otherwise. - */ -static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) -{ -	uint32_t LastBlockAddressInLUN = (VIRTUAL_MEMORY_BLOCKS - 1); -	uint32_t MediaBlockSize        = VIRTUAL_MEMORY_BLOCK_SIZE; - -	Endpoint_Write_Stream_BE(&LastBlockAddressInLUN, sizeof(LastBlockAddressInLUN), NULL); -	Endpoint_Write_Stream_BE(&MediaBlockSize, sizeof(MediaBlockSize), NULL); -	Endpoint_ClearIN(); - -	/* Succeed the command and update the bytes transferred counter */ -	MSInterfaceInfo->State.CommandBlock.DataTransferLength -= 8; - -	return true; -} - -/** Command processing for an issued SCSI SEND DIAGNOSTIC command. This command performs a quick check of the Dataflash ICs on the - *  board, and indicates if they are present and functioning correctly. Only the Self-Test portion of the diagnostic command is - *  supported. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - * - *  \return Boolean true if the command completed successfully, false otherwise. - */ -static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) -{ -	/* Check to see if the SELF TEST bit is not set */ -	if (!(MSInterfaceInfo->State.CommandBlock.SCSICommandData[1] & (1 << 2))) -	{ -		/* Only self-test supported - update SENSE key and fail the command */ -		SCSI_SET_SENSE(SCSI_SENSE_KEY_ILLEGAL_REQUEST, -		               SCSI_ASENSE_INVALID_FIELD_IN_CDB, -		               SCSI_ASENSEQ_NO_QUALIFIER); - -		return false; -	} - -	/* Check to see if all attached Dataflash ICs are functional */ -	if (!(DataflashManager_CheckDataflashOperation())) -	{ -		/* Update SENSE key with a hardware error condition and return command fail */ -		SCSI_SET_SENSE(SCSI_SENSE_KEY_HARDWARE_ERROR, -		               SCSI_ASENSE_NO_ADDITIONAL_INFORMATION, -		               SCSI_ASENSEQ_NO_QUALIFIER); - -		return false; -	} - -	/* Succeed the command and update the bytes transferred counter */ -	MSInterfaceInfo->State.CommandBlock.DataTransferLength = 0; - -	return true; -} - -/** Command processing for an issued SCSI READ (10) or WRITE (10) command. This command reads in the block start address - *  and total number of blocks to process, then calls the appropriate low-level Dataflash routine to handle the actual - *  reading and writing of the data. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - *  \param[in] IsDataRead  Indicates if the command is a READ (10) command or WRITE (10) command (DATA_READ or DATA_WRITE) - * - *  \return Boolean true if the command completed successfully, false otherwise. - */ -static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, -                                      const bool IsDataRead) -{ -	uint32_t BlockAddress; -	uint16_t TotalBlocks; - -	/* Check if the disk is write protected or not */ -	if ((IsDataRead == DATA_WRITE) && DISK_READ_ONLY) -	{ -		/* Block address is invalid, update SENSE key and return command fail */ -		SCSI_SET_SENSE(SCSI_SENSE_KEY_DATA_PROTECT, -		               SCSI_ASENSE_WRITE_PROTECTED, -		               SCSI_ASENSEQ_NO_QUALIFIER); - -		return false; -	} - -	/* Load in the 32-bit block address (SCSI uses big-endian, so have to reverse the byte order) */ -	BlockAddress = SwapEndian_32(*(uint32_t*)&MSInterfaceInfo->State.CommandBlock.SCSICommandData[2]); - -	/* Load in the 16-bit total blocks (SCSI uses big-endian, so have to reverse the byte order) */ -	TotalBlocks  = SwapEndian_16(*(uint16_t*)&MSInterfaceInfo->State.CommandBlock.SCSICommandData[7]); - -	/* Check if the block address is outside the maximum allowable value for the LUN */ -	if (BlockAddress >= VIRTUAL_MEMORY_BLOCKS) -	{ -		/* Block address is invalid, update SENSE key and return command fail */ -		SCSI_SET_SENSE(SCSI_SENSE_KEY_ILLEGAL_REQUEST, -		               SCSI_ASENSE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE, -		               SCSI_ASENSEQ_NO_QUALIFIER); - -		return false; -	} - -	/* Determine if the packet is a READ (10) or WRITE (10) command, call appropriate function */ -	if (IsDataRead == DATA_READ) -	  DataflashManager_ReadBlocks(MSInterfaceInfo, BlockAddress, TotalBlocks); -	else -	  DataflashManager_WriteBlocks(MSInterfaceInfo, BlockAddress, TotalBlocks); - -	/* Update the bytes transferred counter and succeed the command */ -	MSInterfaceInfo->State.CommandBlock.DataTransferLength -= ((uint32_t)TotalBlocks * VIRTUAL_MEMORY_BLOCK_SIZE); - -	return true; -} - -/** Command processing for an issued SCSI MODE SENSE (6) command. This command returns various informational pages about - *  the SCSI device, as well as the device's Write Protect status. - * - *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface structure that the command is associated with - * - *  \return Boolean true if the command completed successfully, false otherwise. - */ -static bool SCSI_Command_ModeSense_6(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) -{ -	/* Send an empty header response with the Write Protect flag status */ -	Endpoint_Write_8(0x00); -	Endpoint_Write_8(0x00); -	Endpoint_Write_8(DISK_READ_ONLY ? 0x80 : 0x00); -	Endpoint_Write_8(0x00); -	Endpoint_ClearIN(); - -	/* Update the bytes transferred counter and succeed the command */ -	MSInterfaceInfo->State.CommandBlock.DataTransferLength -= 4; - -	return true; -} -#endif diff --git a/Projects/Incomplete/StandaloneProgrammer/Lib/SCSI.h b/Projects/Incomplete/StandaloneProgrammer/Lib/SCSI.h deleted file mode 100644 index a0940a796..000000000 --- a/Projects/Incomplete/StandaloneProgrammer/Lib/SCSI.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -             LUFA Library -     Copyright (C) Dean Camera, 2012. - -  dean [at] fourwalledcubicle [dot] com -           www.lufa-lib.org -*/ - -/* -  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) - -  Permission to use, copy, modify, distribute, and sell this -  software and its documentation for any purpose is hereby granted -  without fee, provided that the above copyright notice appear in -  all copies and that both that the copyright notice and this -  permission notice and warranty disclaimer appear in supporting -  documentation, and that the name of the author not be used in -  advertising or publicity pertaining to distribution of the -  software without specific, written prior permission. - -  The author disclaim all warranties with regard to this -  software, including all implied warranties of merchantability -  and fitness.  In no event shall the author be liable for any -  special, indirect or consequential damages or any damages -  whatsoever resulting from loss of use, data or profits, whether -  in an action of contract, negligence or other tortious action, -  arising out of or in connection with the use or performance of -  this software. -*/ - -/** \file - * - *  Header file for SCSI.c. - */ - -#ifndef _SCSI_H_ -#define _SCSI_H_ - -	/* Includes: */ -		#include <avr/io.h> -		#include <avr/pgmspace.h> - -		#include <LUFA/Drivers/USB/USB.h> - -		#include "../StandaloneProgrammer.h" -		#include "../Descriptors.h" -		#include "DataflashManager.h" - -	/* Macros: */ -		/** Macro to set the current SCSI sense data to the given key, additional sense code and additional sense qualifier. This -		 *  is for convenience, as it allows for all three sense values (returned upon request to the host to give information about -		 *  the last command failure) in a quick and easy manner. -		 * -		 *  \param[in] Key    New SCSI sense key to set the sense code to -		 *  \param[in] Acode  New SCSI additional sense key to set the additional sense code to -		 *  \param[in] Aqual  New SCSI additional sense key qualifier to set the additional sense qualifier code to -		 */ -		#define SCSI_SET_SENSE(Key, Acode, Aqual)  MACROS{ SenseData.SenseKey                 = (Key);   \ -		                                                   SenseData.AdditionalSenseCode      = (Acode); \ -		                                                   SenseData.AdditionalSenseQualifier = (Aqual); }MACROE - -		/** Macro for the \ref SCSI_Command_ReadWrite_10() function, to indicate that data is to be read from the storage medium. */ -		#define DATA_READ           true - -		/** Macro for the \ref SCSI_Command_ReadWrite_10() function, to indicate that data is to be written to the storage medium. */ -		#define DATA_WRITE          false - -		/** Value for the DeviceType entry in the SCSI_Inquiry_Response_t enum, indicating a Block Media device. */ -		#define DEVICE_TYPE_BLOCK   0x00 - -		/** Value for the DeviceType entry in the SCSI_Inquiry_Response_t enum, indicating a CD-ROM device. */ -		#define DEVICE_TYPE_CDROM   0x05 - -	/* Function Prototypes: */ -		#if defined(USB_CAN_BE_DEVICE) -			bool SCSI_DecodeSCSICommand(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo); - -			#if defined(INCLUDE_FROM_SCSI_C) -				static bool SCSI_Command_Inquiry(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo); -				static bool SCSI_Command_Request_Sense(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo); -				static bool SCSI_Command_Read_Capacity_10(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo); -				static bool SCSI_Command_Send_Diagnostic(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo); -				static bool SCSI_Command_ReadWrite_10(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo, -													  const bool IsDataRead); -				static bool SCSI_Command_ModeSense_6(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo); -			#endif -		#endif - -#endif -  | 
