flash: add flash_get_address

pull/25/head
Jan Pochyla 7 years ago
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…
Cancel
Save