diff options
| author | hathach <[email protected]> | 2018-09-08 16:39:42 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-09-08 16:39:42 +0700 |
| commit | 154daf584c01fd2131d92233535c83ee15c246a2 (patch) | |
| tree | 5d65427f4bf890e7ff7272c8e1891c6c9c94fc5f /examples/device | |
| parent | 8572947da584e10d202845bccafaf313c4693460 (diff) | |
better qspi
Diffstat (limited to 'examples/device')
| -rw-r--r-- | examples/device/nrf52840/src/msc_flash_qspi.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/examples/device/nrf52840/src/msc_flash_qspi.c b/examples/device/nrf52840/src/msc_flash_qspi.c index 3496d06bb..c2cca9b20 100644 --- a/examples/device/nrf52840/src/msc_flash_qspi.c +++ b/examples/device/nrf52840/src/msc_flash_qspi.c @@ -47,6 +47,19 @@ void flash_flush (void); //--------------------------------------------------------------------+ // MACRO TYPEDEF CONSTANT ENUM DECLARATION //--------------------------------------------------------------------+ +enum +{ + FLASH_STATE_IDLE, + FLASH_STATE_BUSY, + FLASH_STATE_COMPLETE +}; + +volatile uint8_t _fl_state = FLASH_STATE_IDLE; + +void qspi_flash_complete (void) +{ + _fl_state = FLASH_STATE_COMPLETE; +} //------------- IMPLEMENTATION -------------// // Callback invoked when received READ10 command. @@ -55,8 +68,27 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buff { uint32_t addr = lba * CFG_TUD_MSC_BLOCK_SZ + offset; - flash_read(buffer, addr, bufsize); +// switch ( _fl_state ) +// { +// case FLASH_STATE_IDLE: +// _fl_state = FLASH_STATE_BUSY; +// flash_read(buffer, addr, bufsize); +// return 0; // data not ready +// +// case FLASH_STATE_BUSY: +// return 0; // data not ready +// +// case FLASH_STATE_COMPLETE: +// _fl_state = FLASH_STATE_IDLE; +// return bufsize; +// +// default: +// _fl_state = FLASH_STATE_IDLE; +// return -1; +// } + + flash_read(buffer, addr, bufsize); return bufsize; } @@ -96,7 +128,16 @@ void flash_flush (void) if ( _fl_addr == NO_CACHE ) return; TU_ASSERT(NRFX_SUCCESS == nrfx_qspi_erase(NRF_QSPI_ERASE_LEN_4KB, _fl_addr),); +// while ( _fl_state != FLASH_STATE_COMPLETE ) +// { +// } +// _fl_state = FLASH_STATE_IDLE; + TU_ASSERT(NRFX_SUCCESS == nrfx_qspi_write(_fl_buf, FLASH_PAGE_SIZE, _fl_addr),); +// while ( _fl_state != FLASH_STATE_COMPLETE ) +// { +// } +// _fl_state = FLASH_STATE_IDLE; _fl_addr = NO_CACHE; } @@ -109,7 +150,8 @@ void flash_write (uint32_t dst, const void *src, int len) { flash_flush(); _fl_addr = newAddr; - memset(_fl_buf, 0xff, FLASH_PAGE_SIZE); + + flash_read(_fl_buf, newAddr, FLASH_PAGE_SIZE); } memcpy(_fl_buf + (dst & (FLASH_PAGE_SIZE - 1)), src, len); } |
