blob: 6507254d784ca8caae492b4c9f1f5a3408d8081f [file] [log] [blame]
// 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
}