diff options
author | joe <joe@FreeBSD.org> | 2002-01-02 20:16:53 +0000 |
---|---|---|
committer | joe <joe@FreeBSD.org> | 2002-01-02 20:16:53 +0000 |
commit | dc37dfab7839bf806e8b708af3594f4351d24c83 (patch) | |
tree | 0606c3163a777ae4d4d6ebf432595414516a660e /sys | |
parent | 59ca9f3607038f6a0ace86a98f6ca9a484836e7f (diff) | |
download | FreeBSD-src-dc37dfab7839bf806e8b708af3594f4351d24c83.zip FreeBSD-src-dc37dfab7839bf806e8b708af3594f4351d24c83.tar.gz |
Sync usb.h with NetBSD, apart from usb_device_info.speed, which
requires logic changes. For now leave it as usb_device_info.lowspeed.
It will get addressed when the usb.c code is sync'd.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/usb/umass.c | 4 | ||||
-rw-r--r-- | sys/dev/usb/usb.c | 8 | ||||
-rw-r--r-- | sys/dev/usb/usb.h | 202 | ||||
-rw-r--r-- | sys/dev/usb/usb_subr.c | 10 | ||||
-rw-r--r-- | sys/dev/usb/usbhid.h | 4 |
5 files changed, 155 insertions, 73 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c index e17fc50..af04f74 100644 --- a/sys/dev/usb/umass.c +++ b/sys/dev/usb/umass.c @@ -719,10 +719,10 @@ umass_match_proto(struct umass_softc *sc, usbd_interface_handle iface, sc->proto |= PROTO_CBI; #endif break; - case UIPROTO_MASS_BBB: + case UIPROTO_MASS_BBB_OLD: sc->proto |= PROTO_BBB; break; - case UIPROTO_MASS_BBB_P: + case UIPROTO_MASS_BBB: sc->drive = ZIP_100; sc->proto |= PROTO_BBB; sc->transfer_speed = UMASS_ZIP100_TRANSFER_SPEED; diff --git a/sys/dev/usb/usb.c b/sys/dev/usb/usb.c index 8bf401b..ef7d909 100644 --- a/sys/dev/usb/usb.c +++ b/sys/dev/usb/usb.c @@ -652,10 +652,10 @@ usbd_add_event(type, dev) int s; s = splusb(); - if (type == USB_EVENT_DETACH) { + if (type == USB_EVENT_CTRLR_DETACH) { for (ueq = TAILQ_FIRST(&usb_events); ueq; ueq = ueq_next) { ueq_next = TAILQ_NEXT(ueq, next); - if (ueq->ue.ue_cookie.cookie == dev->cookie.cookie) { + if (ueq->ue.u.ue_driver.ue_cookie.cookie == dev->cookie.cookie) { TAILQ_REMOVE(&usb_events, ueq, next); free(ueq, M_USBDEV); usb_nevents--; @@ -676,8 +676,8 @@ usbd_add_event(type, dev) return; } ueq->ue.ue_type = type; - ueq->ue.ue_cookie = dev->cookie; - usbd_fill_deviceinfo(dev, &ueq->ue.ue_device, 0); + ueq->ue.u.ue_driver.ue_cookie = dev->cookie; + usbd_fill_deviceinfo(dev, &ueq->ue.u.ue_device, 0); microtime(&thetime); TIMEVAL_TO_TIMESPEC(&thetime, &ueq->ue.ue_time); TAILQ_INSERT_TAIL(&usb_events, ueq, next); diff --git a/sys/dev/usb/usb.h b/sys/dev/usb/usb.h index 6b6ee31..21c733f 100644 --- a/sys/dev/usb/usb.h +++ b/sys/dev/usb/usb.h @@ -1,5 +1,5 @@ -/* $NetBSD: usb.h,v 1.38 1999/10/20 21:02:39 augustss Exp $ */ -/* $FreeBSD$ */ +/* $NetBSD: usb/usb.h,v 1.60 2001/12/29 15:44:11 augustss Exp $ */ +/* $FreeBSD$ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -79,36 +79,43 @@ MALLOC_DECLARE(M_USBHC); /* * The USB records contain some unaligned little-endian word * components. The U[SG]ETW macros take care of both the alignment - * and endian problem and should always be used to access 16 bit + * and endian problem and should always be used to access non-byte * values. */ typedef u_int8_t uByte; typedef u_int8_t uWord[2]; +typedef u_int8_t uDWord[4]; + +#define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h)) + +#if 1 #define UGETW(w) ((w)[0] | ((w)[1] << 8)) #define USETW(w,v) ((w)[0] = (u_int8_t)(v), (w)[1] = (u_int8_t)((v) >> 8)) -#define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h)) -typedef u_int8_t uDWord[4]; #define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24)) #define USETDW(w,v) ((w)[0] = (u_int8_t)(v), \ (w)[1] = (u_int8_t)((v) >> 8), \ (w)[2] = (u_int8_t)((v) >> 16), \ (w)[3] = (u_int8_t)((v) >> 24)) +#else /* * On little-endian machines that can handle unanliged accesses * (e.g. i386) these macros can be replaced by the following. */ -#if 0 #define UGETW(w) (*(u_int16_t *)(w)) #define USETW(w,v) (*(u_int16_t *)(w) = (v)) +#define UGETDW(w) (*(u_int32_t *)(w)) +#define USETDW(w,v) (*(u_int32_t *)(w) = (v)) #endif +#define UPACKED __attribute__((__packed__)) + typedef struct { uByte bmRequestType; uByte bRequest; uWord wValue; uWord wIndex; uWord wLength; -} usb_device_request_t; +} UPACKED usb_device_request_t; #define UT_WRITE 0x00 #define UT_READ 0x80 @@ -154,6 +161,10 @@ typedef struct { #define UDESC_STRING 0x03 #define UDESC_INTERFACE 0x04 #define UDESC_ENDPOINT 0x05 +#define UDESC_DEVICE_QUALIFIER 0x06 +#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 +#define UDESC_INTERFACE_POWER 0x08 +#define UDESC_OTG 0x09 #define UDESC_CS_DEVICE 0x21 /* class specific */ #define UDESC_CS_CONFIG 0x22 #define UDESC_CS_STRING 0x23 @@ -170,19 +181,25 @@ typedef struct { /* Feature numbers */ #define UF_ENDPOINT_HALT 0 #define UF_DEVICE_REMOTE_WAKEUP 1 +#define UF_TEST_MODE 2 #define USB_MAX_IPACKET 8 /* maximum size of the initial packet */ +#define USB_2_MAX_CTRL_PACKET 64 +#define USB_2_MAX_BULK_PACKET 512 + typedef struct { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; -} usb_descriptor_t; +} UPACKED usb_descriptor_t; typedef struct { uByte bLength; uByte bDescriptorType; uWord bcdUSB; +#define UD_USB_2_0 0x0200 +#define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0) uByte bDeviceClass; uByte bDeviceSubClass; uByte bDeviceProtocol; @@ -195,7 +212,7 @@ typedef struct { uByte iProduct; uByte iSerialNumber; uByte bNumConfigurations; -} usb_device_descriptor_t; +} UPACKED usb_device_descriptor_t; #define USB_DEVICE_DESCRIPTOR_SIZE 18 typedef struct { @@ -211,7 +228,7 @@ typedef struct { #define UC_REMOTE_WAKEUP 0x20 uByte bMaxPower; /* max current in 2 mA units */ #define UC_POWER_FACTOR 2 -} usb_config_descriptor_t; +} UPACKED usb_config_descriptor_t; #define USB_CONFIG_DESCRIPTOR_SIZE 9 typedef struct { @@ -224,7 +241,7 @@ typedef struct { uByte bInterfaceSubClass; uByte bInterfaceProtocol; uByte iInterface; -} usb_interface_descriptor_t; +} UPACKED usb_interface_descriptor_t; #define USB_INTERFACE_DESCRIPTOR_SIZE 9 typedef struct { @@ -251,19 +268,23 @@ typedef struct { #define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) uWord wMaxPacketSize; uByte bInterval; -} usb_endpoint_descriptor_t; +} UPACKED usb_endpoint_descriptor_t; #define USB_ENDPOINT_DESCRIPTOR_SIZE 7 typedef struct { uByte bLength; uByte bDescriptorType; uWord bString[127]; -} usb_string_descriptor_t; +} UPACKED usb_string_descriptor_t; #define USB_MAX_STRING_LEN 128 #define USB_LANGUAGE_TABLE 0 /* # of the string language id table */ /* Hub specific request */ #define UR_GET_BUS_STATE 0x02 +#define UR_CLEAR_TT_BUFFER 0x08 +#define UR_RESET_TT 0x09 +#define UR_GET_TT_STATE 0x0a +#define UR_STOP_TT 0x0b /* Hub features */ #define UHF_C_HUB_LOCAL_POWER 0 @@ -280,30 +301,64 @@ typedef struct { #define UHF_C_PORT_SUSPEND 18 #define UHF_C_PORT_OVER_CURRENT 19 #define UHF_C_PORT_RESET 20 +#define UHF_PORT_TEST 21 +#define UHF_PORT_INDICATOR 22 typedef struct { uByte bDescLength; uByte bDescriptorType; uByte bNbrPorts; uWord wHubCharacteristics; -#define UHD_PWR 0x03 -#define UHD_PWR_GANGED 0x00 -#define UHD_PWR_INDIVIDUAL 0x01 -#define UHD_PWR_NO_SWITCH 0x02 -#define UHD_COMPOUND 0x04 -#define UHD_OC 0x18 -#define UHD_OC_GLOBAL 0x00 -#define UHD_OC_INDIVIDUAL 0x08 -#define UHD_OC_NONE 0x10 +#define UHD_PWR 0x0003 +#define UHD_PWR_GANGED 0x0000 +#define UHD_PWR_INDIVIDUAL 0x0001 +#define UHD_PWR_NO_SWITCH 0x0002 +#define UHD_COMPOUND 0x0004 +#define UHD_OC 0x0018 +#define UHD_OC_GLOBAL 0x0000 +#define UHD_OC_INDIVIDUAL 0x0008 +#define UHD_OC_NONE 0x0010 +#define UHD_TT_THINK 0x0060 +#define UHD_TT_THINK_8 0x0000 +#define UHD_TT_THINK_16 0x0020 +#define UHD_TT_THINK_24 0x0040 +#define UHD_TT_THINK_32 0x0060 +#define UHD_PORT_IND 0x0080 uByte bPwrOn2PwrGood; /* delay in 2 ms units */ #define UHD_PWRON_FACTOR 2 uByte bHubContrCurrent; uByte DeviceRemovable[32]; /* max 255 ports */ #define UHD_NOT_REMOV(desc, i) \ (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1) - /* deprecated uByte PortPowerCtrlMask[]; */ -} usb_hub_descriptor_t; -#define USB_HUB_DESCRIPTOR_SIZE 8 + /* deprecated */ uByte PortPowerCtrlMask[1]; +} UPACKED usb_hub_descriptor_t; +#define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */ + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uWord bcdUSB; + uByte bDeviceClass; + uByte bDeviceSubClass; + uByte bDeviceProtocol; + uByte bMaxPacketSize0; + uByte bNumConfigurations; + uByte bReserved; +} UPACKED usb_device_qualifier_t; +#define USB_DEVICE_QUALIFIER_SIZE 10 + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bmAttributes; +#define UOTG_SRP 0x01 +#define UOTG_HNP 0x02 +} UPACKED usb_otg_descriptor_t; + +/* OTG feature selectors */ +#define UOTG_B_HNP_ENABLE 3 +#define UOTG_A_HNP_SUPPORT 4 +#define UOTG_A_ALT_HNP_SUPPORT 5 typedef struct { uWord wStatus; @@ -312,14 +367,14 @@ typedef struct { #define UDS_REMOTE_WAKEUP 0x0002 /* Endpoint status flags */ #define UES_HALT 0x0001 -} usb_status_t; +} UPACKED usb_status_t; typedef struct { uWord wHubStatus; #define UHS_LOCAL_POWER 0x0001 #define UHS_OVER_CURRENT 0x0002 uWord wHubChange; -} usb_hub_status_t; +} UPACKED usb_hub_status_t; typedef struct { uWord wPortStatus; @@ -330,13 +385,16 @@ typedef struct { #define UPS_RESET 0x0010 #define UPS_PORT_POWER 0x0100 #define UPS_LOW_SPEED 0x0200 +#define UPS_HIGH_SPEED 0x0400 +#define UPS_PORT_TEST 0x0800 +#define UPS_PORT_INDICATOR 0x1000 uWord wPortChange; #define UPS_C_CONNECT_STATUS 0x0001 #define UPS_C_PORT_ENABLED 0x0002 #define UPS_C_SUSPEND 0x0004 #define UPS_C_OVERCURRENT_INDICATOR 0x0008 #define UPS_C_PORT_RESET 0x0010 -} usb_port_status_t; +} UPACKED usb_port_status_t; /* Device class codes */ #define UDCLASS_AUDIO 0x00 @@ -344,8 +402,11 @@ typedef struct { #define UDCLASS_HID 0x00 #define UDCLASS_HUB 0x09 #define UDSUBCLASS_HUB 0 +#define UDPROTO_FSHUB 0 +#define UDPROTO_HSHUBSTT 1 +#define UDPROTO_HSHUBMTT 2 #define UDCLASS_MASS 0x00 - + /* Interface class codes */ #define UICLASS_UNSPEC 0x00 @@ -374,6 +435,7 @@ typedef struct { #define UISUBCLASS_PRINTER 1 #define UIPROTO_PRINTER_UNI 1 #define UIPROTO_PRINTER_BI 2 +#define UIPROTO_PRINTER_1284 3 #define UICLASS_MASS 0x08 #define UISUBCLASS_RBC 1 @@ -384,11 +446,14 @@ typedef struct { #define UISUBCLASS_SCSI 6 #define UIPROTO_MASS_CBI_I 0 #define UIPROTO_MASS_CBI 1 -#define UIPROTO_MASS_BBB 2 -#define UIPROTO_MASS_BBB_P 80 /* 'P' for the Iomega Zip drive */ +#define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ +#define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ #define UICLASS_HUB 0x09 #define UISUBCLASS_HUB 0 +#define UIPROTO_FSHUB 0 +#define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ +#define UIPROTO_HSHUBMTT 1 #define UICLASS_CDC_DATA 0x0a #define UISUBCLASS_DATA 0 @@ -409,6 +474,9 @@ typedef struct { #define UICLASS_FIRM_UPD 0x0c #define UICLASS_APPL_SPEC 0xfe +#define UISUBCLASS_IRDA 2 +#define UIPROTO_IRDA 0 + #define UICLASS_VENDOR 0xff @@ -424,18 +492,20 @@ typedef struct { #if 0 /* These are the values from the spec. */ #define USB_PORT_RESET_DELAY 10 /* ms */ +#define USB_PORT_ROOT_RESET_DELAY 50 /* ms */ #define USB_PORT_RESET_SETTLE 10 /* ms */ #define USB_PORT_POWERUP_DELAY 100 /* ms */ #define USB_SET_ADDRESS_SETTLE 2 /* ms */ -#define USB_RESUME_TIME (20*5) /* ms */ +#define USB_RESUME_DELAY (20*5) /* ms */ #define USB_RESUME_WAIT 10 /* ms */ #define USB_RESUME_RECOVERY 10 /* ms */ #define USB_EXTRA_POWER_UP_TIME 0 /* ms */ #else /* Allow for marginal (i.e. non-conforming) devices. */ #define USB_PORT_RESET_DELAY 50 /* ms */ +#define USB_PORT_ROOT_RESET_DELAY 250 /* ms */ #define USB_PORT_RESET_RECOVERY 50 /* ms */ -#define USB_PORT_POWERUP_DELAY 200 /* ms */ +#define USB_PORT_POWERUP_DELAY 300 /* ms */ #define USB_SET_ADDRESS_SETTLE 10 /* ms */ #define USB_RESUME_DELAY (50*5) /* ms */ #define USB_RESUME_WAIT 50 /* ms */ @@ -448,8 +518,9 @@ typedef struct { #define USB_BUS_RESET_DELAY 100 /* ms XXX?*/ -#define USB_UNCONFIG_NO 0 -#define USB_UNCONFIG_INDEX (-1) + +#define USB_UNCONFIG_NO 0 +#define USB_UNCONFIG_INDEX (-1) /*** ioctl() related stuff ***/ @@ -508,26 +579,28 @@ struct usb_ctl_report_desc { u_char data[1024]; /* filled data size will vary */ }; +typedef struct { u_int32_t cookie; } usb_event_cookie_t; + +#define USB_MAX_DEVNAMES 4 +#define USB_MAX_DEVNAMELEN 16 struct usb_device_info { - u_int8_t bus; /* bus number */ - u_int8_t addr; /* device address */ -# define MAXDEVNAMELEN 10 /* number of drivers */ -# define MAXDEVNAMES 4 /* attached drivers */ - char devnames[MAXDEVNAMES][MAXDEVNAMELEN]; - /* device names */ - char product[USB_MAX_STRING_LEN]; /* iProduct */ - char vendor[USB_MAX_STRING_LEN]; /* iManufacturer */ - char release[8]; /* string of releaseNo*/ - u_int16_t productNo; /* idProduct */ - u_int16_t vendorNo; /* idVendor */ - u_int16_t releaseNo; /* bcdDevice */ - u_int8_t class; /* bDeviceClass */ - u_int8_t subclass; /* bDeviceSubclass */ - u_int8_t protocol; /* bDeviceProtocol */ - u_int8_t config; /* config index */ - u_int8_t lowspeed; /* lowsped yes/no */ + u_int8_t bus; + u_int8_t addr; /* device address */ + usb_event_cookie_t cookie; + char product[USB_MAX_STRING_LEN]; + char vendor[USB_MAX_STRING_LEN]; + char release[8]; + u_int16_t productNo; + u_int16_t vendorNo; + u_int16_t releaseNo; + u_int8_t class; + u_int8_t subclass; + u_int8_t protocol; + u_int8_t config; + u_int8_t lowspeed; int power; /* power consumption in mA, 0 if selfpowered */ - int nports; /* 0 if not hub */ + int nports; + char devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN]; u_int8_t ports[16];/* hub only: addresses of devices on ports */ #define USB_PORT_ENABLED 0xff #define USB_PORT_SUSPENDED 0xfe @@ -544,15 +617,27 @@ struct usb_device_stats { u_long requests[4]; /* indexed by transfer type UE_* */ }; -typedef struct { u_int32_t cookie; } usb_event_cookie_t; /* Events that can be read from /dev/usb */ struct usb_event { int ue_type; -#define USB_EVENT_ATTACH 1 -#define USB_EVENT_DETACH 2 - struct usb_device_info ue_device; +#define USB_EVENT_CTRLR_ATTACH 1 +#define USB_EVENT_CTRLR_DETACH 2 +#define USB_EVENT_DEVICE_ATTACH 3 +#define USB_EVENT_DEVICE_DETACH 4 +#define USB_EVENT_DRIVER_ATTACH 5 +#define USB_EVENT_DRIVER_DETACH 6 +#define USB_EVENT_IS_ATTACH(n) ((n) == USB_EVENT_CTRLR_ATTACH || (n) == USB_EVENT_DEVICE_ATTACH || (n) == USB_EVENT_DRIVER_ATTACH) struct timespec ue_time; - usb_event_cookie_t ue_cookie; + union { + struct { + int ue_bus; + } ue_ctrlr; + struct usb_device_info ue_device; + struct { + usb_event_cookie_t ue_cookie; + char ue_devname[16]; + } ue_driver; + } u; }; /* USB controller */ @@ -567,6 +652,7 @@ struct usb_event { #define USB_SET_IMMED _IOW ('U', 22, int) #define USB_GET_REPORT _IOWR('U', 23, struct usb_ctl_report) #define USB_SET_REPORT _IOW ('U', 24, struct usb_ctl_report) +#define USB_GET_REPORT_ID _IOR ('U', 25, int) /* Generic USB device */ #define USB_GET_CONFIG _IOR ('U', 100, int) diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c index f14c02a..f17e515 100644 --- a/sys/dev/usb/usb_subr.c +++ b/sys/dev/usb/usb_subr.c @@ -1032,7 +1032,7 @@ usbd_new_device(device_ptr_t parent, usbd_bus_handle bus, int depth, return (err); } - usbd_add_event(USB_EVENT_ATTACH, dev); + usbd_add_event(USB_EVENT_CTRLR_ATTACH, dev); return (USBD_NORMAL_COMPLETION); } @@ -1172,15 +1172,15 @@ usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di, if (dev->subdevs != NULL) { for (i = 0; dev->subdevs[i] && - i < MAXDEVNAMES; i++) { + i < USB_MAX_DEVNAMES; i++) { strncpy(di->devnames[i], USBDEVPTRNAME(dev->subdevs[i]), - MAXDEVNAMELEN); - di->devnames[i][MAXDEVNAMELEN-1] = '\0'; + USB_MAX_DEVNAMELEN); + di->devnames[i][USB_MAX_DEVNAMELEN-1] = '\0'; } } else { i = 0; } - for (/*i is set */; i < MAXDEVNAMES; i++) + for (/*i is set */; i < USB_MAX_DEVNAMES; i++) di->devnames[i][0] = 0; /* empty */ if (dev->hub) { diff --git a/sys/dev/usb/usbhid.h b/sys/dev/usb/usbhid.h index a6552b5..fbc1704 100644 --- a/sys/dev/usb/usbhid.h +++ b/sys/dev/usb/usbhid.h @@ -54,10 +54,6 @@ #define UR_GET_PROTOCOL 0x03 #define UR_SET_PROTOCOL 0x0b -#if defined(__FreeBSD__) -#define UPACKED __attribute__ ((packed)) -#endif - typedef struct usb_hid_descriptor { uByte bLength; uByte bDescriptorType; |