From c78babdc12fc18cc400585f19d53af2482100aa1 Mon Sep 17 00:00:00 2001 From: Jan Pochyla Date: Wed, 18 Oct 2017 18:30:53 +0200 Subject: [PATCH] flash: add flash_get_address --- embed/trezorhal/flash.c | 37 +++++++++++++++++++++++++++++-------- embed/trezorhal/flash.h | 2 ++ embed/unix/flash.c | 36 ++++++++++++++++++------------------ 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/embed/trezorhal/flash.c b/embed/trezorhal/flash.c index 08bccde09c..99cdb1b09f 100644 --- a/embed/trezorhal/flash.c +++ b/embed/trezorhal/flash.c @@ -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 + #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 diff --git a/embed/trezorhal/flash.h b/embed/trezorhal/flash.h index e62b6f1018..fea66b2965 100644 --- a/embed/trezorhal/flash.h +++ b/embed/trezorhal/flash.h @@ -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); diff --git a/embed/unix/flash.c b/embed/unix/flash.c index b554ec73a3..f4a4d91166 100644 --- a/embed/unix/flash.c +++ b/embed/unix/flash.c @@ -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; }