Troubleshooting SIMATIC IOT2040 USB Detection Failure on Windows
The SIMATIC IOT2040 is a compact industrial IoT gateway based on the Intel Quark X1020 (Galileo-generation) SoC. It is part of the SIMATIC IOT2000 family and is frequently programmed through the Arduino IDE using its Arduino Uno R3-compatible headers. A common commissioning fault is that the engineering PC running Windows 10 or Windows 7 fails to enumerate the device in Device Manager when the IOT2040 is connected over the µUSB (device) port. No new COM port appears, no CDC (Communications Device Class) entry is created, and the Arduino IDE cannot select a serial port for upload. This article provides a complete field-tested diagnostic and remediation procedure for the most common variants of this fault, including the tell-tale "USB LED permanently green even with no cable attached" symptom that indicates a power-rail or firmware issue on the gateway itself.
1. Problem Summary
When the IOT2040 is connected to a Windows PC using a micro-USB data cable (not a charge-only cable), one of the following symptoms is observed:
| Symptom | Typical Cause | Severity |
|---|---|---|
| No new "Ports (COM & LPT)" entry appears in Device Manager | USB CDC driver not installed or µUSB cable is charge-only | Recoverable |
| Entry appears under "Other devices" as IOT2040 with yellow exclamation | Driver signature missing or driver not associated | Recoverable |
| No change at all in Device Manager when cable is plugged/unplugged | Galileo CDC service not running, port disabled, or hardware fault | Recoverable / hardware dependent |
| USB Status LED solid green, even with no USB cable attached | Internal 3.3 V rail pulled up incorrectly; firmware loop or hardware defect | Hardware dependent |
| PC enumerates then disconnects the device repeatedly (sound of USB disconnect) | Insufficient USB port current, defective cable, or unstable SoC | Recoverable |
| Arduino IDE "Port" menu greyed out | No CDC COM port enumerated (consequence of above) |
The target COM port expected on a healthy IOT2040 is between COM3 and COM9 for the first device, with the number assigned incrementally by Windows. The driver it should bind to is the Intel Galileo (CDC) Virtual COM Port driver, distributed in the IntelGalileoWindowsSerialDrivers package (or embedded in the Arduino IDE Galileo board package).
2. Hardware Reference: SIMATIC IOT2040
Before diving into the diagnostic, lock down the hardware reference values used in the troubleshooting steps:
| Parameter | Value |
|---|---|
| Article number (MLFB) | 6ES7647-0AA00-0YA2 |
| SoC | Intel Quark X1020 (x86, 32-bit, 400 MHz) |
| RAM | 1 GB DDR3 |
| Boot flash (NOR) | 8 MB on-board SPI |
| Mass storage | MicroSD card slot, 4-32 GB, FAT32 / ext4 |
| Network | 2x RJ45 10/100 Mbit/s (Realtek RTL8111GN) |
| USB host | 2x USB 2.0 Type-A (Rear + front) |
| USB device | 1x µUSB Type-B (console / Arduino serial) |
| Arduino shield headers | Uno R3 compatible (D0-D13, A0-A5, IOREF, RESET, 3V3, 5V, GND, VIN) |
| Console baud (default) | 115200 8N1 (root shell) |
| Power input | 9-36 V DC, Phoenix Contact MC 1,5/ 3-G-3,5 |
| Operating system image | Siemens IOT2000 Example Image (Yocto Linux 1.7 / kernel 4.4) |
The µUSB port is wired to a USB 2.0 device controller inside the Quark SoC. On power-up, the on-board firmware exposes a CDC ACM (Communications Device Class / Abstract Control Model) interface on this port, which Windows binds to a virtual COM port. The driver that the OS uses is the same one used for the Intel Galileo Gen 2 reference board — they share a common USB device PID/VID (VID 0x8087, PID 0x0A65 for the CDC composite). The Arduino IDE Galileo board core distributes this driver automatically; manual install is required when using the IDE in portable mode or when the bundled driver fails.
3. Root Cause Analysis
The failure tree for "PC does not detect IOT2040" branches into four dominant causes. Each must be ruled out in order.
3.1 Cause A — USB cable is charge-only or defective
The most common field failure. Many micro-USB cables shipped with phone chargers, power banks, and low-cost IoT devices have only the VBUS and GND conductors connected; the D+ and D- data lines are not bonded. Plugging such a cable into the IOT2040 will illuminate the USB LED (because VBUS is present) but the host PC will see no device at all — exactly the symptom reported. A data cable is always required.
3.2 Cause B — Intel Galileo CDC driver not bound
On a clean Windows 10 / 11 install with driver signature enforcement enforced, the Galileo CDC driver (usbserm64.sys + usbser.sys with the matching .inf) must be installed from the Arduino IDE Galileo package or from the official Intel driver download. The fact that the user is on Arduino IDE 1.8.x with the Intel Galileo boards by Intel package installed does not guarantee the Windows driver was copied to the system store. Manual installation through Device Manager → "Update Driver" → "Let me pick from a list" → "Show All Devices" → "Have Disk" is often necessary.
3.3 Cause C — The Galileo CDC service on the IOT2040 has been disabled
On the Siemens IOT2000 Example Image, the systemd unit galileo-target.service is responsible for the Arduino-side serial bridge. If this service is disabled or masked, the µUSB CDC endpoint may not enumerate on the host even though the Linux kernel is running. The user has explicitly confirmed that they have not disabled it via the iot2000setup tool, but the diagnostic must still confirm it is in state active (running) from the Yocto console.
3.4 Cause D — Hardware fault on the IOT2040 mainboard
The "USB LED stays green even with no cable plugged in" symptom is a strong indicator of a hardware-level issue. The USB LED on the IOT2040 is driven by the VBUS-sense line of the µUSB port going through a current-limiting resistor to the green LED. If VBUS is being held high internally — typically because the 3.3 V regulator on the Quark SoC daughter-card has failed and is back-feeding the rail — the LED will glow at full brightness with no cable attached. This is a non-recoverable field state and requires RMA.
4. Prerequisites
Before running the diagnostic, ensure the following are available:
- A known-good micro-USB data cable (tested by plugging a phone into the same PC; the phone must enumerate as a Media Transfer Device).
- Windows 10 (build 1909 or later) or Windows 7 SP1. Windows 11 is supported but driver signature enforcement is stricter — disable secure boot temporarily or install in test-signing mode.
- Arduino IDE 1.8.13 or later with the Intel Galileo boards by Intel package (Tools → Board → Boards Manager → search "Galileo" → install).
- Siemens SIMATIC IOT2000 Example Image V3.2.4 (or the latest) on a microSD card.
- The official IntelGalileoWindowsSerialDrivers package, downloaded directly from the Intel archived downloads site (see reference link in Section 9).
- Administrator rights on the Windows PC.
- A second known-good USB port on the PC (use rear panel directly on the chipset, not a hub).
5. Step-by-Step Diagnostic Procedure
Execute the following checks in the listed order. Do not skip — every step eliminates one branch of the failure tree.
Step 1 — Validate the cable
- Mark the suspect cable.
- Plug a known phone (any Android with a micro-USB port) into the same Windows PC using the suspect cable.
- If the phone does not appear in Device Manager at all, the cable is charge-only. Replace it with a data-rated cable (e.g., Anker PowerLine Micro, Belkin MIXIT).
- Re-test with the IOT2040 using the new cable.
Step 2 — Validate the USB port and power
- Plug the IOT2040 into a rear-panel USB 2.0 port on the PC (directly on the motherboard, not a front-panel header or hub).
- Open Device Manager (devmgmt.msc) → View → Devices by container.
- Unplug the IOT2040; observe which entries disappear. Re-plug; observe which entries reappear.
- If nothing changes, the IOT2040 µUSB port is not presenting a USB device descriptor at all. Proceed to Step 3.
Step 3 — Check the USB LED behavior
With the IOT2040 powered (24 V DC applied, not via USB) and no micro-USB cable connected, observe the USB LED on the front of the housing.
| LED state | Diagnosis | Action |
|---|---|---|
| Off | Normal | Continue to Step 4 |
| Faint glow | Residual VBUS from the PC, not a fault | Continue to Step 4 |
| Solid green at full brightness | Hardware fault, internal 3.3 V rail back-feeding LED | Replace the unit — RMA to Siemens. Do not continue software troubleshooting |
| Blinking green | Bootloader running, image not loaded | Re-flash the SD card image (Step 8) |
Step 4 — Install the Intel Galileo CDC driver manually
- Download the IntelGalileoWindowsSerialDrivers package from the official Intel archive (URL in Section 9).
- Extract the ZIP to a known folder, e.g.,
C:\Drivers\Galileo\. - Open Device Manager. Look for an entry under "Other devices" labeled Galileo, IOT2040, or USB Serial Device with a yellow exclamation.
- Right-click → "Update driver" → "Browse my computer for driver software" → "Let me pick from a list of available drivers on my computer" → "Show All Devices" → "Next" → "Have Disk".
- Browse to
C:\Drivers\Galileo\and select the.inffile. Confirm the driver "Intel(R) Galileo Virtual COM Port" is shown. - Click Next. If Windows warns about driver signature, choose "Install this driver software anyway".
- Reboot when prompted.
- Repeat the install a second time (this is a known workaround documented in the IOT2000 community, see Section 9 reference to the official Siemens tutorial). The first install binds the CDC ACM lower filter, the second binds the upper filter for the COM port number assignment.
Step 5 — Verify COM port enumeration
- After the second install and reboot, plug the IOT2040 into the PC.
- Open Device Manager → "Ports (COM & LPT)".
- A new entry "USB Serial Device (COMx)" or "Intel Galileo (COMx)" should appear.
- Note the COM number (e.g., COM7).
- If the entry does not appear, proceed to Step 6.
Step 6 — Connect via Yocto console over Ethernet and validate galileo-target
- Connect the IOT2040 Ethernet port 0 (X1) to the same network as the PC.
- Open a serial terminal (PuTTY, Tera Term) over SSH to the default address
192.168.200.1(factory DHCP fallback) or scan with Advanced IP Scanner. Login asroot, no password on the Example Image by default. - Run the following commands and capture the output:
systemctl status galileo-target lsmod | grep cdc_acm lsusb dmesg | grep -i cdc - Expected output for a healthy unit:
galileo-target.service - "Galileo target service" Loaded: loaded (/lib/systemd/system/galileo-target.service; enabled) Active: active (running) since ... - If
galileo-targetisinactive (dead)ormasked, re-enable it:systemctl unmask galileo-target systemctl enable galileo-target systemctl start galileo-target - If
lsusbshows no entry for VID 0x8087 / PID 0x0A65, the IOT2040 is not enumerating its device controller. This confirms a host-side or hardware fault — continue to Step 7.
Step 7 — Validate power supply and SD card
- Verify the 24 V DC supply is in the 9-36 V range and capable of at least 1 A continuous. Undervoltage on the Quark SoC manifests as silent µUSB enumeration failure because the SoC never brings up the USB device controller.
- Re-flash the SD card with the Siemens Example Image V3.2.4 (or latest) using a tool like balenaEtcher and a known-good microSD card (SanDisk Industrial 8 GB minimum, A1-rated).
- Insert the SD card, apply power, wait 60 seconds, then re-test the µUSB enumeration on the Windows PC.
Step 8 — Re-flash the IOT2040 firmware
Recovery via the on-board bootloader:
- Download the firmware package from the Siemens IOT2000 GitHub (see Section 9).
- Copy the contents to the root of the microSD card while it is removed from the IOT2040.
- Re-insert the SD card, apply 24 V DC power.
- The recovery process runs for approximately 4 minutes; the heartbeat LED blinks at 2 Hz.
- Once complete, the gateway reboots into the new image. Re-test the µUSB enumeration.
Step 9 — Final hardware test
If all software steps fail, perform an IOT2040 hardware swap with a known-good unit. If the known-good unit enumerates on the same PC with the same cable and driver stack, the original unit is faulty and must be returned through the standard Siemens RMA process (article number 6ES7647-0AA00-0YA2).
6. Arduino IDE Configuration Verification
Once the COM port is enumerated, configure the Arduino IDE to match the IOT2040:
- Open Arduino IDE → Tools menu.
- Board: Intel Galileo Gen2
- Port: select the COM port noted in Step 5 (e.g., COM7).
- Programmer: ArduinoISP (default for Galileo).
- Open File → Examples → 01.Basics → Blink.
- Click Upload. The IDE will compile and push the sketch over the CDC COM port to
/sketch/sketch.elfon the IOT2040. The galileo-target service on the device restarts the sketch within 2-3 seconds. - Verify the on-board LED13 (the LED wired to Arduino pin 13 on the shield headers) blinks at 1 Hz.
avrdude: stk500_recv(): programmer is not responding", the galileo-target service is not running. Repeat Step 6 from the Yocto console.7. Driver-Specific Installation Notes for Windows 10 / 11
On Windows 10 build 1903 and later, Microsoft enabled driver blocklist rules for unsigned drivers. The Intel Galileo CDC driver was signed by Intel under SHA-1, which is no longer accepted by default. Workarounds:
- Open Advanced Boot Options (Shift + click Restart) → Troubleshoot → Advanced → Startup Settings → Restart → Press 7 (Disable driver signature enforcement).
- Boot into Windows, install the driver as documented in Step 4.
- Reboot normally. The driver will continue to function because the hash is cached.
- For a permanent fix, add the driver to the
AllowTelemetrygroup policy or use the DriverPack Cloud to source a WHQL-signed equivalent.
For Windows 11 22H2 and later, the same procedure applies. Some users report that switching the USB port from USB 3.0 (blue) to USB 2.0 (black) resolves enumeration issues because the Galileo CDC endpoint descriptor uses bInterval values that confuse some USB 3.0 host controllers on first contact.
8. Validation Matrix
| Check | Expected State | Pass Condition |
|---|---|---|
| USB LED off with no cable | Off | Hardware OK |
| Device Manager shows "Intel Galileo (COMx)" | Present in "Ports (COM & LPT)" | Driver bound |
| Arduino IDE Port menu active | Non-greyed COM entry visible | Ready for upload |
| SSH console galileo-target.service | active (running) | Sketch bridge functional |
| Sketch upload completes | Bytes written counter increments | End-to-end OK |
| Pin 13 LED blinks after upload | 1 Hz square wave | Runtime OK |
9. References (Official Documentation)
- SIMATIC IOT2040 Operating Instructions (Siemens Support, entry ID 109741658)
- Siemens IOT2000 SDK and Example Image on GitHub
- Arduino IDE Getting Started Guide (official)
- Arduino IDE Download (official)
- Intel Galileo Board Package (official Arduino.cc)
- Siemens SIMATIC IOT2000 Product Family Page
10. FAQ
Why does the SIMATIC IOT2040 USB LED stay green even when no micro-USB cable is plugged in?
This is a strong indicator of a hardware-level fault on the mainboard. The USB LED is driven by the VBUS sense line, which is held at 0 V when no cable is connected. A permanently-lit LED means the 3.3 V regulator on the Quark SoC daughter-card is back-feeding the rail. The unit is non-recoverable in the field; replace through the standard Siemens RMA process for article number 6ES7647-0AA00-0YA2.
How do I install the Intel Galileo CDC driver manually on Windows 10?
Download the IntelGalileoWindowsSerialDrivers package from the official Intel download archive. Open Device Manager, locate the "Other devices" entry for the IOT2040 (or Galileo), right-click → Update Driver → Browse my computer → Let me pick from a list → Show All Devices → Have Disk → browse to the extracted .inf file → Next → install anyway. Reboot and repeat the install a second time — the first binds the CDC ACM lower filter and the second binds the upper filter required for COM port assignment.
What is the default COM port and baud rate for the IOT2040 on Windows?
The COM port number is assigned by Windows and is typically between COM3 and COM9 for the first Galileo-class device on the system. The default baud rate exposed by the IOT2040 µUSB CDC endpoint is 115200 8N1, matching the Yocto Linux console on the Ethernet-side SSH shell. The Arduino IDE uses 115200 baud for sketch upload to the galileo-target service.
My Arduino IDE shows the COM port but upload fails with "programmer is not responding" — what is wrong?
This means the COM port is enumerated by Windows but the galileo-target.service on the IOT2040 is not running. SSH into the device (default IP 192.168.200.1, user root, no password) and run systemctl status galileo-target. If the service is masked or inactive, execute systemctl unmask galileo-target, systemctl enable galileo-target, and systemctl start galileo-target, then retry the upload.
Can I use the SIMATIC IOT2050 with the same Arduino workflow and driver stack as the IOT2040?
No. The IOT2050 is based on an ARK RK3399 (ARM Cortex-A72) SoC and uses a different USB-to-serial bridge (typically FTDI or CP210x). Install the matching driver for the bridge chip on your IOT2050 SKU and select the appropriate board core in the Arduino IDE; the Intel Galileo CDC driver documented here is not compatible with the IOT2050.