+
+ dataflashAddr_t byte_addr;
+ dataflashAddr_t current_page;
+
+ uint8_t *data = (uint8_t *) _buf;
+
+ ASSERT(fd->seek_pos + size <= fd->size);
+ size = MIN((uint32_t)size, fd->size - fd->seek_pos);
+
+ kprintf("Writing at pos[%u]\n", fd->seek_pos);
+
+ while (size)
+ {
+ /*
+ * We select from absolute address page address
+ * and byte address in page.
+ * \{
+ */
+ current_page = fd->seek_pos / (dataflashAddr_t)DATAFLASH_PAGE_SIZE;
+ byte_addr = fd->seek_pos % (dataflashAddr_t)DATAFLASH_PAGE_SIZE;
+ /* \} */
+
+ size_t wr_len = MIN(size, DATAFLASH_PAGE_SIZE - byte_addr);
+
+ kprintf(" [page-<%ld>, byte-<%ld>]",current_page, byte_addr);
+
+ if (current_page != previous_page)
+ {
+ /* Flush current page in main memory*/
+ dataflash_flush();
+ /* Load select page memory from data flash memory*/
+ dataflash_loadPage(current_page);
+
+ previous_page = current_page;
+ kprintf(" >> Load page: <%ld> ",current_page);
+ }
+ /*
+ * Write byte in current page, and set true
+ * page_modified flag.
+ *\{
+ */
+ dataflash_write_byte(byte_addr, DFO_WRITE_BUFF1, data);
+ page_modified = true;
+ /* \} */
+
+ data += wr_len;
+ fd->seek_pos += wr_len;
+ size -= wr_len;
+ total_write += wr_len;
+ }
+
+ kprintf("written %u bytes\n", total_write);
+ return total_write;