Перейти к содержанию
    

Составное USB, нехватка конечных точек

Собственно на LPC1343 реализованно composite device. Все получается, но! нехватает конечных точек. Вычитал, что можно как то подцепиться к 0й endpoint. Как? Подскажите где копать, пожалуйста.

Дальше вопрос, сможет ли в таком случае соответствующий интерфейс стать стандартным (kbd, mouse) ?

 

Конкретезирую. У меня composite: mouse+kbd+Virtual COM.

 

mouse 1 endpoint interrupt in

kbd 1 endpoint interrupt in

Virt COM 3: 1 in interrupt + 1 in bulk + 1 out bulk

 

тем временем в контроллере:

0 0 Control Out 64 No

0 1 Control In 64 No

1 2 Interrupt/Bulk Out 64 No

1 3 Interrupt/Bulk In 64 No

2 4 Interrupt/Bulk Out 64 No

2 5 Interrupt/Bulk In 64 No

3 6 Interrupt/Bulk Out 64 Yes

3 7 Interrupt/Bulk In 64 Yes

4 8 Isochronous Out 512 Yes

4 9 Isochronous In 512 Yes

 

Проблема в том что 4ая endpoint Isochronous и её никуда не подсунишь. А влезть как то нужно. КАК?

 

Увидел что вроди как CDC можно и через Isochronous делать. Пока ковыряю в эту сторону

 

Изменено пользователем pil

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Virt COM 3: 1 in interrupt + 1 in bulk + 1 out bulk

...

Попробуйте для Virt COM 3 использовать 1 in bulk + 1 out bulk. Переходник USB2.0 - RS232 (COM) VE024 имеет именно такую конфигурацию эндпоинтов. И работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вычитал, что можно как то подцепиться к 0й endpoint. Как?

HID устройства могут не иметь EP кроме 0-й. Я так делал, всё отлично работает. Но я использовал только запросы GET/SET Report. Но интеррупт канал, по идее, должен работать через EP0. Для этого всё предусмотрено. Там просто будет запрос от интерфейса с соотв-м номером. Просто нужно на него ответить и всё.

Проверить легко - не описывать HID-овские EP и посмотреть запросы сниффером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте для Virt COM 3 использовать 1 in bulk + 1 out bulk. Переходник USB2.0 - RS232 (COM) VE024 имеет именно такую конфигурацию эндпоинтов. И работает.

 

а можно дескриптор?

 

HID устройства могут не иметь EP кроме 0-й. Я так делал, всё отлично работает. Но я использовал только запросы GET/SET Feature. Но интеррупт канал, по идее, должен работать через EP0. Для этого всё предусмотрено. Там просто будет запрос от интерфейса с соотв-м номером. Просто нужно на него ответить и всё.

Проверить легко - не описывать HID-овские EP и посмотреть запросы сниффером.

Пока запасной вариант, попробую.

Изменено пользователем pil

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте для Virt COM 3 использовать 1 in bulk + 1 out bulk.

Видимо то же самое - InterruptIn переносится на 0-ю EP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а можно дескриптор?

Вот что выдает UVCView.x86.exe

           ---===>Device Information<===---
English product name: "usb serial conveter"

ConnectionStatus:                  
Current Config Value:              0x01  -> Device Bus Speed: Full
Device Address:                    0x01
Open Pipes:                           2

           ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0040 = 0x40 bytes
bInterval:                         0x00

           ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x02  -> Direction: OUT - EndpointID: 2
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0040 = 0x40 bytes
bInterval:                         0x00

           ===>Device Descriptor<===
bLength:                           0x12
bDescriptorType:                   0x01
bcdUSB:                          0x0200
bDeviceClass:                      0x00  -> This is an Interface Class Defined Device
bDeviceSubClass:                   0x00
bDeviceProtocol:                   0x00
bMaxPacketSize0:                   0x08 = (8) Bytes
idVendor:                        0x0403 = Future Technology Devices International Limited
idProduct:                       0x6001
bcdDevice:                       0x0400
iManufacturer:                     0x01
      English (United States)  "ftdi"
iProduct:                          0x02
      English (United States)  "usb serial conveter"
iSerialNumber:                     0x03
      English (United States)  "ftQPMA5P"
bNumConfigurations:                0x01

           ===>Configuration Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x02
wTotalLength:                    0x0020  -> Validated
bNumInterfaces:                    0x01
bConfigurationValue:               0x01
iConfiguration:                    0x00
bmAttributes:                      0xA0  -> Bus Powered
MaxPower:                          0x16 =  44 mA

           ===>Interface Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x04
