WIP - offset in page
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/46f19dcd Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/46f19dcd Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/46f19dcd Branch: refs/heads/sensors_branch Commit: 46f19dcd0f3c2fb1bc198ccb6871c38ddec1f1a9 Parents: 1d0b37b Author: Fabio Utzig <ut...@utzig.org> Authored: Mon Jan 2 20:47:29 2017 -0200 Committer: Fabio Utzig <ut...@utzig.org> Committed: Fri Jan 20 07:27:40 2017 -0200 ---------------------------------------------------------------------- hw/drivers/flash/src/flash.c | 43 ++++++++++++++------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/46f19dcd/hw/drivers/flash/src/flash.c ---------------------------------------------------------------------- diff --git a/hw/drivers/flash/src/flash.c b/hw/drivers/flash/src/flash.c index b5b7caf..468f918 100644 --- a/hw/drivers/flash/src/flash.c +++ b/hw/drivers/flash/src/flash.c @@ -176,18 +176,6 @@ buffer_equal(struct flash_dev *dev) return ((read_status(dev) & STATUS_CMP) == 0); } -static inline uint16_t -page_address(uint32_t addr) -{ - return (uint16_t) addr / PAGE_SIZE; -} - -static inline uint16_t -block_address(uint32_t addr) -{ - return (uint16_t) addr % PAGE_SIZE; -} - /* FIXME: add timeout */ static inline void wait_ready(struct flash_dev *dev) @@ -238,19 +226,20 @@ flash_read(uint8_t flash_id, uint32_t addr, void *buf, size_t len) uint8_t val; uint32_t n; uint16_t page_count; + uint16_t page_index; uint16_t offset; + uint16_t amount; dev = cfg_dev(flash_id); if (!dev) { return -1; } - /* FIXME: when reading beyond the end of the page, it rolls back to the - * beginning of the same page... - */ - page_count = (len / (PAGE_SIZE + 1)) + 1; - offset = 0; + offset = addr % PAGE_SIZE; + if (len - offset >= PAGE_SIZE) { + page_count++; + } while (page_count--) { wait_ready(dev); @@ -259,15 +248,15 @@ flash_read(uint8_t flash_id, uint32_t addr, void *buf, size_t len) hal_spi_tx_val(dev->spi_num, MEM_READ); - pa = page_address(addr); - ba = block_address(addr); - - /* FIXME: not using BA9 (required to access more than 512 bytes on page) */ + pa = addr / PAGE_SIZE; + ba = addr % PAGE_SIZE; /* < r, PA12-6 > */ val = (pa >> 6) & ~0x80; hal_spi_tx_val(dev->spi_num, val); + /* FIXME: not using BA9 */ + /* < PA5-0, BA9-8 > */ val = (pa << 2) | ((ba >> 8) & 1); hal_spi_tx_val(dev->spi_num, val); @@ -281,13 +270,15 @@ flash_read(uint8_t flash_id, uint32_t addr, void *buf, size_t len) hal_spi_tx_val(dev->spi_num, 0xff); hal_spi_tx_val(dev->spi_num, 0xff); - for (n = 0; n < len; n++) { + amount = MIN + for (n = 0; n < amount; n++) { *((uint8_t *) buf + n) = hal_spi_tx_val(dev->spi_num, 0xff); } hal_gpio_write(dev->ss_pin, 1); - offset += PAGE_SIZE; + page_index += PAGE_SIZE; + addr = (addr + offset) & (PAGE_SIZE - 1); } return 0; @@ -299,7 +290,6 @@ flash_write(uint8_t flash_id, uint32_t addr, const void *buf, size_t len) struct flash_dev *dev; uint16_t pa; //uint16_t bfa; - //uint8_t val; uint32_t n; int page_count; int offset; @@ -310,16 +300,13 @@ flash_write(uint8_t flash_id, uint32_t addr, const void *buf, size_t len) } /* FIXME: calculation is assuming that addr starts at offset 0 in page */ + addr % PAGE_SIZE page_count = (len / (PAGE_SIZE + 1)) + 1; if (!page_count) { return 0; } - /* FIXME: when reading beyond the end of the page, it rolls back to the - * beginning of the same page... - */ - offset = 0; while (page_count-- >= 0) { wait_ready(dev);