Thanks Dan

I'm really amazed at the amount of help you've been able to give me. 
Thank you.

I think your guess is spot-on, although it still has not worked for me. 
I say this because I have used the device successfully under windows 
(using manufacturers software) and have used SniffUsb to trace the 
control message values. For turning the light green it reported:

[463107 ms] UsbSnoop - FilterDispatchAny(b3c27fd2) : 
IRP_MJ_INTERNAL_DEVICE_CONTROL
[463107 ms] UsbSnoop - FdoHookDispatchInternalIoctl(b3c281ea) : 
fdo=854f76a8, Irp=85618008, IRQL=0
[463107 ms]  >>>  URB 6 going down  >>>
-- URB_FUNCTION_VENDOR_DEVICE:
   TransferFlags          = 00000000 (USBD_TRANSFER_DIRECTION_OUT, 
~USBD_SHORT_TRANSFER_OK)
   TransferBufferLength = 00000000
   TransferBuffer       = 00000000
   TransferBufferMDL    = 00000000

     no data supplied
   UrbLink                 = 00000000
   RequestTypeReservedBits = 00000008
   Request                 = 00000012
   Value                   = 0000020a
   Index                   = 00000006
[463109 ms] UsbSnoop - MyInternalIOCTLCompletion(b3c28126) : 
fido=00000000, Irp=85618008, Context=8559b538, IRQL=2
[463109 ms]  <<<  URB 6 coming back  <<<
-- URB_FUNCTION_CONTROL_TRANSFER:
   PipeHandle           = 857a0958
   TransferFlags        = 0000000a (USBD_TRANSFER_DIRECTION_OUT, 
USBD_SHORT_TRANSFER_OK)
   TransferBufferLength = 00000000
   TransferBuffer       = 00000000
   TransferBufferMDL    = 00000000
   UrbLink              = 00000000
   SetupPacket          =
     00000000: 48 12 0a 02 06 00 00 00

I translated these values into my test code:

UsbDevice device = locateDevice(
     rootHub, "Delcom Engineering", "USB Visual Indicator");
UsbControlIrp usbControlIrp = device.createUsbControlIrp(
     (byte)0x08, (byte)0x12, (short) 0x20a, (short)0x006);
usbControlIrp.setData(new byte[0]); // have also tried byte[8] & [255]
device.syncSubmit(usbControlIrp);

The result is still: javax.usb.UsbStallException: Error submitting IRP

I checked the USB 2.0 spec and learnt that STALL infers that the control 
IRP I'm sending is not understood by the device. At this stage it feels 
like I need to tweak the control IRP just a little, but how I'm not 
sure. All the tweaking I do continues to yield only STALL.

Does the trace provided above indicate where I might be getting it wrong?



