Use USB vendor/product IDs instead of bus/dev IDs

This commit is contained in:
AlexSSD7 2023-08-27 18:07:51 +01:00
commit a8f5af7bd0
4 changed files with 23 additions and 15 deletions

View file

@ -46,21 +46,21 @@ func getDevicePassthroughConfig(val string) vm.USBDevicePassthroughConfig {
os.Exit(1)
}
usbBus, err := strconv.ParseUint(usbValsSplit[0], 10, 8)
vendorID, err := strconv.ParseUint(usbValsSplit[0], 16, 32)
if err != nil {
slog.Error("Bad USB device bus number", "value", usbValsSplit[0])
slog.Error("Bad USB vendor ID", "value", usbValsSplit[0])
os.Exit(1)
}
usbPort, err := strconv.ParseUint(usbValsSplit[1], 10, 8)
productID, err := strconv.ParseUint(usbValsSplit[1], 16, 32)
if err != nil {
slog.Error("Bad USB device port number", "value", usbValsSplit[1])
slog.Error("Bad USB product ID", "value", usbValsSplit[1])
os.Exit(1)
}
return vm.USBDevicePassthroughConfig{
HostBus: uint8(usbBus),
HostPort: uint8(usbPort),
VendorID: uint16(vendorID),
ProductID: uint16(productID),
}
default:
slog.Error("Unknown device passthrough type", "value", valSplit[0])

View file

@ -1,6 +1,7 @@
package utils
import (
"encoding/binary"
"regexp"
"strings"
"unicode"
@ -28,3 +29,9 @@ func ValidateDevName(s string) bool {
return devNameRegexp.MatchString(s)
}
func Uint16ToBytesBE(v uint16) []byte {
b := make([]byte, 2)
binary.BigEndian.PutUint16(b, v)
return b
}

View file

@ -10,8 +10,8 @@ import (
)
type USBDevicePassthroughConfig struct {
HostBus uint8
HostPort uint8
VendorID uint16
ProductID uint16
}
type PortForwardingRule struct {

View file

@ -4,13 +4,13 @@ import (
"bufio"
"bytes"
"context"
"encoding/hex"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
"runtime"
"strconv"
"sync"
"sync/atomic"
"syscall"
@ -122,17 +122,18 @@ func NewVM(logger *slog.Logger, cfg VMConfig) (*VM, error) {
if !cfg.ShowDisplay {
cmdArgs = append(cmdArgs, "-display", "none")
if runtime.GOARCH == "arm64" {
// No video is configured by default in ARM. This will enable it.
cmdArgs = append(cmdArgs, "-device", "virtio-gpu-device")
}
} else if runtime.GOARCH == "arm64" {
// No video is configured by default in ARM. This will enable it.
// TODO: This doesn't really work on arm64. It just shows a blank viewer.
cmdArgs = append(cmdArgs, "-device", "virtio-gpu-device")
}
if len(cfg.USBDevices) != 0 {
cmdArgs = append(cmdArgs, "-usb", "-device", "nec-usb-xhci,id=xhci")
cmdArgs = append(cmdArgs, "-device", "nec-usb-xhci,id=xhci")
for _, dev := range cfg.USBDevices {
cmdArgs = append(cmdArgs, "-device", "usb-host,hostbus="+strconv.FormatUint(uint64(dev.HostBus), 10)+",hostport="+strconv.FormatUint(uint64(dev.HostPort), 10))
cmdArgs = append(cmdArgs, "-device", "usb-host,vendorid=0x"+hex.EncodeToString(utils.Uint16ToBytesBE(dev.VendorID))+",productid=0x"+hex.EncodeToString(utils.Uint16ToBytesBE(dev.ProductID)))
}
}