- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am just wondering how long it should take to write to flash, the following line of code takes about 8 seconds to update a 128k block of CFI flash memory. Is this normal?
alt_write_flash (fd, address, (unsigned int*)CONF_RAM_OUTPUT_UCBASE, 0x20000);Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Seems somewhat slow.
I'd expect a moderate fraction of a second - something like 100ms but it is a long time since I've written/used flash writing code.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
What flash device are you using?
Usually CFI flash memories have a byte programming time of few us. But if I remember correctly alt_write_flash includes the erase sector cycles, even if memory is already blank. Each sector erase may require tens of ms, so you must consider it.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here is the part number that shows up when I use the USB Blaster.
Info: Device 2 CFI Flash 1 is Numonyx JS28F256P33 Bottom Boot (16 bits data bus) And the settings out of system.h.# define ALT_MODULE_CLASS_cfi_flash altera_avalon_cfi_flash# define CFI_FLASH_HOLD_VALUE 0# define CFI_FLASH_IRQ -1# define CFI_FLASH_IRQ_INTERRUPT_CONTROLLER_ID -1# define CFI_FLASH_NAME "/dev/cfi_flash"# define CFI_FLASH_SETUP_VALUE 80# define CFI_FLASH_SIZE 33554432u# define CFI_FLASH_SPAN 33554432# define CFI_FLASH_TIMING_UNITS "ns"# define CFI_FLASH_TYPE "altera_avalon_cfi_flash"# define CFI_FLASH_WAIT_VALUE 50 The alt_write _flash function appears to compare the memory, erase, then write. If the data to be written is the same as the flash it only takes a fraction of a second, so I assume it only erases and writes the block if necessary. Is there a formula that I could use to calculate how long a block write should take?- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If you browse the JS28F256P33 datasheet you will see a couple of seconds may be required for erasing the memory. I think alt_write_flash will erase a block at a time, so you need typically 1.6s. Then, the programming time for 128KB in single word mode (I assume this is what HAL driver uses) is about 5.9s.
With some extra time due to code and function calls, you obtain your measured 8 seconds, if I calculated correctly. If you always need to write the full 128KB content you can greatly improve performance by writing your own flash programming function which exploits full chip erase (typ 0.85s) and programming 32 word buffers (need less than 1s for 128KB).- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the info, I found in the datasheet that typical block erase time is 0.8 seconds and single word writes are typical 150 us. So it looks like 9.8s is typical to write a block. Thanks for the explanation, it looks like I can suggest implementing buffered programming to cut the update time by 20-25 minutes.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page