1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-24 05:12:02 +00:00

flash: add flash_get_address

This commit is contained in:
Jan Pochyla 2017-10-18 18:30:53 +02:00
parent f07b4dda0b
commit c78babdc12
3 changed files with 49 additions and 26 deletions

View File

@ -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 STM32_HAL_H
#include <string.h> #include <string.h>
#include "flash.h" #include "flash.h"
// see docs/memory.md for more information // see docs/memory.md for more information
@ -46,6 +54,19 @@ secbool flash_lock(void)
return sectrue; 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)) secbool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int pos, int len))
{ {
if (sectrue != flash_unlock()) { 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)); 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) { 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) { if (offset % 4 != 0) {
return false; return secfalse;
} }
*data = *((uint32_t *) SECTOR_TABLE[sector] + offset); *data = *((uint32_t *) SECTOR_TABLE[sector] + offset);
return true; return sectrue;
} }
#define FLASH_OTP_LOCK_BASE 0x1FFF7A00U #define FLASH_OTP_LOCK_BASE 0x1FFF7A00U

View File

@ -48,6 +48,8 @@ extern const uint32_t FLASH_SECTOR_TABLE[FLASH_SECTOR_COUNT + 1];
secbool flash_unlock(void); secbool flash_unlock(void);
secbool flash_lock(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_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_byte(uint32_t address, uint8_t data);
secbool flash_write_word(uint32_t address, uint32_t data); secbool flash_write_word(uint32_t address, uint32_t data);

View File

@ -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) int flash_init(void)
{ {
flash_read(); flash_read();
@ -95,6 +82,19 @@ bool flash_lock(void)
return true; 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)) bool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int pos, int len))
{ {
if (progress) { 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) 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) { if (!flash) {
return false; return false;
} }
if ((flash[0] & data) != data) { 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[0] = data;
flash_sync(); 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 if (offset % 4) { // we write only at 4-byte boundary
return false; 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) { if (!flash) {
return false; return false;
} }
if ((flash[0] & data) != data) { 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[0] = data;
flash_sync(); 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 if (offset % 4) { // we read only at 4-byte boundary
return false; 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) { if (!flash) {
return false; return false;
} }