/// <summary>
 /// Creates and initialize a <a href="http://libusb.sourceforge.net/api-1.0/index.html">Libusb-1.0</a> USB session handle.
 /// </summary>
 /// <remarks>
 /// <para>A <see cref="MonoUsbSessionHandle"/> instance must be created before calling any other <a href="http://libusb.sourceforge.net/api-1.0/index.html">Libusb-1.0 API</a> function.</para>
 /// </remarks>
 public MonoUsbSessionHandle() : base(IntPtr.Zero, true)
 {
     lock (sessionLOCK)
     {
         IntPtr pNewSession = IntPtr.Zero;
         try
         {
             mLastReturnCode = (MonoUsbError)MonoUsbApi.Init(ref pNewSession);
         }
         catch (DllNotFoundException dllNotFound)
         {
             if (LHelper.IsLinux)
             {
                 throw new DllNotFoundException(DLL_NOT_FOUND_LINUX, dllNotFound);
             }
             else
             {
                 throw new DllNotFoundException(DLL_NOT_FOUND_WINDOWS, dllNotFound);
             }
         }
         if ((int)mLastReturnCode < 0)
         {
             mLastReturnString = MonoUsbApi.StrError(mLastReturnCode);
             SetHandleAsInvalid();
         }
         else
         {
             SetHandle(pNewSession);
             mSessionCount++;
         }
     }
 }
 /// <summary>
 /// Creates and initialize a <a href="http://libusb.sourceforge.net/api-1.0/index.html">Libusb-1.0</a> USB session handle.
 /// </summary>
 /// <remarks>
 /// <para>A <see cref="MonoUsbSessionHandle"/> instance must be created before calling any other <a href="http://libusb.sourceforge.net/api-1.0/index.html">Libusb-1.0 API</a> function.</para>
 /// </remarks>
 public MonoUsbSessionHandle()
     : base(IntPtr.Zero, true)
 {
     lock (sessionLOCK)
     {
         IntPtr pNewSession = IntPtr.Zero;
         try
         {
             mLastReturnCode = (MonoUsbError)MonoUsbApi.Init(ref pNewSession);
         }
         catch (DllNotFoundException dllNotFound)
         {
             if (Helper.IsLinux)
             {
                 throw new DllNotFoundException(DLL_NOT_FOUND_LINUX, dllNotFound);
             }
             else
             {
                 throw new DllNotFoundException(DLL_NOT_FOUND_WINDOWS, dllNotFound);
             }
         }
         if ((int)mLastReturnCode < 0)
         {
             mLastReturnString = MonoUsbApi.StrError(mLastReturnCode);
             SetHandleAsInvalid();
         }
         else
         {
             SetHandle(pNewSession);
             mSessionCount++;
         }
     }
 }
        private MonoUsbError GetDeviceDescriptor(out MonoUsbDeviceDescriptor monoUsbDeviceDescriptor)
        {
            MonoUsbError ec = MonoUsbError.Success;

            monoUsbDeviceDescriptor = new MonoUsbDeviceDescriptor();
            //Console.WriteLine("MonoUsbProfile:GetDeviceDescriptor");
            ec = (MonoUsbError)MonoUsbApi.GetDeviceDescriptor(mMonoUSBProfileHandle, monoUsbDeviceDescriptor);
            if (ec != MonoUsbError.Success)
            {
#if LIBUSBDOTNET
                UsbError.Error(ErrorCode.MonoApiError, (int)ec, "GetDeviceDescriptor Failed", this);
#endif
                monoUsbDeviceDescriptor = null;
            }
            return(ec);
        }
