X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/7e7124e40ba2155c5ee4348701be30d3790edca3..2a0c28e6e47c8a173f32fc99cd8666a2633c5c12:/LUFA/Drivers/Board/Dataflash.h diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h index 2b682d7c9..acdcc4c40 100644 --- a/LUFA/Drivers/Board/Dataflash.h +++ b/LUFA/Drivers/Board/Dataflash.h @@ -40,6 +40,23 @@ * directory. */ +/** \ingroup Group_BoardDrivers + * @defgroup Group_Dataflash Dataflash Driver - LUFA/Drivers/Board/Dataflash.h + * + * \section Sec_Dependencies Module Source Dependencies + * The following files must be built with any user project that uses this module: + * - None + * + * \section Module Description + * Dataflash driver. This module provides an easy to use interface for the Dataflash ICs located on many boards, + * for the storage of large amounts of data into the Dataflash's non-volatile memory. + * + * If the BOARD value is set to BOARD_USER, this will include the /Board/Dataflash.h file in the user project + * directory. Otherwise, it will include the appropriate built in board driver header file. + * + * @{ + */ + #ifndef __DATAFLASH_H__ #define __DATAFLASH_H__ @@ -50,23 +67,9 @@ #endif /* Includes: */ - #include "../AT90USBXXX/SPI.h" + #include "../Peripheral/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" { @@ -74,37 +77,48 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ - /** Returns the mask of the currently selected Dataflash chip, either DATAFLASH_NO_CHIP or a - * DATAFLASH_CHIPn mask (where n is the chip number). - */ - #define Dataflash_GetSelectedChip() (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK) - - /** Selects the dataflash chip given as a chip mask, in the form of DATAFLASH_CHIPn (where n - * is the chip number). + #if !defined(__DOXYGEN__) + #define __GET_DATAFLASH_MASK2(x, y) x ## y + #define __GET_DATAFLASH_MASK(x) __GET_DATAFLASH_MASK2(DATAFLASH_CHIP,x) + #endif + + /* Retrieves the Dataflash chip select mask for the given Dataflash chip index. + * + * \param index Index of the dataflash chip mask to retrieve */ - #define Dataflash_SelectChip(mask) MACROS{ DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT \ - & ~DATAFLASH_CHIPCS_MASK) | mask); }MACROE + #define DATAFLASH_CHIP_MASK(index) __GET_DATAFLASH_MASK(index) + + /* Pseudo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Determines the currently selected dataflash chip. + * + * \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected + * or a DATAFLASH_CHIPn mask (where n is the chip number). + */ + static inline uint8_t Dataflash_GetSelectedChip(void); + + /** Selects the given dataflash chip. + * + * \param[in] ChipMask Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is + * the chip number). + */ + static inline void Dataflash_SelectChip(uint8_t ChipMask); + + /** Deselects the current dataflash chip, so that no dataflash is selected. */ + static inline void Dataflash_DeselectChip(void); + #else + #define Dataflash_GetSelectedChip() (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK) + + #define Dataflash_SelectChip(mask) MACROS{ DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT \ + & ~DATAFLASH_CHIPCS_MASK) | mask); }MACROE + + #define Dataflash_DeselectChip() Dataflash_SelectChip(DATAFLASH_NO_CHIP) + #endif - /** Deselects the current dataflash chip, so that no dataflash is selected. */ - #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 + * \param[in] Byte of data to send to the dataflash * * \return Last response byte from the dataflash */ @@ -116,7 +130,7 @@ /** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. * - * \param Byte of data to send to the dataflash + * \param[in] Byte of data to send to the dataflash */ static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; static inline void Dataflash_SendByte(const uint8_t Byte) @@ -133,21 +147,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[in] 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 @@ -158,49 +196,27 @@ Dataflash_ToggleSelectedChipCS(); Dataflash_SendByte(DF_CMD_GETSTATUS); while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); + Dataflash_ToggleSelectedChipCS(); } /** 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). + * \param[in] 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. * - * \param PageAddress Page address within the selected dataflash IC - * \param BufferByte Address within the dataflash's buffer + * \param[in] PageAddress Page address within the selected dataflash IC + * \param[in] 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) @@ -208,3 +224,5 @@ #endif #endif + +/** @} */