From e05a20af63e187c1d3a4d68007e962a34cd27b67 Mon Sep 17 00:00:00 2001 From: George Sexton Date: Fri, 20 Sep 2024 12:51:10 -0600 Subject: [PATCH] Issue #60, fix onewire not present, and hanging when it is. --- host_linux.go | 1 + netlink/netlink_linux.go | 15 +++++++++++++++ netlink/netlink_other.go | 4 ++++ netlink/onewire.go | 3 +++ 4 files changed, 23 insertions(+) diff --git a/host_linux.go b/host_linux.go index 5a729b99..a850466b 100644 --- a/host_linux.go +++ b/host_linux.go @@ -7,5 +7,6 @@ package host import ( // Make sure required drivers are registered. _ "periph.io/x/host/v3/gpioioctl" + _ "periph.io/x/host/v3/netlink" _ "periph.io/x/host/v3/sysfs" ) diff --git a/netlink/netlink_linux.go b/netlink/netlink_linux.go index 76774c77..d60792b0 100644 --- a/netlink/netlink_linux.go +++ b/netlink/netlink_linux.go @@ -6,6 +6,7 @@ package netlink import ( "fmt" + "path/filepath" "syscall" ) @@ -52,3 +53,17 @@ func (s *connSocket) close() error { s.fd = 0 return syscall.Close(fd) } + +// isOneWireAvailable checks to see if the Linux onewire bus drivers are loaded. +// It does this by looking for entries in the /sys/bus pseudo-filesystem. +// +// On a Raspberry Pi SBC, the onewire bus is enabled by creating entries in the +// kernel config.txt file which is located in /boot, or /boot/firmware depending +// on OS/kernel levels. +func isOneWireAvailable() bool { + items, err := filepath.Glob("/sys/bus/w1/devices/*") + if err != nil || len(items) == 0 { + return false + } + return true +} diff --git a/netlink/netlink_other.go b/netlink/netlink_other.go index bd0a2aee..6d2b0858 100644 --- a/netlink/netlink_other.go +++ b/netlink/netlink_other.go @@ -28,3 +28,7 @@ func (*connSocket) recv(_ []byte) (int, error) { func (*connSocket) close() error { return errors.New("not implemented") } + +func isOneWireAvailable() bool { + return false +} diff --git a/netlink/onewire.go b/netlink/onewire.go index 814fe8ca..c4c9b39b 100644 --- a/netlink/onewire.go +++ b/netlink/onewire.go @@ -463,6 +463,9 @@ func (d *driver1W) After() []string { } func (d *driver1W) Init() (bool, error) { + if !isOneWireAvailable() { + return false, errors.New("no onewire buses found") + } s, err := newW1Socket() if err != nil { return false, fmt.Errorf("netlink-onewire: failed to open socket: %v", err)