Russian Qt Forum

Компиляторы и платформы => Linux => Тема начата: FalconHAM от Февраль 10, 2011, 17:15



Название: libUSB linux [решено]
Отправлено: FalconHAM от Февраль 10, 2011, 17:15
Добрый день.
Есть такой код:

Код:
//------------------------------------------------------------------------
bool MW::acquireAdapter() {
struct usb_bus *usbBus;
struct usb_device *usbDev;

usb_init();
// usb_set_debug(0);

unsigned int vendor, product;
if(usb_find_busses() < 0) {
QMessageBox::critical(this, "!!!", trUtf8("Ошибка!\n%1 ").arg(trUtf8(usb_strerror())));
return false;
}
if(usb_find_devices() < 0) {
QMessageBox::critical(this, "!!!", trUtf8("Ошибка!\n%1 ").arg(trUtf8(usb_strerror())));
return false;
}
usbBus = usb_get_busses();
if (usbBus == NULL) {
QMessageBox::critical(this, "!!!", trUtf8("Ошибка!\n%1 ").arg(trUtf8(usb_strerror())));
return false;
}
for (; usbBus != NULL; usbBus = usbBus->next) {
for (usbDev = usbBus->devices; usbDev != NULL; usbDev = usbDev->next) {
vendor = usbDev->descriptor.idVendor;
product = usbDev->descriptor.idProduct;
qDebug()<<"---vendor--->"<<vendor<<"----prod---->"<<product<<"--desc--->"<<usbDev->descriptor.iProduct;
if(vendor == DALLAS && product == DS2490) {
sysLog(trUtf8("Найден адаптер ds2490."));
if((usbHandle = usb_open(usbDev)) == NULL) {
QMessageBox::critical(this, "!!!", trUtf8("Ошибка!\n%1 ").arg(trUtf8(usb_strerror())));
return false; // Устройство ременно недоступно
}
if(usb_set_configuration(usbHandle, 1)) {

// Всегда заваливается сюда
// Если тут сделать дополнительный  qDebug()<<"---conf--->"<<usb_set_configuration(usbHandle, 1)
// Всегда возвращает -16

QMessageBox::critical(this, "!!!", trUtf8("Ошибка!\n%1 ").arg(trUtf8(usb_strerror())));
return false; // Устройство или ресурс занято

}
  return true;
}
}
}
QMessageBox::critical(this, trUtf8("Внимание!"),
trUtf8("Ошибка! Адаптер ds9490 не обнаружен.\n"),
trUtf8("Ok"));
sysLog(trUtf8(""));
return false;
}

Перабрал все что знал о USB в Линуксе:
команды lsof и fuser возвращают: файл /dev/bus/usb/00x/00x свободен.(
(Если запросить во время останова в окне QMessageBox::critical  - пишут занят моим приложением)

strace возвращает:
Код:
open("/dev/bus/usb/004/004", O_RDWR)    = 14
write(12, "\1", 1)                      = 1
read(11, "\1", 1)                       = 1
ioctl(14, USBDEVFS_SETCONFIGURATION, 0xbfcc2ad4) = -1 EBUSY (Device or resource busy)


usbview выводит инфо, да и я могу просмотреть весь дескриптор.
А когда начинаю активировать девайс, получаю отказ.
Проверял на двух машинах. На обоих установлена SUSE 11.3
Адаптеров ds2490 тоже два R и В

Кто с линуксом хорошо знаком?
Помогите, куда хоть рыть.




Название: Re: libUSB linux
Отправлено: ivm2008 от Февраль 11, 2011, 08:38
Из своего опыта работы с libusb могу сказать две вещи:

1. До вызова open() надо вызвать libusb_claim_interface(...) (найдешь в документации по libusb какие у нее параметры)

2. libusb требует прав на запись, поэтому в Ubuntu это делается так:
    в /etc/udev/rules.d   надо создать файл с определением доступа к устройству c именем типа 70-udev-libusb.rules.
    и содержащим вот такую строку:

# ez-usb device nodes
ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="04b4", SYSFS{idProduct}=="1004", MODE="0777"

ну по смыслу думаю понятно, что где надо подставить в твоем случае.
Как в других Линуксах  - надо смотреть доки


Название: Re: libUSB linux
Отправлено: FalconHAM от Февраль 12, 2011, 09:31
Пока ничего не помогло.  :(
И на линоксоидных форумах молчат.
Похоже дело в либе, буду переустанавливать.


Название: Re: libUSB linux
Отправлено: coffeesmoke от Март 03, 2011, 15:17
код

            }
            if(usb_set_configuration(usbHandle, 1)) {

заменить на

            }
            usb_detach_kernel_driver_np(usbHandle, 1); // отцепись от ядра !!!!!!!!!!!!!!!!!!!!!!

            if(usb_set_configuration(usbHandle, 1)) {


Название: Re: libUSB linux
Отправлено: FalconHAM от Май 17, 2011, 08:24

Цитировать
usb_detach_kernel_driver_np(usbHandle, 1); // отцепись от ядра !!!!!!!!!!!!!!!!!!!!!!
Да спасибо, я тогда так и сделал. Только забыл сказать спасибо :)
А сейчас мне тако-же вопрос задали и я вспомнил  8)
Единственно, надо вместо 1-цы вписать номер интерфейса:
Код:
				qDebug()<<"---bus--->"<<usbBus->dirname<<"---dev--->"<<usbDev->filename;
qDebug()<<usb_detach_kernel_driver_np(usbHandle, usbDev->config->interface->altsetting->bInterfaceNumber);
if(usb_set_configuration(usbHandle, 1) < 0) {
QMessageBox::critical(this, "!!!", trUtf8("Ошибка!\n%1 ").arg(trUtf8(usb_strerror())));
sysLog(trUtf8(usb_strerror()));
return false; // Устройство или ресурс занято
}
sysLog(trUtf8("Все пучком!"));

Меня тогда смутил вывод команды fuser:
Цитировать
# fuser -m /dev/bus/usb/004/004
/dev/bus/usb/004/004:     1   363  1053  1057  1058  1075  1397  1486m  1644  1723  1806  1834  1912  2356  2390  2507  2590  2598  2730  2855  2904  2906  2918  2983m  3536  3925  4162  4167  4170  4177  4209  4252  4255  4274  4372  4404  4405  4407  4433  4603  4604  4605  4606  4607  4608  4692  4694  4705  4722  4728  4741  4742  4783  4792  4812  4817  4821  7753  9879
:o
После этого мысль у меня остановилась  ::)

ЗЫ: Не нашел, где поставить опцию "решено"




Название: Re: libUSB linux [решено]
Отправлено: coffeesmoke от Май 23, 2011, 12:16
Всё проще.
Читаем http://mirror.linux.org.au/linux-man...iguration.html
"This is used to enable non-default device modes. Not all devices support this kind of configurability. By default, configuration zero is selected after enumeration; many devices only have a single configuration."
Ясненько!
Я сделал проще:
1. Проверяю количество конфигураций.
2. Если ТОЛЬКО ОДНА, до данную функцию, просто, не вызываю, т.к. по-умолчанию всегда идёт переход на неё.

Далее -- сразу устанавливаю интерфейс.

Работает!
Удачи.


Название: Re: libUSB linux [решено]
Отправлено: Пантер от Май 23, 2011, 12:18
Поправь ссылку.