Заблокирован
1

ST-LINK/V2 STMicroelectronics. Qt. Обмен через LibUSB

27.01.2014, 13:40. Показов 5446. Ответов 25
Метки нет (Все метки)

Здравствуйте!
Я новичок в теме микроконтроллеров, это не моя прямая специализация. Мне ближе программирование на языках высокого уровня.
Но тут возникла задача - получить данные с платы, а это не только язык высокого уровня - но и знание микроконтроллеров.

У меня есть плата sgs thomson microelectronics st link/v2
Картинка характеристик платы:
ST-LINK/V2 STMicroelectronics. Qt. Обмен через LibUSB


Плата посылает массив данных 64 бита (вижу на hid терминале). Мне их надо получить.

Использую
ОС Linux Debian, фреймворк QT4, библиотека lib_ussb 1.0

Всё подключается - библиотека, программа находит устройство по VID PID и т.д.
Делаю программу по этой статье
Проблема в том, что я до конца не понимаю, что я делаю
А именно, в той части где осуществляется приём данных.
Не знаю значения EP_IN для своего устройства (и где его посмотреть). Не знаю, что в принципе писать в
void bulk_transfer_loop.
Ну и как результат, программа запускается - но в Aplication Output идут ошибки.
Хочется услышать от вас подсказки, советы.

Вот мой код
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <QApplication>
#include "mainwindow.h"
#include "libusb.h"
 
#define DEV_VID 0x483//0x5824
#define DEV_PID 0x3748 //0x1503
#define DEV_CONFIG 1
#define DEV_INTF 0//0
#define EP_IN 0x81
#define USB_DEBUG_LEVEL 1
//#define EP_OUT 0x01
#define DATA_SIZE 64
 
 
void interrupt_transfer_loop(libusb_device_handle *handle);
 
 
 
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 2;
}
//else
//return 1;
 
if (libusb_kernel_driver_active(handle,DEV_INTF))
      libusb_detach_kernel_driver(handle, DEV_INTF);
 
 
 
if (libusb_claim_interface(handle,  DEV_INTF) < 0){
//       printf("Ошибка интерфейса\n");
    return 2;
   }
 
 
interrupt_transfer_loop(handle);
 
libusb_attach_kernel_driver(handle, DEV_INTF);
libusb_close(handle);
libusb_exit(NULL);
 
 
 
 
 
 
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}
 
 
 
 
 
void interrupt_transfer_loop(libusb_device_handle *handle) {
    unsigned char buf[DATA_SIZE];
    int ret;
 
    while (1) {
 
        int returned = libusb_interrupt_transfer(handle, EP_IN, buf, DATA_SIZE, &ret, 1000);
 
        if (returned >= 0) {
            buf[0] = (int)buf[0];
            buf[1] = (int)buf[1];
        }
    }
}
 
