mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-23 13:02:03 +00:00
flash: add flash_get_address
This commit is contained in:
parent
f07b4dda0b
commit
c78babdc12
@ -1,6 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Pavol Rusnak, Jan Pochyla, SatoshiLabs
|
||||
*
|
||||
* Licensed under TREZOR License
|
||||
* see LICENSE file for details
|
||||
*/
|
||||
|
||||
#include STM32_HAL_H
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "flash.h"
|
||||
|
||||
// see docs/memory.md for more information
|
||||
@ -46,6 +54,19 @@ secbool flash_lock(void)
|
||||
return sectrue;
|
||||
}
|
||||
|
||||
const void *flash_get_address(uint8_t sector, uint32_t offset, uint32_t size)
|
||||
{
|
||||
if (sector >= SECTOR_COUNT) {
|
||||
return NULL;
|
||||
}
|
||||
uint32_t addr = SECTOR_TABLE[sector];
|
||||
uint32_t next = SECTOR_TABLE[sector + 1];
|
||||
if (offset + size > next - addr) {
|
||||
return NULL;
|
||||
}
|
||||
return (const uint8_t *)addr + offset;
|
||||
}
|
||||
|
||||
secbool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int pos, int len))
|
||||
{
|
||||
if (sectrue != flash_unlock()) {
|
||||
@ -91,26 +112,26 @@ secbool flash_write_word(uint32_t address, uint32_t data)
|
||||
return sectrue * (HAL_OK == HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data));
|
||||
}
|
||||
|
||||
bool flash_write_byte_rel(uint8_t sector, uint32_t offset, uint8_t data)
|
||||
secbool flash_write_byte_rel(uint8_t sector, uint32_t offset, uint8_t data)
|
||||
{
|
||||
return HAL_OK == HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, SECTOR_TABLE[sector] + offset, data);
|
||||
return sectrue * (HAL_OK == HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, SECTOR_TABLE[sector] + offset, data));
|
||||
}
|
||||
|
||||
bool flash_write_word_rel(uint8_t sector, uint32_t offset, uint32_t data)
|
||||
secbool flash_write_word_rel(uint8_t sector, uint32_t offset, uint32_t data)
|
||||
{
|
||||
if (offset % 4 != 0) {
|
||||
return false;
|
||||
return secfalse;
|
||||
}
|
||||
return HAL_OK == HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, SECTOR_TABLE[sector] + offset, data);
|
||||
return sectrue * (HAL_OK == HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, SECTOR_TABLE[sector] + offset, data));
|
||||
}
|
||||
|
||||
bool flash_read_word_rel(uint8_t sector, uint32_t offset, uint32_t *data)
|
||||
secbool flash_read_word_rel(uint8_t sector, uint32_t offset, uint32_t *data)
|
||||
{
|
||||
if (offset % 4 != 0) {
|
||||
return false;
|
||||
return secfalse;
|
||||
}
|
||||
*data = *((uint32_t *) SECTOR_TABLE[sector] + offset);
|
||||
return true;
|
||||
return sectrue;
|
||||
}
|
||||
|
||||
#define FLASH_OTP_LOCK_BASE 0x1FFF7A00U
|
||||
|
@ -48,6 +48,8 @@ extern const uint32_t FLASH_SECTOR_TABLE[FLASH_SECTOR_COUNT + 1];
|
||||
secbool flash_unlock(void);
|
||||
secbool flash_lock(void);
|
||||
|
||||
const void *flash_get_address(uint8_t sector, uint32_t offset, uint32_t size);
|
||||
|
||||
secbool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int pos, int len));
|
||||
secbool flash_write_byte(uint32_t address, uint8_t data);
|
||||
secbool flash_write_word(uint32_t address, uint32_t data);
|
||||
|
@ -62,19 +62,6 @@ static void flash_read(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void *sector_ptr(uint8_t sector, uint32_t offset, uint32_t size)
|
||||
{
|
||||
if (sector >= SECTOR_COUNT) {
|
||||
return NULL;
|
||||
}
|
||||
uint32_t sector_size = sector_table[sector + 1] - sector_table[sector];
|
||||
if (offset + size > sector_size) {
|
||||
return NULL;
|
||||
}
|
||||
uint32_t sector_offset = sector_table[sector] - sector_table[0];
|
||||
return flash_buffer + sector_offset + offset;
|
||||
}
|
||||
|
||||
int flash_init(void)
|
||||
{
|
||||
flash_read();
|
||||
@ -95,6 +82,19 @@ bool flash_lock(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
const void *flash_get_address(uint8_t sector, uint32_t offset, uint32_t size)
|
||||
{
|
||||
if (sector >= SECTOR_COUNT) {
|
||||
return NULL;
|
||||
}
|
||||
uint32_t sector_size = sector_table[sector + 1] - sector_table[sector];
|
||||
if (offset + size > sector_size) {
|
||||
return NULL;
|
||||
}
|
||||
uint32_t sector_offset = sector_table[sector] - sector_table[0];
|
||||
return flash_buffer + sector_offset + offset;
|
||||
}
|
||||
|
||||
bool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int pos, int len))
|
||||
{
|
||||
if (progress) {
|
||||
@ -115,12 +115,12 @@ bool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int p
|
||||
|
||||
bool flash_write_byte_rel(uint8_t sector, uint32_t offset, uint8_t data)
|
||||
{
|
||||
uint8_t *flash = sector_ptr(sector, offset, sizeof(data));
|
||||
uint8_t *flash = (uint8_t *)flash_get_address(sector, offset, sizeof(data));
|
||||
if (!flash) {
|
||||
return false;
|
||||
}
|
||||
if ((flash[0] & data) != data) {
|
||||
return false; // we cannot change zeros to ones
|
||||
return false; // we cannot change zeroes to ones
|
||||
}
|
||||
flash[0] = data;
|
||||
flash_sync();
|
||||
@ -132,12 +132,12 @@ bool flash_write_word_rel(uint8_t sector, uint32_t offset, uint32_t data)
|
||||
if (offset % 4) { // we write only at 4-byte boundary
|
||||
return false;
|
||||
}
|
||||
uint32_t *flash = sector_ptr(sector, offset, sizeof(data));
|
||||
uint32_t *flash = (uint32_t *)flash_get_address(sector, offset, sizeof(data));
|
||||
if (!flash) {
|
||||
return false;
|
||||
}
|
||||
if ((flash[0] & data) != data) {
|
||||
return false; // we cannot change zeros to ones
|
||||
return false; // we cannot change zeroes to ones
|
||||
}
|
||||
flash[0] = data;
|
||||
flash_sync();
|
||||
@ -149,7 +149,7 @@ bool flash_read_word_rel(uint8_t sector, uint32_t offset, uint32_t *data)
|
||||
if (offset % 4) { // we read only at 4-byte boundary
|
||||
return false;
|
||||
}
|
||||
uint32_t *flash = sector_ptr(sector, offset, sizeof(data));
|
||||
uint32_t *flash = (uint32_t *)flash_get_address(sector, offset, sizeof(data));
|
||||
if (!flash) {
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user