Russian Qt Forum
Май 13, 2024, 23:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: libUSB linux [решено]  (Прочитано 10467 раз)
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 и В

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


« Последнее редактирование: Май 17, 2011, 09:34 от Константин » Записан
ivm2008
Новичок

Offline Offline

Сообщений: 9


Просмотр профиля
« Ответ #1 : Февраль 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"

ну по смыслу думаю понятно, что где надо подставить в твоем случае.
Как в других Линуксах  - надо смотреть доки
« Последнее редактирование: Февраль 11, 2011, 08:47 от ivm2008 » Записан
FalconHAM
Гость
« Ответ #2 : Февраль 12, 2011, 09:31 »

Пока ничего не помогло.  Грустный
И на линоксоидных форумах молчат.
Похоже дело в либе, буду переустанавливать.
Записан
coffeesmoke
Гость
« Ответ #3 : Март 03, 2011, 15:17 »

код

            }
            if(usb_set_configuration(usbHandle, 1)) {

заменить на

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

            if(usb_set_configuration(usbHandle, 1)) {
Записан
FalconHAM
Гость
« Ответ #4 : Май 17, 2011, 08:24 »


Цитировать
usb_detach_kernel_driver_np(usbHandle, 1); // отцепись от ядра !!!!!!!!!!!!!!!!!!!!!!
Да спасибо, я тогда так и сделал. Только забыл сказать спасибо Улыбающийся
А сейчас мне тако-же вопрос задали и я вспомнил  Крутой
Единственно, надо вместо 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
Шокированный
После этого мысль у меня остановилась  Строит глазки

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


Записан
coffeesmoke
Гость
« Ответ #5 : Май 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. Если ТОЛЬКО ОДНА, до данную функцию, просто, не вызываю, т.к. по-умолчанию всегда идёт переход на неё.

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

Работает!
Удачи.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Май 23, 2011, 12:18 »

Поправь ссылку.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.