Hi, I am very new to usb programming and I am trying
to create a Java frontend to the Creative Nomad
Jukebox (independant of libnjb). I have viewed the
protocol for the jukebox here:
(https://sourceforge.net/project/showfiles.php?group_id=32528&package_id=24703).
According to it, for example, to get the library
counter (page 33), it says the following data is to be
sent to the control endpoint:
 
begin quote
 
 Get Library Counter
The “get library counter” request is sent by the host,
and the count is returned in the data phase of the USB
request
 
Setup Phase
 
Request Type
 0xC3
 
Request
 0x43
 
Value
 0x0000
 
Index
 0x0000
 
Data Length
 0x0019
 

 

Data Phase
 
Host << NJB
 
status
 1 byte
 
JukeBox ID
 16 bytes
 
library count MSDW
 4 bytes
 
library count LSDW
 4 bytes
 

 

The library count is stored as a 64-bit integer,
broken up into an MSDW and LSDW. See the “get disk
usage” command for more information.

 

end quote

 

I am using the following code (which I dont think is
correct)

 

public static void testIO(UsbDevice jukebox)
    {
        try
        {            
            System.out.println("Configured:
"+jukebox.isConfigured());            
            List configs =
jukebox.getUsbConfigurations();
            
            System.out.println("Number of
configurations: "+configs.size());
            System.out.println("Product:
"+jukebox.getProductString());
            System.out.println("Manufacturer:
"+jukebox.getManufacturerString());
            System.out.println("Serial num.:
"+jukebox.getSerialNumberString());
            
            UsbConfiguration config =
jukebox.getActiveUsbConfiguration();
            System.out.println("Configuration active:
"+config.isActive());
            System.out.println("Configuration String:
"+config.getConfigurationString());
            
            List totalInterfaces =
config.getUsbInterfaces();
            System.out.println("Number of interfaces:
"+totalInterfaces.size());
            
            for (int i=0; i<totalInterfaces.size();
i++)
            {
                UsbInterface interf = (UsbInterface)
totalInterfaces.get(i);
                System.out.println("Interface "+i+"
Active: "+interf.isActive());
                System.out.println("Interface "+i+"
Claimed... "+interf.isClaimed());
                try
                {
                    interf.claim();
                    System.out.println("Interface
claimed");
                }
                catch(UsbClaimException
u1){System.out.println("Claim Exception");}
                catch(UsbException
u2){System.out.println("Usb Exception");}
                catch(UsbNotActiveException
u3){System.out.println("Not Active Exception");}
                
                byte[] b = new byte[25];
                UsbControlIrp controlIrp =
jukebox.createUsbControlIrp((byte)0xC3, (byte)0x43,
(byte)0x0000, (byte)0x0000);
                controlIrp.setLength(25);
                controlIrp.setData(b);
                System.out.println("Going to submit
device IRP..");
                jukebox.syncSubmit(controlIrp);
                

                List totalEndpoints =
interf.getUsbEndpoints();
               
System.out.println(totalEndpoints.size()+" Endpoints
got from interface "+i);
                
                for (int j=0; j<totalEndpoints.size();
j++)
                {
                    UsbEndpoint ep = (UsbEndpoint)
totalEndpoints.get(j);
                    System.out.println("Direction:
"+getDirectionString(ep.getDirection()));
                    System.out.println("Type:
"+getTypeString(ep.getType()));
                    
                    UsbPipe pipe = ep.getUsbPipe();
                    pipe.open();
                    System.out.println("Pipe opened:
"+pipe.isOpen());
                    System.out.println("Pipe active:
"+pipe.isActive());
                    byte[] data = new byte[256];
                    
                    if(ep.getDirection() ==
UsbConst.ENDPOINT_DIRECTION_IN)
                    {
//                        // Perform I/O through the
USB pipe here.
//                        UsbControlIrp ctlirp =
pipe.createUsbControlIrp((byte)0xC3, (byte)0x04,
(short)0x0000, (short)0x0000);
//                        ctlirp.setData(data);
//                        ctlirp.setLength(17);
//                        pipe.syncSubmit(ctlirp);
//                        System.out.println("IRP
submitted");
                    }
                    else System.out.println("Out
endpoint detected");
                    
                    pipe.close();
                    System.out.println("Pipe closed");
                }
                interf.release();
                System.out.println("Interface
released");
            }
        }
        catch (Exception e)
        {
            System.out.println("Caught Exception");
            e.printStackTrace();
        }
    }
    
    public static String getDirectionString(int
direction)
    {
        if(direction ==
UsbConst.ENDPOINT_DIRECTION_IN) return
"ENDPOINT_DIRECTION_IN";
        else if(direction ==
UsbConst.ENDPOINT_DIRECTION_OUT) return
"ENDPOINT_DIRECTION_OUT";
        else if(direction ==
UsbConst.ENDPOINT_DIRECTION_MASK) return
"ENDPOINT_DIRECTION_MASK";
        else return null;
    }
    
    public static String getTypeString(int type)
    {
        if(type == UsbConst.ENDPOINT_TYPE_BULK) return
"ENDPOINT_TYPE_BULK";
        else if(type ==
UsbConst.ENDPOINT_TYPE_CONTROL) return
"ENDPOINT_TYPE_CONTROL";
        else if(type ==
UsbConst.ENDPOINT_TYPE_INTERRUPT) return
"ENDPOINT_TYPE_INTERRUPT";
        else if(type ==
UsbConst.ENDPOINT_TYPE_ISOCHRONOUS) return
"ENDPOINT_TYPE_ISOCHRONOUS";
        else if(type == UsbConst.ENDPOINT_TYPE_MASK)
return "ENDPOINT_TYPE_MASK";
        else return null;
    }

 

When i run the code everything goes ok until
syncSubmit is called and the whole program freezes,
requiring me to unplug the usb cable before i can
attempt another connection. I suppose what I really
want to know is:

 

Am I sending the setup packet correctly?

Am I sending it from the correct place in the code,
i.e. do I use jukebox.createUsbControlIrp(..) of do i
have to open an in- or out-endpoint (although i think
these are bulk type)

How do i send a setup packet that sends its data back
on a bulk endpoint, i.e. what code is necessary to
send a control IRP and to capture the bulk data?

 

Any help with this matter would be gratefully
appreciated.

 

Thanks,

Noel



                
__________________________________ 
Yahoo! Music Unlimited 
Access over 1 million songs. Try it free.
http://music.yahoo.com/unlimited/


-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl
_______________________________________________
javax-usb-devel mailing list
javax-usb-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/javax-usb-devel

Reply via email to