void bulk_transfer_loop(libusb_device_handle *handle) {
//  libusb_bulk_transfer()
 
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2014, 13:40
Ответы с готовыми решениями:

Raspberry Pi. Доступ к USB HID через libusb
Все привет. Есть устройство работающее как USB HID.Но не могу написать программу считывания данных...

Брать или не брать - ST-LINK/V2 от STMICROELECTRONICS
Всем привет! Решил попробовать себя в Армах, посоветуйте, стоит ли брать ST-LINK/V2 от...

Не конфигурируется ds2490 через libUSB (SUSE 11.3)
Добрый день. Вообще то не только ds2490 но и контроллеры FTDI не могу активировать. Есть такой...

Раздел STMicroelectronics
Руководство STMicroitistronics не смогло договориться о разделе компании -...

25
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
27.01.2014, 23:11 2
Библиотеки для работы с USB. Нижний и верхний уровень (по libusb)

Конкретно пример работы с описанием тут.
Функция libusb_bulk_transfer() предназначена для передачи больших массивов данных. Заголовок этой функции выглядит так же, как и у функции libusb_interrupt_transfer(). А именно libusb_interrupt_transfer(handle, 0x81, data,
BUFFER_SIZE, &len, 0);

пример
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h> 
#include <libusb.h> 
 
#define VENDOR  0xA5A5 
#define PRODUCT 0x0001 
 
#define INTERFACE 0 
 
#define ENDPOINT 0x81 
 
#define BUFFER_SIZE     64 
 
 
int main(int argc, char **argv) 
{ 
  struct libusb_transfer *transfer; 
  unsigned char data[BUFFER_SIZE]; 
  struct libusb_device_handle *handle; 
  libusb_context *ctx; 
  int result, count; 
  int restore_kernel_driver = 0; 
 
  count = 0; 
  result = libusb_init(&ctx); 
  if (result < 0) 
    { 
      printf("Error %i initializing usb context\n", result); 
      goto quit; 
    } 
 
  libusb_set_debug(ctx, 3); 
 
  /* Detect device */ 
  handle = libusb_open_device_with_vid_pid(ctx, VENDOR, PRODUCT); 
  if (handle == NULL) 
    { 
      printf("Cannot find device %hX, %hX\n", VENDOR, PRODUCT); 
      goto clean_context; 
    } 
 
  result = libusb_kernel_driver_active(handle, INTERFACE); 
  if (result < 0) 
    { 
      printf("Error %i checking kernel driver\n", result); 
      goto clean_handle; 
    } 
  if (result > 1) 
    { 
      result = libusb_detach_kernel_driver(handle, INTERFACE); 
      if (result < 0) 
        { 
          printf("Error %i detaching kernel driver\n", result); 
          goto clean_handle; 
        } 
      restore_kernel_driver = 1; 
    } 
 
  result = libusb_claim_interface(handle, 0); 
  if (result < 0) 
    { 
      printf("Error %i claiming interface\n", result); 
      goto restore_kernel_driver; 
    } 
 
  /* Read data */ 
  while (count < 10) 
    { 
      int len; 
     result = libusb_interrupt_transfer(handle, 0x81, data, 
BUFFER_SIZE, &len, 0); 
      if (result < 0) 
        { 
          printf("Error %i receiving interrupt\n", result); 
          goto release_interface; 
        } 
      while (len--) 
        { 
          printf("%hX,", data[len]); 
        } 
      printf("\n"); 
      count++; 
    } 
 
 release_interface: 
  libusb_release_interface(handle, 0); 
 
 restore_kernel_driver: 
  if (restore_kernel_driver) 
    libusb_attach_kernel_driver(handle, INTERFACE); 
 
 clean_handle: 
  libusb_close(handle); 
 
 clean_context: 
  libusb_exit(ctx); 
 
 quit: 
  return 0; 
}
но я бы использовал usb_control_msg().
1
Заблокирован
29.01.2014, 17:33  [ТС] 3
Спасибо за ваши ответы.
Не могли бы вы мне ещё посоветовать какой нибудь HIDterminal под Linux Debian.
Что либо на подобии USB: Raw HID.
Виндосовский HIDterminal с Wine ничего не показывает. А на винде - всё видно. Данные идут.
Мне нужно увидеть, что посылает (а вдруг нет?) моё устройство в Линуксе. Проверить идут данные или нет.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
29.01.2014, 19:33 4
...а если так:
Код
my = open("read.txt").read()
hd = open("/dev/usb/hiddev0")
while 1:
print (hd.read(len(my)) == my)
Рабочий вариант Под QT/Libusb:
Работа с HID (библиотека libusb-1.0)
0
Заблокирован
02.02.2014, 19:33  [ТС] 5
raxp
Я попробовал все приведённые вами варианты. Ваш код -одна программа и код по ссылке - две программы.

Рабочий вариант Под QT/Libusb:
При компиляции любой из трёх программ, на этапе компиляции, ошибок не возникает. В Aplication Output и Compile Output тоже нет ошибок.

После запуска программы, появляется консоль с сообщением.
ST-LINK/V2 STMicroelectronics. Qt. Обмен через LibUSB
(картинку с радикала не вставляет )
Такая "ошибка" возникает при исполнении вашего кода и кода третей программы по ссылке - та, что должна читать raw файл.
Вторая программа - та, что должна создавать raw файл, похоже работает т.к. такой файл появляется в папке и такой ошибки не возникает.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
02.02.2014, 20:21 6
Ошибка явно указывает на то, что не может присоединиться к сокету. Вероятно в вашей системе подключенное устройство имеет другое имя, т.е. ошибка в задании пути.
0
Заблокирован
02.02.2014, 21:02  [ТС] 7
Цитата Сообщение от raxp Посмотреть сообщение
Вероятно в вашей системе подключенное устройство имеет другое имя, т.е. ошибка в задании пути.
Я не очень понимаю, что значит "другое имя".
Вот моё устройство
https://www.cyberforum.ru/atta... 1391360355

Вот ваш пример.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h> 
#include <libusb.h> 
 
#define VENDOR  0xffff 
#define PRODUCT 0x0bad 
 
#define INTERFACE 0 
 
#define ENDPOINT 0x81 
 
#define BUFFER_SIZE     64 
 
 
int main(int argc, char **argv) 
{ 
  struct libusb_transfer *transfer; 
  unsigned char data[BUFFER_SIZE]; 
  struct libusb_device_handle *handle; 
  libusb_context *ctx; 
  int result, count; 
  int restore_kernel_driver = 0; 
 
  count = 0; 
  result = libusb_init(&ctx); 
  if (result < 0) 
    { 
      printf("Error %i initializing usb context\n", result); 
      goto quit; 
    } 
 
  libusb_set_debug(ctx, 3); 
 
  /* Detect device */ 
  handle = libusb_open_device_with_vid_pid(ctx, VENDOR, PRODUCT); 
  if (handle == NULL) 
    { 
      printf("Cannot find device %hX, %hX\n", VENDOR, PRODUCT); 
      goto clean_context; 
    } 
 
  result = libusb_kernel_driver_active(handle, INTERFACE); 
  if (result < 0) 
    { 
      printf("Error %i checking kernel driver\n", result); 
      goto clean_handle; 
    } 
  if (result > 1) 
    { 
      result = libusb_detach_kernel_driver(handle, INTERFACE); 
      if (result < 0) 
        { 
          printf("Error %i detaching kernel driver\n", result); 
          goto clean_handle; 
        } 
      restore_kernel_driver = 1; 
    } 
 
  result = libusb_claim_interface(handle, 0); 
  if (result < 0) 
    { 
      printf("Error %i claiming interface\n", result); 
      goto restore_kernel_driver; 
    } 
 
  /* Read data */ 
  while (count < 10) 
    { 
      int len; 
     result = libusb_interrupt_transfer(handle, 0x81, data, 
BUFFER_SIZE, &len, 0); 
      if (result < 0) 
        { 
          printf("Error %i receiving interrupt\n", result); 
          goto release_interface; 
        } 
      while (len--) 
        { 
          printf("%hX,", data[len]); 
        } 
      printf("\n"); 
      count++; 
    } 
 
 release_interface: 
  libusb_release_interface(handle, 0); 
 
 restore_kernel_driver: 
  if (restore_kernel_driver) 
    libusb_attach_kernel_driver(handle, INTERFACE); 
 
 clean_handle: 
  libusb_close(handle); 
 
 clean_context: 
  libusb_exit(ctx); 
 
 quit: 
  return 0; 
}
В коде устройство идентифицируется по VID PID. Я их изменил на свои.
Вроде, больше ничего менять не нужно...
0
Миниатюры
ST-LINK/V2 STMicroelectronics. Qt. Обмен через LibUSB  
Заблокирован
03.02.2014, 21:37  [ТС] 8
Разобрался с консолью (нужно было прописать другие настройки в QT). Запустил ваш код.

Спасибо за код. Ваш код работает, но не стабильно.
Не знаю, в чём причина. Сомневаюсь, что в коде.

Программа иногда выдаёт данные, иногда выдаёт ошибку Error -6 claming interface. Иногда другие ошибки с -6.
Буду тестировать.
0
0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 10
12.03.2014, 14:04 9
Здравствуйте! Ранее уже писал здесь под схожим ником...
За пару месяцев немного освоился в QT и Линукс.
Умею получать данные с платы. Теперь хочется научиться передавать.

Работаю с платой st-link v2. Фреймворк QT (С++), ОС Линукс, библиотека libusb.

Я хочу передать сигнал (данные) на плату st-link v2.
Принимать данные умею.

Мой код. Это весь код. Ниже есть часть кода, где возможно кроется ошибка.

Программа на QT (c++)
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <string>
#include <stdio.h>
#include <libusb.h>
#define VENDOR  0xffff
#define PRODUCT 0x0bad
#define INTERFACE 0
#define BUFFER_SIZE 64 //размер (граница) массива,
#define EP_IN 0x81 //Точка "входа" - в этой программе не используется
#define EP_OUT 0x05 //Точка "выхода"
 
 
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onButtonClick1()));}
 
 
 
 
void MainWindow::onButtonClick1()
{
    //Код инициализации устройства
        //Чтение данных с платы
 
              unsigned char data[BUFFER_SIZE];
              struct libusb_device_handle *handle;
              libusb_context *ctx;
              int result, count;
              int restore_kernel_driver = 0;
 
              count = 0;
              result = libusb_init(&ctx);
              if (result < 0)
                {
                  ui->label_2->setText("Error initializing usb context");
                }
 
              libusb_set_debug(ctx, 3);
 
              /* Detect device */
              handle = libusb_open_device_with_vid_pid(ctx, VENDOR, PRODUCT);
              if (handle == NULL)
                {
                   ui->label_2->setText("Cannot find device using current VID PID");
 
                }
 
              result = libusb_kernel_driver_active(handle, INTERFACE);
              if (result < 0)
                {
                  ui->label_2->setText("Error checking kernel driver");
 
                }
              if (result > 1)
                {
                  result = libusb_detach_kernel_driver(handle, INTERFACE);
                  if (result < 0)
                    {
                      ui->label_2->setText("Error detaching kernel driver");
 
                    }
                  restore_kernel_driver = 1;
                }
 
 
        //Дополнительный код
        if (libusb_kernel_driver_active(handle,INTERFACE))
        libusb_detach_kernel_driver(handle, INTERFACE);
 
 
 
 
              result = libusb_claim_interface(handle, 0);
              if (result < 0)
                {
                   ui->label_2->setText("Error claiming interface");
 
                }
 
 
 
    if(ui->pushButton->text()=="Turn on led 1")
    {
      ui->pushButton->setText("Turn off led 1");
 
int ret;
static const int buffer_data=1;
unsigned char buffer[buffer_data];
static int transferred=1;
 
 
ret = libusb_bulk_transfer(handle,EP_OUT,buffer,1, &transferred,1000);
 
//ret= libusb_interrupt_transfer(handle,EP_OUT,buffer,1,&transferred,1000 );
 
 
 
qDebug() << ("Error %d\n", ret);
 
 
    }
    else
    {
    ui->pushButton->setText("Turn on led 1");
 
    }
 
 
 
}
 
 
 
