esp32_Adafruit_BusIO/Adafruit_BusIO_Register.cpp

172 lines
4.0 KiB
C++
Raw Normal View History

2019-05-18 04:36:14 +01:00
#include <Adafruit_BusIO_Register.h>
2019-05-18 05:04:51 +01:00
Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, uint16_t reg_addr,
uint8_t width, uint8_t bitorder, uint8_t address_width) {
2019-05-18 04:36:14 +01:00
_i2cdevice = i2cdevice;
_spidevice = NULL;
_addrwidth = address_width;
_address = reg_addr;
_bitorder = bitorder;
_width = width;
}
2019-05-18 05:04:51 +01:00
Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_SPIDevice *spidevice, uint16_t reg_addr,
Adafruit_BusIO_SPIRegType type,
uint8_t width, uint8_t bitorder, uint8_t address_width) {
2019-05-18 04:36:14 +01:00
_spidevice = spidevice;
2019-05-18 05:04:51 +01:00
_spiregtype = type;
2019-05-18 04:36:14 +01:00
_i2cdevice = NULL;
_addrwidth = address_width;
_address = reg_addr;
_bitorder = bitorder;
_width = width;
}
2019-05-18 07:47:48 +01:00
Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_I2CDevice *i2cdevice, Adafruit_SPIDevice *spidevice,
uint16_t reg_addr, Adafruit_BusIO_SPIRegType type,
uint8_t width, uint8_t bitorder, uint8_t address_width) {
_spidevice = spidevice;
_i2cdevice = i2cdevice;
_spiregtype = type;
_addrwidth = address_width;
_address = reg_addr;
_bitorder = bitorder;
_width = width;
}
2019-05-18 04:36:14 +01:00
bool Adafruit_BusIO_Register::write(uint8_t *buffer, uint8_t len) {
2019-05-18 05:04:51 +01:00
2019-03-07 22:51:36 +00:00
uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), (uint8_t)(_address>>8)};
2019-05-18 05:04:51 +01:00
if (_i2cdevice) {
return _i2cdevice->write(buffer, len, true, addrbuffer, _addrwidth);
}
2019-05-18 05:04:51 +01:00
if (_spidevice) {
if (_spiregtype == ADDRBIT8_HIGH_TOREAD) {
addrbuffer[0] &= ~0x80;
}
return _spidevice->write( buffer, len, addrbuffer, _addrwidth);
}
return false;
}
2019-05-18 04:36:14 +01:00
bool Adafruit_BusIO_Register::write(uint32_t value, uint8_t numbytes) {
if (numbytes == 0) {
numbytes = _width;
}
if (numbytes > 4) {
return false;
}
for (int i=0; i<numbytes; i++) {
if (_bitorder == LSBFIRST) {
_buffer[i] = value & 0xFF;
} else {
_buffer[numbytes-i-1] = value & 0xFF;
}
value >>= 8;
}
return write(_buffer, numbytes);
}
2019-03-07 21:23:12 +00:00
// This does not do any error checking! returns 0xFFFFFFFF on failure
2019-05-18 04:36:14 +01:00
uint32_t Adafruit_BusIO_Register::read(void) {
2019-03-07 21:23:12 +00:00
if (! read(_buffer, _width)) {
return -1;
}
2019-03-07 22:51:36 +00:00
2019-03-07 21:23:12 +00:00
uint32_t value = 0;
2019-03-07 22:51:36 +00:00
2019-03-07 21:23:12 +00:00
for (int i=0; i < _width; i++) {
value <<= 8;
2019-03-08 07:29:27 +00:00
if (_bitorder == LSBFIRST) {
2019-03-07 21:23:12 +00:00
value |= _buffer[_width-i-1];
} else {
value |= _buffer[i];
}
}
2019-03-07 22:51:36 +00:00
2019-03-07 21:23:12 +00:00
return value;
}
2019-05-18 04:36:14 +01:00
bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) {
2019-05-18 05:04:51 +01:00
uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), (uint8_t)(_address>>8)};
if (_i2cdevice) {
return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len);
}
2019-05-18 05:04:51 +01:00
if (_spidevice) {
if (_spiregtype == ADDRBIT8_HIGH_TOREAD) {
addrbuffer[0] |= 0x80;
}
return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len);
}
return false;
}
2019-05-18 04:36:14 +01:00
bool Adafruit_BusIO_Register::read(uint16_t *value) {
if (! read(_buffer, 2)) {
return false;
}
if (_bitorder == LSBFIRST) {
*value = _buffer[1];
*value <<= 8;
*value |= _buffer[0];
} else {
*value = _buffer[0];
*value <<= 8;
*value |= _buffer[1];
}
return true;
}
2019-05-18 04:36:14 +01:00
bool Adafruit_BusIO_Register::read(uint8_t *value) {
if (! read(_buffer, 1)) {
return false;
}
*value = _buffer[0];
return true;
}
2019-03-08 07:29:27 +00:00
2019-05-18 04:36:14 +01:00
void Adafruit_BusIO_Register::print(Stream *s) {
2019-03-08 07:29:27 +00:00
uint32_t val = read();
s->print("0x"); s->print(val, HEX);
}
2019-05-18 04:36:14 +01:00
void Adafruit_BusIO_Register::println(Stream *s) {
2019-03-08 07:29:27 +00:00
print(s);
s->println();
}
2019-05-18 04:36:14 +01:00
Adafruit_BusIO_RegisterBits::Adafruit_BusIO_RegisterBits(Adafruit_BusIO_Register *reg, uint8_t bits, uint8_t shift) {
2019-03-08 07:29:27 +00:00
_register = reg;
_bits = bits;
_shift = shift;
}
2019-05-18 04:36:14 +01:00
uint32_t Adafruit_BusIO_RegisterBits::read(void) {
2019-03-08 07:29:27 +00:00
uint32_t val = _register->read();
val >>= _shift;
return val & ((1 << (_bits+1)) - 1);
}
2019-05-18 04:36:14 +01:00
void Adafruit_BusIO_RegisterBits::write(uint32_t data) {
2019-03-08 07:29:27 +00:00
uint32_t val = _register->read();
// mask off the data before writing
uint32_t mask = (1 << (_bits+1)) - 1;
data &= mask;
mask <<= _shift;
val &= ~mask; // remove the current data at that spot
val |= data << _shift; // and add in the new data
_register->write(val, _register->width());
}