From 97618d8ec088be94d01b0c5a93875155da888605 Mon Sep 17 00:00:00 2001 From: WeijiangChen Date: Sun, 21 Jul 2024 12:06:17 +0800 Subject: [PATCH 1/3] ADD: GetDescriptor --- device.go | 12 ++++++++++++ libusb.go | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/device.go b/device.go index 4180b11..57acbab 100644 --- a/device.go +++ b/device.go @@ -240,6 +240,18 @@ func (d *Device) GetStringDescriptor(descIndex int) (string, error) { return d.ctx.libusb.getStringDesc(d.handle, descIndex) } +// GetDescriptor returns a device descriptor with the given index number. +func (d *Device) GetDescriptor(descIndex int) ([]byte, error) { + if d.handle == nil { + return nil, fmt.Errorf("GetStringDescriptor(%d) called on %s after Close", descIndex, d) + } + // descriptor index value of 0 indicates no string descriptor. + if descIndex == 0 { + return nil, nil + } + return d.ctx.libusb.getDescriptor(d.handle, descIndex) +} + // Manufacturer returns the device's manufacturer name. // GetStringDescriptor's string conversion rules apply. func (d *Device) Manufacturer() (string, error) { diff --git a/libusb.go b/libusb.go index ddc0b2a..a7a101e 100644 --- a/libusb.go +++ b/libusb.go @@ -150,6 +150,7 @@ type libusbIntf interface { getConfig(*libusbDevHandle) (uint8, error) setConfig(*libusbDevHandle, uint8) error getStringDesc(*libusbDevHandle, int) (string, error) + getDescriptor(*libusbDevHandle, int) ([]byte, error) setAutoDetach(*libusbDevHandle, int) error detachKernelDriver(*libusbDevHandle, uint8) error @@ -413,6 +414,22 @@ func (libusbImpl) getStringDesc(d *libusbDevHandle, index int) (string, error) { return string(buf[:errno]), nil } +func (libusbImpl) getDescriptor(d *libusbDevHandle, index int) ([]byte, error) { + // allocate 200-byte array limited the length of descriptor + buf := make([]byte, 256) + // get descriptor from libusb. if errno < 0 then there are any errors. + // if errno >= 0; it is a length of result descriptor + errno := C.libusb_get_descriptor( + (*C.libusb_device_handle)(d), + C.uint8_t(index), 0, + (*C.uchar)(unsafe.Pointer(&buf[0])), + 256) + if errno < 0 { + return nil, fmt.Errorf("failed to get descriptor %d: %s", index, fromErrNo(errno)) + } + return buf[:errno], nil +} + func (libusbImpl) setAutoDetach(d *libusbDevHandle, val int) error { err := fromErrNo(C.libusb_set_auto_detach_kernel_driver((*C.libusb_device_handle)(d), C.int(val))) if err != nil && err != ErrorNotSupported { From c8899615a3da15adb5ce98ca696b65c10053a652 Mon Sep 17 00:00:00 2001 From: WeijiangChen Date: Sun, 21 Jul 2024 19:30:02 +0800 Subject: [PATCH 2/3] fix desc string --- device.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device.go b/device.go index 57acbab..e70ac54 100644 --- a/device.go +++ b/device.go @@ -243,7 +243,7 @@ func (d *Device) GetStringDescriptor(descIndex int) (string, error) { // GetDescriptor returns a device descriptor with the given index number. func (d *Device) GetDescriptor(descIndex int) ([]byte, error) { if d.handle == nil { - return nil, fmt.Errorf("GetStringDescriptor(%d) called on %s after Close", descIndex, d) + return nil, fmt.Errorf("GetDescriptor(%d) called on %s after Close", descIndex, d) } // descriptor index value of 0 indicates no string descriptor. if descIndex == 0 { From d1252187ecf568581c4c6f2f182883d5f12b0355 Mon Sep 17 00:00:00 2001 From: WeijiangChen Date: Sun, 21 Jul 2024 19:33:35 +0800 Subject: [PATCH 3/3] fix annotation --- libusb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libusb.go b/libusb.go index a7a101e..80e7bd6 100644 --- a/libusb.go +++ b/libusb.go @@ -415,7 +415,7 @@ func (libusbImpl) getStringDesc(d *libusbDevHandle, index int) (string, error) { } func (libusbImpl) getDescriptor(d *libusbDevHandle, index int) ([]byte, error) { - // allocate 200-byte array limited the length of descriptor + // allocate 256-byte array limited the length of descriptor buf := make([]byte, 256) // get descriptor from libusb. if errno < 0 then there are any errors. // if errno >= 0; it is a length of result descriptor