move flash_write and flush to seperate files for other usage
This commit is contained in:
		
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							@@ -120,6 +120,7 @@ endif
 | 
			
		||||
 | 
			
		||||
# src
 | 
			
		||||
C_SOURCE_FILES += $(SRC_PATH)/main.c
 | 
			
		||||
C_SOURCE_FILES += $(SRC_PATH)/flash.c
 | 
			
		||||
C_SOURCE_FILES += $(SRC_PATH)/dfu_ble_svc.c
 | 
			
		||||
C_SOURCE_FILES += $(SRC_PATH)/dfu_init.c
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										86
									
								
								src/flash.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/flash.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
/**************************************************************************/
 | 
			
		||||
/*!
 | 
			
		||||
    @file     flash.c
 | 
			
		||||
    @author   hathach (tinyusb.org)
 | 
			
		||||
 | 
			
		||||
    @section LICENSE
 | 
			
		||||
 | 
			
		||||
    Software License Agreement (BSD License)
 | 
			
		||||
 | 
			
		||||
    Copyright (c) 2018, Adafruit Industries (adafruit.com)
 | 
			
		||||
    All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
    documentation and/or other materials provided with the distribution.
 | 
			
		||||
    3. Neither the name of the copyright holders nor the
 | 
			
		||||
    names of its contributors may be used to endorse or promote products
 | 
			
		||||
    derived from this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
 | 
			
		||||
    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
 | 
			
		||||
    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
			
		||||
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
*/
 | 
			
		||||
/**************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "flash.h"
 | 
			
		||||
#include "boards.h"
 | 
			
		||||
 | 
			
		||||
#include "nrf_sdm.h"
 | 
			
		||||
 | 
			
		||||
#define FLASH_PAGE_SIZE    4096
 | 
			
		||||
 | 
			
		||||
#define NO_CACHE 0xffffffff
 | 
			
		||||
 | 
			
		||||
static uint32_t _fl_addr = NO_CACHE;
 | 
			
		||||
static uint8_t _fl_buf[FLASH_PAGE_SIZE] __attribute__((aligned(4)));
 | 
			
		||||
static bool _first_flush = true;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void flash_flush(void)
 | 
			
		||||
{
 | 
			
		||||
  if ( _fl_addr == NO_CACHE ) return;
 | 
			
		||||
 | 
			
		||||
  if ( _first_flush )
 | 
			
		||||
  {
 | 
			
		||||
    _first_flush = false;
 | 
			
		||||
 | 
			
		||||
    // disable softdevice
 | 
			
		||||
    sd_softdevice_disable();
 | 
			
		||||
 | 
			
		||||
    led_blink_fast(true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( memcmp(_fl_buf, (void *) _fl_addr, FLASH_PAGE_SIZE) != 0 )
 | 
			
		||||
  {
 | 
			
		||||
    nrf_nvmc_page_erase(_fl_addr);
 | 
			
		||||
    nrf_nvmc_write_words(_fl_addr, (uint32_t *) _fl_buf, FLASH_PAGE_SIZE / sizeof(uint32_t));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _fl_addr = NO_CACHE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void flash_write (uint32_t dst, const uint8_t *src, int len)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t newAddr = dst & ~(FLASH_PAGE_SIZE - 1);
 | 
			
		||||
 | 
			
		||||
  if ( newAddr != _fl_addr )
 | 
			
		||||
  {
 | 
			
		||||
    flash_flush();
 | 
			
		||||
    _fl_addr = newAddr;
 | 
			
		||||
    memcpy(_fl_buf, (void *) newAddr, FLASH_PAGE_SIZE);
 | 
			
		||||
  }
 | 
			
		||||
  memcpy(_fl_buf + (dst & (FLASH_PAGE_SIZE - 1)), src, len);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								src/flash.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/flash.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
/**************************************************************************/
 | 
			
		||||
