avr-fw-modules/core/src/i2cee_load.c

53 lines
957 B
C
Executable File

#include <sys/i2ceeprom.h>
#include <hwo/i2c.h>
#include <sys/errno.h>
#include <sys/assert.h>
#define DEVICE(x) ((x >> 16)&0x07)
#define PAGE(x) (x >> 7)
#define PAGEBASE(x) (x & 0xFF80)
#define PAGEOFFSET(x) (x & 0x007F)
int i2cee_load(int32_t base,void *p,int16_t len){
uint8_t *b = p;
uint16_t ilen,slen;
int r;
int32_t offset = base;
MUTEXED(&i2c.mutex);
uint8_t off8[2];
slen = 0;
while (len > 0){
if (!(i2cee.emask & (1<<DEVICE(offset))))
return -ENOFILE;
ilen = 128 - PAGEOFFSET(offset);
if (ilen > len) {
ilen = len;
};
off8[0] = (offset>>8) & 0xFF;
off8[1] = (offset) & 0xFF;
r = noassert( i2c_transfer( (0xA0 + (DEVICE(offset) << 1)), off8, 2 ) );
if (r != 2)
return -EFAIL;
r = noassert( i2c_transfer( (0xA0 + (DEVICE(offset) << 1)) | 1, b, ilen ) );
if (r != ilen){
return r;
};
len -= ilen;
b += ilen;
offset += ilen;
slen += ilen;
};
return slen;
};