bInterfaceNumber:                  0x00
bAlternateSetting:                 0x00
bNumEndpoints:                     0x02
bInterfaceClass:                   0xFF  -> Vendor Specific Device
bInterfaceSubClass:                0xFF
*!*CAUTION:    This appears to be an invalid bInterfaceSubClass
bInterfaceProtocol:                0xFF
*!*WARNING:  must be set to PC_PROTOCOL_UNDEFINED 0 for this class
iInterface:                        0x02
      English (United States)  "usb serial conveter"
*!*ERROR:  0xFF is the prerelease USB Video Class ID

           ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0040 = 0x40 bytes
bInterval:                         0x00

           ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x02  -> Direction: OUT - EndpointID: 2
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0040 = 0x40 bytes
bInterval:                         0x00

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно хоть все интерфейсы на одни и те же конечные точки посадить. Но... Если захотите одновременно пользоваться этими интерфейсами (читай, разными драйверами), будут проблемы. Как и в устройстве. Вы не сможете различить кто вам информацию посылал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

idVendor: 0x0403 = Future Technology Devices International Limited

idProduct: 0x6001

Так это значит драйвер по VID/PID установится. Там что угодно может быть.

Кстати, а ведь насколько я помню, класс CDC должен быть в дескрипторе устройства прописан. Из дескриптора интерфейса драйвер не установится. Т.е. составного устройства, включающего в себя CDC, быть не может. Т.е. может, конечно, но только со своим драйвером, а значит покупка VID.

 

Можно хоть все интерфейсы на одни и те же конечные точки посадить. Но... Если захотите одновременно пользоваться этими интерфейсами (читай, разными драйверами), будут проблемы. Как и в устройстве. Вы не сможете различить кто вам информацию посылал.

То, что идёт через EP0 можно отличить. Там в запросе N интерфейса присутствует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, а ведь насколько я помню, класс CDC должен быть в дескрипторе устройства прописан. Из дескриптора интерфейса драйвер не установится. Т.е. составного устройства, включающего в себя CDC, быть не может. Т.е. может, конечно, но только со своим драйвером, а значит покупка VID.

 

Все там ставится. Прописываете в *.inf к какому интерфесу относится драйвер и все путем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все там ставится. Прописываете в *.inf к какому интерфесу относится драйвер и все путем.

vid pid не нулевые, про это речь была. Проблема только при массовом выпуске.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все там ставится. Прописываете в *.inf к какому интерфесу относится драйвер и все путем.

Да, с записью в *.inf можно, я и забыл про такую возможность.

Но тогда в режиме Plug and Play работать невозможно будет, а у нас это обязательным условием было.

К тому же опять проблема с тем, что VID должен быть не равен 0.

 

Кстати, а почему клавиатура и мышь разными устройствами?

Насколько я помню, там их можно в один HID объединить. Только усаги у него соответствующие написать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

vid pid не нулевые, про это речь была. Проблема только при массовом выпуске.

 

При массовом выпуске платишь около 400 евро и получаешь официальные vid и pid (не путать с правом посадить usb label. это на порядок дороже).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При массовом выпуске платишь около 400 евро и получаешь официальные vid и pid (не путать с правом посадить usb label. это на порядок дороже).

Кто-нибудь у нас VID уже за такие деньги получил?

Или это про перепродавцов, которые покупают VID и продают PIDы в розницу, речь? Так это чистый развод, т.к. ничего официального в этом нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте для Virt COM 3 использовать 1 in bulk + 1 out bulk. Переходник USB2.0 - RS232 (COM) VE024 имеет именно такую конфигурацию эндпоинтов. И работает.

Вообщем использовал самый простой вариант, т.е. Virt COM = 1 in bulk + 1 out bulk. Причем InterruptIn не убрал из описания, а просто посадил на несуществующую конечную точку. Все пашет ОК.

Всем спасибо, хоть дискусия ушла к vid|pid=)

Изменено пользователем pil

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем использовал самый простой вариант, т.е. Virt COM = 1 in bulk + 1 out bulk. Причем InterruptIn не убрал из описания, а просто посадил на несуществующую конечную точку. Все пашет ОК.

Всем спасибо, хоть дискусия ушла к vid|pid=)

 

Все это и будет работать, если вы не собираетесь хосту сообщать о состоянии своих сигналов DTR/CTS и параметрах baud, parity и пр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...