diff --git a/P4wnP1_service.go b/P4wnP1_service.go index e49e69b..d039383 100644 --- a/P4wnP1_service.go +++ b/P4wnP1_service.go @@ -39,5 +39,11 @@ func main() { service.InitLed(false) //Set LED to manual trigger service.InitDefaultLEDSettings() + + log.Printf("Keyboard devFile: %s\n", service.HidDevPath[service.USB_FUNCTION_HID_KEYBOARD_name]) + log.Printf("Mouse devFile: %s\n", service.HidDevPath[service.USB_FUNCTION_HID_MOUSE_name]) + log.Printf("HID RAW devFile: %s\n", service.HidDevPath[service.USB_FUNCTION_HID_RAW_name]) + + service.StartRpcServerAndWeb("0.0.0.0", "50051") //start gRPC service } diff --git a/ToDo.txt b/ToDo.txt new file mode 100644 index 0000000..e69de29 diff --git a/service/usb.go b/service/usb.go index bdb8134..79441eb 100644 --- a/service/usb.go +++ b/service/usb.go @@ -12,6 +12,7 @@ import ( "time" "fmt" "net" + "regexp" ) const ( @@ -73,7 +74,9 @@ const ( ) var ( - GadgetSettingsState pb.GadgetSettings = pb.GadgetSettings{} + GadgetSettingsState pb.GadgetSettings = pb.GadgetSettings{} + rp_usbHidDevName = regexp.MustCompile("(?m)DEVNAME=(.*)\n") + HidDevPath = make(map[string]string) //stores device path for HID devices ) func ValidateGadgetSetting(gs pb.GadgetSettings) error { @@ -568,6 +571,12 @@ func DeployGadgetSettings(settings pb.GadgetSettings) error { } } + + //clear device path for HID devices + HidDevPath[USB_FUNCTION_HID_KEYBOARD_name] = "" + HidDevPath[USB_FUNCTION_HID_MOUSE_name] = "" + HidDevPath[USB_FUNCTION_HID_RAW_name] = "" + //get UDC driver name and bind to gadget if settings.Enabled { udc_name, err := getUDCName() @@ -578,9 +587,16 @@ func DeployGadgetSettings(settings pb.GadgetSettings) error { if err = ioutil.WriteFile(USB_GADGET_DIR+"/UDC", []byte(udc_name), os.ModePerm); err != nil { return err } + + //update device path' + if devPath,errF := enumDevicePath(USB_FUNCTION_HID_KEYBOARD_name); errF == nil { HidDevPath[USB_FUNCTION_HID_KEYBOARD_name] = devPath } + if devPath,errF := enumDevicePath(USB_FUNCTION_HID_MOUSE_name); errF == nil { HidDevPath[USB_FUNCTION_HID_MOUSE_name] = devPath } + if devPath,errF := enumDevicePath(USB_FUNCTION_HID_RAW_name); errF == nil { HidDevPath[USB_FUNCTION_HID_RAW_name] = devPath } } + + deleteUSBEthernetBridge() //delete former used bridge, if there's any //In case USB ethernet is uesd (RNDIS or CDC ECM), we add a bridge interface if usesUSBEthernet && settings.Enabled { @@ -602,6 +618,32 @@ func DeployGadgetSettings(settings pb.GadgetSettings) error { return nil } +func enumDevicePath(funcName string) (devPath string, err error){ + //cat /sys/dev/char/$(cat /sys/kernel/config/usb_gadget/mame82_gadget/functions/hid.mouse/dev)/uevent | grep DEVNAME + devfile := USB_GADGET_DIR + "/functions/" + funcName + "/dev" + + var udevNode string + if res, err := ioutil.ReadFile(devfile); err != nil { + err1 := errors.New(fmt.Sprintf("Gadget error reading udevname for %s\n", funcName)) + return "", err1 + } else { + udevNode = strings.TrimSuffix(string(res), "\n") + } + + + ueventPath := fmt.Sprintf("/sys/dev/char/%s/uevent", udevNode) + if ueventContent, err := ioutil.ReadFile(ueventPath); err != nil { + err1 := errors.New(fmt.Sprintf("Gadget error reading uevent file '%s' for %s\n", ueventPath, funcName)) + return "", err1 + } else { + + strDevNameSub := rp_usbHidDevName.FindStringSubmatch(string(ueventContent)) + if len(strDevNameSub) > 1 { devPath = "/dev/" + strDevNameSub[1]} + } + + return +} + func DestroyAllGadgets() error { //gadget_root := "./test" gadget_root := USB_GADGET_DIR_BASE diff --git a/service/wifi.go b/service/wifi.go index 9e9395b..5c5d313 100644 --- a/service/wifi.go +++ b/service/wifi.go @@ -259,17 +259,6 @@ func wifiCreateHostapdConfString(ws *pb.WiFiSettings) (config string, err error) return } -func WifiTest() { - fmt.Println("Hostapd settings:") - conf, err := wifiCreateHostapdConfString(GetDefaultWiFiSettings()) - if err == nil { - fmt.Println(conf) - } else { - fmt.Printf("Error creating hostapd config: %v\n", err) - } - - fmt.Println("End of hostapd settings:") -} func hostapdCreateConfigFile(s *pb.WiFiSettings, filename string) (err error) { log.Printf("Creating hostapd configuration file at '%s'\n", filename)