示例#4
0
        /// <summary>
        /// Get a string describing a <see cref="MonoUsbError"/>.
        /// </summary>
        /// <param name="errcode">The <see cref="MonoUsbError"/> code to retrieve a description for.</param>
        /// <returns>A string describing the <see cref="MonoUsbError"/> code.</returns>
        public static string StrError(MonoUsbError errcode)
        {
            switch (errcode)
            {
            case MonoUsbError.Success:
                return("Success");

            case MonoUsbError.ErrorIO:
                return("Input/output error");

            case MonoUsbError.ErrorInvalidParam:
                return("Invalid parameter");

            case MonoUsbError.ErrorAccess:
                return("Access denied (insufficient permissions)");

            case MonoUsbError.ErrorNoDevice:
                return("No such device (it may have been disconnected)");

            case MonoUsbError.ErrorBusy:
                return("Resource busy");

            case MonoUsbError.ErrorTimeout:
                return("Operation timed out");

            case MonoUsbError.ErrorOverflow:
                return("Overflow");

            case MonoUsbError.ErrorPipe:
                return("Pipe error or endpoint halted");

            case MonoUsbError.ErrorInterrupted:
                return("System call interrupted (perhaps due to signal)");

            case MonoUsbError.ErrorNoMem:
                return("Insufficient memory");

            case MonoUsbError.ErrorIOCancelled:
                return("Transfer was canceled");

            case MonoUsbError.ErrorNotSupported:
                return("Operation not supported or unimplemented on this platform");

            default:
                return("Unknown error:" + errcode);
            }
        }
 /// <summary>Open a device handle from <paramref name="profileHandle"/>.</summary>
 /// <remarks>
 /// <para>A handle allows you to perform I/O on the device in question.</para>
 /// <para>To close a device handle call its <see cref="SafeHandle.Close"/> method.</para>
 /// <para>This is a non-blocking function; no requests are sent over the bus.</para>
 /// <note title="Libusb-1.0 API Note:" type="cpp">The <see cref="MonoUsbDeviceHandle(MonoUsbProfileHandle)"/> constructor is roughly equivalent to <a href="http://libusb.sourceforge.net/api-1.0/group__dev.html#ga8163100afdf933fabed0db7fa81c89d1">libusb_open()</a>.</note>
 /// </remarks>
 /// <param name="profileHandle">A device profile handle.</param>
 public MonoUsbDeviceHandle(MonoUsbProfileHandle profileHandle)
     : base(IntPtr.Zero)
 {
     IntPtr pDeviceHandle = IntPtr.Zero;
     int ret = MonoUsbApi.Open(profileHandle, ref pDeviceHandle);
     if (ret < 0 || pDeviceHandle==IntPtr.Zero)
     {
         lock (handleLOCK)
         {
             mLastReturnCode = (MonoUsbError) ret;
             mLastReturnString = MonoUsbApi.StrError(mLastReturnCode);
         }
         SetHandleAsInvalid();
     }
     else
     {
         SetHandle(pDeviceHandle);
     }
 }
示例#6
0
        /// <summary>Open a device handle from <paramref name="profileHandle"/>.</summary>
        /// <remarks>
        /// <para>A handle allows you to perform I/O on the device in question.</para>
        /// <para>To close a device handle call its <see cref="SafeHandle.Close"/> method.</para>
        /// <para>This is a non-blocking function; no requests are sent over the bus.</para>
        /// <note title="Libusb-1.0 API Note:" type="cpp">The <see cref="MonoUsbDeviceHandle(MonoUsbProfileHandle)"/> constructor is roughly equivalent to <a href="http://libusb.sourceforge.net/api-1.0/group__dev.html#ga8163100afdf933fabed0db7fa81c89d1">libusb_open()</a>.</note>
        /// </remarks>
        /// <param name="profileHandle">A device profile handle.</param>
        public MonoUsbDeviceHandle(MonoUsbProfileHandle profileHandle)
            : base(IntPtr.Zero)
        {
            IntPtr pDeviceHandle = IntPtr.Zero;
            int    ret           = MonoUsbApi.Open(profileHandle, ref pDeviceHandle);

            if (ret < 0 || pDeviceHandle == IntPtr.Zero)
            {
                lock (handleLOCK)
                {
                    mLastReturnCode   = (MonoUsbError)ret;
                    mLastReturnString = MonoUsbApi.StrError(mLastReturnCode);
                }
                SetHandleAsInvalid();
            }
            else
            {
                SetHandle(pDeviceHandle);
            }
        }
示例#7
0
 /// <summary>
 /// Get a string describing a <see cref="MonoUsbError"/>.
 /// </summary>
 /// <param name="errcode">The <see cref="MonoUsbError"/> code to retrieve a description for.</param>
 /// <returns>A string describing the <see cref="MonoUsbError"/> code.</returns>
 public static string StrError(MonoUsbError errcode)
 {
     switch (errcode)
     {
         case MonoUsbError.Success:
             return "Success";
         case MonoUsbError.ErrorIO:
             return "Input/output error";
         case MonoUsbError.ErrorInvalidParam:
             return "Invalid parameter";
         case MonoUsbError.ErrorAccess:
             return "Access denied (insufficient permissions)";
         case MonoUsbError.ErrorNoDevice:
             return "No such device (it may have been disconnected)";
         case MonoUsbError.ErrorBusy:
             return "Resource busy";
         case MonoUsbError.ErrorTimeout:
             return "Operation timed out";
         case MonoUsbError.ErrorOverflow:
             return "Overflow";
         case MonoUsbError.ErrorPipe:
             return "Pipe error or endpoint halted";
         case MonoUsbError.ErrorInterrupted:
             return "System call interrupted (perhaps due to signal)";
         case MonoUsbError.ErrorNoMem:
             return "Insufficient memory";
         case MonoUsbError.ErrorIOCancelled:
             return "Transfer was canceled";
         case MonoUsbError.ErrorNotSupported:
             return "Operation not supported or unimplemented on this platform";
         default:
             return "Unknown error:" + errcode;
     }
 }
