22#include <libtock/peripherals/i2c_master.h>
28static const uint8_t g_base_addr = 0b10100000;
31static const int mb85rc1mt_pages = 1;
34static const int mb85rc1mt_seg_size = 1 << 17;
75 i2c_addr.
dev = g_base_addr | ((addr >> 15) & 0x0E);
76 i2c_addr.
mem = addr & 0xFFFF;
96 if ((
size_t)addr + len > mb85rc1mt_seg_size) {
97 write_len = mb85rc1mt_seg_size - addr;
103 int tock_status = RETURNCODE_SUCCESS;
109 while (written < write_len) {
112 buffer[0] = (uint8_t)(i2c_addr.
mem >> 8);
113 buffer[1] = (uint8_t)(i2c_addr.
mem & 0xFF);
116 size_t remaining = write_len - written;
117 size_t chunk_size = 0;
118 if (remaining > 30) {
121 chunk_size = remaining;
125 memcpy(
buffer + 2,
data + written, chunk_size);
127 tock_status = i2c_master_write_sync(i2c_addr.
dev,
buffer, chunk_size + 2);
128 if (tock_status < 0) {
133 written += chunk_size;
135 i2c_addr = convert_address(addr + written);
179 if ((
size_t)addr + len > mb85rc1mt_seg_size) {
180 read_len = mb85rc1mt_seg_size - addr;
186 int tock_status = RETURNCODE_SUCCESS;
188 uint8_t mem_addr[2] = {};
189 mem_addr[0] = (uint8_t)(i2c_addr.
mem >> 8);
190 mem_addr[1] = (uint8_t)(i2c_addr.
mem & 0xFF);
193 tock_status = i2c_master_write_sync(i2c_addr.
dev, mem_addr, 2);
194 if (tock_status < 0) {
202 for (
size_t i = 0;
i < read_len;
i++) {
203 tock_status = i2c_master_read_sync(i2c_addr.
dev,
data +
i, 1);
204 if (tock_status < 0) {
Storage interface for onboard FRAM chips.
fram_status mb85rc1mt_write(fram_addr addr, const uint8_t *data, size_t len)
Write bytes to FRAM at the given address.
fram_status mb85rc1mt_read(fram_addr addr, size_t len, uint8_t *data)
Read bytes from FRAM at the given address.
fram_addr mb85rc1mt_size(void)
Get the total size of FRAM in bytes.
fram_status mb85rc1mt_wakeup(mb85rc1mt_address addr)
Put the chip into sleep mode.
fram_status mb85rc1mt_sleep(mb85rc1mt_address addr)
Wake up device from sleep.
Driver for mb87rc1mt FRAM chip.
Internal representation of the MB85RC1MT I2C address.