summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/devfs.go
diff options
context:
space:
mode:
Diffstat (limited to 'dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/devfs.go')
-rw-r--r--dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/devfs.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/devfs.go b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/devfs.go
new file mode 100644
index 0000000..3c7704f
--- /dev/null
+++ b/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/io/i2c/devfs.go
@@ -0,0 +1,80 @@
+// 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.
+
+//go:build linux
+// +build linux
+
+package i2c
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "syscall"
+
+ "golang.org/x/exp/io/i2c/driver"
+)
+
+// Devfs is an I2C driver that works against the devfs.
+// You need to load the "i2c-dev" kernel module to use this driver.
+type Devfs struct {
+ // Dev is the I2C bus device, e.g. /dev/i2c-1. Required.
+ Dev string
+}
+
+const (
+ i2c_SLAVE = 0x0703 // TODO(jbd): Allow users to use I2C_SLAVE_FORCE?
+ i2c_TENBIT = 0x0704
+)
+
+// TODO(jbd): Support I2C_RETRIES and I2C_TIMEOUT at the driver and implementation level.
+
+func (d *Devfs) Open(addr int, tenbit bool) (driver.Conn, error) {
+ f, err := os.OpenFile(d.Dev, os.O_RDWR, os.ModeDevice)
+ if err != nil {
+ return nil, err
+ }
+ conn := &devfsConn{f: f}
+ if tenbit {
+ if err := conn.ioctl(i2c_TENBIT, uintptr(1)); err != nil {
+ conn.Close()
+ return nil, fmt.Errorf("cannot enable the 10-bit address mode on bus %v: %v", d.Dev, err)
+ }
+ }
+ if err := conn.ioctl(i2c_SLAVE, uintptr(addr)); err != nil {
+ conn.Close()
+ return nil, fmt.Errorf("error opening the address (%v) on the bus (%v): %v", addr, d.Dev, err)
+ }
+ return conn, nil
+}
+
+type devfsConn struct {
+ f *os.File
+}
+
+func (c *devfsConn) Tx(w, r []byte) error {
+ if w != nil {
+ if _, err := c.f.Write(w); err != nil {
+ return err
+ }
+ c.f.Sync()
+ }
+ if r != nil {
+ if _, err := io.ReadFull(c.f, r); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (c *devfsConn) Close() error {
+ return c.f.Close()
+}
+
+func (c *devfsConn) ioctl(arg1, arg2 uintptr) error {
+ if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, c.f.Fd(), arg1, arg2); errno != 0 {
+ return syscall.Errno(errno)
+ }
+ return nil
+}