blob: 192ad3d521dbfde7fc6fd0b5b72601bb2d9fe0dd [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
package i2c // import ""
import (
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