LINUX.ORG.RU

[PATCH] Исправление работы драйвера pl2303 для USB-to-RS232 конвертора...


0

0

Совпало так, что я и мой товарищь купили кабелечки USB-to-RS232
на чипе pl2303, я для своего внешнего модема Courier'а, а он для мобильника, что бы GPRS использовать ну и для других целей.
Подключили, линукс распознал кабелечки как свои и решили
поработать, у меня выход в инет через работу, ну а он через
GPRS, все заработало отлично, особо делать ничего не пришлось,
но после небольшого промежутка времени выяснилось, покрайней
мере у меня первого, так как линии дома просто говно, что драйвер
не обрабатывает статус modem hangup, т.е. получалось так, что
когда обрывалась связь, модем как положено клал трубу, но
pppd даже не реагировал, что модем в дауне и пора делать дисконнект,
затем дозваниваться заново:(. Эта ситуация была хренова тем, что
постоянно приходилось посматривать на лампочки модема, дабы
потом случае чего вручную перезвонить, мне лично это надоело
и я сделал небольшой патч, лучше конечно сказать грубый хак:),
что бы забыть про это на всегда....

--- l/drivers/usb/serial/pl2303.c.orig  2003-09-16 01:41:35.000000000 +0400
+++ l/drivers/usb/serial/pl2303.c       2003-10-11 03:15:16.000000000 +0400
@@ -64,6 +64,7 @@



+static int modem_hangup = 0;
 static struct usb_device_id id_table [] = {
        { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) },
        { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) },
@@ -382,6 +383,7 @@
        unsigned char buf[10];
        int result;

+       modem_hangup = 1;
        if (port_paranoia_check (port, __FUNCTION__))
                return -ENODEV;

@@ -618,6 +620,26 @@

        usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, urb->transfer_buffer);

+       /* HACK: check for modem hangup status (McMCC) */
+       if ( urb->actual_length == 10 &&
+            data[0] == 0xa1 &&
+            data[1] == 0x20 &&
+            data[2] == 0    &&
+            data[3] == 0    &&
+            data[4] == 0    &&
+            data[5] == 0    &&
+            data[6] == 0x02 &&
+            data[7] == 0    &&
+            data[8] == 0x82 &&
+            data[9] == 0    &&
+            modem_hangup == 0
+          )
+       {
+               dbg("%s - modem hangup", __FUNCTION__);
+               tty_hangup(port->tty); /* send hangup */
+               usb_submit_urb(urb);
+       }
+
        if (urb->actual_length > UART_STATE)
                return;

@@ -719,6 +741,7 @@
        struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
        int result;

+       modem_hangup = 0;
        if (port_paranoia_check (port, __FUNCTION__))
                return;

В чем кайф этого переходника, так это цена в 11$, у товарища правда 
подороже, так как для мобильника, и то что можно не боятся спалить
ком порт при отключении или подключении модема, все же USB рулит
в этом отношении...

★★★

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.