реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> V-USB, передача данных по HID, [WinAVR C++, tiny45]
Urvin
сообщение Oct 1 2009, 07:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540



Здравствуйте!
Возможно, вы подскажете по такой узкой теме, как передача данных через hid, используя модуль V-USB.

Суть задачи примерно такова: есть составное hid-устройство и необходимо к нему добавить и передачу данных на 128 байт.
Двигаюсь по примеру в папке examples, но где-то запутался.. rolleyes.gif

Соответственно, добавляю к hid-дескриптору такой блок:
Код
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x85, 0x04,                    //   REPORT_ID (4)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x80,                    //   REPORT_COUNT (128)
    0x09, 0x00,                    //   USAGE (Undefined)
    0xb2, 0x02, 0x01,              //   FEATURE (Data,Var,Abs,Buf)
    0xc0                           // END_COLLECTION


Так как внутри программы я использую несколько массивов (и эти данные мне надо отправить на комп), я решил воспользоваться массивом указателей. Вот его определение и определения других переменных:
Код
static uchar usbreportid = 4;
static uchar*   dataout[128];
static uchar    currentAddress;
static uchar    bytesRemaining;

static uchar buttonsADC[32];
static uchar keycodes[76];
static uchar canHoldButtons[17];


Перед началом работы определяем ссылки на данные:
Код
static void dataoutInit(void)
{
   uchar i=0;
  
   // 0
   dataout[0] = &usbreportid; // Первый байт - номер отчета
  
   //1-32
   for(i=0; i<32; i++)
   {
      dataout[i+1] = &buttonsADC[i];
   }
  
   //33-48
   for(i=0; i<16; i++)
   {
      dataout[i+33] = &canHoldButtons[i+1];
   }
  
   //49-124
   for(i=0; i<76; i++)
   {
      dataout[i+ 49] = &keycodes[i];
   }
}


В соответствии с изменением дескриптора изменяется и функция usbFunctionSetup (здесь я убрал часть, отвечающую за идентификацию трех предыдущих отчетов):
Код
uchar   usbFunctionSetup(uchar data[8])
{
usbRequest_t    *rq = (void *)data;
  
    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){    /* class request type */
        if(rq->bRequest == USBRQ_HID_GET_REPORT){  /* wValue: ReportType (highbyte), ReportID (lowbyte) */
         if (rq->wValue.bytes[0] == 1)
                        // ...
         else if (rq->wValue.bytes[0] == 4) // Если отчет №4 - передача данных
         {
            bytesRemaining = 128;
            currentAddress = 0;
            return USB_NO_MSG;
         }
        
         return 0;
      }
      else if(rq->bRequest == USBRQ_HID_SET_REPORT)
      {
         if (rq->wValue.bytes[0] == 4)
         {
            bytesRemaining = 128;
            currentAddress = 0;
            return USB_NO_MSG;
         }
      }


        // Здесь уже в принципе не интересно
        else if(rq->bRequest == USBRQ_HID_GET_IDLE)
   {
            usbMsgPtr = &idleRate;
            return 1;
        }
   else if(rq->bRequest == USBRQ_HID_SET_IDLE)
   {
            idleRate = rq->wValue.bytes[1];
        }
    }
   else
   {
        /* no vendor specific requests implemented */
    }
   return 0;
}



Пока пытаюсь наладить передачу данных на копмьютер, вот функция usbFunctionRead:
Код
uchar usbFunctionRead(uchar *data, uchar len)
{
   if(len > bytesRemaining)
        len = bytesRemaining;
  
   uchar i=0;
  
   for (i=0; i<len; i++)
   {
      if (currentAddress + i <= 124)
      {
         data[i] = *dataout[currentAddress + i];
      }
      else
      {
         data[i] = 123; // Если вышли за пределы важных данных, просто посылаем ерунду
      }
   }
  
   currentAddress += len;
        bytesRemaining -= len;

   return len;
}




Приложение на стороне компьютера - децл измененный пример из тех же примеров от v-usb:
Код
#define USBREPORTBUFFERLEN 129
#define USB_REPORT_ID 4

usbDevice_t* usbDevice;
char usbReportBuffer[USBREPORTBUFFERLEN];

void read_hid_device()
{
    int len = USBREPORTBUFFERLEN;

    int err = usbhidGetReport(usbDevice, USB_REPORT_ID, usbReportBuffer, &len);

    if (err != 0)
    {
        cout<<"Error reading data: "<<usbErrorMessage(err)<<endl;  // Это если ошибка, а ошибка у меня всегда =(
    }
    else
    {
        //Успешный прием и обработка данных
    }
}



Устройство по своему основному функционалу работает, на заголовки компьютер не ругается, все замечательно.
Моя программа на компьютере нормально открывает и закрывает устройство, но никак не удается передать данные на компьютер - я все время получаю "Error reading data: communication error with device", т.е. (err != 0).

Где у меня может быть ошибка?
Go to the top of the page
 
+Quote Post
GDI
сообщение Oct 2 2009, 09:53
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А Controll-передачи позволяют делать пакеты длиннее 64 байт?


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Urvin
сообщение Oct 2 2009, 10:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540



У V-USB есть пример "hiddata", в котором именно столько же - 128 - байт передается.
Причем действительно передается)

Мне кажется, я здесь где-то запнулся в reportID, а вот где - не пойму.
Go to the top of the page
 
+Quote Post
Scanner
сообщение Oct 2 2009, 15:52
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 355
Регистрация: 23-07-08
Из: Пензенская область
Пользователь №: 39 157



Что за модуль модуль V-USB, где взять?
Go to the top of the page
 
+Quote Post
Urvin
сообщение Oct 2 2009, 16:11
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540



Программная эмуляция usb.
http://www.obdev.at/products/vusb/index.html
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Oct 3 2009, 18:47
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Urvin @ Oct 2 2009, 14:36) *
У V-USB есть пример "hiddata", в котором именно столько же - 128 - байт передается.

Передавать то можно хоть 128Кб. Но за несколько пакетов. А для HID максимальный пакет все же 64 байта. И это для FULL speed.
А для LOW speed ( а программнная эмуляция именно такая) только 8 байт.
Go to the top of the page
 
+Quote Post
Urvin
сообщение Oct 3 2009, 19:00
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540



Тем не менее, для софта на на хосте это ничего не значит - принимаем именно 128 байт, составлением пакета занимается невидимый для глаз модуль.
На стороне МК пакет действительно принимается пачками, для правильного расчета и используются переменные currentAddress и bytesRemaining.

Проблемы начинаются (у меня) когда контроллер эмулирует несколько устройств. Причем у меня есть пример, где используется два "неопределенных" отчета vendor-defined.
Некорректную работу программы на пк отбразываю - параллельно проверяю программами на С++ и Delphi (jedi).

С libusb у меня как-то совсем не сложилось - не могу даже увидеть устройство.

Сообщение отредактировал Urvin - Oct 3 2009, 19:00
Go to the top of the page
 
+Quote Post
alex6441161
сообщение Oct 8 2014, 05:17
Сообщение #8





Группа: Участник
Сообщений: 9
Регистрация: 12-08-14
Пользователь №: 82 528



Цитата(Urvin @ Oct 1 2009, 10:17) *
Здравствуйте!
Возможно, вы подскажете по такой узкой теме, как передача данных через hid, используя модуль V-USB.
...Где у меня может быть ошибка?


подскажите пожалуйста, вы решили свою проблему

Сообщение отредактировал IgorKossak - Oct 8 2014, 08:15
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016