MainWindow::~MainWindow()
{delete ui;}
В результате, в ничего не происходит, а в дебаге (Aplication Output) получаю ошибку
[ 0.000000] [00000f94] libusbx: error [submit_bulk_transfer] submiturb failed error -1 errno=2
-1
В Compile Output особо смотреть не на что.
Считаю, что ошибка в этом коде т.к. код выше libusb_bulk_transfer - прекрасно работает, в случае приёма данных. И при запуске программы label 2 не изменяет текст, значит скорее всего там ошибок нет.

Наверно, ошибка должна быть тут.
C++ (Qt)
1
2
3
4
5
int ret;
static const int buffer_data=1;
unsigned char buffer[buffer_data];
static int transferred=1;
ret = libusb_bulk_transfer(handle,EP_OUT,buffer,1, &transferred,1000);
Ссылка на функцию
http://libusb.sourceforge.net/... dc26c8a805

Прошу подсказать где ошибка.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
12.03.2014, 16:33 10
...поставьте бряк после libusb_bulk_transfer(), если оно до него доходит, тогда ход мыслей верен.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16828 / 6706 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.03.2014, 16:51 11
Цитата Сообщение от Сергей1980_ Посмотреть сообщение
Ранее уже писал здесь под схожим ником...
А зачем создали клона?
0
0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 10
12.03.2014, 17:38 12
Цитата Сообщение от raxp Посмотреть сообщение
...поставьте бряк после libusb_bulk_transfer(), если оно до него доходит, тогда ход мыслей верен.
Бряк не пошел (QT намекает на луп или свич), сделал так

