Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Eugene Grosbein                      2:5006/1       28 Sep 2007  08:33:26
 To : Alexander V. Ribchansky
 Subject : Re: Nokia E50 & umodem
 -------------------------------------------------------------------------------- 
 
 26 сен 2007, среда, в 10:03 KRAST, Alexander V. Ribchansky написал(а):
 
  AVR> с твоим патчем на N73 та же картина. тоесть не работает и выдает
  AVR> дословно то же, что ты привел выше.
 
 Попробуй вот этот вариант, с ним у меня работает.
 
 - --- umodem.c.orig   2007-09-26 21:22:37.000000000 +0800
 +++ umodem.c  2007-09-28 09:29:35.000000000 +0800
 @@ -172,13 +173,14 @@
    struct task    sc_task;
  };
  
 -Static void  *umodem_get_desc(usbd_device_handle dev, int type, int subtype);
 +Static void  *umodem_get_desc(usbd_device_handle dev, usb_descriptor_t *, int
 type, int subtype);
 +Static usbd_interface_handle umodem_get_interface(struct usb_attach_arg *uaa,
 int ifcno);
  Static usbd_status umodem_set_comm_feature(struct umodem_softc *sc,
               int feature, int state);
  Static usbd_status umodem_set_line_coding(struct umodem_softc *sc,
              usb_cdc_line_state_t *state);
  
 -Static void  umodem_get_caps(usbd_device_handle, int *, int *);
 +Static int   umodem_get_caps(struct usb_attach_arg *, int, int *, int *);
  
  Static void  umodem_get_status(void *, int portno, u_char *lsr, u_char *msr);
  Static void  umodem_set(void *, int, int, int);
 @@ -261,10 +263,7 @@
    if (ret == UMATCH_NONE)
       return (ret);
  
 -  umodem_get_caps(uaa->device, &cm, &acm);
 -  if (!(cm & USB_CDC_CM_DOES_CM) ||
 -      !(cm & USB_CDC_CM_OVER_DATA) ||
 -      !(acm & USB_CDC_ACM_HAS_LINE))
 +  if (umodem_get_caps(uaa, -1, &cm, &acm) == -1)
       return (UMATCH_NONE);
  
    return ret;
 @@ -276,7 +275,6 @@
    usbd_device_handle dev = uaa->device;
    usb_interface_descriptor_t *id;
    usb_endpoint_descriptor_t *ed;
 -  usb_cdc_cm_descriptor_t *cmd;
    char *devinfo = NULL;
    const char *devname;
    usbd_status err;
 @@ -304,15 +302,14 @@
      id->bInterfaceClass, id->bInterfaceSubClass);
    sc->sc_ctl_iface_no = id->bInterfaceNumber;
  
 -  umodem_get_caps(dev, &sc->sc_cm_cap, &sc->sc_acm_cap);
 -
    /* Get the data interface no. */
 -  cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
 -  if (cmd == NULL) {
 -     printf("%s: no CM descriptor\n", devname);
 +  sc->sc_data_iface_no = data_ifcno =
 +      umodem_get_caps(uaa, sc->sc_ctl_iface_no, &sc->sc_cm_cap,
 
 &sc->sc_acm_cap);
 
 +
 +  if (data_ifcno == -1) {
 +     printf("%s: no pointer to data interface\n", devname);
       goto bad;
    }
 -  sc->sc_data_iface_no = data_ifcno = cmd->bDataInterface;
  
    printf("%s: data interface %d, has %sCM over data, has %sbreak\n",
           devname, data_ifcno,
 @@ -550,27 +547,45 @@
    ucom_status_change(&sc->sc_ucom);
  }
  
 -void
 -umodem_get_caps(usbd_device_handle dev, int *cm, int *acm)
 +Static int
 +umodem_get_caps(struct usb_attach_arg *uaa, int ctl_iface_no, int *cm, int
 *acm)
  {
    usb_cdc_cm_descriptor_t *cmd;
    usb_cdc_acm_descriptor_t *cad;
 +  usb_cdc_union_descriptor_t *cud;
 +  usbd_device_handle dev = uaa->device;
 +  usbd_interface_handle iface;
 +  int iface_no = 0;
  
    *cm = *acm = 0;
  
 -  cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
 +  cmd = umodem_get_desc(dev, NULL, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
    if (cmd == NULL) {
       DPRINTF(("umodem_get_desc: no CM desc\n"));
 -     return;
 +  } else {
 +     *cm = cmd->bmCapabilities;
    }
 -  *cm = cmd->bmCapabilities;
  
 -  cad = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM);
 +  cad = umodem_get_desc(dev, NULL, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM);
    if (cad == NULL) {
       DPRINTF(("umodem_get_desc: no ACM desc\n"));
 -     return;
 +  } else {
 +     *acm = cad->bmCapabilities;
 +  }
 +  
 +  cud = NULL;
 +  while ((cud = 
 +    umodem_get_desc(dev, (usb_descriptor_t *)cud,
 +        UDESC_CS_INTERFACE, UDESCSUB_CDC_UNION))) {
 +     iface_no = cud->bSlaveInterface[0];
 +     iface = umodem_get_interface(uaa,iface_no);
 +     if (usbd_get_interface_descriptor(iface)->bNumEndpoints) >=2)
 +      break;
    }
 -  *acm = cad->bmCapabilities;
 +  if (cud == NULL)
 +     DPRINTF(("umodem_get_caps: no UNION desc\n"));
 +  
 +  return cmd ? cmd->bDataInterface : cud ? iface_no : -1;
  }
  
  void
 @@ -586,6 +601,23 @@
       *msr = sc->sc_msr;
  }
  
 +Static usbd_interface_handle
 +umodem_get_interface(struct usb_attach_arg *uaa, int ifcno)
 +{
 +  int i;
 +  usb_interface_descriptor_t *id;
 +
 +  for (i = 0; i < uaa->nifaces; i++) {
 +     if (uaa->ifaces[i] != NULL) {
 +      id = usbd_get_interface_descriptor(uaa->ifaces[i]);
 +      if (id != NULL && id->bInterfaceNumber == ifcno) {
 +         return uaa->ifaces[i];
 +      }
 +     }
 +  }
 +  return NULL;
 +}
 +
  int
  umodem_param(void *addr, int portno, struct termios *t)
  {
 @@ -776,14 +808,17 @@
    return (USBD_NORMAL_COMPLETION);
  }
  
 -void *
 -umodem_get_desc(usbd_device_handle dev, int type, int subtype)
 +Static void *
 +umodem_get_desc(usbd_device_handle dev, usb_descriptor_t *restart, int type,
 int subtype)
  {
    usb_descriptor_t *desc;
    usb_config_descriptor_t *cd = usbd_get_config_descriptor(dev);
          uByte *p = (uByte *)cd;
          uByte *end = p + UGETW(cd->wTotalLength);
  
 +  if (restart)
 +     p = (uByte *)(restart) + restart->bLength;
 +
    while (p < end) {
       desc = (usb_descriptor_t *)p;
       if (desc->bDescriptorType == type &&
 
 Eugene
 -- 
 Поэты - страшные люди. У них все святое.
 --- slrn/0.9.8.1 (FreeBSD)
  * Origin: Svyaz Service JSC (2:5006/1@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: Nokia E50 & umodem   Eugene Grosbein   28 Sep 2007 08:33:26 
Архивное /ru.unix.bsd/2609370d6e2f7.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional