+ KFileDataflash *fd = KFILEDATAFLASH(_fd);
+
+ dataflash_offset_t offset;
+ dataflash_page_t new_page;
+ size_t total_write = 0;
+
+ const uint8_t *data = (const uint8_t *) _buf;
+
+ ASSERT(fd->fd.seek_pos + size <= fd->fd.size);
+ size = MIN((uint32_t)size, fd->fd.size - fd->fd.seek_pos);
+
+ kprintf("Writing at pos[%lu]\n", fd->fd.seek_pos);
+
+ while (size)
+ {
+ /*
+ * We select page and offest from absolute address.
+ */
+ new_page = fd->fd.seek_pos / mem_info[fd->dev].page_size;
+ offset = fd->fd.seek_pos % mem_info[fd->dev].page_size;
+
+
+ size_t wr_len = MIN(size, mem_info[fd->dev].page_size - offset);
+
+ kprintf(" [page-<%ld>, byte-<%ld>]",new_page, offset);
+
+ if (new_page != fd->current_page)
+ {
+ /* Flush current page in main memory*/
+ dataflash_flush(&fd->fd);
+ /* Load select page memory from data flash memory*/
+ dataflash_loadPage(fd, new_page);
+
+ fd->current_page = new_page;
+ kprintf(" >> Load page: <%ld> ", new_page);
+ }
+ /*
+ * Write byte in current page, and set true
+ * page_dirty flag.
+ */
+ dataflash_writeBlock(fd, offset, DFO_WRITE_BUFF1, data, wr_len);
+ fd->page_dirty = true;
+
+ data += wr_len;
+ fd->fd.seek_pos += wr_len;
+ size -= wr_len;
+ total_write += wr_len;
+ }
+
+ kprintf("written %lu bytes\n", total_write);
+ return total_write;