aboutsummaryrefslogtreecommitdiffstats
path: root/sw
diff options
context:
space:
mode:
Diffstat (limited to 'sw')
-rw-r--r--sw/usbcom/go.mod8
-rw-r--r--sw/usbcom/go.sum8
-rw-r--r--sw/usbcom/main.go85
-rw-r--r--sw/usbcom/usb/usb.go158
4 files changed, 0 insertions, 259 deletions
diff --git a/sw/usbcom/go.mod b/sw/usbcom/go.mod
deleted file mode 100644
index 1870f76..0000000
--- a/sw/usbcom/go.mod
+++ /dev/null
@@ -1,8 +0,0 @@
-module git.samanthony.xyz/can_gauge_interface/sw/usbcom
-
-go 1.24.6
-
-require (
- github.com/google/gousb v1.1.3 // indirect
- golang.org/x/sync v0.17.0 // indirect
-)
diff --git a/sw/usbcom/go.sum b/sw/usbcom/go.sum
deleted file mode 100644
index 64a2dc3..0000000
--- a/sw/usbcom/go.sum
+++ /dev/null
@@ -1,8 +0,0 @@
-github.com/google/gousb v1.1.3 h1:xt6M5TDsGSZ+rlomz5Si5Hmd/Fvbmo2YCJHN+yGaK4o=
-github.com/google/gousb v1.1.3/go.mod h1:GGWUkK0gAXDzxhwrzetW592aOmkkqSGcj5KLEgmCVUg=
-github.com/gotmc/libusb/v2 v2.3.4 h1:xDKi52trBIq7QTMxlhHy9zgb+HRmimSBo8yhx+k1NWU=
-github.com/gotmc/libusb/v2 v2.3.4/go.mod h1:rU0mvps+snf/CHvEkISbxrwUlWpt6VluOkjqpKo6TFw=
-github.com/sam-rba/share v0.3.0 h1:aBVvgSbcBaH43Jrbq++iz15/DAso/D6oJDm+dDM4E40=
-github.com/sam-rba/share v0.3.0/go.mod h1:rDx/wFG1Vc6JO1F/F0eBnkcy2wHwV0T9100ig/hu12A=
-golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
-golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
diff --git a/sw/usbcom/main.go b/sw/usbcom/main.go
deleted file mode 100644
index 70661d9..0000000
--- a/sw/usbcom/main.go
+++ /dev/null
@@ -1,85 +0,0 @@
-package main
-
-import (
- "context"
- "fmt"
- "io"
- "os"
-
- "golang.org/x/sync/errgroup"
-
- "git.samanthony.xyz/can_gauge_interface/sw/usbcom/usb"
-)
-
-const bufSize = 512
-
-func main() {
- exitCode := make(chan int)
- go exit(exitCode)
- defer close(exitCode)
-
- dev, err := usb.Connect()
- if err != nil {
- fmt.Fprintf(os.Stderr, "Error connecting to device: %v\n", err)
- exitCode <- 1
- return
- }
- defer func() {
- if err := dev.Close(); err != nil {
- fmt.Fprintf(os.Stderr, "Error :%v\n", err)
- exitCode <- 1
- }
- }()
-
- var group errgroup.Group
- ctx, cancel := context.WithCancel(context.Background())
-
- // Host->Device
- group.Go(func() error {
- err := hostToDevice(dev)
- cancel() // device->host routine
- return err
- })
-
- // Device->Host
- group.Go(func() error {
- return deviceToHost(ctx, dev)
- })
-
- if err = group.Wait(); err != nil {
- fmt.Fprintf(os.Stderr, "Error: %v\n", err)
- exitCode <- 1
- }
-}
-
-func exit(code <-chan int) {
- worst := 0
- for c := range code {
- if c > worst {
- worst = c
- }
- }
- os.Exit(worst)
-}
-
-func hostToDevice(dev *usb.Device) error {
- _, err := io.Copy(dev, os.Stdin)
- return err
-}
-
-func deviceToHost(ctx context.Context, dev *usb.Device) error {
- buf := make([]byte, bufSize)
- for {
- select {
- case <-ctx.Done():
- return nil
- default:
- }
-
- n, err := dev.Read(buf)
- if err != nil {
- return err
- }
- fmt.Print(string(buf[:n]))
- }
-}
diff --git a/sw/usbcom/usb/usb.go b/sw/usbcom/usb/usb.go
deleted file mode 100644
index c920884..0000000
--- a/sw/usbcom/usb/usb.go
+++ /dev/null
@@ -1,158 +0,0 @@
-package usb
-
-import (
- "fmt"
-
- "github.com/google/gousb"
-)
-
-const (
- vendorId gousb.ID = 0x04d8
- productId gousb.ID = 0x000a
-
- inEndpointAddr = 0x82
- outEndpointAddr = 0x02
-)
-
-type Device struct {
- ctx *gousb.Context
- dev *gousb.Device
- closeIntf func()
- in *gousb.ReadStream // IN endpoint (device->host)
- out *gousb.WriteStream // OUT endpoint (host->device)
-}
-
-func Connect() (*Device, error) {
- ctx := gousb.NewContext()
-
- dev, err := ctx.OpenDeviceWithVIDPID(vendorId, productId)
- if err != nil {
- ctx.Close()
- return nil, err
- }
-
- intf, closeIntf, err := interfaceByClass(dev, gousb.ClassData)
- if err != nil {
- dev.Close()
- ctx.Close()
- return nil, err
- }
-
- in, err := inEndpoint(intf)
- if err != nil {
- closeIntf()
- dev.Close()
- ctx.Close()
- return nil, err
- }
-
- out, err := outEndpoint(intf)
- if err != nil {
- in.Close()
- closeIntf()
- dev.Close()
- ctx.Close()
- return nil, err
- }
-
- return &Device{
- ctx,
- dev,
- closeIntf,
- in, out,
- }, nil
-}
-
-func interfaceByClass(dev *gousb.Device, class gousb.Class) (intf *gousb.Interface, close func(), err error) {
- cfgNum, err := dev.ActiveConfigNum()
- if err != nil {
- return nil, nil, fmt.Errorf("failed to get active config number of device %s: %v", dev, err)
- }
- cfg, err := dev.Config(cfgNum)
- if err != nil {
- return nil, nil, fmt.Errorf("failed to claim config %d of device %s: %v", cfgNum, dev, err)
- }
-
- intfNum, altNum, ok := func() (int, int, bool) {
- for i, intf := range cfg.Desc.Interfaces {
- for a, alt := range intf.AltSettings {
- if alt.Class == class {
- return i, a, true
- }
- }
- }
- return -1, -1, false
- }()
- if !ok {
- cfg.Close()
- return nil, nil, fmt.Errorf("failed to get %s interface of device %s: %v", class, dev, err)
- }
-
- intf, err = cfg.Interface(intfNum, altNum)
- if err != nil {
- cfg.Close()
- return nil, nil, fmt.Errorf("failed to select interface (%d,%d) of config %d of device %s: %v", intfNum, altNum, cfgNum, dev, err)
- }
-
- return intf, func() {
- intf.Close()
- cfg.Close()
- }, nil
-}
-
-func inEndpoint(intf *gousb.Interface) (*gousb.ReadStream, error) {
- ep, err := intf.InEndpoint(inEndpointAddr)
- if err != nil {
- return nil, err
- }
-
- desc, ok := intf.Setting.Endpoints[inEndpointAddr]
- if !ok {
- return nil, fmt.Errorf("no such endpoint: %x", inEndpointAddr)
- }
-
- return ep.NewStream(desc.MaxPacketSize, 1)
-}
-
-func outEndpoint(intf *gousb.Interface) (*gousb.WriteStream, error) {
- ep, err := intf.OutEndpoint(outEndpointAddr)
- if err != nil {
- return nil, err
- }
-
- desc, ok := intf.Setting.Endpoints[outEndpointAddr]
- if !ok {
- return nil, fmt.Errorf("no such endpoint: %x", outEndpointAddr)
- }
-
- return ep.NewStream(desc.MaxPacketSize, 1)
-}
-
-func (dev *Device) Close() error {
- outErr := dev.out.Close()
- inErr := dev.in.Close()
- dev.closeIntf()
- devErr := dev.dev.Close()
- ctxErr := dev.ctx.Close()
-
- return nonNil(outErr, inErr, devErr, ctxErr)
-}
-
-func nonNil(errs ...error) error {
- for _, err := range errs {
- if err != nil {
- return err
- }
- }
- return nil
-}
-
-// Read from the IN endpoint (device->host)
-func (dev *Device) Read(p []byte) (n int, err error) {
- return dev.in.Read(p)
-}
-
-// Write to the OUT endpoint (host->device)
-func (dev *Device) Write(p []byte) (n int, err error) {
- return dev.out.Write(p)
-}