X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/071e02c6b6b4837fa9cf0b6d4c749994e02638d7..279e1b6ece7fbc90db6cb642f1c289b45648cf9c:/LUFA/Drivers/Board/STK526/Dataflash.h?ds=sidebyside diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h index bba04f37f..f51073511 100644 --- a/LUFA/Drivers/Board/STK526/Dataflash.h +++ b/LUFA/Drivers/Board/STK526/Dataflash.h @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2010. - + Copyright (C) Dean Camera, 2011. + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + 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 + 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 + 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 @@ -29,9 +29,9 @@ */ /** \file - * \brief Board specific Dataflash driver header for the STK525. + * \brief Board specific Dataflash driver header for the Atmel STK525. * - * Board specific Dataflash driver header for the STK525. + * Board specific Dataflash driver header for the Atmel STK525. * * \note This file should not be included directly. It is automatically included as needed by the dataflash driver * dispatch header located in LUFA/Drivers/Board/Dataflash.h. @@ -40,7 +40,7 @@ /** \ingroup Group_Dataflash * @defgroup Group_Dataflash_STK526 STK526 * - * Board specific Dataflash driver header for the STK525. + * Board specific Dataflash driver header for the Atmel STK525. * * \note This file should not be included directly. It is automatically included as needed by the dataflash driver * dispatch header located in LUFA/Drivers/Board/Dataflash.h. @@ -77,7 +77,7 @@ /** Mask for the first dataflash chip selected. */ #define DATAFLASH_CHIP1 0 - + /** Internal main memory page size for the board's dataflash IC. */ #define DATAFLASH_PAGE_SIZE 1024 @@ -85,6 +85,44 @@ #define DATAFLASH_PAGES 8192 /* Inline Functions: */ + /** Initialises the dataflash driver so that commands and data may be sent to an attached dataflash IC. + * The AVR's SPI driver MUST be initialized before any of the dataflash commands are used. + */ + static inline void Dataflash_Init(void) + { + DATAFLASH_CHIPCS_DDR |= DATAFLASH_CHIPCS_MASK; + DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; + } + + /** 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) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + static inline uint8_t Dataflash_GetSelectedChip(void) + { + return (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); + } + + /** 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(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; + static inline void Dataflash_SelectChip(const uint8_t ChipMask) + { + DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT & ~DATAFLASH_CHIPCS_MASK) | ChipMask); + } + + /** Deselects the current dataflash chip, so that no dataflash is selected. */ + static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; + static inline void Dataflash_DeselectChip(void) + { + Dataflash_SelectChip(DATAFLASH_NO_CHIP); + } + /** 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 @@ -97,26 +135,50 @@ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) { Dataflash_DeselectChip(); - + if (PageAddress >= DATAFLASH_PAGES) return; Dataflash_SelectChip(DATAFLASH_CHIP1); } + /** 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) + { + uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + + Dataflash_DeselectChip(); + Dataflash_SelectChip(SelectedChipMask); + } + + /** Spin-loops while the currently selected dataflash is busy executing a command, such as a main + * memory page program or main memory to buffer transfer. + */ + static inline void Dataflash_WaitWhileBusy(void) + { + Dataflash_ToggleSelectedChipCS(); + Dataflash_SendByte(DF_CMD_GETSTATUS); + while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); + Dataflash_ToggleSelectedChipCS(); + } + /** 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[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) - { + 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 /** @} */ +