diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt
index 58bd9d2334..27cbca8662 100644
--- a/LUFA/ChangeLog.txt
+++ b/LUFA/ChangeLog.txt
@@ -33,6 +33,8 @@
* - The NO_CLEARSET_FEATURE_REQUEST compile time token has been renamed to NO_FEATURELESS_CONTROL_ONLY_DEVICE, and its function expanded
* to also remove parts of the Get Status chapter 9 request to further reduce code usage
* - Makefile updated to include output giving the currently selected BOARD parameter value
+ * - Board Dataflash driver now allows for dataflash ICs which use different shifts for setting the current page/byte address (thanks
+ * to Kenneth Clubb)
*
* \section Sec_ChangeLog090209 Version 090209
*
diff --git a/LUFA/DriverStubs/Dataflash.h b/LUFA/DriverStubs/Dataflash.h
index 0bef94ebbf..41581a730a 100644
--- a/LUFA/DriverStubs/Dataflash.h
+++ b/LUFA/DriverStubs/Dataflash.h
@@ -78,4 +78,40 @@
/** Total number of pages inside each of the board's dataflash ICs. */
#define DATAFLASH_PAGES // TODO: Replace with the total number of pages inside one of the Dataflash ICs
+ /* Inline Functions: */
+ /** Selects a dataflash IC from the given page number, which should range from 0 to
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+ * dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+ * the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+ * are deselected.
+ *
+ * \param PageAddress Address of the page to manipulate, ranging from
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+ */
+ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+ {
+ Dataflash_DeselectChip();
+
+ if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+ return;
+
+ // TODO: If more than one dataflash chip, select the correct chip from the page address here
+ Dataflash_SelectChip(DATAFLASH_CHIP1);
+ }
+
+ /** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+ * dataflash commands which require a complete 24-byte address.
+ *
+ * \param PageAddress Page address within the selected dataflash IC
+ * \param BufferByte Address within the dataflash's buffer
+ */
+ static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+ {
+ // TODO: If more than one dataflash chip, adjust absolute page address to be correct for the current chip,
+ // also the shifts may need to be altered to suit the dataflash model being used
+ Dataflash_SendByte(PageAddress >> 5);
+ Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+ Dataflash_SendByte(BufferByte);
+ }
+
#endif
diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h
index 2b682d7c9c..aa0c0892f1 100644
--- a/LUFA/Drivers/Board/Dataflash.h
+++ b/LUFA/Drivers/Board/Dataflash.h
@@ -52,21 +52,7 @@
/* Includes: */
#include "../AT90USBXXX/SPI.h"
#include "../../Common/Common.h"
-
- #if !defined(BOARD)
- #error BOARD must be set in makefile to a value specified in BoardTypes.h.
- #elif (BOARD == BOARD_USBKEY)
- #include "USBKEY/Dataflash.h"
- #elif (BOARD == BOARD_STK525)
- #include "STK525/Dataflash.h"
- #elif (BOARD == BOARD_STK526)
- #include "STK526/Dataflash.h"
- #elif (BOARD == BOARD_USER)
- #include "Board/Dataflash.h"
- #else
- #error The selected board does not contain a dataflash IC.
- #endif
-
+
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
@@ -89,19 +75,6 @@
#define Dataflash_DeselectChip() Dataflash_SelectChip(DATAFLASH_NO_CHIP)
/* Inline Functions: */
- /** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
- * sent to an attached dataflash IC.
- *
- * \param PrescalerMask SPI prescaler mask, see SPI.h documentation
- */
- static inline void Dataflash_Init(const uint8_t PrescalerMask)
- {
- DATAFLASH_CHIPCS_DDR |= DATAFLASH_CHIPCS_MASK;
- DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
-
- SPI_Init(PrescalerMask, true);
- }
-
/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
*
* \param Byte of data to send to the dataflash
@@ -133,21 +106,45 @@
{
return SPI_ReceiveByte();
}
+
+ /* Includes: */
+ #if !defined(BOARD)
+ #error BOARD must be set in makefile to a value specified in BoardTypes.h.
+ #elif (BOARD == BOARD_USBKEY)
+ #include "USBKEY/Dataflash.h"
+ #elif (BOARD == BOARD_STK525)
+ #include "STK525/Dataflash.h"
+ #elif (BOARD == BOARD_STK526)
+ #include "STK526/Dataflash.h"
+ #elif (BOARD == BOARD_USER)
+ #include "Board/Dataflash.h"
+ #else
+ #error The selected board does not contain a dataflash IC.
+ #endif
+
+ /* Inline Functions: */
+ /** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
+ * sent to an attached dataflash IC.
+ *
+ * \param PrescalerMask SPI prescaler mask, see SPI.h documentation
+ */
+ static inline void Dataflash_Init(const uint8_t PrescalerMask)
+ {
+ DATAFLASH_CHIPCS_DDR |= DATAFLASH_CHIPCS_MASK;
+ DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+ SPI_Init(PrescalerMask, true);
+ }
/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
* a new command.
*/
static inline void Dataflash_ToggleSelectedChipCS(void)
{
- #if (DATAFLASH_TOTALCHIPS == 2)
- uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+ uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
- Dataflash_DeselectChip();
- Dataflash_SelectChip(SelectedChipMask);
- #else
- Dataflash_DeselectChip();
- Dataflash_SelectChip(DATAFLASH_CHIP1);
- #endif
+ Dataflash_DeselectChip();
+ Dataflash_SelectChip(SelectedChipMask);
}
/** Spinloops while the currently selected dataflash is busy executing a command, such as a main
@@ -162,28 +159,14 @@
/** Selects a dataflash IC from the given page number, which should range from 0 to
* ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
- * dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside the total number
- * of pages contained in the boards dataflash ICs, all dataflash ICs are deselected.
+ * dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+ * the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+ * are deselected.
*
* \param PageAddress Address of the page to manipulate, ranging from
* ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
*/
- static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
- {
- Dataflash_DeselectChip();
-
- if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
- return;
-
- #if (DATAFLASH_TOTALCHIPS == 2)
- if (PageAddress & 0x01)
- Dataflash_SelectChip(DATAFLASH_CHIP2);
- else
- Dataflash_SelectChip(DATAFLASH_CHIP1);
- #else
- Dataflash_SelectChip(DATAFLASH_CHIP1);
- #endif
- }
+ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress);
/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
* dataflash commands which require a complete 24-byte address.
@@ -191,16 +174,7 @@
* \param PageAddress Page address within the selected dataflash IC
* \param BufferByte Address within the dataflash's buffer
*/
- static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
- {
- #if (DATAFLASH_TOTALCHIPS == 2)
- PageAddress >>= 1;
- #endif
-
- Dataflash_SendByte(PageAddress >> 5);
- Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
- Dataflash_SendByte(BufferByte);
- }
+ static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
diff --git a/LUFA/Drivers/Board/STK525/Dataflash.h b/LUFA/Drivers/Board/STK525/Dataflash.h
index 3f30f97b95..e4e2f52371 100644
--- a/LUFA/Drivers/Board/STK525/Dataflash.h
+++ b/LUFA/Drivers/Board/STK525/Dataflash.h
@@ -72,4 +72,37 @@
/** Total number of pages inside the board's dataflash IC. */
#define DATAFLASH_PAGES 8192
+ /* Inline Functions: */
+ /** Selects a dataflash IC from the given page number, which should range from 0 to
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+ * dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+ * the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+ * are deselected.
+ *
+ * \param PageAddress Address of the page to manipulate, ranging from
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+ */
+ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+ {
+ Dataflash_DeselectChip();
+
+ if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+ return;
+
+ Dataflash_SelectChip(DATAFLASH_CHIP1);
+ }
+
+ /** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+ * dataflash commands which require a complete 24-byte address.
+ *
+ * \param PageAddress Page address within the selected dataflash IC
+ * \param BufferByte Address within the dataflash's buffer
+ */
+ static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+ {
+ Dataflash_SendByte(PageAddress >> 5);
+ Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+ Dataflash_SendByte(BufferByte);
+ }
+
#endif
diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h
index 177fefaaba..443c1a754d 100644
--- a/LUFA/Drivers/Board/STK526/Dataflash.h
+++ b/LUFA/Drivers/Board/STK526/Dataflash.h
@@ -72,4 +72,37 @@
/** Total number of pages inside the board's dataflash IC. */
#define DATAFLASH_PAGES 8192
+ /* Inline Functions: */
+ /** Selects a dataflash IC from the given page number, which should range from 0 to
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+ * dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+ * the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+ * are deselected.
+ *
+ * \param PageAddress Address of the page to manipulate, ranging from
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+ */
+ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+ {
+ Dataflash_DeselectChip();
+
+ if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+ return;
+
+ Dataflash_SelectChip(DATAFLASH_CHIP1);
+ }
+
+ /** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+ * dataflash commands which require a complete 24-byte address.
+ *
+ * \param PageAddress Page address within the selected dataflash IC
+ * \param BufferByte Address within the dataflash's buffer
+ */
+ static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+ {
+ Dataflash_SendByte(PageAddress >> 5);
+ Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+ Dataflash_SendByte(BufferByte);
+ }
+
#endif
diff --git a/LUFA/Drivers/Board/USBKEY/Dataflash.h b/LUFA/Drivers/Board/USBKEY/Dataflash.h
index 848ae32d85..2b3956f04d 100644
--- a/LUFA/Drivers/Board/USBKEY/Dataflash.h
+++ b/LUFA/Drivers/Board/USBKEY/Dataflash.h
@@ -74,5 +74,43 @@
/** Total number of pages inside each of the board's dataflash ICs. */
#define DATAFLASH_PAGES 8192
+
+ /* Inline Functions: */
+ /** Selects a dataflash IC from the given page number, which should range from 0 to
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+ * dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+ * the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+ * are deselected.
+ *
+ * \param PageAddress Address of the page to manipulate, ranging from
+ * ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+ */
+ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+ {
+ Dataflash_DeselectChip();
+
+ if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+ return;
+
+ if (PageAddress & 0x01)
+ Dataflash_SelectChip(DATAFLASH_CHIP2);
+ else
+ Dataflash_SelectChip(DATAFLASH_CHIP1);
+ }
+
+ /** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+ * dataflash commands which require a complete 24-byte address.
+ *
+ * \param PageAddress Page address within the selected dataflash IC
+ * \param BufferByte Address within the dataflash's buffer
+ */
+ static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
+ {
+ PageAddress >>= 1;
+
+ Dataflash_SendByte(PageAddress >> 5);
+ Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+ Dataflash_SendByte(BufferByte);
+ }
#endif
diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt
index 25bf782685..a04b1b0538 100644
--- a/LUFA/MigrationInformation.txt
+++ b/LUFA/MigrationInformation.txt
@@ -28,6 +28,7 @@
*
* Non-USB Library Components
* - The ATTR_ALWAYSINLINE function attribute macro has been renamed to ATTR_ALWAYS_INLINE.
+ * - Custom board Dataflash drivers now require the implementation of Dataflash_SelectChipFromPage() and Dataflash_SendAddressBytes().
*
* Device Mode
* - The NO_CLEARSET_FEATURE_REQUEST compile time token has been renamed to NO_FEATURELESS_CONTROL_ONLY_DEVICE, and its function expanded