Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обмен данными по USB
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Politeh
Добрый день!

Как открыть USB порт программно и производить обмен данными по нему?
Если делать, как указывается в некоторой справочной литаретуре:

SetupDiGetClassDevs
SetupDiEnumDeviceInterfaces
SetupDiGetDeviceInterfaceDetail
CreateFile
WriteFile/ReadFile

То все работает за исключением WriteFile/ReadFile.

У Microsoft сказано, что надо делать еще WinUsb_Initialize, чтобы получит WinUSB handle и далее обмениваться данными посредством WinUsb_WritePipe/WinUsb_ReadPipe. Но не ясно, что надо сделать, чтобы данная функция (WinUsb_Initialize) выполнилась успешно.

Спасибо.
Alex11
USB-порт еще ни о чем не говорит. Какой класс USB-устройства? Если один из стандартных, поддерживаемых виндюками, то обращение должно быть согласовано с классом. Не исключено, что даже при поддержке класса потребуется свой inf-файл, чтобы стандартный драйвер установился (как, например, для CDC, чтобы получился COM-port). Если устройство нестандартное, то пока свой драйвер не напишите, ничего работать не будет.
Politeh
Используется устройство с USB CDC.
Да, описанные мною выше функции работы с USB устройством, работать не будут, т.к. они работают с драйвером winusb.sys. В данном же случае, для работы с CDC потребуется использовать свой inf c установкой usbser.sys драйвера. И далее можно будет работать с подключаемым девайсом, как с виртуальным COM портом, обычными COM-овскими функциями CreateFile/WriteFile/ReadFile.
Однако возникла проблема при установке usbser.sys драйвера.
USB CDC на устройстве реализовано на микрочипе Atmel at91sam7s256. Подключаю девайс к компу, оно увиделось и Windows просит установить нужный драйвер, в диалоге установки выбираю «Установить с диска» и указываю нужный inf файл, жму OK, но появляется сообщение «В указанном месте отсутствуют сведения об оборудовании».
Inf файл взят стандартный, из документации с сайта Atmel
//**************************************************************************//
[Version] ; Version section
Signature="$Chicago$" ; All Windows versions
Class=Ports ; This is a serial port driver
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} ; Associated GUID
Provider=%ATMEL% ; Driver is provided by ATMEL
DriverVer=09/12/2006,1.1.1.5 ; Driver version 1.1.1.5 published on 23 February 2007
[DestinationDirs] ; DestinationDirs section
DefaultDestDir=12 ; Default install directory is \drivers or \IOSubSys
[Manufacturer] ; Manufacturer section
%ATMEL%=AtmelMfg ; Only one manufacturer (ATMEL), models section is named
; AtmelMfg
[AtmelMfg] ; Models section corresponding to ATMEL
%USBtoSerialConverter%=USBtoSer.Install, USB\VID_03EB&PID_6119
; Identifies a device with ATMEL Vendor ID (03EBh) and
; Product ID equal to 6119h. Corresponding Install section
; is named USBtoSer.Install
[USBtoSer.Install]; Install section
include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=USBtoSer.AddReg ; Registry keys to add are listed in USBtoSer.AddReg
[USBtoSer.AddReg] ; AddReg section
HKR,,DevLoader,,*ntkern ;
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[USBtoSer.Install.Services] ; Services section
AddService=usbser,0x00000002,USBtoSer.AddService
; Assign usbser as the PnP driver for the device
[USBtoSer.AddService] ; Service install section
DisplayName=%USBSer% ; Name of the serial driver
ServiceType=1 ; Service kernel driver
StartType=3 ; Driver is started by the PnP manager
ErrorControl=1 ; Warn about errors
ServiceBinary=%12%\usbser.sys ; Driver filename
[Strings] ; Strings section
ATMEL="ATMEL Corp." ; String value for the ATMEL symbol
USBtoSerialConverter="AT91 USB to Serial Converter" ; String value for the USBtoSerialConverter symbol
USBSer="USB Serial Driver" ; String value for the USBSer symbol
//***********************************************************************//
Прошивка для микрочипа взята также с сайта Atmel.
Для интереса попробовал установить этот inf на обычную флэшку (Mass Storage), драйвер usbser.sys под нее встал, в inf файле потребовалось лишь изменить vendor и product id на номера, которые у флэши (USB\VID_VVVV&PID_PPPP). В диспетчере устройств название флэшки переместилось из раздела «… USB» в раздел «Порты (COM и LPT)», как новый COM порт, на названии, конечно, желтый значок (- драйвер с оборудованием работает некорректно), но факт установки был.
В чем может быть проблема, где еще смотреть:
- использую некорректные VID и PID
- неправильно сконфигурирован код прошивки
- нестандартное оборудование, нужно писать свой драйвер

(
вот Device Description:
const USBDeviceDescriptor usbDeviceDescriptor = {

sizeof(USBDeviceDescriptor),
USBGenericDescriptor_DEVICE,
USBDeviceDescriptor_USB2_00,
0, // No device class code
0, // No device subclass code
0, // No device protocol code
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0),
0x03EB, // Atmel vendor ID
0x6119, //0001;// Product ID
0x0001, // Product release 0.01
0, // No manufacturer string descriptor
0, // No product string descriptor
0, // No serial number string descriptor
1 // One possible configuration
};
)

Спасибо.
Alex11
А класс CDC где? Или он в интерфейсе указан?
Politeh
Цитата(Alex11 @ Jun 19 2009, 20:28) *
А класс CDC где? Или он в интерфейсе указан?


Изменил значения под CDC класс и в DeviceDescription и в Interface согласно указанным значениям в msdn
(
- http://msdn.microsoft.com/en-us/library/aa919760.aspx
- http://msdn.microsoft.com/en-us/library/aa930780.aspx
)

/// Device descriptor.
const USBDeviceDescriptor usbDeviceDescriptor = {

sizeof(USBDeviceDescriptor),
USBGenericDescriptor_DEVICE,
USBDeviceDescriptor_USB2_00,
0x2, // No device class code
0, // No device subclass code
0, // No device protocol code
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0),
0x03EB, // Atmel vendor ID
0x6119, //0001;// Product ID
0x0001, // Product release 0.01
0, // No manufacturer string descriptor
0, // No product string descriptor
0, // No serial number string descriptor
1 // One possible configuration
};

/// Configuration descriptors.
const struct SimpleConfigurationDescriptors configurationDescriptors = {

// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION,
sizeof(struct SimpleConfigurationDescriptors),
0, // No interface in this configuration
1, // This is configuration #1
0, // No string descriptor for this configuration
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Interface descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
0, // This is interface #0
0, // This is setting #0 for interface
0, // Interface has no endpoint
0x02, // No interface class code
0x02, // No interface subclass code
0xFF, // No interface protocol code
0, // No string descriptor
}
};

Однако эффект нулевой!
Может еще каки поля не определены?

Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.