4 Replies Latest reply on Jul 27, 2017 9:51 AM by rguevara

    How to use Intel Atom E3800 Windows IO driver for I2C?




      after trying to figure out how to communicate with the I2C driver using the Win API for several days, I hope you can help me,.

      The problem is that no devices can be found using the global unique identifier I2C_LPSS_INTERFACE_GUID defined in the I2Cpublic.h header file which was included in the driver package and that should be used within the user-mode Win API functions according to the Software Developer's Manual.

      To get the device name and create a handle for that device I used the following procedure:


      1. Get the device interface class corresponding to that GUID:

           hDvcInfoSet = SetupDiGetClassDevs(&I2C_LPSS_INTERFACE_GUID, NULL, NULL, DIGCF_ALLCLASSES)


      2. Loop through all the devices information elements, create an interface for each element and get details about each interface:

           while (SetupDiEnumDeviceInfo(hDvcInfoSet, i, &devInfo)) {

                if (devInfo.ClassGuid == I2C_LPSS_INTERFACE_GUID) {

                     SetupDiCreateDeviceInterface(hDvcInfoSet, &devInfo, &I2C_LPSS_INTERFACE_GUID, NULL, 0, &dvcInterfaceData)

                     SetupDiGetDeviceInterfaceDetail(hDvcInfoSet, &dvcInterfaceData, requiredSize, NULL, NULL)




      In the details of an interface the device path can be found which can be used to create a handle.

      The problem was, that there were no device information elements with that GUID, so I took a look into setup information file used to install the I2C controller driver (iaioi2c.inf).

      There is also a ClassGuid defined, but it does not correspond to the one in the header file.

      Therefore I tried the other GUID and then I could find several device information elements that use this identifier and created an interface for each to get the device paths.

      Those paths where either part of root, acpi or pci which already confuses since I thought I was only filtering for I2C devices which should all be part of pci.

      Anyway even the devices being part of pci had other hardware Id's than specified in the iaioi2c.inf file and the datasheet of the Intel Atom E3800 family.

      There, it says (on page 81 - PCI configuration space) the seven I2C ports have the device IDs 0F41h-0F47h.

      Hence, the I2C ports should have HW IDs like that (which are also specified in the iaioi2c.inf file):


      But the output when printing the device path of an device interface I got was something like this:

      PCI\VEN_8086&DEV_0F4C&SUBSYS_0F4C8086&REV_11#3&11583659&0&e2#{<the class GUID>}


      So my questions are:

      1. Why can't I find devices when I follow the software developer's manual procedure?

      2. Why do I get other HW IDs of the I2C ports if I use the class GUID defined in the iaioi2c.inf file?

      3. Is there a better manual/guide how to use the Intel Atom E3800 I2C controller in Windows?


      The driver package including the header files and the software developer's manual can be found here:

      Download Intel® Embedded Drivers for Windows* 7 (32-bit and 64-bit)


      Thank you! (Only for reading all this stuff)