[feat][flash] add bflb_flash_get_image_offset api

This commit is contained in:
jzlv 2022-11-22 16:00:00 +08:00
parent a093cca2f0
commit 5133d0f5d9
10 changed files with 37 additions and 267 deletions

View File

@ -136,6 +136,7 @@ void board_init(void)
console_init(); console_init();
bl_show_log(); bl_show_log();
bl_show_flashinfo();
printf("dynamic memory init success,heap size = %d Kbyte \r\n", system_mmheap[0].mem_size / 1024); printf("dynamic memory init success,heap size = %d Kbyte \r\n", system_mmheap[0].mem_size / 1024);
} }

View File

@ -1,263 +0,0 @@
/****************************************************************************************
* @file flash.ld
*
* @brief This file is the link script file (gnuarm or armgcc).
*
* Copyright (C) BouffaloLab 2021
*
****************************************************************************************
*/
/* configure the CPU type */
OUTPUT_ARCH( "riscv" )
/* link with the standard c library */
INPUT(-lc)
/* link with the standard GCC library */
INPUT(-lgcc)
/* configure the entry point */
ENTRY(__start)
StackSize = 0x0400; /* 1KB */
HeapMinSize = 0x1000; /* 4KB */
MEMORY
{
xip_memory (rx) : ORIGIN = 0x58000000, LENGTH = 32M
itcm_memory (rx) : ORIGIN = 0x62028000, LENGTH = 12K
dtcm_memory (rx) : ORIGIN = 0x6202B000, LENGTH = 4K
nocache_ram_memory (!rx) : ORIGIN = 0x2202C000, LENGTH = 16K + 64K
ram_memory (!rx) : ORIGIN = 0x62040000, LENGTH = 160K - 64K
xram_memory (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
}
SECTIONS
{
.text :
{
. = ALIGN(4);
__text_code_start__ = .;
KEEP (*(SORT_NONE(.init)))
*(.text)
*(.text.*)
/* section information for shell */
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;
. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;
/* section information for usb usbh_class_info */
. = ALIGN(4);
__usbh_class_info_start__ = .;
KEEP(*(.usbh_class_info))
. = ALIGN(4);
__usbh_class_info_end__ = .;
/*put .rodata**/
*(EXCLUDE_FILE( *bl808_glb*.o* \
*bl808_glb_gpio*.o* \
*bl808_pds*.o* \
*bl808_aon*.o* \
*bl808_hbn*.o* \
*bl808_l1c*.o* \
*bl808_common*.o* \
*bl808_clock*.o* \
*bl808_ef_ctrl*.o* \
*bl808_sf_cfg*.o* \
*bl808_sf_ctrl*.o* \
*bl808_sflash*.o* \
*bl808_xip_sflash*.o* \
*bl808_romapi_patch*.o* ) .rodata*)
*(.srodata)
*(.srodata.*)
. = ALIGN(4);
__text_code_end__ = .;
} > xip_memory
. = ALIGN(4);
__itcm_load_addr = .;
.itcm_region : AT (__itcm_load_addr)
{
. = ALIGN(4);
__tcm_code_start__ = .;
*(.tcm_code.*)
*(.tcm_const.*)
*(.sclock_rlt_code.*)
*(.sclock_rlt_const.*)
*bl808_glb*.o*(.rodata*)
*bl808_glb_gpio*.o*(.rodata*)
*bl808_pds*.o*(.rodata*)
*bl808_aon*.o*(.rodata*)
*bl808_hbn*.o*(.rodata*)
*bl808_l1c*.o*(.rodata*)
*bl808_common*.o*(.rodata*)
*bl808_clock*.o*(.rodata*)
*bl808_ef_ctrl*.o*(.rodata*)
*bl808_sf_cfg*.o*(.rodata*)
*bl808_sf_ctrl*.o*(.rodata*)
*bl808_sflash*.o*(.rodata*)
*bl808_xip_sflash*.o*(.rodata*)
*bl808_romapi_patch*.o*(.rodata*)
. = ALIGN(4);
__tcm_code_end__ = .;
} > itcm_memory
__dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);
.dtcm_region : AT (__dtcm_load_addr)
{
. = ALIGN(4);
__tcm_data_start__ = .;
*(.tcm_data)
/* *finger_print.o(.data*) */
. = ALIGN(4);
__tcm_data_end__ = .;
} > dtcm_memory
/*************************************************************************/
/* .stack_dummy section doesn't contains any symbols. It is only
* used for linker to calculate size of stack sections, and assign
* values to stack symbols later */
.stack_dummy (NOLOAD):
{
. = ALIGN(0x4);
. = . + StackSize;
. = ALIGN(0x4);
} > dtcm_memory
/* Set stack top to end of RAM, and stack limit move down by
* size of stack_dummy section */
__StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);
PROVIDE( __freertos_irq_stack_top = __StackTop);
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
/* Check if data + heap + stack exceeds RAM limit */
ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")
/*************************************************************************/
__nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region);
.nocache_ram_region : AT (__nocache_ram_load_addr)
{
. = ALIGN(4);
__nocache_ram_data_start__ = .;
*(.nocache_ram)
. = ALIGN(4);
__nocache_ram_data_end__ = .;
} > nocache_ram_memory
__system_ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region);
.system_ram_data_region : AT (__system_ram_load_addr)
{
. = ALIGN(4);
__system_ram_data_start__ = .;
*(.system_ram)
. = ALIGN(4);
__system_ram_data_end__ = .;
} > ram_memory
.system_ram_noinit_data_region (NOLOAD) :
{
. = ALIGN(4);
*(.system_ram_noinit)
. = ALIGN(4);
} > ram_memory
__ram_load_addr = __system_ram_load_addr + SIZEOF(.system_ram_data_region);
/* Data section */
RAM_DATA : AT (__ram_load_addr)
{
. = ALIGN(4);
__ram_data_start__ = .;
PROVIDE( __global_pointer$ = . + 0x800 );
*(.data)
*(.data.*)
*(.sdata)
*(.sdata.*)
*(.sdata2)
*(.sdata2.*)
. = ALIGN(4);
__ram_data_end__ = .;
} > ram_memory
__etext_final = (__ram_load_addr + SIZEOF (RAM_DATA));
ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow")
.bss (NOLOAD) :
{
. = ALIGN(4);
__bss_start__ = .;
*(.bss*)
*(.sbss*)
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
} > ram_memory
.noinit_data (NOLOAD) :
{
. = ALIGN(4);
__noinit_data_start__ = .;
*(.noinit_data*)
. = ALIGN(4);
__noinit_data_end__ = .;
} > ram_memory
.nocache_noinit_ram_region (NOLOAD) :
{
. = ALIGN(4);
__nocache_noinit_ram_data_start__ = .;
*(.nocache_noinit_ram)
*(.noncacheable)
. = ALIGN(4);
__nocache_noinit_ram_data_end__ = .;
} > nocache_ram_memory
.heap (NOLOAD):
{
. = ALIGN(4);
__HeapBase = .;
/*__end__ = .;*/
/*end = __end__;*/
KEEP(*(.heap*))
. = ALIGN(4);
__HeapLimit = .;
} > ram_memory
__HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory);
ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow")
}

