mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
bd88b70511
* add regmap Device8I2C/SPI types and their methods * add endianess hint
124 lines
4.2 KiB
Go
124 lines
4.2 KiB
Go
package regmap
|
|
|
|
import (
|
|
"encoding/binary"
|
|
|
|
"tinygo.org/x/drivers"
|
|
)
|
|
|
|
// Device8SPI implements common logic to most 8-bit peripherals with an SPI bus.
|
|
// All methods expect the target to support conventional register read and write operations
|
|
// where the first byte sent is the register address being accessed.
|
|
//
|
|
// All methods use an internal buffer and perform no dynamic memory allocation.
|
|
type Device8SPI struct {
|
|
bus drivers.SPI
|
|
order binary.ByteOrder
|
|
d Device8
|
|
}
|
|
|
|
// SetBus sets the SPI bus and byte order for the Device8SPI.
|
|
//
|
|
// As a hint, most SPI devices use big-endian (MSB) byte order.
|
|
// - Big endian: A value of 0x1234 is transmitted as 0x12 followed by 0x34.
|
|
// - Little endian: A value of 0x1234 is transmitted as 0x34 followed by 0x12.
|
|
func (d *Device8SPI) SetBus(bus drivers.SPI, order binary.ByteOrder) {
|
|
d.bus = bus
|
|
d.order = order
|
|
}
|
|
|
|
// Read8 reads a single byte from register addr.
|
|
func (d *Device8SPI) Read8(addr uint8) (byte, error) {
|
|
return d.d.Read8SPI(d.bus, addr)
|
|
}
|
|
|
|
// Read16 reads a 16-bit value from register addr.
|
|
func (d *Device8SPI) Read16(addr uint8) (uint16, error) {
|
|
return d.d.Read16SPI(d.bus, addr, d.order)
|
|
}
|
|
|
|
// Read32 reads a 32-bit value from register addr.
|
|
func (d *Device8SPI) Read32(addr uint8) (uint32, error) {
|
|
return d.d.Read32SPI(d.bus, addr, d.order)
|
|
}
|
|
|
|
// ReadData reads dataLength bytes from register addr. Due to the internal functioning of
|
|
// SPI, an auxiliary buffer must be provided to perform the operation and avoid memory allocation.
|
|
// The returned slice is a subslice of auxBuffer containing the read data.
|
|
func (d *Device8SPI) ReadData(addr uint8, datalength int, auxBuffer []byte) ([]byte, error) {
|
|
return d.d.ReadDataSPI(d.bus, addr, datalength, auxBuffer)
|
|
}
|
|
|
|
// Write8 writes a single byte value to register addr.
|
|
func (d *Device8SPI) Write8(addr, value uint8) error {
|
|
return d.d.Write8SPI(d.bus, addr, value)
|
|
}
|
|
|
|
// Write16 writes a 16-bit value to register addr.
|
|
func (d *Device8SPI) Write16(addr uint8, value uint16) error {
|
|
return d.d.Write16SPI(d.bus, addr, value, d.order)
|
|
}
|
|
|
|
// Write32 writes a 32-bit value to register addr.
|
|
func (d *Device8SPI) Write32(addr uint8, value uint32) error {
|
|
return d.d.Write32SPI(d.bus, addr, value, d.order)
|
|
}
|
|
|
|
// Device8I2C implements common logic to most 8-bit peripherals with an I2C bus.
|
|
// All methods expect the target to support conventional register read and write operations
|
|
// where the first byte sent is the register address being accessed.
|
|
//
|
|
// All methods use an internal buffer and perform no dynamic memory allocation.
|
|
type Device8I2C struct {
|
|
bus drivers.I2C
|
|
i2cAddr uint16
|
|
order binary.ByteOrder
|
|
d Device8
|
|
}
|
|
|
|
// SetBus sets the I2C bus, device address, and byte order for the Device8I2C.
|
|
//
|
|
// As a hint, most I2C devices use big-endian (MSB) byte order.
|
|
// - Big endian: A value of 0x1234 is transmitted as 0x12 followed by 0x34.
|
|
// - Little endian: A value of 0x1234 is transmitted as 0x34 followed by 0x12.
|
|
func (d *Device8I2C) SetBus(bus drivers.I2C, i2cAddr uint16, order binary.ByteOrder) {
|
|
d.bus = bus
|
|
d.i2cAddr = i2cAddr
|
|
d.order = order
|
|
}
|
|
|
|
// Read8 reads a single byte from register addr.
|
|
func (d *Device8I2C) Read8(addr uint8) (byte, error) {
|
|
return d.d.Read8I2C(d.bus, d.i2cAddr, addr)
|
|
}
|
|
|
|
// Read16 reads a 16-bit value from register addr.
|
|
func (d *Device8I2C) Read16(addr uint8) (uint16, error) {
|
|
return d.d.Read16I2C(d.bus, d.i2cAddr, addr, d.order)
|
|
}
|
|
|
|
// Read32 reads a 32-bit value from register addr.
|
|
func (d *Device8I2C) Read32(addr uint8) (uint32, error) {
|
|
return d.d.Read32I2C(d.bus, d.i2cAddr, addr, d.order)
|
|
}
|
|
|
|
// ReadData reads dataLength bytes from register addr.
|
|
func (d *Device8I2C) ReadData(addr uint8, dataDestination []byte) error {
|
|
return d.d.ReadDataI2C(d.bus, d.i2cAddr, addr, dataDestination)
|
|
}
|
|
|
|
// Write8 writes a single byte value to register addr.
|
|
func (d *Device8I2C) Write8(addr, value uint8) error {
|
|
return d.d.Write8I2C(d.bus, d.i2cAddr, addr, value)
|
|
}
|
|
|
|
// Write16 writes a 16-bit value to register addr.
|
|
func (d *Device8I2C) Write16(addr uint8, value uint16) error {
|
|
return d.d.Write16I2C(d.bus, d.i2cAddr, addr, value, d.order)
|
|
}
|
|
|
|
// Write32 writes a 32-bit value to register addr.
|
|
func (d *Device8I2C) Write32(addr uint8, value uint32) error {
|
|
return d.d.Write32I2C(d.bus, d.i2cAddr, addr, value, d.order)
|
|
}
|