From d770d98bca4af54b10316d03979bfcdb71ce623d Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 17 Mar 2009 04:43:34 +0000 Subject: [PATCH] Board Dataflash driver now allows for dataflash ICs which use different shifts for setting the current page/byte address (thanks to Kenneth Clubb). --- LUFA/ChangeLog.txt | 2 + LUFA/DriverStubs/Dataflash.h | 36 +++++++++ LUFA/Drivers/Board/Dataflash.h | 102 ++++++++++---------------- LUFA/Drivers/Board/STK525/Dataflash.h | 33 +++++++++ LUFA/Drivers/Board/STK526/Dataflash.h | 33 +++++++++ LUFA/Drivers/Board/USBKEY/Dataflash.h | 38 ++++++++++ LUFA/MigrationInformation.txt | 1 + 7 files changed, 181 insertions(+), 64 deletions(-) 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