Add USB API to read power draw on USB devices.
Update usbconfig to print power draw on USB devices. MFC after: 2 weeks Submitted by: Matt Burke @ icritical.com
This commit is contained in:
parent
af9a6b5901
commit
d7b1840a86
@ -190,6 +190,7 @@ MLINKS += libusb20.3 libusb20_dev_reset.3
|
||||
MLINKS += libusb20.3 libusb20_dev_check_connected.3
|
||||
MLINKS += libusb20.3 libusb20_dev_set_power_mode.3
|
||||
MLINKS += libusb20.3 libusb20_dev_get_power_mode.3
|
||||
MLINKS += libusb20.3 libusb20_dev_get_power_usage.3
|
||||
MLINKS += libusb20.3 libusb20_dev_set_alt_index.3
|
||||
MLINKS += libusb20.3 libusb20_dev_get_device_desc.3
|
||||
MLINKS += libusb20.3 libusb20_dev_alloc_config.3
|
||||
|
@ -26,7 +26,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 13, 2012
|
||||
.Dd February 14, 2013
|
||||
.Dt LIBUSB20 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -149,6 +149,8 @@ USB access library (libusb -lusb)
|
||||
.Fn libusb20_dev_set_power_mode "struct libusb20_device *pdev" "uint8_t power_mode"
|
||||
.Ft uint8_t
|
||||
.Fn libusb20_dev_get_power_mode "struct libusb20_device *pdev"
|
||||
.Ft uint16_t
|
||||
.Fn libusb20_dev_get_power_usage "struct libusb20_device *pdev"
|
||||
.Ft int
|
||||
.Fn libusb20_dev_set_alt_index "struct libusb20_device *pdev" "uint8_t iface_index" "uint8_t alt_index"
|
||||
.Ft struct LIBUSB20_DEVICE_DESC_DECODED *
|
||||
@ -740,6 +742,12 @@ USB device.
|
||||
.
|
||||
.Pp
|
||||
.
|
||||
.Fn libusb20_dev_get_power_usage
|
||||
returns the reported power usage in milliamps for the given USB device.
|
||||
A power usage of zero typically means that the device is self powered.
|
||||
.
|
||||
.Pp
|
||||
.
|
||||
.Fn libusb20_dev_set_alt_index
|
||||
will try to set the given alternate index for the given
|
||||
USB interface index.
|
||||
|
@ -71,6 +71,7 @@ dummy_callback(struct libusb20_transfer *xfer)
|
||||
#define dummy_check_connected (void *)dummy_int
|
||||
#define dummy_set_power_mode (void *)dummy_int
|
||||
#define dummy_get_power_mode (void *)dummy_int
|
||||
#define dummy_get_power_usage (void *)dummy_int
|
||||
#define dummy_kernel_driver_active (void *)dummy_int
|
||||
#define dummy_detach_kernel_driver (void *)dummy_int
|
||||
#define dummy_do_request_sync (void *)dummy_int
|
||||
@ -717,6 +718,18 @@ libusb20_dev_get_power_mode(struct libusb20_device *pdev)
|
||||
return (power_mode);
|
||||
}
|
||||
|
||||
uint16_t
|
||||
libusb20_dev_get_power_usage(struct libusb20_device *pdev)
|
||||
{
|
||||
int error;
|
||||
uint16_t power_usage;
|
||||
|
||||
error = pdev->methods->get_power_usage(pdev, &power_usage);
|
||||
if (error)
|
||||
power_usage = 0;
|
||||
return (power_usage);
|
||||
}
|
||||
|
||||
int
|
||||
libusb20_dev_set_alt_index(struct libusb20_device *pdev, uint8_t ifaceIndex, uint8_t altIndex)
|
||||
{
|
||||
|
@ -255,6 +255,7 @@ int libusb20_dev_reset(struct libusb20_device *pdev);
|
||||
int libusb20_dev_check_connected(struct libusb20_device *pdev);
|
||||
int libusb20_dev_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode);
|
||||
uint8_t libusb20_dev_get_power_mode(struct libusb20_device *pdev);
|
||||
uint16_t libusb20_dev_get_power_usage(struct libusb20_device *pdev);
|
||||
int libusb20_dev_set_alt_index(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index);
|
||||
int libusb20_dev_get_info(struct libusb20_device *pdev, struct usb_device_info *pinfo);
|
||||
int libusb20_dev_get_iface_desc(struct libusb20_device *pdev, uint8_t iface_index, char *buf, uint8_t len);
|
||||
|
@ -105,6 +105,7 @@ typedef int (libusb20_process_t)(struct libusb20_device *pdev);
|
||||
typedef int (libusb20_reset_device_t)(struct libusb20_device *pdev);
|
||||
typedef int (libusb20_set_power_mode_t)(struct libusb20_device *pdev, uint8_t power_mode);
|
||||
typedef int (libusb20_get_power_mode_t)(struct libusb20_device *pdev, uint8_t *power_mode);
|
||||
typedef int (libusb20_get_power_usage_t)(struct libusb20_device *pdev, uint16_t *power_usage);
|
||||
typedef int (libusb20_set_alt_index_t)(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index);
|
||||
typedef int (libusb20_set_config_index_t)(struct libusb20_device *pdev, uint8_t index);
|
||||
typedef int (libusb20_check_connected_t)(struct libusb20_device *pdev);
|
||||
@ -127,6 +128,7 @@ typedef void (libusb20_tr_cancel_async_t)(struct libusb20_transfer *xfer);
|
||||
m(n, check_connected) \
|
||||
m(n, set_power_mode) \
|
||||
m(n, get_power_mode) \
|
||||
m(n, get_power_usage) \
|
||||
m(n, set_alt_index) \
|
||||
m(n, set_config_index) \
|
||||
m(n, tr_cancel_async) \
|
||||
|
@ -69,6 +69,7 @@ static libusb20_reset_device_t ugen20_reset_device;
|
||||
static libusb20_check_connected_t ugen20_check_connected;
|
||||
static libusb20_set_power_mode_t ugen20_set_power_mode;
|
||||
static libusb20_get_power_mode_t ugen20_get_power_mode;
|
||||
static libusb20_get_power_usage_t ugen20_get_power_usage;
|
||||
static libusb20_kernel_driver_active_t ugen20_kernel_driver_active;
|
||||
static libusb20_detach_kernel_driver_t ugen20_detach_kernel_driver;
|
||||
static libusb20_do_request_sync_t ugen20_do_request_sync;
|
||||
@ -638,6 +639,18 @@ ugen20_get_power_mode(struct libusb20_device *pdev, uint8_t *power_mode)
|
||||
return (0); /* success */
|
||||
}
|
||||
|
||||
static int
|
||||
ugen20_get_power_usage(struct libusb20_device *pdev, uint16_t *power_usage)
|
||||
{
|
||||
int temp;
|
||||
|
||||
if (ioctl(pdev->file_ctrl, USB_GET_POWER_USAGE, &temp)) {
|
||||
return (LIBUSB20_ERROR_OTHER);
|
||||
}
|
||||
*power_usage = temp;
|
||||
return (0); /* success */
|
||||
}
|
||||
|
||||
static int
|
||||
ugen20_kernel_driver_active(struct libusb20_device *pdev,
|
||||
uint8_t iface_index)
|
||||
|
@ -1840,6 +1840,17 @@ ugen_get_power_mode(struct usb_fifo *f)
|
||||
return (udev->power_mode);
|
||||
}
|
||||
|
||||
static int
|
||||
ugen_get_power_usage(struct usb_fifo *f)
|
||||
{
|
||||
struct usb_device *udev = f->udev;
|
||||
|
||||
if (udev == NULL)
|
||||
return (0);
|
||||
|
||||
return (udev->power);
|
||||
}
|
||||
|
||||
static int
|
||||
ugen_do_port_feature(struct usb_fifo *f, uint8_t port_no,
|
||||
uint8_t set, uint16_t feature)
|
||||
@ -2202,6 +2213,10 @@ ugen_ioctl_post(struct usb_fifo *f, u_long cmd, void *addr, int fflags)
|
||||
*u.pint = ugen_get_power_mode(f);
|
||||
break;
|
||||
|
||||
case USB_GET_POWER_USAGE:
|
||||
*u.pint = ugen_get_power_usage(f);
|
||||
break;
|
||||
|
||||
case USB_SET_PORT_ENABLE:
|
||||
error = ugen_do_port_feature(f,
|
||||
*u.pint, 1, UHF_PORT_ENABLE);
|
||||
|
@ -277,7 +277,8 @@ struct usb_gen_quirk {
|
||||
#define USB_IFACE_DRIVER_DETACH _IOW ('U', 125, int)
|
||||
#define USB_GET_PLUGTIME _IOR ('U', 126, uint32_t)
|
||||
#define USB_READ_DIR _IOW ('U', 127, struct usb_read_dir)
|
||||
/* 128 - 135 unused */
|
||||
/* 128 - 134 unused */
|
||||
#define USB_GET_POWER_USAGE _IOR ('U', 135, int)
|
||||
#define USB_SET_TX_FORCE_SHORT _IOW ('U', 136, int)
|
||||
#define USB_SET_TX_TIMEOUT _IOW ('U', 137, int)
|
||||
#define USB_GET_TX_FRAME_SIZE _IOR ('U', 138, int)
|
||||
|
@ -225,13 +225,17 @@ dump_device_info(struct libusb20_device *pdev, uint8_t show_ifdrv)
|
||||
{
|
||||
char buf[128];
|
||||
uint8_t n;
|
||||
unsigned int usage;
|
||||
|
||||
printf("%s, cfg=%u md=%s spd=%s pwr=%s\n",
|
||||
usage = libusb20_dev_get_power_usage(pdev);
|
||||
|
||||
printf("%s, cfg=%u md=%s spd=%s pwr=%s (%umA)\n",
|
||||
libusb20_dev_get_desc(pdev),
|
||||
libusb20_dev_get_config_index(pdev),
|
||||
dump_mode(libusb20_dev_get_mode(pdev)),
|
||||
dump_speed(libusb20_dev_get_speed(pdev)),
|
||||
dump_power_mode(libusb20_dev_get_power_mode(pdev)));
|
||||
dump_power_mode(libusb20_dev_get_power_mode(pdev)),
|
||||
usage);
|
||||
|
||||
if (!show_ifdrv)
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user