- #if CONFIG_EEPROM_TYPE == EEPROM_24XX16
- /*
- * The 24LC16 uses the slave address as a 3-bit
- * block address.
- */
- uint8_t blk_addr = (uint8_t)((addr >> 8) & 0x07);
- uint8_t blk_offs = (uint8_t)addr;
+ if (mem_info[fd->type].has_dev_addr)
+ {
+ addr_buf[0] = (fd->fd.seek_pos >> 8) & 0xFF;
+ addr_buf[1] = (fd->fd.seek_pos & 0xFF);
+ }
+ else
+ {
+ dev_addr = (e2dev_addr_t)((fd->fd.seek_pos >> 8) & 0x07);
+ addr_buf[0] = (fd->fd.seek_pos & 0xFF);
+ }
+
+
+ if (!(twi_start_w(EEPROM_ADDR(dev_addr))
+ && twi_send(addr_buf, addr_len)
+ && twi_send(buf, count)))
+ {
+ twi_stop();
+ return wr_len;
+ }
+
+ twi_stop();
+
+ /* Update count and addr for next operation */
+ size -= count;
+ fd->fd.seek_pos += count;
+ buf = ((const char *)buf) + count;
+ wr_len += count;
+ }
+
+ return wr_len;
+}
+
+/**
+ * Copy \a size bytes from buffer \a _buf to
+ * eeprom.
+ * \note Writes are verified and if buffer content
+ * is not matching we retry 5 times max.
+ */
+static size_t eeprom_writeVerify(struct KFile *_fd, const void *_buf, size_t size)
+{
+ Eeprom *fd = EEPROM_CAST(_fd);
+ int retries = 5;
+ size_t wr_len;
+
+ while (retries--)
+ {
+ wr_len = eeprom_writeRaw(_fd, _buf, size);
+ /* rewind to verify what we have just written */
+ kfile_seek(_fd, -(kfile_off_t)wr_len, KSM_SEEK_CUR);
+ if (wr_len == size
+ && eeprom_verify(fd, _buf, wr_len))
+ {
+ /* Forward to go after what we have written*/
+ kfile_seek(_fd, wr_len, KSM_SEEK_CUR);
+ return wr_len;
+ }
+ }
+ return wr_len;
+}