示例#8
0
        void testComms()
        {
            if (profiles.Count < 1)
            {
                logger.info("testComms: no profiles");
                return;
            }

            foreach (MonoUsbProfile profile in profiles)
            {
                MonoUsbDeviceHandle device = null;
                try
                {
                    logger.info("Opening {0:x4}:{1:x4}", profile.DeviceDescriptor.VendorID, profile.DeviceDescriptor.ProductID);
                    device = profile.OpenDeviceHandle();
                    if (device.IsInvalid)
                    {
                        logger.error("Failed opening device handle: {0} ({1})", MonoUsbDeviceHandle.LastErrorCode, MonoUsbDeviceHandle.LastErrorString);
                        continue;
                    }

                    // re-confirm configurations for this profile
                    for (byte i = 0; i < profile.DeviceDescriptor.ConfigurationCount; i++)
                    {
                        MonoUsbConfigHandle configHandle;
                        if (MonoUsbApi.GetConfigDescriptor(profile.ProfileHandle, i, out configHandle) < 0)
                        {
                            continue;
                        }
                        if (configHandle.IsInvalid)
                        {
                            continue;
                        }
                        MonoUsbConfigDescriptor configDescriptor = new MonoUsbConfigDescriptor(configHandle);
                        logger.info("  configuration #{0}: {1} ({2})", i, configDescriptor.bConfigurationValue, configDescriptor);
                        logger.info("      type       = {0}", configDescriptor.bDescriptorType);
                        logger.info("      length     = {0}", configDescriptor.bLength);
                        logger.info("      attributes = {0:x2}", configDescriptor.bmAttributes);
                        logger.info("      interfaces = {0}", configDescriptor.bNumInterfaces);
                        logger.info("      extLength  = {0}", configDescriptor.ExtraLength);
                        logger.info("      iConfig    = {0}", configDescriptor.iConfiguration);
                        logger.info("      maxPower   = {0}", configDescriptor.MaxPower);
                        logger.info("      totalLength= {0}", configDescriptor.wTotalLength);
                    }

                    int result = 0;

                    // Set Configuration
                    // Note: http://libusb.sourceforge.net/api-1.0/caveats.html#configsel
                    MonoUsbError error = (MonoUsbError)(result = MonoUsbApi.SetConfiguration(device, 1));
                    if (false && result < 0)
                    {
                        logger.error("Failed SetConfiguration: {0} ({1}) (result = {2})", error, MonoUsbApi.StrError(error), result);
                        continue;
                    }

                    // Claim Interface
                    error = (MonoUsbError)(result = MonoUsbApi.ClaimInterface(device, 0));
                    if (result < 0)
                    {
                        logger.error("Failed ClaimInterface: {0} ({1})", error, MonoUsbApi.StrError(error));
                        continue;
                    }

                    // retain device handles
                    devices.Add(device);

                    byte DEVICE_TO_HOST      = 0xc0;
                    byte SECOND_TIER_COMMAND = 0xff;
                    byte GET_MODEL_CONFIG    = 0x01;
                    byte PAGE_SIZE           = 64;
                    byte PAGE_ID             = 0;
                    int  TIMEOUT_MS          = 1000;

                    // Create a vendor specific control setup, allocate 1 byte for return control data.
                    // byte requestType = (byte)(UsbCtrlFlags.Direction_In | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.RequestType_Vendor);
                    // byte request = 0x0F;
                    // MonoUsbControlSetupHandle controlSetupHandle = new MonoUsbControlSetupHandle(requestType, request, 0, 0, 1);

                    MonoUsbControlSetupHandle controlSetupHandle = new MonoUsbControlSetupHandle(DEVICE_TO_HOST, SECOND_TIER_COMMAND, GET_MODEL_CONFIG, PAGE_ID, PAGE_SIZE);

                    // Transfer the control setup packet
                    int len = libusb_control_transfer(device, controlSetupHandle, TIMEOUT_MS);
                    if (len > 0)
                    {
                        logger.info("Success");
                        byte[] ctrlDataBytes  = controlSetupHandle.ControlSetup.GetData(len);
                        string ctrlDataString = Helper.HexString(ctrlDataBytes, String.Empty, "h ");
                        logger.info("Return Length: {0}", len);
                        logger.info("DATA (hex)   : [ {0} ]", ctrlDataString.Trim());
                    }
                    MonoUsbApi.ReleaseInterface(device, 0);
                }
                finally
                {
                    if (device != null)
                    {
                        logger.info("closing device");
                        device.Close();
                    }
                }
            }
        }