LINUX.ORG.RU

Переподключение usb-устройства

 , ,


0

1

Привет, ЛОР.

Есть стратегически важный сервер, который должен иметь постоянный доступ в интернет. Сервер стоит в промзоне, на территории которой работает только один провайдер с оптикой, и качество его работы порой оставляет желать лучшего.

Резервный канал работает через lte от йоты по usb-модему.

Bus 001 Device 002: ID 1076:8002 GCT Semiconductor, Inc
На самом деле это не модем, а rndis (cdc) ethernet. Определяется как сетевой интерфейс, который получает по dhcp адрес 10.0.0.10/24 и шлюз по умолчанию 10.0.0.1. На 10.0.0.1 веб-сервер, который показывает страничку с уровнем сигнала и контактами провайдера. Все это крутится внутри usb-свистка.

Проблема в том, что через несколько часов работы (от 2 до 30), 10.0.0.1 перестает раздавать интернет, но сам при этом пингуется и веб-сервер на нем работает. В dmesg ничего по этому поводу нет.

Пробовали эту штуку. Пробовали делать так:

echo 0 > /sys/bus/usb/devices/1-2/authorized
echo 1 > /sys/bus/usb/devices/1-2/authorized
Сетевой интерфейс пропадает и появляется, но индикатор питания на свистке при этом горит (диоды на флешках и клавиатурах от этого гаснут). Перезагрузка сервера не помогает. Помогает только физическое переподключение девайса.

У других людей аналогичные проблемы с этими девайсами, если замена по гарантии и решит проблему, то скорее всего лишь на время. Роутеры у йоты стоят дорого, и нет гарантии, что у них не будет аналогичных проблем при большом трафике с низким уровнем сигнала. Другие 3g/4g провайдеры не устраивают ценами и качеством связи.

Что еще можно попробовать сделать программно?

Решит ли проблему usb-хаб с внешним питанием, подключенным через реле с микроконтроллером, или оно при этом продолжит питаться от компьютерной шины? Можно ли транзисторным ключом отключать питание на usb без отключения линий передачи данных, если нельзя, то чем их отключать? Это самый безобразный вариант, но он может быть полезен в будущем для работы с другим глючным железом вроде usb-токенов.

Может кто-нибудь посоветует недорогой роутер с usb, который быстро грузится и не дохнет от частых отключений питания?

Deleted

Программно, ИМХО, ничего не сделать, если презагрузка сервера не помогает, значит нужно снимать питание с usb порта полностью.

Все usb хабы с внешним питанием, которые я лично видел пропускают питание от порта компьютера, поэтому он вам не поможет.

USB (комментарий)

mky ★★★★★ ()

Попробуй:

#!/usr/bin/python3
import fcntl

USBDEVFS_RESET=21780
fcntl.ioctl(open('/dev/bus/usb/x/y','w'),USBDEVFS_RESET)

anonymous ()

Наверное, в dmesg что-то про emi?

anonymous ()

cdc ethernet

Как раз сейчас с такой штукой буду иметь сношение.
Предлагаю поискать на железке UART или telnet и посылать на него «reboot».

CYB3R ★★★★★ ()
Ответ на: комментарий от anonymous

Ъ-способ вот такой:

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
    const char *filename;
    int fd;
    int rc;

    if (argc != 2) {
        fprintf(stderr, "Usage: usbreset device-filename\n");
        return 1;
    }
    filename = argv[1];

    fd = open(filename, O_WRONLY);
    if (fd < 0) {
        perror("Error opening output file");
        return 1;
    }

    printf("Resetting USB device %s\n", filename);
    rc = ioctl(fd, USBDEVFS_RESET, 0);
    if (rc < 0) {
        perror("Error in ioctl");
        return 1;
    }
    printf("Reset successful\n");

    close(fd);
    return 0;
}
Но вряд ли поможет, я думаю.
Кстати, питон говно, да.

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

А если консоли не нащупаешь, городи USB-реле. Это способ наверняка.

CYB3R ★★★★★ ()

отключать питание на usb без отключения линий передачи данных

На линиях данных мусор может быть, ЕМНИП стандарт USB чётко определяет, что линии данных должны быть отключены первыми, и только потом питание.

false ★★★★★ ()
Последнее исправление: false (всего исправлений: 1)

Если только сбрасывать контроллер USB к которому модем подключен, usb_reset программка называется, ищи, пару раз уже была такая тема. даже вот нашёл

//gcc -o usb-reset usb-reset.c -lusb
#include <usb.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

main (int argc, char **argv)
{
      struct usb_bus *busses;
      usb_init();
      usb_find_busses();
      usb_find_devices();
      busses = usb_get_busses();
      struct usb_bus *bus;
      int c, i, a;
      /* ... */
      for (bus = busses; bus; bus = bus->next) {
        struct usb_device *dev;
        int val;
        usb_dev_handle *junk;
        for (dev = bus->devices; dev; dev = dev->next) {
          char buf[1024];
          junk = usb_open ( dev );
          usb_get_string_simple(junk,2,buf,1023);
          if ( junk == NULL ){
            printf("Can't open %p (%s)\n", dev, buf );
          } else {
           printf( "find %p (%s)\n", dev, buf );
           if((argc>1) && strstr(buf,argv[1]))
           {
            val = usb_reset(junk);
            val = usb_resetep(junk,0);
            printf( "reset %p %d (%s)\n", dev, val, buf );
           }
          }
          usb_close(junk);
        }
      }

}



но может глючить, вплоть до зависания наглухо, если два устройства например подключены, но может и повезет

ilovewindows ★★★★★ ()
Последнее исправление: ilovewindows (всего исправлений: 2)

В итоге остановились на контроллере, который отключает питание модема. Вроде работает.

Deleted ()
Ответ на: комментарий от anonymous

Мы поставили ардуину, т.к. коллега в свое время закупился ими с избытком, но в принципе должно подойти все что угодно с работающим в линуксе usb-uart. Землю в usb для йоты подключили через ключ на биполярном транзисторе, база которого подключена к ардуиновскому порту ввода/вывода (в интернете масса примеров). Если нужны подробности, могу позже скинуть исходник прошивки и скрипт для управления с сервера.

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