123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /**************************************************************************************************
- Filename: hal_flash.c
- Revised: $Date: 2010-10-07 02:19:52 -0700 (Thu, 07 Oct 2010) $
- Revision: $Revision: 24049 $
- Description: This file contains the interface to the H/W Flash driver.
- Copyright 2006-2010 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_mcu.h"
- #include "hal_types.h"
- /**************************************************************************************************
- * @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 *pData = (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) && (!defined HAL_OTA_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) && (!defined HAL_OTA_BOOT_CODE)
- HAL_ENTER_CRITICAL_SECTION(is);
- #endif
- // Calculate and map the containing flash bank into XDATA.
- MEMCTR = (MEMCTR & 0xF8) | pg;
- while (cnt--)
- {
- *buf++ = *pData++;
- }
- MEMCTR = memctr;
- #if (!defined HAL_OAD_BOOT_CODE) && (!defined HAL_OTA_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)
- {
- #if (defined HAL_DMA) && (HAL_DMA == TRUE)
- 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);
- FCTL |= 0x02; // Trigger the DMA writes.
- while (FCTL & 0x80); // Wait until writing is done.
- #endif
- }
- /**************************************************************************************************
- * @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;
- }
- /**************************************************************************************************
- */
|