| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- /**************************************************************************************************
- Filename: _hal_flash.c
- Revised: $Date:$
- Revision: $Revision:$
- Description: This file contains the interface to the H/W Flash driver.
- Copyright 2006-2009 Texas Instruments Incorporated. All rights reserved.
- IMPORTANT: Your use of this Software is limited to those specific rights
- granted under the terms of a software license agreement between the user
- who downloaded the software, his/her employer (which must be your employer)
- and Texas Instruments Incorporated (the "License"). You may not use this
- Software unless you agree to abide by the terms of the License. The License
- limits your use, and you acknowledge, that the Software may not be modified,
- copied or distributed unless embedded on a Texas Instruments microcontroller
- or used solely and exclusively in conjunction with a Texas Instruments radio
- frequency transceiver, which is integrated into your product. Other than for
- the foregoing purpose, you may not use, reproduce, copy, prepare derivative
- works of, modify, distribute, perform, display or sell this Software and/or
- its documentation for any purpose.
- YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
- PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
- INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
- NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
- TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
- NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
- LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
- INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
- OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
- OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
- (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
- Should you have any questions regarding your right to use this Software,
- contact Texas Instruments Incorporated at www.TI.com.
- **************************************************************************************************/
- /* ------------------------------------------------------------------------------------------------
- * Includes
- * ------------------------------------------------------------------------------------------------
- */
- #include "hal_board_cfg.h"
- #include "hal_dma.h"
- #include "hal_flash.h"
- #include "hal_types.h"
- /* ------------------------------------------------------------------------------------------------
- * Macros
- * ------------------------------------------------------------------------------------------------
- */
- /* ------------------------------------------------------------------------------------------------
- * Constants
- * ------------------------------------------------------------------------------------------------
- */
- // These values depend on RAM_CODE_FLASH in the .xcl file used.
- #if defined CC2530F64 // RemoTI is using 0x01DDD --> pg 3, offset 0x5DD.
- #define OSET_OF_RAM_CODE 0x5DD
- #define PAGE_OF_RAM_CODE 3
- #define SIZE_OF_RAM_CODE 0x23
- #elif defined HAL_OAD_BOOT_CODE // OAD boot code does not use RAM copy
- #define OSET_OF_RAM_CODE 0x7E5
- #define PAGE_OF_RAM_CODE 0
- #define SIZE_OF_RAM_CODE 0x1B
- #else // Z-Stack is using 0x39DDD --> pg 51, offset 0x5DD.
- #define OSET_OF_RAM_CODE 0x5DD
- #define PAGE_OF_RAM_CODE 51
- #define SIZE_OF_RAM_CODE 0x23
- #endif
- /* ------------------------------------------------------------------------------------------------
- * Typedefs
- * ------------------------------------------------------------------------------------------------
- */
- /* ------------------------------------------------------------------------------------------------
- * Global Variables
- * ------------------------------------------------------------------------------------------------
- */
- /* ------------------------------------------------------------------------------------------------
- * Global Functions
- * ------------------------------------------------------------------------------------------------
- */
- /* ------------------------------------------------------------------------------------------------
- * Local Variables
- * ------------------------------------------------------------------------------------------------
- */
- #pragma location="RAM_CODE_XDATA"
- static __no_init uint8 ramCode[SIZE_OF_RAM_CODE];
- /* ------------------------------------------------------------------------------------------------
- * Local Functions
- * ------------------------------------------------------------------------------------------------
- */
- #pragma location="RAM_CODE_FLASH"
- #if defined HAL_OAD_BOOT_CODE
- static void HalFlashWriteTrigger(void);
- #else
- static __monitor void HalFlashWriteTrigger(void);
- #endif
- /**************************************************************************************************
- * @fn HalFlashInit
- *
- * @brief This function initializes the environment for this module.
- *
- * input parameters
- *
- * None.
- *
- * output parameters
- *
- * None.
- *
- * @return None.
- **************************************************************************************************
- */
- void HalFlashInit(void)
- {
- // Load the code to run from RAM into its reserved area of RAM once at startup.
- HalFlashRead(PAGE_OF_RAM_CODE, OSET_OF_RAM_CODE, ramCode, SIZE_OF_RAM_CODE);
- }
- /**************************************************************************************************
- * @fn HalFlashRead
- *
- * @brief This function reads 'cnt' bytes from the internal flash.
- *
- * input parameters
- *
- * @param pg - A valid flash page number.
- * @param offset - A valid offset into the page.
- * @param buf - A valid buffer space at least as big as the 'cnt' parameter.
- * @param cnt - A valid number of bytes to read.
- *
- * output parameters
- *
- * None.
- *
- * @return None.
- **************************************************************************************************
- */
- void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt)
- {
- // Calculate the offset into the containing flash bank as it gets mapped into XDATA.
- uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) +
- ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE);
- uint8 memctr = MEMCTR; // Save to restore.
- #if !defined HAL_OAD_BOOT_CODE
- halIntState_t is;
- #endif
- pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page.
- #if !defined HAL_OAD_BOOT_CODE
- HAL_ENTER_CRITICAL_SECTION(is);
- #endif
- // Calculate and map the containing flash bank into XDATA.
- MEMCTR = (MEMCTR & 0xF8) | pg;
- while (cnt--)
- {
- *buf++ = *ptr++;
- }
- MEMCTR = memctr;
- #if !defined HAL_OAD_BOOT_CODE
- HAL_EXIT_CRITICAL_SECTION(is);
- #endif
- }
- /**************************************************************************************************
- * @fn HalFlashWrite
- *
- * @brief This function writes 'cnt' bytes to the internal flash.
- *
- * input parameters
- *
- * @param addr - Valid HAL flash write address: actual addr / 4 and quad-aligned.
- * @param buf - Valid buffer space at least as big as 'cnt' X 4.
- * @param cnt - Number of 4-byte blocks to write.
- *
- * output parameters
- *
- * None.
- *
- * @return None.
- **************************************************************************************************
- */
- void HalFlashWrite(uint16 addr, uint8 *buf, uint16 cnt)
- {
- halDMADesc_t *ch = HAL_NV_DMA_GET_DESC();
- HAL_DMA_SET_SOURCE(ch, buf);
- HAL_DMA_SET_DEST(ch, &FWDATA);
- HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN);
- HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE));
- HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE);
- HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE);
- HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH);
- HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1);
- HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0);
- // The DMA is to be polled and shall not issue an IRQ upon completion.
- HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE);
- HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS);
- HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH);
- HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH);
- HAL_DMA_ARM_CH(HAL_NV_DMA_CH);
- FADDRL = (uint8)addr;
- FADDRH = (uint8)(addr >> 8);
- HalFlashWriteTrigger();
- }
- /**************************************************************************************************
- * @fn HalFlashErase
- *
- * @brief This function erases the specified page of the internal flash.
- *
- * input parameters
- *
- * @param pg - A valid flash page number to erase.
- *
- * output parameters
- *
- * None.
- *
- * @return None.
- **************************************************************************************************
- */
- void HalFlashErase(uint8 pg)
- {
- FADDRH = pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE / 256);
- FCTL |= 0x01;
- }
- /**************************************************************************************************
- * @fn HalFlashWriteTrigger
- *
- * @brief This function must be copied to RAM before running because it triggers and then
- * awaits completion of Flash write, which can only be done from RAM.
- *
- * input parameters
- *
- * None.
- *
- * output parameters
- *
- * None.
- *
- * @return None.
- **************************************************************************************************
- */
- #if defined HAL_OAD_BOOT_CODE
- #pragma optimize=medium
- static void HalFlashWriteTrigger(void)
- #else
- static __monitor void HalFlashWriteTrigger(void)
- #endif
- {
- MEMCTR |= 0x08; // Start the Memory Arbiter running CODE from RAM.
- FCTL |= 0x02; // Trigger the DMA writes.
- while (FCTL & 0x80); // Wait until writing is done.
- MEMCTR &= ~0x08; // Stop the Memory Arbiter.
- }
- /**************************************************************************************************
- */
|