View File

@ -41,6 +41,7 @@ int bflb_flash_init(void);
uint32_t bflb_flash_get_jedec_id(void); uint32_t bflb_flash_get_jedec_id(void);
void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len); void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len);
void bflb_flash_set_iomode(uint8_t iomode); void bflb_flash_set_iomode(uint8_t iomode);
uint32_t bflb_flash_get_image_offset(void);
int bflb_flash_erase(uint32_t addr, uint32_t len); int bflb_flash_erase(uint32_t addr, uint32_t len);
int bflb_flash_write(uint32_t addr, uint8_t *data, uint32_t len); int bflb_flash_write(uint32_t addr, uint8_t *data, uint32_t len);
int bflb_flash_read(uint32_t addr, uint8_t *data, uint32_t len); int bflb_flash_read(uint32_t addr, uint8_t *data, uint32_t len);

View File

@ -109,6 +109,22 @@ void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len)
*len = sizeof(SPI_Flash_Cfg_Type); *len = sizeof(SPI_Flash_Cfg_Type);
} }
void bflb_flash_set_iomode(uint8_t iomode)
{
g_flash_cfg.ioMode &= ~0x1f;
if (iomode == 4) {
g_flash_cfg.ioMode |= iomode;
} else {
g_flash_cfg.ioMode |= 0x10;
g_flash_cfg.ioMode |= iomode;
}
}
ATTR_TCM_SECTION uint32_t bflb_flash_get_image_offset(void)
{
return SF_Ctrl_Get_Flash_Image_Offset();
}
/** /**
* @brief flash erase * @brief flash erase
* *

View File

@ -258,6 +258,11 @@ void bflb_flash_set_iomode(uint8_t iomode)
} }
} }
ATTR_TCM_SECTION uint32_t bflb_flash_get_image_offset(void)
{
return SF_Ctrl_Get_Flash_Image_Offset(0, 0);
}
/** /**
* @brief erase flash via sbus * @brief erase flash via sbus
* *

View File

@ -126,6 +126,11 @@ void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len)
*len = sizeof(SPI_Flash_Cfg_Type); *len = sizeof(SPI_Flash_Cfg_Type);
} }
ATTR_TCM_SECTION uint32_t bflb_flash_get_image_offset(void)
{
return SF_Ctrl_Get_Flash_Image_Offset();
}
void bflb_flash_set_iomode(uint8_t iomode) void bflb_flash_set_iomode(uint8_t iomode)
{ {
g_flash_cfg.ioMode &= ~0x0f; g_flash_cfg.ioMode &= ~0x0f;

View File

@ -160,6 +160,11 @@ void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len)
*len = sizeof(SPI_Flash_Cfg_Type); *len = sizeof(SPI_Flash_Cfg_Type);
} }
ATTR_TCM_SECTION uint32_t bflb_flash_get_image_offset(void)
{
return SF_Ctrl_Get_Flash_Image_Offset(0, 0);
}
void bflb_flash_set_iomode(uint8_t iomode) void bflb_flash_set_iomode(uint8_t iomode)
{ {
g_flash_cfg.ioMode &= ~0x1f; g_flash_cfg.ioMode &= ~0x1f;

View File

@ -120,7 +120,7 @@ int main(void)
struct bflb_dma_channel_lli_pool_s lli[1]; /* max trasnfer size 4064 * 1 */ struct bflb_dma_channel_lli_pool_s lli[1]; /* max trasnfer size 4064 * 1 */
struct bflb_dma_channel_lli_transfer_s transfers[1]; struct bflb_dma_channel_lli_transfer_s transfers[1];
transfers[0].src_addr = (uint32_t)(FLASH_XIP_BASE - 0x2000 + 0x00010000 + DMA_FLASH_ADDR_OFFSET); transfers[0].src_addr = (uint32_t)(FLASH_XIP_BASE - bflb_flash_get_image_offset() + 0x00010000 + DMA_FLASH_ADDR_OFFSET);
transfers[0].dst_addr = (uint32_t)dst_buffer; transfers[0].dst_addr = (uint32_t)dst_buffer;
transfers[0].nbytes = DMA_BUFFER_LENGTH - DMA_FLASH_ADDR_OFFSET; transfers[0].nbytes = DMA_BUFFER_LENGTH - DMA_FLASH_ADDR_OFFSET;

