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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Работа с библиотекой libusb  (Прочитано 18414 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #15 : Январь 22, 2014, 12:10 »

Цитировать
В примере эта функция использована для чтения данных (хотя interrupt переводится как прерывание).

1. Почитай для начала USB спецификацию и разберись что такое bulk, isochronous и interrupt конечные точки, зачем они нужны, чем отличаются, какой максимальный размер пакета можно прокачать через точку того или иного типа и пр.

2. Посмотри конфигурацию своего девайса, какие он имеет типы точек и пр. Например через lsusb -a в Linux.
3. Выбери точки на которые будешь слать/читать данные (точки могут быть как двунаправленные и иметь одинаковые номера, так и определенного направления - зависит от железки).
4. Напиши код.
Записан

ArchLinux x86_64 / Win10 64 bit
useruser_
Гость
« Ответ #16 : Январь 22, 2014, 12:28 »

Не могли бы вы дать мне ссылку на usb спецификацию?
В сети много информации, есть на русском, английском, usb 2.0 и т.д. Какую лучше прочитать?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #17 : Январь 22, 2014, 12:32 »

Какую лучше прочитать?
Для начала - http://usb.fober.net/teoriya/Tipy-peredachi-dannyx/
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #18 : Январь 22, 2014, 12:36 »

Смотрю функцию libusb_interrupt_transfer (libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int lenght, int actual_lenght,  unsigned int timeout)
Не смотри больше туда, смотри сюда.
И осознай разницу между int actual_lenght и int * transferred .

P.S. о том что переменную перед использованием надо объявить, надеюсь уже догадался.
Записан
useruser_
Гость
« Ответ #19 : Январь 23, 2014, 12:07 »

alex312 -спасибо за статьи, почитал.
Насчёт переменных это и так ясно.

lsusb полезная команда, но в моём линуксе её не было. И apt тоже. Установил нужные пакеты, перезагрузился и "сломал" линукс. Не загружается. Разбираться долго.
Ну оно может и к лучшему. Переустановил всё с нуля -QT, пакеты. Теперь libusb установленная из репозитория работает и линукс "посвежее" (debian-7.3.0-i386-kde).

Пытаюсь сделать следующий шаг. Найти (открыть) устройство, зная его VID и PID.





Мой код
Код:
#include <QApplication>
#include "mainwindow.h"
#include "libusb.h"

#define DEV_VID 0x0483
#define DEV_PID 0x3748
#define DEV_CONFIG 1
#define DEV_INTF 0
#define EP_IN 0x81
#define USB_DEBUG_LEVEL 0


int main(int argc, char *argv[])
{


libusb_init(NULL);
libusb_set_debug(NULL, USB_DEBUG_LEVEL);  // уровень вывода отладочных сообщений
libusb_device_handle *handle = libusb_open_device_with_vid_pid(NULL, DEV_VID, DEV_PID);

if (handle == NULL) {
return 1;
}
else
return 2;



QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}




Результат - программа завершилась с кодом 1. То есть return 1 - не видит устройство.
VID 0x0483, PID 0x3748 - вроде правильные. В линуксе устройство видно. Других ошибок нет. Вывод компилятора -всё ок Process /usr/bin/make exited normaly.
Я правильно указал VID и PID?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #20 : Январь 23, 2014, 12:58 »

Результат - программа завершилась с кодом 1. То есть return 1 - не видит устройство.
1. Включи отладку libusb.
2. вот тебе контрольные программы - https://github.com/mobyfab/qstlink2 , https://github.com/texane/stlink
Записан
useruser_
Гость
« Ответ #21 : Январь 24, 2014, 17:01 »

Цитировать
1. Включи отладку libusb.
Сделал
#define USB_DEBUG_LEVEL 1

Цитировать
2. вот тебе контрольные программы
Установил (не без помощи сообщества debian)

Теперь можно понять, что не так с VID и PID?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #22 : Январь 24, 2014, 17:11 »

Теперь можно понять, что не так с VID и PID?
Конечно, ведь у QStlink2 есть исходники.

ЗЫ А еще могут быть проблемы с правами доступа. Попробуй запустить свою программу с правами root .
« Последнее редактирование: Январь 24, 2014, 17:13 от alex312 » Записан
useruser_
Гость
« Ответ #23 : Январь 24, 2014, 20:25 »

Цитировать
Конечно, ведь у QStlink2 есть исходники.
Вижу, что написан на Qt. И это программатор. У меня как бы уже есть программатор под windows. На нём и программировал плату.
В QStlink2 исходниках много cpp файлов. Предлагаете искать во всех функцию, отвечающую за VID PID?

Цитировать
Попробуй запустить свою программу с правами root
Выполнил sudo ./usb как советовали ниже. Без результата.
« Последнее редактирование: Январь 24, 2014, 22:02 от useruser_ » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #24 : Январь 24, 2014, 21:02 »

>>sudo usb
будет искать в путях указанных в переменной окружения PATH
в линухе в отличие от виндовоза, в текущем каталоге не ищется.

поэтому казывай путь полностью, можно относительный путь использовать:
sudo ./usb
(относительно текущего каталога)
Записан

Юра.
useruser_
Гость
« Ответ #25 : Март 11, 2014, 18:08 »

Прошло много времени. Кое в чём разобрался.
Сейчас пытаюсь передать сигнал на плату. Передаю единицу.

Код:
unsigned char buffer[1];
static int transferred;
ret = libusb_bulk_transfer(handle,EP_IN,buffer,1, &transferred,1000);
Программа выполняется без ошибок, если так можно сказать.
Но ничего не происходит, и ret возвращает -7. В норме должно 0.
Точку указываю ту-же что и для чтения.

Нашел предполагаемую точку для записи. Изменил. Запустил программу. Ничего не происходит.
В аутпуте libusbx error [submit_bulk_transfer] submiturb failed error -1 errorno= -2
-1



« Последнее редактирование: Март 11, 2014, 18:18 от useruser_ » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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