// 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 }