Страница 1 из 3
USB HID интерфейс
Добавлено: Чт мар 08, 2012 19:41:04
+Андрей+
Прочитал, что данный интерфейс очень удобен при проектировании разного рода устройств (самоделок)
Скоростью связи вполне удовлетворен

которую предоствляет мне интерфейс.
Собственно, сам вопрос - какие штатные функции есть в ком-пе для работы с такими устройствами и как реализовать поддержку этого интерфейса на ATmega-48 (имя устройства чтоб еще выводилось)?
В гугле забанили действительно

А если серьезно, то нигде нет ПОЛНОЙ информации по этим двум вопросам НА РУССКОМ ЯЗЫКЕ. А данная инфа могла бы быть полезна для большинства форумчан. Может, плохо искал, но не нашел.
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 19:49:20
SubDia
+Андрей+ писал(а):какие штатные функции есть в ком-пе для работы с такими устройствами
Что Вы понимаете под словосочетанием "штатные функции"? Драйвера есть. =)
Вот
эту тему гляньте, там ребята приводили ссылки на проект на меге восьмой. Правда, не помню, какой тип устройства - HID аль нет. Но это не суть важно.
Ищите и читайте спецификацию на интерфейс USB (1.1, к примеру). Читать и разбираться придется много.
Правда, не совсем понимаю, что означает "данный интерфейс очень удобен при проектировании разного рода устройств". Это еще смотря каких устройств. =)
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 19:52:50
Ser60
Почитайте для начала вторую часть статьи в предыдущих новостях на сайте. Она, правда, не для AVR, н какие-то сведения по USB HID вы из нее извлечете. В компе имеетя готовый драйвер для HID, но как с ним работать зависит от языка программирования. У Windows есть много API для работы с HID.
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:02:04
Мурик
+Андрей+ писал(а):Собственно, сам вопрос - какие штатные функции есть в ком-пе для работы с такими устройствами
Статья из журнала Радио №4, 2011 г.
http://www.radioman-portal.ru/pages/1698/index.shtml
+Андрей+ писал(а):как реализовать поддержку этого интерфейса на ATmega-48 (имя устройства чтоб еще выводилось
http://purebasic.mybb.ru/viewtopic.php?id=211 Тут мега 8, но легко можно переделать под 48. Вроде толко изменить имя рег-файла (заменить $regfile = "m
8def.dat" на $regfile = "m
48def.dat") и перекомпилировать.
Только первая часть статьи о создании своего микроконтроллерного USB устройства.
http://radioman-portal.ru/pages/1928/index.shtml
Полная версия статьи в журнале Радио 2011 в номерах 10 и 11.
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:10:11
+Андрей+
нет, именно ШТАТНЫЕ функции Windows API.

там ничего не нашел, дайте прямую ссылку на проект.
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:14:24
Мурик
Ну там есть функции типа HidD_GetHidGuid, HidD_GetAttributes, HidD_GetPreparsedData, HidP_GetCaps и многие другие.
Проще использовать компонент "HID_Lib_Plus.dll" (см. первую ссылку в моем предыдущем посте) чем лезть в дебри WinAPI, но хозяин-барин.
И многое зависит от языка программирования. На каком пишите?
+Андрей+ писал(а):дайте прямую ссылку на проект
На какой именно?
Если речь про статьи то вот из Радио № 4, 2011
ftp://ftp.radio.ru/pub/2011/04/HID_Lib_Plus.rar
Из Радио № 10, 2011
ftp://ftp.radio.ru/pub/2011/11/usb-bascom.zip
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:23:57
+Андрей+
Ссылку на проект на меге-8.
Пишу на Дельфи и на Си.
И нет ли статейки в MSDN на все эти функции?
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:27:25
Мурик
+Андрей+ писал(а):Ссылку на проект на меге-8.
Там же внизу первого поста есть ссылка крупными буквами.
Скачать файлы (компьютерная программа, прошивка для микроконтроллера и их исходные тексты).
+Андрей+ писал(а):на Дельфи
В архиве есть пример использования компонента "HID_Lib_Plus.dll" в Дельфи 7.
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:29:00
+Андрей+
МНЕ ДАННЫй КОМПОНЕНТ НЕ НУЖЕН, ТОЛЬКО ШТАТНЫЕ ФУНКЦИИ!
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:31:01
Мурик
Тогда гугл в помощь.
Не верю что в инете нет инфы по работе с HID.
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 20:44:33
+Андрей+
ну ведь ничего не нашел!

Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 21:25:51
Мурик
Ну раз реально такой напряг с поиском в инете, то вот вам рабочий код, использующий WinAPI для работы с USB HID.
Код: Выделить всё
Structure HIDD_ATTRIBUTES
Size.l
VendorID.u
ProductID.u
VersionNumber.u
EndStructure
Structure PSP_DEVICE_INTERFACE_DETAIL_DATA
cbSize.l
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
DevicePath.l ; Для x64 платформы.
CompilerElse
DevicePath.c ; Для x86 платформы.
CompilerEndIf
EndStructure
Prototype ProtoHidD_GetHidGuid(*HidGuid.GUID)
Prototype ProtoHidD_GetAttributes(*HidDeviceObject, *Attributes.HIDD_ATTRIBUTES)
Prototype ProtoHidD_GetPreparsedData(*HidDeviceObject, *PreparsedData)
Prototype ProtoHidD_GetFeature(HidHandle, *Buffer, Len)
Prototype ProtoHidD_SetFeature(HidHandle, *Buffer, Len)
Prototype ProtoSetupDiEnumDeviceInterfaces(*DeviceInfoSet, DeviceInfoData.l, *InterfaceClassGuid.GUID, MemberIndex.l, *DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA)
Prototype ProtoSetupDiGetDeviceInterfaceDetail(*DeviceInfoSet, *DeviceInterfaceData.SP_DEVICE_INTERFACE_DATA, DeviceInterfaceDetailData.l, DeviceInterfaceDetailDataSize.l, *RequiredSize, *DeviceInfoData)
hid_Lib=OpenLibrary(#PB_Any, "hid.dll")
Setupapi_Lib=OpenLibrary(#PB_Any, "setupapi.dll")
Global HidD_GetHidGuid.ProtoHidD_GetHidGuid=GetFunction(hid_Lib, "HidD_GetHidGuid")
Global HidD_GetAttributes.ProtoHidD_GetAttributes=GetFunction(hid_Lib, "HidD_GetAttributes")
Global HidD_GetPreparsedData.ProtoHidD_GetPreparsedData=GetFunction(hid_Lib, "HidD_GetPreparsedData")
Global HidD_GetFeature.ProtoHidD_GetFeature=GetFunction(hid_Lib, "HidD_GetFeature")
Global HidD_SetFeature.ProtoHidD_SetFeature=GetFunction(hid_Lib, "HidD_SetFeature")
Global SetupDiEnumDeviceInterfaces.ProtoSetupDiEnumDeviceInterfaces=GetFunction(Setupapi_Lib, "SetupDiEnumDeviceInterfaces")
Global SetupDiGetDeviceInterfaceDetail.ProtoSetupDiGetDeviceInterfaceDetail=GetFunction(Setupapi_Lib, "SetupDiGetDeviceInterfaceDetailA")
Procedure HID_OpenDevice(PID.w, VID.w, VersionNumber.w, Index.w) ; Получение доступа к HID устройству
HidGuid.Guid
devInfoData.SP_DEVICE_INTERFACE_DATA
devInfoData\cbSize = SizeOf(SP_DEVICE_INTERFACE_DATA)
Length.l = 0
CurrentIndex.w=0
Attributes.HIDD_ATTRIBUTES
Security.SECURITY_ATTRIBUTES
Security\nLength=SizeOf(SECURITY_ATTRIBUTES)
Security\bInheritHandle=1
Security\lpSecurityDescriptor = 0
HidD_GetHidGuid(@HidGuid)
hDevInfo=SetupDiGetClassDevs_(@HidGuid,0,0, #DIGCF_PRESENT|#DIGCF_DEVICEINTERFACE)
If hDevInfo=0
ProcedureReturn 0
EndIf
LastDevice = #False
For i=0 To 255
MyDeviceDetected=#False
Result=SetupDiEnumDeviceInterfaces(hDevInfo, 0, @HidGuid, i, @devInfoData)
If Result
Result = SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInfoData, 0, 0,@Length, 0)
*detailData.PSP_DEVICE_INTERFACE_DETAIL_DATA=AllocateMemory(Length)
*detailData\cbSize=SizeOf(PSP_DEVICE_INTERFACE_DETAIL_DATA)
Result = SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInfoData, *detailData, Length+1, @Required, 0)
DevicePath.s=PeekS(@*detailData\DevicePath)
FreeMemory(*detailData)
DeviceHandle=CreateFile_(@DevicePath, #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ|#FILE_SHARE_WRITE, @Security, #OPEN_EXISTING, 0, 0)
If DeviceHandle>0
Attributes\Size = SizeOf(HIDD_ATTRIBUTES)
Result = HidD_GetAttributes(DeviceHandle, @Attributes)
If Attributes\ProductID=PID And Attributes\VendorID=VID And (Attributes\VersionNumber=VersionNumber Or VersionNumber=-1 )
If CurrentIndex=Index
SetupDiDestroyDeviceInfoList_(hDevInfo)
ProcedureReturn DeviceHandle
Else
CurrentIndex+1
CloseHandle_(DeviceHandle)
EndIf
Else
CloseHandle_(DeviceHandle)
EndIf
EndIf
Else
Break
EndIf
Next i
SetupDiDestroyDeviceInfoList_(hDevInfo)
ProcedureReturn 0
EndProcedure
Procedure HID_CloseDevice(DeviceHandle) ; Закрытие HID устройства.
If DeviceHandle
ProcedureReturn CloseHandle_(DeviceHandle)
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure HID_WriteDevice(DeviceHandle, *buffer, LenBuffer) ; Запись данных в HID устройство
If DeviceHandle=0 Or *buffer=0 Or LenBuffer<=0
ProcedureReturn 0
EndIf
Written.l=0
Result=WriteFile_(DeviceHandle, *buffer, LenBuffer, @Written, 0)
ProcedureReturn Written
EndProcedure
Procedure HID_ReadDevice(DeviceHandle, *buffer, LenBuffer) ; Чтение данных из HID устройства
If DeviceHandle=0 Or *buffer=0 Or LenBuffer<=0
ProcedureReturn 0
EndIf
Written.l=0
Result=ReadFile_(DeviceHandle, *buffer, LenBuffer, @Written, 0)
ProcedureReturn Written
EndProcedure
Procedure HID_GetFeature(DeviceHandle, *buffer, LenBuffer)
If DeviceHandle And *buffer And LenBuffer>0
ProcedureReturn HidD_GetFeature(DeviceHandle, *buffer, LenBuffer)
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure HID_SetFeature(DeviceHandle, *buffer, LenBuffer)
If DeviceHandle And *buffer And LenBuffer>0
ProcedureReturn HidD_SetFeature(DeviceHandle, *buffer, LenBuffer)
Else
ProcedureReturn 0
EndIf
EndProcedure
Тестирование кода, включение и отключение режима программирования в программаторе PICkit 2, который является USB HID устройством.
Код: Выделить всё
#USB_PID = $33 ; Идентификаторы программатора PicKit 2
#USB_VID = $4D8
#PK_PACKET_SIZE = 65
Procedure VddOn(Handle) ; Включить питание
Dim OutBuffer.b(#PK_PACKET_SIZE+2)
OutBuffer(0)=0
OutBuffer(1)=$A6 ; EXECUTE_SCRIPT
OutBuffer(2)=2
OutBuffer(3)=$FC ; _VDD_GND_OFF
OutBuffer(4)=$FF ; _VDD_ON
ProcedureReturn HID_WriteDevice(Handle, @OutBuffer(), #PK_PACKET_SIZE)
EndProcedure
Procedure VddOff(Handle) ; Выключить питание
Dim OutBuffer.b(#PK_PACKET_SIZE+2)
OutBuffer(0)=0
OutBuffer(1)=$A6 ; EXECUTE_SCRIPT
OutBuffer(2)=2
OutBuffer(3)=$FE ; _VDD_OFF
OutBuffer(4)=$FD ; _VDD_GND_ON
ProcedureReturn HID_WriteDevice(Handle, @OutBuffer(), #PK_PACKET_SIZE)
EndProcedure
Handle=HID_OpenDevice(#USB_PID, #USB_VID, -1, 0) ; Установка связи с PicKit 2
If Handle
VddOn(Handle) ; Включить питание программируемого МК
Delay(1000) ; Пауза, равная 1000 миллисекунд
VddOff(Handle) ; Выключить питание программируемого МК
HID_CloseDevice(Handle) ; Разыв связи с PicKit 2
Else
MessageRequester("PicKit 2 Test", "Нет связи с PicKit2!", 48)
EndIf
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 22:36:16
+Андрей+
так.
а для МК как поддержку юсб реализовать?
Re: USB HID интерфейс
Добавлено: Чт мар 08, 2012 23:04:07
Мурик
+Андрей+ писал(а):так.
а для МК как поддержку юсб реализовать?
Я же выше давал ссылки.
Пример девайса.
http://purebasic.mybb.ru/viewtopic.php?id=211
Описание библиотеки совтового USB для AVRов.
http://radioman-portal.ru/pages/1928/index.shtml
Re: USB HID интерфейс
Добавлено: Пт мар 09, 2012 07:43:20
+Андрей+
Вот, большое спасибо, искренне благодарен

Re: USB HID интерфейс
Добавлено: Пт мар 09, 2012 09:30:11
AaNnDdRrEeYy
Можно еще использовать V-USB
http://we.easyelectronics.ru/electro-an ... v-usb.html
Но остался один незатронутый вопрос, как отлаживать подобные устройства.
если что то не заработает то трудно понять на какой стороне на стороне хоста или на стороне МК.
есть ли программные эмуляторы HID устройств с помощью которых можно отладить софт на стороне хоста и быть уверенным что он работает?
облазил интернет но ничего кроме снифферов найти не смог, было бы здорово запустить эмулятор прописать VID и PID и обмениваться данными с ней вместо устройства.
Re: USB HID интерфейс
Добавлено: Пт мар 09, 2012 10:25:53
Мурик
AaNnDdRrEeYy писал(а):как отлаживать подобные устройства.если что то не заработает то трудно понять на какой стороне на стороне хоста или на стороне МК.
Со стороны хоста, отладка проблем не вызывает. Главное чтобы в IDE был нормальный отладчик.
Re: USB HID интерфейс
Добавлено: Пт мар 09, 2012 10:39:35
AaNnDdRrEeYy
а со стороны МК как быть? pruteus программную реализацию usb не эмулирует.
пытался запустить V-USB в режиме отладки в AVR studio 4, студия вылетела по ошибке причем ничего не сказала просто закрылась.
Re: USB HID интерфейс
Добавлено: Пт мар 09, 2012 11:05:09
Мурик
А со стороны МК нужно все делать аккуратно и без быдлокодерства.
Тогда может отладка и не понадобится.
Re: USB HID интерфейс
Добавлено: Сб мар 10, 2012 00:24:58
AaNnDdRrEeYy
собрал ради интереса девайс на V USB (
http://we.easyelectronics.ru/electro-an ... v-usb.html) заработал!
выдает вот такой вот дескриптор сообщений
HID Descriptor
Usage Page: 65280 (Vendor Specific)
Usage: 1 (Unknown)
Collection
Logical Minimum: 0
Logical Maximum: 255
Report Size: 8
Report Count: 3
Usage: 0 (Unknown)
Feature: 258 (Data,Variable,Absolute,No Wrap,Linear,Preferred State,No Null Position)
End Collection
и вот такой вот дескриптор устройства
Device Descriptor
USB version: 1.10
Device class: 0x0 - (Defined at Interface level)
Device subclass: 0x0 - Unknown
Device protocol: 0x0 - Unknown
Control pipe max size: 8 bytes
Vendor ID: 0x16c0 (VOTI)
Product ID: 0x5df (Unknown)
Product version: 1.0
программа на хосте которая работает не видит его нифига, как теперь с ним общаться ХЗ.