This commit is contained in:
ladyada 2025-01-07 22:08:13 -05:00
parent c43db9d7c2
commit 66448b37ec
4 changed files with 100 additions and 91 deletions

View File

@ -89,28 +89,25 @@ Adafruit_BusIO_Register::Adafruit_BusIO_Register(
} }
/*! /*!
* @brief Create a register we access over a GenericDevice * @brief Create a register we access over a GenericDevice
* @param genericdevice Generic device to use * @param genericdevice Generic device to use
* @param reg_addr Register address we will read/write * @param reg_addr Register address we will read/write
* @param width Width of the register in bytes (1-4) * @param width Width of the register in bytes (1-4)
* @param byteorder Byte order of register data (LSBFIRST or MSBFIRST) * @param byteorder Byte order of register data (LSBFIRST or MSBFIRST)
* @param address_width Width of the register address in bytes (1 or 2) * @param address_width Width of the register address in bytes (1 or 2)
*/ */
Adafruit_BusIO_Register::Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, Adafruit_BusIO_Register::Adafruit_BusIO_Register(
uint16_t reg_addr, Adafruit_GenericDevice *genericdevice, uint16_t reg_addr, uint8_t width,
uint8_t width, uint8_t byteorder, uint8_t address_width) {
uint8_t byteorder, _i2cdevice = nullptr;
uint8_t address_width) { _spidevice = nullptr;
_i2cdevice = nullptr; _genericdevice = genericdevice;
_spidevice = nullptr; _addrwidth = address_width;
_genericdevice = genericdevice; _address = reg_addr;
_addrwidth = address_width; _byteorder = byteorder;
_address = reg_addr; _width = width;
_byteorder = byteorder;
_width = width;
} }
/*! /*!
* @brief Write a buffer of data to the register location * @brief Write a buffer of data to the register location
* @param buffer Pointer to data to write * @param buffer Pointer to data to write
@ -214,42 +211,41 @@ uint32_t Adafruit_BusIO_Register::read(void) {
uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; } uint32_t Adafruit_BusIO_Register::readCached(void) { return _cached; }
bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) { bool Adafruit_BusIO_Register::read(uint8_t *buffer, uint8_t len) {
uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF), uint8_t addrbuffer[2] = {(uint8_t)(_address & 0xFF),
(uint8_t)(_address >> 8)}; (uint8_t)(_address >> 8)};
if (_i2cdevice) { if (_i2cdevice) {
return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len); return _i2cdevice->write_then_read(addrbuffer, _addrwidth, buffer, len);
} }
if (_spidevice) { if (_spidevice) {
if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) { if (_spiregtype == ADDRESSED_OPCODE_BIT0_LOW_TO_WRITE) {
// very special case! // very special case!
// pass the special opcode address which we set as the high byte of the // pass the special opcode address which we set as the high byte of the
// regaddr // regaddr
addrbuffer[0] = addrbuffer[0] =
(uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read (uint8_t)(_address >> 8) | 0x01; // set bottom bit high to read
// the 'actual' reg addr is the second byte then // the 'actual' reg addr is the second byte then
addrbuffer[1] = (uint8_t)(_address & 0xFF); addrbuffer[1] = (uint8_t)(_address & 0xFF);
// the address appears to be a byte longer // the address appears to be a byte longer
return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer, return _spidevice->write_then_read(addrbuffer, _addrwidth + 1, buffer,
len); len);
} }
if (_spiregtype == ADDRBIT8_HIGH_TOREAD) { if (_spiregtype == ADDRBIT8_HIGH_TOREAD) {
addrbuffer[0] |= 0x80; addrbuffer[0] |= 0x80;
} }
if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) { if (_spiregtype == ADDRBIT8_HIGH_TOWRITE) {
addrbuffer[0] &= ~0x80; addrbuffer[0] &= ~0x80;
} }
if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) { if (_spiregtype == AD8_HIGH_TOREAD_AD7_HIGH_TOINC) {
addrbuffer[0] |= 0x80 | 0x40; addrbuffer[0] |= 0x80 | 0x40;
} }
return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len); return _spidevice->write_then_read(addrbuffer, _addrwidth, buffer, len);
} }
if (_genericdevice) { if (_genericdevice) {
return _genericdevice->readRegister(addrbuffer, _addrwidth, buffer, len); return _genericdevice->readRegister(addrbuffer, _addrwidth, buffer, len);
} }
return false; return false;
} }
/*! /*!
* @brief Read 2 bytes of data from the register location * @brief Read 2 bytes of data from the register location
* @param value Pointer to uint16_t variable to read into * @param value Pointer to uint16_t variable to read into

View File

@ -6,9 +6,9 @@
#if !defined(SPI_INTERFACES_COUNT) || \ #if !defined(SPI_INTERFACES_COUNT) || \
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0)) (defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
#include <Adafruit_GenericDevice.h>
#include <Adafruit_I2CDevice.h> #include <Adafruit_I2CDevice.h>
#include <Adafruit_SPIDevice.h> #include <Adafruit_SPIDevice.h>
#include <Adafruit_GenericDevice.h>
typedef enum _Adafruit_BusIO_SPIRegType { typedef enum _Adafruit_BusIO_SPIRegType {
ADDRBIT8_HIGH_TOREAD = 0, ADDRBIT8_HIGH_TOREAD = 0,
@ -58,8 +58,9 @@ public:
uint8_t width = 1, uint8_t byteorder = LSBFIRST, uint8_t width = 1, uint8_t byteorder = LSBFIRST,
uint8_t address_width = 1); uint8_t address_width = 1);
Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice, uint16_t reg_addr, Adafruit_BusIO_Register(Adafruit_GenericDevice *genericdevice,
uint8_t width = 1, uint8_t byteorder = LSBFIRST, uint16_t reg_addr, uint8_t width = 1,
uint8_t byteorder = LSBFIRST,
uint8_t address_width = 1); uint8_t address_width = 1);
bool read(uint8_t *buffer, uint8_t len); bool read(uint8_t *buffer, uint8_t len);

View File

@ -1,43 +1,47 @@
#include "Adafruit_GenericDevice.h" #include "Adafruit_GenericDevice.h"
Adafruit_GenericDevice::Adafruit_GenericDevice(busio_genericdevice_read_t read_func, Adafruit_GenericDevice::Adafruit_GenericDevice(
busio_genericdevice_write_t write_func, busio_genericdevice_read_t read_func,
busio_genericdevice_readreg_t readreg_func, busio_genericdevice_write_t write_func,
busio_genericdevice_writereg_t writereg_func) { busio_genericdevice_readreg_t readreg_func,
_read_func = read_func; busio_genericdevice_writereg_t writereg_func) {
_write_func = write_func; _read_func = read_func;
_readreg_func = readreg_func; _write_func = write_func;
_writereg_func = writereg_func; _readreg_func = readreg_func;
_begun = false; _writereg_func = writereg_func;
_begun = false;
} }
bool Adafruit_GenericDevice::begin(void) { bool Adafruit_GenericDevice::begin(void) {
_begun = true; _begun = true;
return true; return true;
} }
bool Adafruit_GenericDevice::write(const uint8_t *buffer, size_t len) { bool Adafruit_GenericDevice::write(const uint8_t *buffer, size_t len) {
if (!_begun) if (!_begun)
return false; return false;
return _write_func(buffer, len); return _write_func(buffer, len);
} }
bool Adafruit_GenericDevice::read(uint8_t *buffer, size_t len) { bool Adafruit_GenericDevice::read(uint8_t *buffer, size_t len) {
if (!_begun) if (!_begun)
return false; return false;
return _read_func(buffer, len); return _read_func(buffer, len);
} }
bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz) { bool Adafruit_GenericDevice::readRegister(uint8_t *addr_buf, uint8_t addrsiz,
uint8_t *buf, uint16_t bufsiz) {
if (!_begun || !_readreg_func) if (!_begun || !_readreg_func)
return false; return false;
return _readreg_func(addr_buf, addrsiz, buf, bufsiz); return _readreg_func(addr_buf, addrsiz, buf, bufsiz);
} }
bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz) { bool Adafruit_GenericDevice::writeRegister(uint8_t *addr_buf, uint8_t addrsiz,
const uint8_t *buf,
uint16_t bufsiz) {
if (!_begun || !_writereg_func) if (!_begun || !_writereg_func)
return false; return false;

View File

@ -5,25 +5,33 @@
typedef bool (*busio_genericdevice_read_t)(uint8_t *buffer, size_t len); typedef bool (*busio_genericdevice_read_t)(uint8_t *buffer, size_t len);
typedef bool (*busio_genericdevice_write_t)(const uint8_t *buffer, size_t len); typedef bool (*busio_genericdevice_write_t)(const uint8_t *buffer, size_t len);
typedef bool (*busio_genericdevice_readreg_t)(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz); typedef bool (*busio_genericdevice_readreg_t)(uint8_t *addr_buf,
typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz); uint8_t addrsiz, uint8_t *buf,
uint16_t bufsiz);
typedef bool (*busio_genericdevice_writereg_t)(uint8_t *addr_buf,
uint8_t addrsiz,
const uint8_t *buf,
uint16_t bufsiz);
/*! /*!
* @brief Class for communicating with a device via generic read/write functions * @brief Class for communicating with a device via generic read/write functions
*/ */
class Adafruit_GenericDevice { class Adafruit_GenericDevice {
public: public:
Adafruit_GenericDevice(busio_genericdevice_read_t read_func, Adafruit_GenericDevice(
busio_genericdevice_write_t write_func, busio_genericdevice_read_t read_func,
busio_genericdevice_readreg_t readreg_func = nullptr, busio_genericdevice_write_t write_func,
busio_genericdevice_writereg_t writereg_func = nullptr); busio_genericdevice_readreg_t readreg_func = nullptr,
busio_genericdevice_writereg_t writereg_func = nullptr);
bool begin(void); bool begin(void);
bool read(uint8_t *buffer, size_t len); bool read(uint8_t *buffer, size_t len);
bool write(const uint8_t *buffer, size_t len); bool write(const uint8_t *buffer, size_t len);
bool readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf, uint16_t bufsiz); bool readRegister(uint8_t *addr_buf, uint8_t addrsiz, uint8_t *buf,
bool writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf, uint16_t bufsiz); uint16_t bufsiz);
bool writeRegister(uint8_t *addr_buf, uint8_t addrsiz, const uint8_t *buf,
uint16_t bufsiz);
protected: protected:
busio_genericdevice_read_t _read_func; busio_genericdevice_read_t _read_func;