/// <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); }
/// <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); } }
/// <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); } }
/// <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; } }
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(); } } } }