Lines 69-74
Link Here
|
69 |
/* |
69 |
/* |
70 |
* Comm Class spec: http://www.usb.org/developers/devclass_docs/usbccs10.pdf |
70 |
* Comm Class spec: http://www.usb.org/developers/devclass_docs/usbccs10.pdf |
71 |
* http://www.usb.org/developers/devclass_docs/usbcdc11.pdf |
71 |
* http://www.usb.org/developers/devclass_docs/usbcdc11.pdf |
|
|
72 |
* http://www.usb.org/developers/devclass_docs/cdc_wmc10.zip |
72 |
*/ |
73 |
*/ |
73 |
/* |
74 |
/* |
Lines 127-132
Link Here
|
127 |
{ USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_AHK3001V, 0 }, |
128 |
{ USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_AHK3001V, 0 }, |
128 |
{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC5720, 0 }, |
129 |
{ USB_VENDOR_SIERRA, USB_PRODUCT_SIERRA_MC5720, 0 }, |
129 |
{ USB_VENDOR_CURITEL, USB_PRODUCT_CURITEL_PC5740, 0 }, |
130 |
{ USB_VENDOR_CURITEL, USB_PRODUCT_CURITEL_PC5740, 0 }, |
|
|
131 |
{ 0x0421, 0x0445, 0 }, |
130 |
{ 0, 0, 0 }, |
132 |
{ 0, 0, 0 }, |
131 |
}; |
133 |
}; |
Lines 179-185
Link Here
|
179 |
usb_cdc_line_state_t *state); |
181 |
usb_cdc_line_state_t *state); |
180 |
Static void umodem_get_caps(usbd_device_handle, int *, int *); |
182 |
Static void umodem_get_caps(usbd_device_handle, int *, int *); |
181 |
|
183 |
Static usb_cdc_union_descriptor_t * |
|
|
184 |
umodem_get_union(usbd_device_handle dev, int iface_no); |
182 |
Static void umodem_get_status(void *, int portno, u_char *lsr, u_char *msr); |
185 |
Static void umodem_get_status(void *, int portno, u_char *lsr, u_char *msr); |
183 |
Static void umodem_set(void *, int, int, int); |
186 |
Static void umodem_set(void *, int, int, int); |
184 |
Static void umodem_dtr(struct umodem_softc *, int); |
187 |
Static void umodem_dtr(struct umodem_softc *, int); |
Lines 269-275
Link Here
|
269 |
return ret; |
272 |
return ret; |
270 |
} |
273 |
} |
271 |
|
|
|
272 |
USB_ATTACH(umodem) |
274 |
USB_ATTACH(umodem) |
273 |
{ |
275 |
{ |
274 |
USB_ATTACH_START(umodem, sc, uaa); |
276 |
USB_ATTACH_START(umodem, sc, uaa); |
Lines 277-282
Link Here
|
277 |
usb_interface_descriptor_t *id; |
279 |
usb_interface_descriptor_t *id; |
278 |
usb_endpoint_descriptor_t *ed; |
280 |
usb_endpoint_descriptor_t *ed; |
279 |
usb_cdc_cm_descriptor_t *cmd; |
281 |
usb_cdc_cm_descriptor_t *cmd; |
|
|
282 |
usb_cdc_union_descriptor_t *cud; |
280 |
char *devinfo = NULL; |
283 |
char *devinfo = NULL; |
281 |
const char *devname; |
284 |
const char *devname; |
282 |
usbd_status err; |
285 |
usbd_status err; |
Lines 309-318
Link Here
|
309 |
/* Get the data interface no. */ |
312 |
/* Get the data interface no. */ |
310 |
cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM); |
313 |
cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM); |
311 |
if (cmd == NULL) { |
314 |
if (cmd == NULL) { |
312 |
printf("%s: no CM descriptor\n", devname); |
315 |
cud = umodem_get_union(dev, sc->sc_ctl_iface_no); |
|
|
316 |
if (cud == NULL) { |
317 |
printf("%s: no CM and Union descriptors\n", devname); |
313 |
goto bad; |
318 |
goto bad; |
314 |
} |
319 |
}else data_ifcno = cud->bSlaveInterface[0]; |
315 |
sc->sc_data_iface_no = data_ifcno = cmd->bDataInterface; |
320 |
}else data_ifcno = cmd->bDataInterface; |
|
|
321 |
sc->sc_data_iface_no = data_ifcno; |
316 |
printf("%s: data interface %d, has %sCM over data, has %sbreak\n", |
322 |
printf("%s: data interface %d, has %sCM over data, has %sbreak\n", |
317 |
devname, data_ifcno, |
323 |
devname, data_ifcno, |
Lines 558-576
Link Here
|
558 |
*cm = *acm = 0; |
564 |
*cm = *acm = 0; |
559 |
cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM); |
|
|
560 |
if (cmd == NULL) { |
561 |
DPRINTF(("umodem_get_desc: no CM desc\n")); |
562 |
return; |
563 |
} |
564 |
*cm = cmd->bmCapabilities; |
565 |
|
566 |
cad = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM); |
565 |
cad = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM); |
567 |
if (cad == NULL) { |
566 |
if (cad == NULL) { |
568 |
DPRINTF(("umodem_get_desc: no ACM desc\n")); |
567 |
DPRINTF(("umodem_get_desc: no ACM desc\n")); |
569 |
return; |
568 |
return; |
570 |
} |
569 |
} |
571 |
*acm = cad->bmCapabilities; |
570 |
*acm = cad->bmCapabilities; |
|
|
571 |
|
572 |
cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM); |
573 |
if (cmd == NULL) { |
574 |
DPRINTF(("umodem_get_desc: no CM desc\n")); |
575 |
*cm = USB_CDC_CM_DOES_CM | USB_CDC_CM_OVER_DATA; |
576 |
}else *cm = cmd->bmCapabilities; |
577 |
} |
578 |
|
579 |
usb_cdc_union_descriptor_t * |
580 |
umodem_get_union(usbd_device_handle dev, int iface_no) |
581 |
{ |
582 |
usb_cdc_union_descriptor_t *desc; |
583 |
usb_config_descriptor_t *cd = usbd_get_config_descriptor(dev); |
584 |
uByte *p = (uByte *)cd; |
585 |
uByte *end = p + UGETW(cd->wTotalLength); |
586 |
while (p < end) { |
587 |
desc = (usb_cdc_union_descriptor_t *)p; |
588 |
if (desc->bDescriptorType == UDESC_CS_INTERFACE && |
589 |
desc->bDescriptorSubtype == UDESCSUB_CDC_UNION && |
590 |
desc->bMasterInterface == iface_no) |
591 |
return (desc); |
592 |
p += desc->bLength; |
593 |
} |
594 |
return (0); |
572 |
} |
595 |
} |
573 |
void |
596 |
void |