C++ (Qt)
1
2
3
4
5
6
int ret;
static const int buffer_data=1;
unsigned char buffer[buffer_data];
static int transferred=1;
ret = libusb_bulk_transfer(handle,EP_OUT,buffer,1, &transferred,1000);
qDebug() <<"This is end";
В дебагере пишет This is end. Думаю, что доходит.

Не по теме:

Добавлено через 5 минут

Цитата Сообщение от KOPOJI Посмотреть сообщение
А зачем создали клона?
Восстановить старый ник, имея доступ к почте не удалось. Никак. Пытался восстановить, приходило письмо.
Но не пускает с новым паролем и всё. Три раза маялся, надоело.
Считаю, что есть проблемы с форумом т.к. пишу на многих форумах и сервисах. там таких проблем нет.
Вот и пришлось зарегистрировать новый аккаунт.

0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
12.03.2014, 17:45 13
EP_OUT... уверены, что адрес указан верно?
0
0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 10
12.03.2014, 18:33 14
Цитата Сообщение от raxp Посмотреть сообщение
EP_OUT... уверены, что адрес указан верно?
Пробовал разные, ошибка та-же

В любом случае, endpoint EP_OUT брал из дескриптора. Это файл С, которым прошивают плату.
Вот часть кода из этого файла
Делал 0x80 и 0x05
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* Configuration 1 Descriptor */
const char configDescriptor1[]= {
    // Configuration Descriptor
    
    // HID Class-Specific Descriptor
    0x09,                   // bLength - Descriptor size in bytes.
    0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.
    0x01,0x01,              // bcdHID - HID specification release number (BCD).
    0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.
    1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.
    0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows
    USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.
 
    // Endpoint Descriptor
    0x07,                   // bLength - Descriptor size in bytes (07h)
    0x05,                   // bDescriptorType - The constant Endpoint (05h)
    USB_HID_EP | 0x80,      // bEndpointAddress - Endpoint number and direction
    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information    
    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
    EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate
 
    // Endpoint Descriptor
    0x07,                   // bLength - Descriptor size in bytes (07h)
    0x05,                   // bDescriptorType - The constant Endpoint (05h)
    USB_HID_EP,             // bEndpointAddress - Endpoint number and direction
    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported    
    EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate
};
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
12.03.2014, 20:04 15
Пробовал разные, ошибка та-же
а что говорит документация на плату?
0
0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 10
13.03.2014, 09:25 16
Цитата Сообщение от raxp Посмотреть сообщение
а что говорит документация на плату?
Хороший вопрос) Её у меня нет. Будем искать, даже может гуглить...

