[feat][flash] add bflb_flash_get_image_offset api
This commit is contained in:
parent
a093cca2f0
commit
5133d0f5d9
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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);
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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]) {
|
||||||
|
Reference in New Issue
Block a user