59#define ALIGN(n,align) (((n)+((align)-1)) & ~((align)-1))
61#define usb_dma_alloc(n) (KMALLOC(ALIGN((n),CACHE_ALIGN),BUFF_ALIGN))
62#define usb_dma_free(p) (KFREE(p))
68#define usbhub_set_port_feature(dev,port,feature) \
69 usb_simple_request(dev,0x23,USB_HUBREQ_SET_FEATURE,feature,port)
71#define usbhub_set_hub_feature(dev,feature) \
72 usb_simple_request(dev,0x20,USB_HUBREQ_SET_FEATURE,feature,0)
74#define usbhub_clear_port_feature(dev,port,feature) \
75 usb_simple_request(dev,0x23,USB_HUBREQ_CLEAR_FEATURE,feature,port)
77#define usbhub_clear_hub_feature(dev,feature) \
78 usb_simple_request(dev,0x20,USB_HUBREQ_CLEAR_FEATURE,feature,0)
92static int usbhub_detach(
usbdev_t *dev);
93static void usbhub_markdetached(
usbdev_t *dev);
99#define UHUB_MAX_DEVICES 8
101#define UHUB_FLG_NEEDSCAN 1
143static int usbhub_ireq_callback(
usbreq_t *ur)
236 memcpy(dscr, respbuf, (len <= maxlen ? len : maxlen));
265 sizeof(usbhub_status_t));
432static int usbhub_detach(
usbdev_t *dev)
438 if (!
IS_HUB(dev))
return 0;
445 console_log(
"USB: Removing device attached to bus %d hub %d port %d",
462 console_log(
"USB: Detached device on bus %d hub %d port %d "
500static void usbhub_map_tree1(
usbdev_t *dev,
int level,
501 int (*func)(
usbdev_t *dev,
void *arg),
void *arg)
512 usbhub_map_tree1(hub->
uhub_devices[idx],level+1,func,arg);
539 usbhub_map_tree1(dev,0,func,arg);
556static int usbhub_dumpbus1(
usbdev_t *dev,
void *arg)
560 if ((*verbose & 0x00FF) && (dev->
ud_address != (*verbose & 0x00FF)))
return 0;
562 if (*verbose & 0x100) {
563 printf(
"============================================================================\n");
568 if (*verbose & 0x100) {
625 usbhub_get_port_status(dev,port,portstatus);
628 usbhub_get_port_status(dev,port,portstatus);
652static void usbhub_scan_ports(
usbdev_t *dev,
void *arg)
666 unsigned int powerondelay;
671 if (portstatus ==
NULL)
return;
687 usbhub_get_port_status(dev,idx+1,portstatus);
692 printf(
"BeforePowerup: port %d status %04X changed %04X\n",idx+1,current,changed);
709 usbhub_get_port_status(dev,idx+1,portstatus);
715 printf(
"USB: Explore: Bus %d Hub %d port %d status %04X changed %04X\n",
744 console_log(
"USB: New device connected to bus %d hub %d port %d",
754 usbhub_reset_device(dev,idx+1,portstatus);
796 printf(
"[a] usb_get_config_descriptor returns %d\n",res);
804 printf(
"[b] usb_get_config_descriptor returns %d\n",res);
840 console_log(
"USB: Device disconnected from bus %d hub %d port %d",
851 if (newdev) usbhub_markdetached(newdev);
877 console_log(
"USB: Detached device on bus %d hub %d port %d "
901 usbhub_queue_intreq(dev,softc);
918static int usbhub_markdetached1(
usbdev_t *dev,
void *arg)
924static void usbhub_markdetached(
usbdev_t *dev)
944static int usbhub_scan1(
usbdev_t *dev,
void *arg)
953 if (!
IS_HUB(dev))
return 0;
963 usbhub_scan_ports(dev,arg);
#define console_log(fmt, x...)
#define KMALLOC(size, align)
uint8_t bConfigurationValue
int(* udrv_attach)(usbdev_t *, usb_driver_t *)
int(* udrv_detach)(usbdev_t *)
uint8_t bPowerOnToPowerGood
usb_config_descr_t * ud_cfgdescr
usb_device_descr_t ud_devdescr
usb_hub_descr_t uhub_descr
usbdev_t * uhub_devices[UHUB_MAX_DEVICES]
usb_hub_status_t uhub_status
int(* ur_callback)(struct usbreq_s *req)
#define GETUSBFIELD(s, f)
#define USB_PORT_FEATURE_C_PORT_CONNECTION
#define USB_PORT_STATUS_CONNECT
#define USB_PORT_STATUS_ENABLED
#define USB_ENDPOINT_DESCRIPTOR_TYPE
#define USB_PORT_STATUS_POWER
#define USB_HUB_DESCR_SIZE
#define USB_PORT_STATUS_RESET
#define USB_PORT_FEATURE_C_PORT_RESET
#define USB_PORT_FEATURE_RESET
#define USB_PORT_STATUS_LOWSPD
#define USB_PORT_FEATURE_POWER
#define USB_INTERFACE_DESCRIPTOR_TYPE
#define USB_PORT_FEATURE_C_PORT_ENABLE
#define USB_HUBREQ_GET_DESCRIPTOR
void * usb_find_cfg_descr(usbdev_t *dev, int dtype, int idx)
int usb_std_request(usbdev_t *dev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *buffer, int length)
int usb_new_address(usbbus_t *bus)
usbreq_t * usb_make_request(usbdev_t *dev, int epaddr, uint8_t *buf, int length, int flags)
void usb_free_request(usbreq_t *ur)
int usb_get_device_status(usbdev_t *dev, usb_device_status_t *status)
void usb_poll(usbbus_t *bus)
usbdev_t * usb_create_device(usbbus_t *bus, int lowspeed)
int usb_queue_request(usbreq_t *ur)
int usb_set_address(usbdev_t *dev, int address)
int usb_get_config_descriptor(usbdev_t *dev, usb_config_descr_t *dscr, int idx, int maxlen)
int usb_get_device_descriptor(usbdev_t *dev, usb_device_descr_t *dscr, int smallflg)
void usb_delay_ms(usbbus_t *bus, int ms)
void usb_destroy_all_pipes(usbdev_t *dev)
int usb_set_configuration(usbdev_t *dev, int config)
int usb_set_ep0mps(usbdev_t *dev, int mps)
int usb_open_pipe(usbdev_t *dev, usb_endpoint_descr_t *epdesc)
void usb_destroy_device(usbdev_t *dev)
void usb_dbg_showdevice(usbdev_t *dev)
void usb_dbg_dumpdescriptors(usbdev_t *dev, uint8_t *ptr, int len)
void usb_dbg_dumpportstatus(int port, usb_port_status_t *portstatus, int level)
usb_driver_t * usb_find_driver(usbdev_t *dev)
#define UR_ERR_DEVICENOTRESPONDING
void usb_dbg_dumpcfgdescr(usbdev_t *dev, unsigned int index)
usb_driver_t usbhub_driver
usb_driver_t usbroothub_driver
struct usbhub_softc_s usbhub_softc_t
#define usbhub_clear_port_feature(dev, port, feature)
#define UHUB_FLG_NEEDSCAN
void usbhub_map_tree(usbbus_t *bus, int(*func)(usbdev_t *dev, void *arg), void *arg)
void usbhub_map_from_device(usbdev_t *dev, int(*func)(usbdev_t *dev, void *arg), void *arg)
void usb_scan(usbbus_t *bus)
void usbhub_dumpbus(usbbus_t *bus, uint32_t verbose)
#define usbhub_set_port_feature(dev, port, feature)