Моё мнение, может и не правильное, что я ошибся в коде. Неправильно задал константы и прочее.
Возможно, там в части параметров должны быть дескрипторы...

Вот полный код файла (как понимаю он инклудится в программу), которым прошивают плату.
Сплошные дескрипторы.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* Device Descriptor */
const struct {
    char bLength;               // bLength         - Descriptor size in bytes (12h)
    char bDescriptorType;       // bDescriptorType - The constant DEVICE (01h)
    unsigned int bcdUSB;        // bcdUSB          - USB specification release number (BCD)
    char bDeviceClass;          // bDeviceClass    - Class Code
    char bDeviceSubClass;       // bDeviceSubClass - Subclass code
    char bDeviceProtocol;       // bDeviceProtocol - Protocol code
    char bMaxPacketSize0;       // bMaxPacketSize0 - Maximum packet size for endpoint 0
    unsigned int idVendor;      // idVendor        - Vendor ID
    unsigned int idProduct;     // idProduct       - Product ID
    unsigned int bcdDevice;     // bcdDevice       - Device release number (BCD)
    char iManufacturer;         // iManufacturer   - Index of string descriptor for the manufacturer
    char iProduct;              // iProduct        - Index of string descriptor for the product.
    char iSerialNumber;         // iSerialNumber   - Index of string descriptor for the serial number.
    char bNumConfigurations;    // bNumConfigurations - Number of possible configurations
} device_dsc = {
      0x12,                   // bLength
      0x01,                   // bDescriptorType
      0x0200,                 // bcdUSB
      0x00,                   // bDeviceClass
      0x00,                   // bDeviceSubClass
      0x00,                   // bDeviceProtocol
      8,                      // bMaxPacketSize0
      USB_VENDOR_ID,          // idVendor
      USB_PRODUCT_ID,         // idProduct
      0x0001,                 // bcdDevice
      0x01,                   // iManufacturer
      0x02,                   // iProduct
      0x00,                   // iSerialNumber
      0x01                    // bNumConfigurations
  };
 
