barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 30 мая 2011 г.

Перезапуск USB-устройства из командной строки в Linux

Для перезупуска usb-устройства из командной строки можно воспользоваться этой программкой:

/* 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;
}

Компилируется она следующим образом:
gcc usbreset.c -o usbreset
Для запуска нужно посмотреть, какой номер имеет USB-устройство, которое нужно перезапустить:  
[aspirin@aspxeee ~]$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 003: ID 13d3:5111 IMC Networks Integrated Webcam Bus 003 Device 002: ID 0eef:480d D-WAV Scientific Co., Ltd Bus 002 Device 002: ID 09da:000a A4 Tech Co., Ltd Port Mouse
Например, нужно перезапустить мышь:  
[aspirin@aspxeee ~]$ sudo usbreset /dev/bus/usb/002/002 Resetting USB device /dev/bus/usb/003/002 Reset successful  

7 комментариев:

  1. usbreset.c:3:10: ошибка: для #include ожидается "ИМЯ_ФАЙЛА" или
    usbreset.c:4:10: ошибка: для #include ожидается "ИМЯ_ФАЙЛА" или
    usbreset.c:5:10: ошибка: для #include ожидается "ИМЯ_ФАЙЛА" или
    usbreset.c:6:10: ошибка: для #include ожидается "ИМЯ_ФАЙЛА" или
    usbreset.c:7:10: ошибка: для #include ожидается "ИМЯ_ФАЙЛА" или
    usbreset.c:9:10: ошибка: для #include ожидается "ИМЯ_ФАЙЛА" или

    ОтветитьУдалить
    Ответы
    1. Прошу прощения, пост протух немного. Поправил, если еще будут ошибки - пишите, к сожалению сейчас нет линуха под рукой, чтобы попробовать скомпилировать

      Удалить
    2. In file included from usbreset.c:8:
      /usr/include/linux/usbdevice_fs.h:49: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token
      /usr/include/linux/usbdevice_fs.h:56: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token
      /usr/include/linux/usbdevice_fs.h:66: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token
      /usr/include/linux/usbdevice_fs.h:100: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token
      /usr/include/linux/usbdevice_fs.h:116: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘*’ token
      usbreset.c:38:9: warning: no newline at end of file

      Удалить
    3. Тут я уже ничем не могу помочь - ошибки в заголовочном файле /usr/include/linux/usbdevice_fs.h

      Удалить
  2. Отличная вещь, а главное работает

    ОтветитьУдалить
  3. Пишет bash: usbreset: команда не найдена...
    Команда компиляции вроде не ругнулась...
    Я не профи, не ругайтесь...

    ОтветитьУдалить