Dan Streetman wrote:
> Nothing in that spec corresponds to anything in USB.  But my best
> guess - and purely a guess - based solely on the size of their
> "command", is it maps:
> 
> "Recipient" -> bmRequestType
> "Device Model" -> bRequest
> "Major/Minor Command" -> wIndex
> "Data LSB/MSB" -> wValue
> "Length" -> data length
> "DataExtension" -> data
> 
> You'll have to convert the major/minor command and data lsb/msb into
> shorts for the wIndex and wValue.  Note that the USB spec requires
> them to be in little endian.
> 
> 
> 
> On Sat, Aug 16, 2008 at 1:17 AM, Jeremy Mawson <[EMAIL PROTECTED]> wrote:
>> This is the device:
>> http://www.delcom-eng.com/productdetails.asp?productnum=804005-B
>>
>> The "spec" is linked in that page as "USB Indicator Manual" (
>> http://www.delcom-eng.com/downloads/USBVIDM.pdf )
>>
>> The document describes how you can use the Windows driver, or you can
>> use the direct method. I'm following instructions from the latter
>> section (5.3), specifically "Device I/O Control" on p12.
>>
>> DeviceIOControl is a Windows library function.
>> http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx  So whilst
>> it's called the "Direct Method", it's direct to Windows system services
>> and may still be Windows specific.
>>
>>
>>
>>
>>
>> Dan Streetman wrote:
>>> That really doesn't seem like it corresponds to the control parameters
>>> at all, at least not from any of the text.  Are you sure that spec is
>>> for a usb version of your device?  Also, it mentioned the
>>> "DeviceIOControl" function - maybe this "spec" is not a device spec at
>>> all, but a libarary spec, that tells you how to interface with a
>>> proprietary library they provide, which then converts the library
>>> calls you make into the actual USB requests to send to the device.  If
>>> this is the case, the spec will almost certainly not help you at all,
>>> since the actual USB work would be done inside the proprietary
>>> library, and hidden from you.
>>>
>>> If you explain in detail what you have, including the "spec" and any
>>> other components and/or software, as much as you know about the
>>> device, web links, what the device is, etc., it might help.
>>>
>>>
>>> On Fri, Aug 15, 2008 at 11:39 PM, Jeremy Mawson <[EMAIL PROTECTED]> wrote:
>>>> Thanks for your patience Dan.
>>>>
>>>> The device spec is very Windows & C-centric, so the information is not
>>>> obvious to me.
>>>>
>>>> It mentions the need to construct a CTL (control?) code to send to the
>>>> DeviceIOControl() function. The CTL code definition seems to roughly
>>>> match the four parameters required by UsbDevice.createUsbControlIrp().
>>>>
>>>>  "The CTL Codes are predefined codes that describe the desired action
>>>>   to take place. There are many different codes but for our purposes we
>>>>   are only concerned with the send packet code.
>>>>   Below is the CTL_CODE generation shown in C."
>>>>
>>>> #define CTL_CODE( DeviceType, Function, Method, Access ) ( \
>>>>     ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
>>>> #define METHOD_BUFFERED                  0
>>>> #define FILE_ANY_ACCESS                  0
>>>> #define FILE_DEVICE_UNKNOWN              0x00000022
>>>> // --------------------------------------------------------- //
>>>> #define DELCOM_USBIO_IOCTL_VENDOR 0x0800            // Vendor defined
>>>> #define IOCTL_USBIO_WRITE_PACKET     CTL_CODE(FILE_DEVICE_UNKNOWN, \
>>>>                                      DELCOM_USBIO_IOCTL_VENDOR+10,\
>>>>                                      METHOD_BUFFERED, \
>>>>                                      FILE_ANY_ACCESS)
>>>>
>>>> This resolves to 0x222028, but that value doesn't help me to get the
>>>> arguments to usbDevice.createUsbControlIrp().
>>>>
>>>> At a guess I've tried mapping DeviceType->bmRequestType,
>>>> Function->bRequest, Method->wValue & Access->wIndex. But
>>>> Function=0x2028, which is too large for the byte value bRequest.
>>>>
>>>> Can anyone help me to decipher the correct usb control irp parameters
>>>> from the #defines?
>>>>
>>>>
>>>>
>>>> Dan Streetman wrote:
>>>>> On Fri, Aug 15, 2008 at 6:03 PM, Jeremy Mawson <[EMAIL PROTECTED]> wrote:
>>>>>> Indeed it does. It says:
>>>>>>
>>>>>> So the command is easy to construct, but how to transmit it? As far as I
>>>>>> can see, there's no concept of a USB command in the javax.usb API.
>>>>> No, you misunderstand - you doc needs to tell you what endpoint/pipe
>>>>> to send the "command" to (there are no "commands" in the USB spec).
>>>>> If that endpoint/pipe is a control endpoint/pipe, then your spec also
>>>>> needs to tell you what to fill in the control-specific fields with.
>>>>> The section you listed regards ONLY the data portion of the "command".
>>>>>
>>>>>> The only method in StandardRequest that will accommodate a freeform
>>>>>> byte[] is setDescriptor, but that doesn't sound right.
>>>>>>
>>>>>> I've tried the UsbControlIrp strategy without success. It may be that
>>>>>> I'm setting the constructor params incorrectly.
>>>>>>
>>>>>> Once I've constructed the command, which method transmits it?
>>>>> Again, *your spec needs to tell you this*.
>>>>>
>>>>>
>>>>>>
>>>>>> Dan Streetman wrote:
>>>>>>> You need to figure out how to format those fields into a USB command.
>>>>>>> I would expect your manual to have that info somewhere in it.
>>>>>>>
>>>>>>> On Fri, Aug 15, 2008 at 9:37 AM, Jem <[EMAIL PROTECTED]> wrote:
>>>>>>>> Hi
>>>>>>>>
>>>>>>>> I have a manual for the USB device I'm trying to control that 
>>>>>>>> describes the
>>>>>>>> bytes I need to transmit to the device in order to perform functions.
>>>>>>>>
>>>>>>>> For example if I wish to turn it green (it's a light) I'd transmit:
>>>>>>>>
>>>>>>>> Recipient Byte: 8
>>>>>>>> Device Model Byte: 18
>>>>>>>> Major Command Byte: 10
>>>>>>>> Minor Command Byte: 34
>>>>>>>> Data LSB: 0
>>>>>>>> Data MSB: 80
>>>>>>>> Length Short: 0, 0
>>>>>>>>
>>>>>>>> I'm not sure how I translate this to methods in the API. Can I use a 
>>>>>>>> method
>>>>>>>> on StandardRequest?
>>>>>>>>
>>>>>>>> Alternatively, I tried the following, which resulted in a 
>>>>>>>> usbStallException:
>>>>>>>>
>>>>>>>>                 byte bmRequestType =
>>>>>>>>                     UsbConst.REQUESTTYPE_DIRECTION_OUT |
>>>>>>>> UsbConst.REQUESTTYPE_TYPE_STANDARD | 
>>>>>>>> UsbConst.REQUESTTYPE_RECIPIENT_DEVICE;
>>>>>>>>                 byte bRequest = UsbConst.REQUEST_SET_FEATURE;
>>>>>>>>                 short wValue = UsbConst.DESCRIPTOR_TYPE_DEVICE << 8;
>>>>>>>>                 short wIndex = 0;
>>>>>>>>
>>>>>>>>                 byte[] buffer = new byte[]{8,18,10,34,0,80,0,0};
>>>>>>>>                 UsbControlIrp usbControlIrp =
>>>>>>>> usbDevice.createUsbControlIrp(bmRequestType, bRequest, wValue, wIndex);
>>>>>>>>                 usbControlIrp.setData(buffer);
>>>>>>>>                 usbDevice.syncSubmit(usbControlIrp);
>>>>>>>>
>>>>>>>> Am I on the right track?
>>>>>>>>
>>>>>>>> Thanks for any help
>>>>>>>> Jeremy

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
javax-usb-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/javax-usb-devel

Reply via email to