/* Configuration 1 Descriptor */
const char configDescriptor1[]= {
    // Configuration Descriptor
    0x09,                   // bLength             - Descriptor size in bytes
    0x02,                   // bDescriptorType     - The constant CONFIGURATION (02h)
    0x29,0x00,              // wTotalLength        - The number of bytes in the configuration descriptor and all of its subordinate descriptors
    1,                      // bNumInterfaces      - Number of interfaces in the configuration
    1,                      // bConfigurationValue - Identifier for Set Configuration and Get Configuration requests
    0,                      // iConfiguration      - Index of string descriptor for the configuration
    USB_SELF_POWER,         // bmAttributes        - Self/bus power and remote wakeup settings
    USB_MAX_POWER,          // bMaxPower           - Bus power required in units of 2 mA
 
    // Interface Descriptor
    0x09,                   // bLength - Descriptor size in bytes (09h)
    0x04,                   // bDescriptorType - The constant Interface (04h)
    0,                      // bInterfaceNumber - Number identifying this interface
    0,                      // bAlternateSetting - A number that identifies a descriptor with alternate settings for this bInterfaceNumber.
    2,                      // bNumEndpoint - Number of endpoints supported not counting endpoint zero
    0x03,                   // bInterfaceClass - Class code
    0,                      // bInterfaceSubclass - Subclass code
    0,                      // bInterfaceProtocol - Protocol code
    0,                      // iInterface - Interface string index
 
    // HID Class-Specific Descriptor
    0x09,                   // bLength - Descriptor size in bytes.
    0x21,                   // bDescriptorType - This descriptor's type: 21h to indicate the HID class.
    0x01,0x01,              // bcdHID - HID specification release number (BCD).
    0x00,                   // bCountryCode - Numeric expression identifying the country for localized hardware (BCD) or 00h.
    1,                      // bNumDescriptors - Number of subordinate report and physical descriptors.
    0x22,                   // bDescriptorType - The type of a class-specific descriptor that follows
    USB_HID_RPT_SIZE,0x00,  // wDescriptorLength - Total length of the descriptor identified above.
 
    // Endpoint Descriptor
    0x07,                   // bLength - Descriptor size in bytes (07h)
    0x05,                   // bDescriptorType - The constant Endpoint (05h)
    USB_HID_EP | 0x80,      // bEndpointAddress - Endpoint number and direction
    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information    
    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported
    EP_IN_INTERVAL,         // bInterval - Service interval or NAK rate
 
    // Endpoint Descriptor
    0x07,                   // bLength - Descriptor size in bytes (07h)
    0x05,                   // bDescriptorType - The constant Endpoint (05h)
    USB_HID_EP,             // bEndpointAddress - Endpoint number and direction
    USB_TRANSFER_TYPE,      // bmAttributes - Transfer type and supplementary information
    0x40,0x00,              // wMaxPacketSize - Maximum packet size supported    
    EP_OUT_INTERVAL         // bInterval - Service interval or NAK rate
};
 
const struct {
  char report[USB_HID_RPT_SIZE];
}hid_rpt_desc =
  {
     {0x06, 0x00, 0xFF,       // Usage Page = 0xFF00 (Vendor Defined Page 1)
      0x09, 0x01,             // Usage (Vendor Usage 1)
      0xA1, 0x01,             // Collection (Application)
  // Input report
      0x19, 0x01,             // Usage Minimum
      0x29, 0x40,             // Usage Maximum
      0x15, 0x00,             // Logical Minimum (data bytes in the report may have minimum value = 0x00)
      0x26, 0xFF, 0x00,       // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
      0x75, 0x08,             // Report Size: 8-bit field size
      0x95, HID_INPUT_REPORT_BYTES,// Report Count
      0x81, 0x02,             // Input (Data, Array, Abs)
  // Output report
      0x19, 0x01,             // Usage Minimum
      0x29, 0x40,             // Usage Maximum
      0x75, 0x08,             // Report Size: 8-bit field size
      0x95, HID_OUTPUT_REPORT_BYTES,// Report Count
      0x91, 0x02,             // Output (Data, Array, Abs)
      0xC0}                   // End Collection
  };
 
//Language code string descriptor
const struct {
  char bLength;
  char bDscType;
  unsigned int string[1];
  } strd1 = {
      4,
      0x03,
      {0x0409}
    };
 
 
