[beken-72xx] Wrap BkDriverFlash for correct partition offsets

This commit is contained in:
Kuba Szczodrzyński
2022-07-07 17:45:58 +02:00
parent c96ef2ff7a
commit e37014ebd6
2 changed files with 132 additions and 0 deletions

View File

@@ -111,6 +111,10 @@ env.Append(
"-Wl,-wrap,snprintf",
"-Wl,-wrap,sprintf",
"-Wl,-wrap,vsnprintf",
"-Wl,-wrap,bk_flash_get_info",
"-Wl,-wrap,bk_flash_erase",
"-Wl,-wrap,bk_flash_write",
"-Wl,-wrap,bk_flash_read",
],
)
@@ -154,6 +158,7 @@ env.AddLibrary(
"+<arch_main.c>",
"+<ate_app.c>",
"+<intc.c>",
"+<wrap_BkDriverFlash.c>",
*srcs_fixups,
],
)

View File

@@ -0,0 +1,127 @@
/* Copyright (c) Kuba Szczodrzyński 2022-07-07. */
#include "BkDriverFlash.h"
#include "drv_model_pub.h"
#include "uart_pub.h"
static const bk_logic_partition_t bk7231_partitions[BK_PARTITION_MAX] = {
{
.partition_owner = BK_FLASH_EMBEDDED,
.partition_description = "Bootloader",
.partition_start_addr = FLASH_BOOTLOADER_OFFSET,
.partition_length = FLASH_BOOTLOADER_LENGTH,
.partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_DIS,
},
{
.partition_owner = BK_FLASH_EMBEDDED,
.partition_description = "Application",
.partition_start_addr = FLASH_APP_OFFSET,
.partition_length = FLASH_APP_LENGTH,
.partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_DIS,
},
{
.partition_owner = BK_FLASH_EMBEDDED,
.partition_description = "ota",
.partition_start_addr = FLASH_DOWNLOAD_OFFSET,
.partition_length = FLASH_DOWNLOAD_LENGTH,
.partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_DIS,
},
{
.partition_owner = BK_FLASH_EMBEDDED,
.partition_description = "RF Firmware",
.partition_start_addr = FLASH_TLV_OFFSET,
.partition_length = FLASH_TLV_LENGTH,
.partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_DIS,
},
{
.partition_owner = BK_FLASH_EMBEDDED,
.partition_description = "NET info",
.partition_start_addr = FLASH_NET_OFFSET,
.partition_length = FLASH_NET_LENGTH,
.partition_options = PAR_OPT_READ_EN | PAR_OPT_WRITE_DIS,
},
};
bk_logic_partition_t *__wrap_bk_flash_get_info(bk_partition_t partition) {
if ((partition >= BK_PARTITION_BOOTLOADER) && (partition < BK_PARTITION_MAX))
return (bk_logic_partition_t *)&bk7231_partitions[partition];
return NULL;
}
OSStatus __wrap_bk_flash_erase(bk_partition_t partition, uint32_t off_set, uint32_t size) {
uint32_t i;
uint32_t param;
UINT32 status;
DD_HANDLE flash_hdl;
uint32_t start_sector, end_sector;
bk_logic_partition_t *partition_info;
GLOBAL_INT_DECLARATION();
partition_info = bk_flash_get_info(partition);
start_sector = off_set >> 12;
end_sector = (off_set + size - 1) >> 12;
flash_hdl = ddev_open(FLASH_DEV_NAME, &status, 0);
ASSERT(DD_HANDLE_UNVALID != flash_hdl);
for (i = start_sector; i <= end_sector; i++) {
param = partition_info->partition_start_addr + (i << 12);
GLOBAL_INT_DISABLE();
ddev_control(flash_hdl, CMD_FLASH_ERASE_SECTOR, (void *)&param);
GLOBAL_INT_RESTORE();
}
return kNoErr;
}
OSStatus
__wrap_bk_flash_write(bk_partition_t partition, volatile uint32_t off_set, uint8_t *inBuffer, uint32_t inBufferLength) {
UINT32 status;
DD_HANDLE flash_hdl;
uint32_t start_addr;
bk_logic_partition_t *partition_info;
GLOBAL_INT_DECLARATION();
if (NULL == inBuffer) {
os_printf("%s inBuffer=NULL\r\n", __FUNCTION__);
return kParamErr;
}
partition_info = bk_flash_get_info(partition);
if (NULL == partition_info) {
os_printf("%s partiion not found\r\n", __FUNCTION__);
return kNotFoundErr;
}
start_addr = partition_info->partition_start_addr + off_set;
flash_hdl = ddev_open(FLASH_DEV_NAME, &status, 0);
if (DD_HANDLE_UNVALID == flash_hdl) {
os_printf("%s open failed\r\n", __FUNCTION__);
return kOpenErr;
}
GLOBAL_INT_DISABLE();
ddev_write(flash_hdl, (char *)inBuffer, inBufferLength, start_addr);
GLOBAL_INT_RESTORE();
return kNoErr;
}
OSStatus
__wrap_bk_flash_read(bk_partition_t partition, volatile uint32_t off_set, uint8_t *outBuffer, uint32_t inBufferLength) {
UINT32 status;
uint32_t start_addr;
DD_HANDLE flash_hdl;
bk_logic_partition_t *partition_info;
GLOBAL_INT_DECLARATION();
if (NULL == outBuffer) {
os_printf("%s outBuffer=NULL\r\n", __FUNCTION__);
return kParamErr;
}
partition_info = bk_flash_get_info(partition);
if (NULL == partition_info) {
os_printf("%s partiion not found\r\n", __FUNCTION__);
return kNotFoundErr;
}
start_addr = partition_info->partition_start_addr + off_set;
flash_hdl = ddev_open(FLASH_DEV_NAME, &status, 0);
if (DD_HANDLE_UNVALID == flash_hdl) {
os_printf("%s open failed\r\n", __FUNCTION__);
return kOpenErr;
}
GLOBAL_INT_DISABLE();
ddev_read(flash_hdl, (char *)outBuffer, inBufferLength, start_addr);
GLOBAL_INT_RESTORE();
return kNoErr;
}