Frequently Asked Questions

Question
MPX200 + FreeBSD

Answer
Опять не мое, судя по всему с www.wce.by

При непатченном GENERIC-ядре MPX200 отпередяется как ugen - т.е. generic usb device. А патчей собственно ранее и не существовало.

Вообщем я использовал 2 подхода:

1. /usr/src/sys/dev/usb/uplcom.c - драйвер, который "supports several USB-to-RS232 serial adapters driven by Profilic PL-2303, PL-2303X and probably PL-2303HX USB-to-RS232 bridge chip."

2. /usr/src/sys/usb/dev/umodem.c - вообщем тут смысл сводится к тому, что mpx возможно возвращает драйверу umodem ACM descriptor, но не возвращает CM descriptor. Патч для устранения этой проблемы существует (Alexey Illarionov), но в 6.1-RELEASE он работать не будет, поэтому его пришлось немного подогнать. Патч в оригинале предназначался для телефонов Nokia - про Моторолу и тем более mpx не слова.

Вообщем первый способ:

Прописываем product id mpx200 в /usr/src/sys/dev/usb/usbdevs:

--- usbdevs.old Mon May 22 03:52:42 2006
+++ usbdevs Mon May 22 03:37:06 2006
@@ -1182,6 +1182,7 @@
product MICROSOFT INTELLIEYE 0x0025 IntelliEye mouse
product MICROSOFT INETPRO2 0x002b Internet Keyboard Pro
product MICROSOFT MN110 0x007a 10/100 USB NIC
+product MICROSOFT MPX200 0x0079 MPx200

/* Microtech products */
product MICROTECH SCSIDB25 0x0004 USB-SCSI-DB25


Vendor id Майкрософта - 0x045e, mpx200 - 0x00ce, mpx200 в режиме usb-модема - 0x0079 - это нас и инетересует.

Затем /usr/src/sys/dev/usb/uplcom.c

--- uplcom.c.old Mon May 22 03:52:58 2006
+++ uplcom.c Mon May 22 03:37:17 2006
@@ -260,6 +260,8 @@
{ USB_VENDOR_HAL, USB_PRODUCT_HAL_IMR001, -1, TYPE_PL2303 },
/* Sitecom USB to Serial */
{ USB_VENDOR_SITECOM, USB_PRODUCT_SITECOM_SERIAL, -1, TYPE_PL2303 },
+ /* Motorola MPx200 */
+ { USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_MPX200, -1 },
{ 0, 0 }
};



На этом все.

Второй способ:
Вот патч для /usr/srs/sys/dev/usb/umodem.c

--- umodem.c.old Mon May 22 04:03:52 2006
+++ umodem.c Mon May 22 03:37:42 2006
@@ -178,6 +178,9 @@

Static void umodem_get_caps(usbd_device_handle, int *, int *);

+Static usb_cdc_union_descriptor_t *
+ umodem_get_union(usbd_device_handle dev, int iface_no);
+
Static void umodem_get_status(void *, int portno, u_char *lsr, u_char *msr);
Static void umodem_set(void *, int, int, int);
Static void umodem_dtr(struct umodem_softc *, int);
@@ -275,6 +278,7 @@
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
usb_cdc_cm_descriptor_t *cmd;
+ usb_cdc_union_descriptor_t *cud;
char *devinfo = NULL;
const char *devname;
usbd_status err;
@@ -307,10 +311,13 @@
/* 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);
+ cud = umodem_get_union(dev, sc->sc_ctl_iface_no);
+ if (cud == NULL) {
+ printf("%s: no CM and Union descriptors\n", devname);
goto bad;
- }
- sc->sc_data_iface_no = data_ifcno = cmd->bDataInterface;
+ } else data_ifcno = cud->bSlaveInterface[0];
+ } else data_ifcno = cmd->bDataInterface;
+ sc->sc_data_iface_no = data_ifcno;

printf("%s: data interface %d, has %sCM over data, has %sbreak\n",
devname, data_ifcno,
@@ -556,19 +563,36 @@

*cm = *acm = 0;

- cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
- if (cmd == NULL) {
- DPRINTF(("umodem_get_desc: no CM desc\n"));
- return;
- }
- *cm = cmd->bmCapabilities;
-
cad = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM);
if (cad == NULL) {
DPRINTF(("umodem_get_desc: no ACM desc\n"));
return;
}
*acm = cad->bmCapabilities;
+
+ cmd = umodem_get_desc(dev, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM);
+ if (cmd == NULL) {
+ DPRINTF(("umodem_get_desc: no CM desc\n"));
+ *cm = USB_CDC_CM_DOES_CM | USB_CDC_CM_OVER_DATA;
+ }else *cm = cmd->bmCapabilities;
+}
+
+usb_cdc_union_descriptor_t *
+umodem_get_union(usbd_device_handle dev, int iface_no)
+{
+ usb_cdc_union_descriptor_t *desc;
+ usb_config_descriptor_t *cd = usbd_get_config_descriptor(dev);
+ uByte *p = (uByte *)cd;
+ uByte *end = p + UGETW(cd->wTotalLength);
+ while (p < end) {
+ desc = (usb_cdc_union_descriptor_t *)p;
+ if (desc->bDescriptorType == UDESC_CS_INTERFACE &&
+ desc->bDescriptorSubtype == UDESCSUB_CDC_UNION &&
+ desc->bMasterInterface == iface_no)
+ return (desc);
+ p += desc->bLength;
+ }
+ return (0);
}

void



На этом все. Компилирование отдельно модулей не привели к каким-либо результатам. Поэтому пришлось пересобрать ядро, добавив туда поддержку uplcom, umodem, ucom:

device ucom
device umodem
device uplcom


Эти строки следует добавить в файл конфигурации ядра. Затем:

config файл_конфигурации_ядра
cd ../compile/файл_конфигурации_ядра
make depend
make
make install


Где файл_конфигурации_ядра - в /usr/src/sys/i386/conf/файл_конфигурации_ядра; /usr/src/sys/i386/compile/файл_конфигуции_ядра - тут уже каталог с таким же названием

Затем перезагрузка, активируем на mpx'е usb-modem, подключаем к компу и видим нечто типа:

ucom0: vendor 0x045e product 0x0079, rev 1.00/0.90, addr 2

Вместо ugen0 уже ucom0 - это значит, что телефон определился как usb-modem. Возможно, такого результата можно добиться и одним из перечисленных способов, но с этим уже мне разбираться лень.


Details
Info Sunday 14 March 2010 - 18:19:15 by




Vampyr`s House!


Protected by Copyscape DMCA Plagiarism Check