//Manufacturer string descriptor
const struct{
  char bLength;
  char bDscType;
  unsigned int string[11];
  }strd2={
    24,           //sizeof this descriptor string
    0x03,
    {'D','e','v','e','l','o','p','m','e','n','t'}
  };
 
//Product string descriptor
const struct{
  char bLength;
  char bDscType;
  unsigned int string[7];
}strd3={
    16,          //sizeof this descriptor string
    0x03,
    {'U','S','B','R','a','n','d'}
 };
 
//Array of configuration descriptors
const char* USB_config_dsc_ptr[1];
 
//Array of string descriptors
const char* USB_string_dsc_ptr[3];
 
void USB_Init_Desc(){
  USB_config_dsc_ptr[0] = &configDescriptor1;
  USB_string_dsc_ptr[0] = (const char*)&strd1;
  USB_string_dsc_ptr[1] = (const char*)&strd2;
  USB_string_dsc_ptr[2] = (const char*)&strd3;
}
0
0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 10
15.03.2014, 11:15 17
С помощью программы-USB сниффера удалось получить следующую информацию.
К сожалению, захват пакета провести не удалось.
-------------
Endpoint Descriptor 81 1 In, Bulk, 64 bytes
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 81h 1 In
3 bmAttributes 1 02h Bulk
1..0: Transfer Type ......10 Bulk
7..2: Reserved 000000..
4 wMaxPacketSize 2 0040h 64 bytes
6 bInterval 1 00h

Endpoint Descriptor 02 2 Out, Bulk, 64 bytes
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 02h 2 Out
3 bmAttributes 1 02h Bulk
1..0: Transfer Type ......10 Bulk
7..2: Reserved 000000..
4 wMaxPacketSize 2 0040h 64 bytes
6 bInterval 1 00h

Endpoint Descriptor 83 3 In, Bulk, 64 bytes
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 83h 3 In
3 bmAttributes 1 02h Bulk
1..0: Transfer Type ......10 Bulk
7..2: Reserved 000000..
4 wMaxPacketSize 2 0040h 64 bytes
6 bInterval 1 00h
-----------------
Почитав - погуглив, написал такой код.

C++ (Qt)
1
2
3
4
5
6
int nEndpoint = 0x81;
int NumberOfBytesSend = 1;
unsigned char DataBuffer[64];
DataBuffer[0] = 0x01;
int ret = libusb_bulk_transfer(handle,nEndpoint,DataBuffer,NumberOfBytesSend, &transferred,1000);
qDebug() << ("Error %d\n", ret);
Результат дебагера -8. (хотя-бы уже не ругается на libusb error) При успешной передаче 0.
На плате ничего не происходит.
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
15.03.2014, 11:54 18
...шаманите, к сожалению без доков можно только либо угадать подобрав нужный дескриптор, либо отреверсить обмен.
0
0 / 0 / 0
Регистрация: 12.03.2014
Сообщений: 10
15.03.2014, 12:49 19
Цитата Сообщение от raxp Посмотреть сообщение
..шаманите
ну да

Цитата Сообщение от raxp Посмотреть сообщение
либо отреверсить обмен.
Пробую. Есть программа USB (hid) terminal от microElectronika, которая посылает на плату значения.
Так при посылке через эту программу единицы, на плате загорается светодиод. При нуле - гаснет.
Вот и пробую отловить пакет.
Шлю 1 через USB (hid) terminal при запущенном сниффере.

Пока безрезультатно - наверно не нашел нужный (хороший?) usb сниффер.
SnoopyPro, USBlyzer и Device Monitoring Studio результатов не дали. Что-то не ловят...
0
10218 / 6598 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
15.03.2014, 13:08 20
...попробуйте:
1
Вложения
Тип файла: zip HID.USB.Demonstrator for ST-Link.zip (466.0 Кб, 21 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2014, 13:08

Программирование МК ST7 (STMicroelectronics)
main: RSP ;Подготовка массива loop JP loop dummy_rt: IRET ; Empty procedure : back to...

db link через link
Добрый день! Товарищи ораклисты, прошу помочь в одном вопросе. Можно ли создать db link через...

STMicroelectronics Virtual COM Port - изменить название
&lt;Изображение удалено&gt; Подскажите, можно как-то с минимальными телодвижениями сделать чтобы после...

библиотека LibUSB
Подскажите, как правильно использовать библиотеку LibUSB совместно с C++ Builder? Возможно не там...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.