View File

@ -80,7 +80,7 @@ int main(void)
bflb_flash_aes_enable(); bflb_flash_aes_enable();
/* read 0x00010000 flash data */ /* read 0x00010000 flash data */
bflb_data_compare(aes_ctr_pt_buffer, (uint8_t *)(FLASH_XIP_BASE - 0x2000 + 0x00010000), AES_DATA_LEN); bflb_data_compare(aes_ctr_pt_buffer, (uint8_t *)(FLASH_XIP_BASE - bflb_flash_get_image_offset() + 0x00010000), AES_DATA_LEN);
printf("flash decrypt with flash aes ctr128 success\r\n"); printf("flash decrypt with flash aes ctr128 success\r\n");
bflb_flash_read(0x00010000, aes_ctr_tmp_buffer, AES_DATA_LEN); bflb_flash_read(0x00010000, aes_ctr_tmp_buffer, AES_DATA_LEN);

View File

@ -21,7 +21,7 @@ int main(void)
bflb_flash_erase(0x00010000 + (i - 1) * 1024, i * 1024); bflb_flash_erase(0x00010000 + (i - 1) * 1024, i * 1024);
/* read 0x00010000 flash data */ /* read 0x00010000 flash data */
read_buf = (uint8_t *)(FLASH_XIP_BASE - 0x2000 + 0x00010000 + (i - 1) * 1024); read_buf = (uint8_t *)(FLASH_XIP_BASE - bflb_flash_get_image_offset() + 0x00010000 + (i - 1) * 1024);
bflb_l1c_dcache_invalidate_range(read_buf, 256); bflb_l1c_dcache_invalidate_range(read_buf, 256);
for (uint16_t j = 0; j < 256; j++) { for (uint16_t j = 0; j < 256; j++) {
if (read_buf[j] != 0xff) { if (read_buf[j] != 0xff) {
@ -34,7 +34,7 @@ int main(void)
bflb_flash_write(0x00010000 + (i - 1) * 1024, write_buf, sizeof(write_buf)); bflb_flash_write(0x00010000 + (i - 1) * 1024, write_buf, sizeof(write_buf));
/* read 0x00010000 flash data */ /* read 0x00010000 flash data */
read_buf = (uint8_t *)(FLASH_XIP_BASE - 0x2000 + 0x00010000 + (i - 1) * 1024); read_buf = (uint8_t *)(FLASH_XIP_BASE - bflb_flash_get_image_offset() + 0x00010000 + (i - 1) * 1024);
bflb_l1c_dcache_invalidate_range(read_buf, 256); bflb_l1c_dcache_invalidate_range(read_buf, 256);
for (uint16_t j = 0; j < 256; j++) { for (uint16_t j = 0; j < 256; j++) {
if (read_buf[j] != write_buf[j]) { if (read_buf[j] != write_buf[j]) {