diff --git a/devicemodel/hw/platform/usb_pmapper.c b/devicemodel/hw/platform/usb_pmapper.c index 99a757f64..88695575e 100755 --- a/devicemodel/hw/platform/usb_pmapper.c +++ b/devicemodel/hw/platform/usb_pmapper.c @@ -19,8 +19,8 @@ #define LOG_TAG "USBPM: " static struct usb_dev_sys_ctx_info g_ctx; -static inline uint8_t usb_dev_get_ep_type(struct usb_dev *udev, int pid, - int epnum); +static uint8_t usb_dev_get_ep_type(struct usb_dev *udev, int pid, int epnum); +static uint16_t usb_dev_get_ep_maxp(struct usb_dev *udev, int pid, int epnum); static bool usb_get_native_devinfo(struct libusb_device *ldev, @@ -480,6 +480,28 @@ usb_dev_get_ep_type(struct usb_dev *udev, int pid, int epnum) return ep->type; } +static inline void +usb_dev_set_ep_maxp(struct usb_dev *udev, int pid, int epnum, uint16_t maxp) +{ + struct usb_dev_ep *ep; + + ep = usb_dev_get_ep(udev, pid, epnum); + if (ep) + ep->maxp = maxp; +} + +static inline uint16_t +usb_dev_get_ep_maxp(struct usb_dev *udev, int pid, int epnum) +{ + struct usb_dev_ep *ep; + + ep = usb_dev_get_ep(udev, pid, epnum); + if (!ep) + return 0; + else + return ep->maxp; +} + static void usb_dev_reset_ep(struct usb_dev *udev) { @@ -515,6 +537,10 @@ usb_dev_update_ep(struct usb_dev *udev) USB_EP_PID(desc), USB_EP_NR(desc), USB_EP_TYPE(desc)); + usb_dev_set_ep_maxp(udev, + USB_EP_PID(desc), + USB_EP_NR(desc), + USB_EP_MAXP(desc)); } } libusb_free_config_descriptor(cfg); diff --git a/devicemodel/include/usb_pmapper.h b/devicemodel/include/usb_pmapper.h index ae528070b..281317f3b 100644 --- a/devicemodel/include/usb_pmapper.h +++ b/devicemodel/include/usb_pmapper.h @@ -18,8 +18,12 @@ #define USB_EP_PID(d) (USB_EP_ADDR(d) & USB_DIR_IN ? TOKEN_IN : TOKEN_OUT) #define USB_EP_TYPE(d) (USB_EP_ATTR(d) & 0x3) #define USB_EP_NR(d) (USB_EP_ADDR(d) & 0xF) +#define USB_EP_MAXP(d) ((d)->wMaxPacketSize) #define USB_EP_ERR_TYPE 0xFF +#define USB_EP_MAXP_SZ(m) ((m) & 0x7ff) +#define USB_EP_MAXP_MT(m) (((m) >> 11) & 0x3) + enum { USB_INFO_VERSION, USB_INFO_SPEED, @@ -32,6 +36,7 @@ enum { struct usb_dev_ep { uint8_t pid; uint8_t type; + uint16_t maxp; }; struct usb_dev {