/*!
 | 
			
		||||
    @file     flash.h
 | 
			
		||||
    @author   hathach (tinyusb.org)
 | 
			
		||||
 | 
			
		||||
    @section LICENSE
 | 
			
		||||
 | 
			
		||||
    Software License Agreement (BSD License)
 | 
			
		||||
 | 
			
		||||
    Copyright (c) 2018, Adafruit Industries (adafruit.com)
 | 
			
		||||
    All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
    notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
    notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
    documentation and/or other materials provided with the distribution.
 | 
			
		||||
    3. Neither the name of the copyright holders nor the
 | 
			
		||||
    names of its contributors may be used to endorse or promote products
 | 
			
		||||
    derived from this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
 | 
			
		||||
    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
 | 
			
		||||
    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
			
		||||
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
*/
 | 
			
		||||
/**************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef FLASH_H_
 | 
			
		||||
#define FLASH_H_
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#include "nrf_nvmc.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
 extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//void flash_erase(uint32_t page_addr);
 | 
			
		||||
void flash_write(uint32_t dst, const uint8_t *src, int len);
 | 
			
		||||
void flash_flush(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
 }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* FLASH_H_ */
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
#include "uf2.h"
 | 
			
		||||
#include "nrf_nvmc.h"
 | 
			
		||||
#include "flash.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "boards.h"
 | 
			
		||||
@@ -115,15 +115,9 @@ static const FAT_BootBlock BootBlock = {
 | 
			
		||||
    .FilesystemIdentifier = "FAT16   ",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define NO_CACHE 0xffffffff
 | 
			
		||||
 | 
			
		||||
#define NRF_LOG_DEBUG(...)
 | 
			
		||||
#define NRF_LOG_WARNING(...)
 | 
			
		||||
 | 
			
		||||
uint32_t flashAddr = NO_CACHE;
 | 
			
		||||
uint8_t flashBuf[FLASH_PAGE_SIZE] __attribute__((aligned(4)));
 | 
			
		||||
bool firstFlush = true;
 | 
			
		||||
 | 
			
		||||
static WriteState _wr_state = { 0 };
 | 
			
		||||
static uint32_t get_flash_size(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -246,40 +240,6 @@ static void uf2_write_complete(uint32_t numBlocks)
 | 
			
		||||
  bootloader_dfu_update_process(update_status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void flushFlash() {
 | 
			
		||||
    if (flashAddr == NO_CACHE)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (firstFlush) {
 | 
			
		||||
        firstFlush = false;
 | 
			
		||||
 | 
			
		||||
        // disable softdevice
 | 
			
		||||
        sd_softdevice_disable();
 | 
			
		||||
 | 
			
		||||
        led_blink_fast(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    NRF_LOG_DEBUG("Flush at %x", flashAddr);
 | 
			
		||||
    if (memcmp(flashBuf, (void *)flashAddr, FLASH_PAGE_SIZE) != 0) {
 | 
			
		||||
        NRF_LOG_DEBUG("Write flush at %x", flashAddr);
 | 
			
		||||
        nrf_nvmc_page_erase(flashAddr);
 | 
			
		||||
        nrf_nvmc_write_words(flashAddr, (uint32_t *)flashBuf, FLASH_PAGE_SIZE / sizeof(uint32_t));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flashAddr = NO_CACHE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void flash_write(uint32_t dst, const uint8_t *src, int len) {
 | 
			
		||||
    uint32_t newAddr = dst & ~(FLASH_PAGE_SIZE - 1);
 | 
			
		||||
 | 
			
		||||
    if (newAddr != flashAddr) {
 | 
			
		||||
        flushFlash();
 | 
			
		||||
        flashAddr = newAddr;
 | 
			
		||||
        memcpy(flashBuf, (void *)newAddr, FLASH_PAGE_SIZE);
 | 
			
		||||
    }
 | 
			
		||||
    memcpy(flashBuf + (dst & (FLASH_PAGE_SIZE - 1)), src, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Write an block
 | 
			
		||||
 *
 | 
			
		||||
 * @return number of bytes processed, only 3 following values
 | 
			
		||||
@@ -340,7 +300,7 @@ int write_block(uint32_t block_no, uint8_t *data, bool quiet/*, WriteState *stat
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // flush last blocks if needed
 | 
			
		||||
                flushFlash();
 | 
			
		||||
                flash_flush();
 | 
			
		||||
 | 
			
		||||
                uf2_write_complete(state->numBlocks);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user