parent
fa71c8244c
commit
238e3fd7c1
@ -0,0 +1,22 @@
|
||||
#ifndef LAYOUT_COMMON_H
|
||||
#define LAYOUT_COMMON_H
|
||||
|
||||
#include "flash.h"
|
||||
|
||||
// OTP blocks allocation
|
||||
#define FLASH_OTP_BLOCK_BATCH 0
|
||||
#define FLASH_OTP_BLOCK_BOOTLOADER_VERSION 1
|
||||
#define FLASH_OTP_BLOCK_VENDOR_HEADER_LOCK 2
|
||||
#define FLASH_OTP_BLOCK_RANDOMNESS 3
|
||||
#define FLASH_OTP_BLOCK_DEVICE_VARIANT 4
|
||||
|
||||
#define STORAGE_AREAS_COUNT (2)
|
||||
|
||||
extern const flash_area_t STORAGE_AREAS[STORAGE_AREAS_COUNT];
|
||||
extern const flash_area_t BOARDLOADER_AREA;
|
||||
extern const flash_area_t BOOTLOADER_AREA;
|
||||
extern const flash_area_t FIRMWARE_AREA;
|
||||
extern const flash_area_t WIPE_AREA;
|
||||
extern const flash_area_t ALL_WIPE_AREA;
|
||||
|
||||
#endif
|
@ -0,0 +1 @@
|
||||
model_T2T1_layout.c
|
@ -0,0 +1,39 @@
|
||||
#include "flash.h"
|
||||
#include "model.h"
|
||||
|
||||
const flash_area_t STORAGE_AREAS[STORAGE_AREAS_COUNT] = {
|
||||
{
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 2,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 3,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t BOOTLOADER_AREA = {
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 0,
|
||||
.num_sectors = 2,
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t FIRMWARE_AREA = {
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 4,
|
||||
.num_sectors = 8,
|
||||
},
|
||||
};
|
@ -0,0 +1 @@
|
||||
model_T2T1_layout.c
|
@ -0,0 +1,82 @@
|
||||
#include "flash.h"
|
||||
#include "model.h"
|
||||
|
||||
const flash_area_t STORAGE_AREAS[STORAGE_AREAS_COUNT] = {
|
||||
{
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 4,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 16,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t BOARDLOADER_AREA = {
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 0,
|
||||
.num_sectors = 3,
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t BOOTLOADER_AREA = {
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 5,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t FIRMWARE_AREA = {
|
||||
.num_subareas = 2,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 6,
|
||||
.num_sectors = 6,
|
||||
},
|
||||
.subarea[1] =
|
||||
{
|
||||
.first_sector = 17,
|
||||
.num_sectors = 7,
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t WIPE_AREA = {
|
||||
.num_subareas = 3,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 4,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
.subarea[1] =
|
||||
{
|
||||
.first_sector = 6,
|
||||
.num_sectors =
|
||||
9, // sector 15 skipped due to bootloader MPU settings
|
||||
},
|
||||
.subarea[2] =
|
||||
{
|
||||
.first_sector = 16,
|
||||
.num_sectors = 8,
|
||||
},
|
||||
};
|
||||
|
||||
const flash_area_t ALL_WIPE_AREA = {
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 3,
|
||||
.num_sectors = 21,
|
||||
},
|
||||
};
|
@ -1 +0,0 @@
|
||||
../stm32f4/image.c
|
@ -1,2 +1,4 @@
|
||||
|
||||
#define FLASH_BYTE_ACCESS 1
|
||||
|
||||
void emulator_poll_events(void);
|
||||
|
@ -0,0 +1,127 @@
|
||||
#include "flash.h"
|
||||
|
||||
static uint32_t flash_subarea_get_size(const flash_subarea_t *subarea) {
|
||||
uint32_t size = 0;
|
||||
for (int s = 0; s < subarea->num_sectors; s++) {
|
||||
size += flash_sector_size(subarea->first_sector + s);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static secbool subarea_get_sector_and_offset(const flash_subarea_t *subarea,
|
||||
uint32_t offset,
|
||||
uint16_t *sector_out,
|
||||
uint32_t *offset_out) {
|
||||
uint32_t tmp_offset = offset;
|
||||
uint16_t sector = subarea->first_sector;
|
||||
|
||||
// in correct subarea
|
||||
for (int s = 0; s < subarea->num_sectors; s++) {
|
||||
const uint32_t sector_size = flash_sector_size(sector);
|
||||
if (tmp_offset < sector_size) {
|
||||
*sector_out = sector;
|
||||
*offset_out = tmp_offset;
|
||||
return sectrue;
|
||||
}
|
||||
tmp_offset -= sector_size;
|
||||
sector++;
|
||||
}
|
||||
return secfalse;
|
||||
}
|
||||
|
||||
uint32_t flash_area_get_size(const flash_area_t *area) {
|
||||
uint32_t size = 0;
|
||||
for (int i = 0; i < area->num_subareas; i++) {
|
||||
size += flash_subarea_get_size(&area->subarea[i]);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
uint16_t flash_total_sectors(const flash_area_t *area) {
|
||||
uint16_t total = 0;
|
||||
for (int i = 0; i < area->num_subareas; i++) {
|
||||
total += area->subarea[i].num_sectors;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
int32_t flash_get_sector_num(const flash_area_t *area,
|
||||
uint32_t sector_inner_num) {
|
||||
uint16_t sector = 0;
|
||||
uint16_t remaining = sector_inner_num;
|
||||
for (int i = 0; i < area->num_subareas; i++) {
|
||||
if (remaining < area->subarea[i].num_sectors) {
|
||||
sector = area->subarea[i].first_sector + remaining;
|
||||
return sector;
|
||||
} else {
|
||||
remaining -= area->subarea[i].num_sectors;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static secbool get_sector_and_offset(const flash_area_t *area, uint32_t offset,
|
||||
uint16_t *sector_out,
|
||||
uint32_t *offset_out) {
|
||||
uint32_t tmp_offset = offset;
|
||||
for (int i = 0; i < area->num_subareas; i++) {
|
||||
uint32_t sub_size = flash_subarea_get_size(&area->subarea[i]);
|
||||
if (tmp_offset >= sub_size) {
|
||||
tmp_offset -= sub_size;
|
||||
continue;
|
||||
}
|
||||
|
||||
return subarea_get_sector_and_offset(&area->subarea[i], tmp_offset,
|
||||
sector_out, offset_out);
|
||||
}
|
||||
return secfalse;
|
||||
}
|
||||
|
||||
const void *flash_area_get_address(const flash_area_t *area, uint32_t offset,
|
||||
uint32_t size) {
|
||||
uint16_t sector;
|
||||
uint32_t sector_offset;
|
||||
|
||||
if (!get_sector_and_offset(area, offset, §or, §or_offset)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return flash_get_address(sector, sector_offset, size);
|
||||
}
|
||||
|
||||
secbool flash_area_erase(const flash_area_t *area,
|
||||
void (*progress)(int pos, int len)) {
|
||||
return flash_area_erase_bulk(area, 1, progress);
|
||||
}
|
||||
|
||||
secbool flash_area_write_byte(const flash_area_t *area, uint32_t offset,
|
||||
uint8_t data) {
|
||||
uint16_t sector;
|
||||
uint32_t sector_offset;
|
||||
if (get_sector_and_offset(area, offset, §or, §or_offset) != sectrue) {
|
||||
return secfalse;
|
||||
}
|
||||
return flash_write_byte(sector, sector_offset, data);
|
||||
}
|
||||
|
||||
secbool flash_area_write_word(const flash_area_t *area, uint32_t offset,
|
||||
uint32_t data) {
|
||||
uint16_t sector;
|
||||
uint32_t sector_offset;
|
||||
if (get_sector_and_offset(area, offset, §or, §or_offset) != sectrue) {
|
||||
return secfalse;
|
||||
}
|
||||
return flash_write_word(sector, sector_offset, data);
|
||||
}
|
||||
|
||||
secbool flash_area_write_quadword(const flash_area_t *area, uint32_t offset,
|
||||
const uint32_t *data) {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (sectrue !=
|
||||
flash_area_write_word(area, offset + i * sizeof(uint32_t), data[i])) {
|
||||
return secfalse;
|
||||
}
|
||||
}
|
||||
return sectrue;
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
#ifndef FLASH_COMMON_H
|
||||
#define FLASH_COMMON_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "secbool.h"
|
||||
|
||||
typedef struct {
|
||||
uint16_t first_sector;
|
||||
uint16_t num_sectors;
|
||||
} flash_subarea_t;
|
||||
|
||||
typedef struct {
|
||||
flash_subarea_t subarea[4];
|
||||
uint8_t num_subareas;
|
||||
} flash_area_t;
|
||||
|
||||
void flash_init(void);
|
||||
|
||||
secbool __wur flash_unlock_write(void);
|
||||
secbool __wur flash_lock_write(void);
|
||||
|
||||
const void *flash_get_address(uint16_t sector, uint32_t offset, uint32_t size);
|
||||
uint32_t flash_sector_size(uint16_t sector);
|
||||
uint16_t flash_total_sectors(const flash_area_t *area);
|
||||
int32_t flash_get_sector_num(const flash_area_t *area,
|
||||
uint32_t sector_inner_num);
|
||||
|
||||
const void *flash_area_get_address(const flash_area_t *area, uint32_t offset,
|
||||
uint32_t size);
|
||||
uint32_t flash_area_get_size(const flash_area_t *area);
|
||||
|
||||
secbool __wur flash_area_erase(const flash_area_t *area,
|
||||
void (*progress)(int pos, int len));
|
||||
secbool __wur flash_area_erase_bulk(const flash_area_t *area, int count,
|
||||
void (*progress)(int pos, int len));
|
||||
|
||||
#if defined FLASH_BYTE_ACCESS
|
||||
secbool __wur flash_area_write_byte(const flash_area_t *area, uint32_t offset,
|
||||
uint8_t data);
|
||||
secbool __wur flash_area_write_word(const flash_area_t *area, uint32_t offset,
|
||||
uint32_t data);
|
||||
#endif
|
||||
secbool __wur flash_area_write_quadword(const flash_area_t *area,
|
||||
uint32_t offset, const uint32_t *data);
|
||||
|
||||
#endif
|
@ -0,0 +1,21 @@
|
||||
|
||||
#include "test_layout.h"
|
||||
|
||||
const flash_area_t STORAGE_AREAS[STORAGE_AREAS_COUNT] = {
|
||||
{
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 4,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
.num_subareas = 1,
|
||||
.subarea[0] =
|
||||
{
|
||||
.first_sector = 16,
|
||||
.num_sectors = 1,
|
||||
},
|
||||
},
|
||||
};
|
@ -0,0 +1,10 @@
|
||||
#ifndef TEST_LAYOUT_H
|
||||
#define TEST_LAYOUT_H
|
||||
|
||||
#define STORAGE_AREAS_COUNT 2
|
||||
|
||||
#include "flash_common.h"
|
||||
|
||||
extern const flash_area_t STORAGE_AREAS[STORAGE_AREAS_COUNT];
|
||||
|
||||
#endif
|
Loading…
Reference in new issue