golang.org/x/exp@v0.0.0-20240506185415-9bf2ced13842/io/i2c/i2c.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package i2c allows users to read from and write to a slave I2C device.
     6  //
     7  // # Deprecated
     8  //
     9  // This package is not maintained anymore. An actively supported cross-platform
    10  // alternative is https://periph.io/.
    11  package i2c // import "golang.org/x/exp/io/i2c"
    12  
    13  import (
    14  	"golang.org/x/exp/io/i2c/driver"
    15  )
    16  
    17  const tenbitMask = 1 << 12
    18  
    19  // Device represents an I2C device. Devices must be closed once
    20  // they are no longer in use.
    21  type Device struct {
    22  	conn driver.Conn
    23  }
    24  
    25  // TenBit marks an I2C address as a 10-bit address.
    26  func TenBit(addr int) int {
    27  	return addr | tenbitMask
    28  }
    29  
    30  // Read reads len(buf) bytes from the device.
    31  func (d *Device) Read(buf []byte) error {
    32  	return d.conn.Tx(nil, buf)
    33  }
    34  
    35  // ReadReg is similar to Read but it reads from a register.
    36  func (d *Device) ReadReg(reg byte, buf []byte) error {
    37  	return d.conn.Tx([]byte{reg}, buf)
    38  }
    39  
    40  // Write writes the buffer to the device. If it is required to write to a
    41  // specific register, the register should be passed as the first byte in the
    42  // given buffer.
    43  func (d *Device) Write(buf []byte) (err error) {
    44  	return d.conn.Tx(buf, nil)
    45  }
    46  
    47  // WriteReg is similar to Write but writes to a register.
    48  func (d *Device) WriteReg(reg byte, buf []byte) (err error) {
    49  	// TODO(jbd): Do not allocate, not optimal.
    50  	return d.conn.Tx(append([]byte{reg}, buf...), nil)
    51  }
    52  
    53  // Close closes the device and releases the underlying sources.
    54  func (d *Device) Close() error {
    55  	return d.conn.Close()
    56  }
    57  
    58  // Open opens a connection to an I2C device.
    59  // All devices must be closed once they are no longer in use.
    60  // For devices that use 10-bit I2C addresses, addr can be marked
    61  // as a 10-bit address with TenBit.
    62  func Open(o driver.Opener, addr int) (*Device, error) {
    63  	unmasked, tenbit := resolveAddr(addr)
    64  	conn, err := o.Open(unmasked, tenbit)
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  	return &Device{conn: conn}, nil
    69  }
    70  
    71  // resolveAddr returns whether the addr is 10-bit masked or not.
    72  // It also returns the unmasked address.
    73  func resolveAddr(addr int) (unmasked int, tenbit bool) {
    74  	return addr & (tenbitMask - 1), addr&tenbitMask == tenbitMask
    75  }