You safely remove the USB device from the USB port. You reconnect the same USB device or a different USB device to the same USB port on the hub. In this scenario, the computer does not detect the USB device. Note This issue affects USB 2.0 hubs and USB 2.0 components in USB 3.0 hubs. This issue occurs because the USB port is disabled. Windows may install drivers for select devices, say the graphics card, under certain circumstances. This happens by default for instance when the device is setup, but may also happen when Microsoft pushes driver updates through Windows Updates. USB describes a wide family of related protocols. USB HID is a subset, but this still covers a large array of devices. The HID specs defines a 32 bits 'usage' identifier supporting up to 4 billion different types of HID devices, although only a fraction of those values have been assigned so far. The Windows API you'll probably need is Raw Input.
Uninstall the USB Controllers. A) Click Start and type devmgmt.msc, and then press Enter. B) Expand the Universal Serial Bus Controllers section. C) Uninstall each of the devices under the USB Controller section by right-clicking on each one, and then clicking Uninstall. D) Close the Device Manager and restart your computer.
Info:
Model: HID Global OMNIKEY Card Reader DriversDrivers Hid Global Usb Devices Wireless Adapter
Vendor: HID Global CorporationVersion: 1.2.29.156, v.1.2.24.27, v.1.2.20.0, v.1.2.6.5
Operating system: Windows XP, Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10
Bits: 32-bit (x86), 64-bit (x64)
Driver Date: 2017-05-25
Size:
Drivers Hid Global Usb Devices Dongle
3.8 mbDriver description
Download driver HID Global OMNIKEY Card Reader Drivers version 1.2.29.156, v.1.2.24.27, v.1.2.20.0, v.1.2.6.5 for Windows XP, Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 32-bit (x86), 64-bit (x64).Screenshot of files
Installation screenshots HID Global OMNIKEY Card Reader Drivers
File Name
hid_global_xchip_driver_1.2.29.156.zip - Windows XP/Vista/7/8/8.1/10 32-64 bits (1.5 mb) v.1.2.29.156 - 25.05.2017
hid_omnikey3x2x_x86_w7_r1_2_24_27.zip - Windows XP/Vista/7 32 bits (3.8 mb) v.1.2.24.27 - 20.03.2014
hid_omnikey3x2x_x64_w7_r1_2_24_27.zip - Windows XP/Vista/7 64 bits (4.1 mb) v.1.2.24.27 - 20.03.2014
hid_omnikey3x2x_x64_r1_2_20_0.exe - Windows XP/Vista/7 64 bits (2.8 mb) v.1.2.20.0 - 08.08.2013
hid_omnikey3x2x_x86_r1_2_20_0.exe - Windows XP/Vista/7 32 bits (2.7 mb) v.1.2.20.0 - 08.08.2013
hid_omnikey3x2x_x64_w8_r1_2_24_27.zip - Windows 8 64 bits (4 mb) v.1.2.24.27 - 20.03.2014
hid_omnikey3x2x_w8_x64_r1_2_20_0.exe - Windows 8 64 bits (4 mb) v.1.2.20.0 - 08.08.2013
hid_omnikey3x2x_x86_w8_r1_2_24_27.zip - Windows 8 32 bits (3.8 mb) v.1.2.24.27 - 20.03.2014
hid_omnikey3x2x_w8_x86_r1_2_20_0.exe - Windows 8 32 bits (2.7 mb) v.1.2.20.0 - 08.08.2013
omnikey3x21_w8_only_x86_r1_2_24_27.exe - manual install, Windows 8/8.1 32 bits (0.2 mb) v.1.2.24.27 - 20.03.2014
omnikey3x21_w8_only_x64_r1_2_24_27.exe - manual install, Windows 8/8.1 64 bits (0.3 mb) v.1.2.24.27 - 20.03.2014
bu_win10_32_release_20140320_1.2.24.27.exe - manual install, Windows 10 32 bits (0.3 mb) v.1.2.24.27 - 20.03.2014
bu_win10_64_release_20140320_1.2.24.27_0.exe - manual install, Windows 10 64 bits (0.3 mb) v.1.2.24.27 - 20.03.2014
drv_hid_global_1.2.6.5.zip - manual install, Windows XP/Vista/7 32 bits (0.1 mb) v.1.2.6.5 - 06.09.2011
This chapter describes how to develop a user-space tool that finds and communicates with an attached USB device and one of its interfaces.
Important: The sample code featured in this document is intended to illustrate how to access a USB device from an application. It is not intended to provide guidance on error handling and other features required for production-quality code.
Using USB Device Interfaces
Applications running in OS X get access to USB devices by using I/O Kit functions to acquire a device interface, a type of plug-in that specifies functions the application can call to communicate with the device. The USB family provides two types of device interface:
IOUSBDeviceInterface
for communicating with the device itselfIOUSBInterfaceInterface
for communicating with an interface in the device
Both device interfaces are defined in /System/Library/Frameworks/IOKit.framework/Headers/usb/IOUSBLib.h
.
Communicating with the device itself is usually only necessary when you need to set or change its configuration. For example, vendor-specific devices are often not configured because there are no default drivers that set a particular configuration. In this case, your application must use the device interface for the device to set the configuration it needs so the interfaces become available.
Important: If your application is sandboxed, it must request the com.apple.security.device.usb
entitlement in order to access USB devices.
The process of finding and communicating with a USB device is divided into two sets of steps. The first set outlines how to find a USB device, acquire a device interface of type IOUSBDeviceInterface
for it, and set or change its configuration. The second set describes how to find an interface in a device, acquire a device interface of type IOUSBInterfaceInterface
for it, and use it to communicate with that interface. If you need to communicate with an unconfigured device or if you need to change a device’s configuration, you follow both sets of steps. If you need to communicate with a device that is already configured to your specification, you follow only the second set of steps. The sample code in Accessing a USB Device follows both sets of steps and extends them to include setting up notifications it can receive when devices are dynamically added or removed.
Follow this first set of steps only to set or change the configuration of a device. If the device you’re interested in is already configured for your needs, skip these steps and follow the second set of steps.
Find the
IOUSBDevice
object that represents the device in the I/O Registry. This includes setting up a matching dictionary with a key from the USB Common Class Specification (see Finding USB Devices and Interfaces). The sample code uses the key elementskUSBVendorName
andkUSBProductName
to find a particular USB device (this is the second key listed in Table 1-2).Create a device interface of type
IOUSBDeviceInterface
for the device. This device interface provides functions that perform tasks such as setting or changing the configuration of the device, getting information about the device, and resetting the device.Examine the device’s configurations with
GetConfigurationDescriptorPtr
, choose the appropriate one, and callSetConfiguration
to set the device’s configuration and instantiate theIOUSBInterface
objects for that configuration.
Follow this second set of steps to find and choose an interface, acquire a device interface for it, and communicate with the device.
Create an interface iterator to iterate over the available interfaces.
Create a device interface for each interface so you can examine its properties and select the appropriate one. To do this, you create a device interface of type
IOUSBInterfaceInterface
. This device interface provides functions that perform tasks such as getting information about the interface, setting the interface’s alternate setting, and accessing its pipes.Use the
USBInterfaceOpen
function to open the selected interface. This will cause the pipes associated with the interface to be instantiated so you can examine the properties of each and select the appropriate one.Communicate with the device through the selected pipe. You can write to and read from the pipe synchronously or asynchronously—the sample code in Accessing a USB Device shows how to do both.
Accessing a USB Device
This section provides snippets of sample code that show how to access a Cypress EZ-USB chip with an 8051 microcontroller core. The sample code follows the first set of steps in section Using USB Device Interfaces to find the Cypress EZ-USB chip in its default, unprogrammed state (also referred to as the “raw device”). It then configures the device and downloads firmware provided by Cypress to program the chip to behave as a device that echoes all information it receives on its bulk out pipe to its bulk in pipe.
Once the chip has been programmed, the device nub representing the default, unprogrammed device is detached from the I/O Registry and a new device nub, representing the programmed chip, is attached. To communicate with the programmed chip (also referred to as the “bulk test device”), the sample code must perform the first set of steps again to find the device, create a device interface for it, and configure it. Then it performs the second set of steps to find an interface, create a device interface for it, and test the device. The sample code also shows how to set up notifications for the dynamic addition and removal of a device.
Important: If your application is sandboxed, it must request the com.apple.security.device.usb
entitlement in order to access USB devices.
Definitions and Global Variables
The code in the USB Notification Example uses the definitions and global variables shown in Listing 2-1. The definition of USE_ASYNC_IO
allows you to choose to use either synchronous or asynchronous calls to read from and write to the chip by commenting out the line or leaving it in, respectively. The definition of kTestMessage
sets up a simple message to write to the device. The remaining definitions are specific to the Cypress EZ-USB chip.
Listing 2-1 Definitions and global variables
The main Function
The main
function in the USB Notification Example project (contained in the file main.c
) accomplishes the following tasks.
It establishes communication with the I/O Kit and sets up a matching dictionary to find the Cypress EZ-USB chip.
It sets up an asynchronous notification to be called when an unprogrammed (raw) device is first attached to the I/O Registry and another to be called when the device is removed.
It modifies the matching dictionary to find the programmed (bulk test) device.
It sets up additional notifications to be called when the bulk test device is first attached or removed.
It starts the run loop so the notifications that have been set up will be received.
The main
function uses I/O Kit functions to set up and modify a matching dictionary and set up notifications, and Core Foundation functions to set up the run loop for receiving the notifications. It calls the following functions to access both the raw device and the bulk test device.
RawDeviceAdded
, shown in Listing 2-3, iterates over the set of matching devices and creates a device interface for each one. It callsConfigureDevice
(shown in Listing 2-5) to set the device’s configuration, and thenDownloadToDevice
(shown in Listing 2-6) to download the firmware to program it.RawDeviceRemoved
, shown in Listing 2-4, iterates over the set of matching devices and releases each one in turn.BulkTestDeviceAdded
, shown in Listing 2-7, iterates over the new set of matching devices, creates a device interface for each one, and callsConfigureDevice
(shown in Listing 2-5) to set the device’s configuration. It then callsFindInterfaces
(shown in Listing 2-8) to get access to the interfaces on the device.BulkTestDeviceRemoved
iterates over the new set of matching devices and releases each one in turn. This function is not shown in this chapter; seeRawDeviceRemoved
(Listing 2-4) for a nearly identical function.
Listing 2-2 The main function
Working With the Raw Device
Now that you’ve obtained an iterator for a set of matching devices, you can use it to gain access to each raw device, configure it, and download the appropriate firmware to it. The function RawDeviceAdded
(shown in Listing 2-3) uses I/O Kit functions to create a device interface for each device and then calls the following functions to configure the device and download firmware to it.
ConfigureDevice
, shown in Listing 2-5, uses device interface functions to get the number of configurations, examine the first one, and set the device’s configuration.DownloadToDevice
, shown in Listing 2-6, downloads the firmware inbulktest.c
to the device.
Listing 2-3 Accessing and programming the raw device
The function RawDeviceRemoved
simply uses the iterator obtained from the main
function (shown in Listing 2-2) to release each device object. This also has the effect of arming the raw device termination notification so it will notify the program of future device removals. RawDeviceRemoved
is shown in Listing 2-4.
Listing 2-4 Releasing the raw device objects
Although every USB device has one or more configurations, unless the device is a composite class device that’s been matched by the AppleUSBComposite
driver which automatically sets the first configuration, none of those configurations may have been set. Therefore, your application may have to use device interface functions to get the appropriate configuration value and use it to set the device’s configuration. In the sample code, the function ConfigureDevice
(shown in Listing 2-5) accomplishes this task. In fact, it is called twice: once by RawDeviceAdded
to configure the raw device and again by BulkTestDeviceAdded
(shown in Listing 2-7) to configure the bulk test device.
Listing 2-5 Configuring a USB device
Now that the device is configured, you can download firmware to it. Cypress makes firmware available to program the EZ-USB chip to emulate different devices. The sample code in this document uses firmware that programs the chip to be a bulk test device, a device that takes the data it receives from its bulk out pipe and echoes it to its bulk in pipe. The firmware, contained in the file bulktest.c
, is an array of INTEL_HEX_RECORD
structures (defined in the file hex2c.h
).
The function DownloadToDevice
uses the function WriteToDevice
(shown together in Listing 2-6) to prepare the device to receive the download and then to write information from each structure to the appropriate address on the device. When all the firmware has been downloaded, DownloadToDevice
calls WriteToDevice
a last time to inform the device that the download is complete. At this point, the raw device detaches itself from the bus and reattaches as a bulk test device. This causes the device nub representing the raw device to be removed from the I/O Registry and a new device nub, representing the bulk test device, to be attached.
Listing 2-6 Two functions to download firmware to the raw device
Working With the Bulk Test Device
After you download the firmware to the device, the raw device is no longer attached to the bus. To gain access to the bulk test device, you repeat most of the same steps you used to get access to the raw device.
Use the iterator obtained by a call to
IOServiceAddMatchingNotification
in themain
function (shown in Listing 2-2) to iterate over a set of matching devices.Create a device interface for each device.
Configure the device.
This time, however, the next step is to find the interfaces on the device so you can choose the appropriate one and get access to its pipes. Because of the similarities of these tasks, the function BulkTestDeviceAdded
follows the same outline of the RawDeviceAdded
function except that instead of downloading firmware to the device, it calls FindInterfaces
(shown in Listing 2-8) to examine the available interfaces and their pipes. The code in Listing 2-7 replaces most of the BulkTestDeviceAdded
function’s code with comments, focusing on the differences between it and the RawDeviceAdded
function.
Listing 2-7 Accessing the bulk test device
The function BulkTestDeviceRemoved
simply uses the iterator obtained from the main
function (shown in Listing 2-2) to release each device object. This also has the effect of arming the bulk test device termination notification so it will notify the program of future device removals.The BulkTestDeviceRemoved
function is identical to the RawDeviceRemoved
function (shown in Listing 2-4), with the exception of the wording of the printed error statement.
Working With Interfaces
Now that you’ve configured the device, you have access to its interfaces. The FindInterfaces
function (shown in Listing 2-8) creates an iterator to iterate over all interfaces on the device and then creates a device interface to communicate with each one. For each interface found, the function opens the interface, determines how many endpoints (or pipes) it has, and prints out the properties of each pipe. Because opening an interface causes its pipes to be instantiated, you can get access to any pipe by using its pipe index. The pipe index is the number of the pipe within the interface, ranging from one to the number of endpoints returned by GetNumEndpoints
. You can communicate with the default control pipe (described in USB Transfer Types) from any interface by using pipe index 0, but it is usually better to use the device interface functions for the device itself (see the use of IOUSBDeviceInterface
functions in Listing 2-5).
The sample code employs conditional compilation using #ifdef
and #ifndef
to demonstrate both synchronous and asynchronous I/O. If you’ve chosen to test synchronous I/O, FindInterfaces
writes the test message (defined in Listing 2-1) to pipe index 2 on the device and reads its echo before returning. For asynchronous I/O, FindInterfaces
first creates an event source and adds it to the run loop created by the main
function (shown in Listing 2-2). It then sets up an asynchronous write and read that will cause a notification to be sent upon completion. The completion functions WriteCompletion
and ReadCompletion
are shown together in Listing 2-9.
Listing 2-8 Finding interfaces on the bulk test device
When an asynchronous write action is complete, the WriteCompletion
function is called by the notification. WriteCompletion
then calls the interface function ReadPipeAsync
to perform an asynchronous read from the pipe. When the read is complete, control passes to ReadCompletion
which simply prints status messages and adds a NULL
termination to the global buffer containing the test message read from the device. The WriteCompletion
and ReadCompletion
functions are shown together in Listing 2-9.
Listing 2-9 Two asynchronous I/O completion functions
Copyright © 2002, 2012 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2012-01-09