diff options
Diffstat (limited to '')
-rw-r--r-- | dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/i2c.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/i2c.go b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/i2c.go new file mode 100644 index 0000000..192ad3d --- /dev/null +++ b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/i2c.go @@ -0,0 +1,75 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package i2c allows users to read from and write to a slave I2C device. +// +// # Deprecated +// +// This package is not maintained anymore. An actively supported cross-platform +// alternative is https://periph.io/. +package i2c // import "golang.org/x/exp/io/i2c" + +import ( + "golang.org/x/exp/io/i2c/driver" +) + +const tenbitMask = 1 << 12 + +// Device represents an I2C device. Devices must be closed once +// they are no longer in use. +type Device struct { + conn driver.Conn +} + +// TenBit marks an I2C address as a 10-bit address. +func TenBit(addr int) int { + return addr | tenbitMask +} + +// Read reads len(buf) bytes from the device. +func (d *Device) Read(buf []byte) error { + return d.conn.Tx(nil, buf) +} + +// ReadReg is similar to Read but it reads from a register. +func (d *Device) ReadReg(reg byte, buf []byte) error { + return d.conn.Tx([]byte{reg}, buf) +} + +// Write writes the buffer to the device. If it is required to write to a +// specific register, the register should be passed as the first byte in the +// given buffer. +func (d *Device) Write(buf []byte) (err error) { + return d.conn.Tx(buf, nil) +} + +// WriteReg is similar to Write but writes to a register. +func (d *Device) WriteReg(reg byte, buf []byte) (err error) { + // TODO(jbd): Do not allocate, not optimal. + return d.conn.Tx(append([]byte{reg}, buf...), nil) +} + +// Close closes the device and releases the underlying sources. +func (d *Device) Close() error { + return d.conn.Close() +} + +// Open opens a connection to an I2C device. +// All devices must be closed once they are no longer in use. +// For devices that use 10-bit I2C addresses, addr can be marked +// as a 10-bit address with TenBit. +func Open(o driver.Opener, addr int) (*Device, error) { + unmasked, tenbit := resolveAddr(addr) + conn, err := o.Open(unmasked, tenbit) + if err != nil { + return nil, err + } + return &Device{conn: conn}, nil +} + +// resolveAddr returns whether the addr is 10-bit masked or not. +// It also returns the unmasked address. +func resolveAddr(addr int) (unmasked int, tenbit bool) { + return addr & (tenbitMask - 1), addr&tenbitMask == tenbitMask +} |