forked from haraldwolff/avr-fw-modules
53 lines
957 B
C
Executable File
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;
|
|
};
|