CDC VCOM Driver For Panda II

A blast from the past but causing a very real problem now. I’ve reviewed all the old posts (including mine) but haven’t seen anything that helps the issue I’m seeing. I’ve been running a very stable application for decades that uses the old Panda II using GHI SDK 4.1.8. When plugged into a USB port it opens a virtual COM Port so a user can input some data. It’s always worked reliably but now when I check the Events tab in Device Properties I see these three messages from the date the driver was installed:

Driver Management has concluded the process to add Service usbser for Device Instance ID USB\VID_1B9F&PID_F001\0 with the following status: 0.

This was followed by a warning message:

Device settings for USB\VID_1B9F&PID_F001\0 were not migrated from previous OS installation due to partial or ambiguous device match.

Last Device Instance ID: USB\VID_046D&PID_C52B\5&30741cdd&0&9
Class GUID: {36fc9e60-c465-11cf-8056-444553540000}
Location Path: PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(9)
Migration Rank: 0xF000FFFFFFFF0033
Present: false
Status: 0xC0000719

And finally another information message:

Device USB\VID_1B9F&PID_F001\0 requires further installation.

In spite of these messages, The virtual COM port works on several different PC’s running both WIN 10 or WIN 11. However a new user at a different location cannot even get the device to show up in Device Manager on any PC they try.

I searched on the failed migration warning and got the following:

The error “Device settings were not migrated from previous OS installation due to partial or ambiguous device match” occurs when Windows fails to correctly transfer a device’s driver configuration during an update or upgrade. The issue is likely caused by the Logitech Unifying Receiver (VID_046D&PID_C52B), which was not migrated properly, leaving the port (identified as VID_0000&PID_0004) in an unusable state.

Any Idea on how to respond to or fix the issues raised in those three messages?
Thanks for any help or ideas.

I would like to uninstall driver and reinstall it again first.

Yes I’ve tried that many times with first uninstalling the device Then plugging it back into USB and attempting to update the driver but Windows says the best driver (Microsoft, 6/21/2006, version 10.0.26100.2454) is already installed.

If I uninstall and then tried to manually install the GHI CDC_Driver.inf first I get an error massage that says “The third-party INF does not contain digital signature information”. Is the original CDC_Driver from GHI not signed?

Thanks for looking into this.

Can you please verify few things:

  • Did it work then suddenly don’t work any more, on same PC?
  • It works on some PC but not on other?
  • Is it window 10 or 11?
  • “It’s always worked reliably but now when I check the Events tab in Device Properties I see these three messages from the date the driver was installed” => does it mean it still work but you are worry about the message? or it does not work now

Can you provide a bit more like small code to reproduce? SDK 4.1 is very old and it does not surprise me one day, windows is updated and old driver has trouble. Give us an easy way to reproduce it and let see what we can do.

Hi Dat_Tran. I agree this issue is based on an old SDK as I froze development to achieve some stability in the design. I know it’s so I really appreciate yoou taking a look at it. I’m pretty certain there must be some simple solution though, because several of my PC’s are working using a Microsoft Serial Com driver instead of the GHI CDC one. Others use the GHI CDC_Driver. Here are my responses to your questions:

Can you please verify few things:

  • Did it work then suddenly don’t work any more, on same PC?

    • It’s always worked on my 6 PC’s I use for testing and deployment. Both Windows 10 and 11. I’ve not had any problems other than the strange information and warnings from Device Manager Events.
  • It works on some PC but not on other?

    • I have a user in Utah who has plugged my device into USB but their PC’s do not do not appear to recognize the device at all – no setup messages and no new devices appearing in Device Manager. Both on Win 10 and Win 11 PC’s. The returned my device (the one using the Panda II) and it works fine on my end.
  • Is it window 10 or 11?

    • Both
  • “It’s always worked reliably but now when I check the Events tab in Device Properties I see these three messages from the date the driver was installed” => does it mean it still work but you are worry about the message? or it does not work now

    • It does still work and yes I am concerned about the messages because they may have something to do with why my Utah users are having problems but I can’t be sure of that until I know why the Device at “Device USB\VID_1B9F&PID_F001\0 requires further installation.”

      I believe USB\VID_1B9F&PID_001 is associated with the CDC VCOM function.

Can you provide a bit more like small code to reproduce? SDK 4.1 is very old and it does not surprise me one day, windows is update and old driver has trouble. Give us an easy way to reproduce it and let see what we can do.

Here’s a code snippet where the Panda II first checks to see if USB is connected by seeing if setting up mass storage with the SD card works. If that is confirmed it then stops mass storage and tries to startup CDC and if successful it will wait for up to 60 seconds for an operator on the PC to connect to the VCOM port and interact. If there is no interaction the code then reverts back to mass storage.

Sorry if the code didn’t format correctly. I’m having trouble getting the three ``` marks to start and stop the code. I’ll repost if I can figure out why it’s not working. Thanks again for you help.

            // SECTION 1
            // all the mass storage/VCOM/dateset/mass storage stuff
            try
            {
                led.Write(false);
                USBC_MassStorage ms = USBClientController.StandardDevices.StartMassStorage();
                // inserted a number of Thread.sleeps as a precaution.Since this only happens once on powerup we can suffer the delay
                Thread.Sleep(200);
                // Assume SD card is connected
                PersistentStorage sd = new PersistentStorage("SD"); // instantiate SD card
                ms.AttachLun(0, sd, " ", " ");
                Thread.Sleep(200);
                // enable host access 
                ms.EnableLun(0);
                Thread.Sleep(200);
                // Debug.Print("Attached and enabled SD Card & will see if it's running");
                USBClientController.State state = USBClientController.GetState();
                // Debug.Print("State " + state.ToString());
                Thread.Sleep(200);
                if (state == USBClientController.State.Running)
                {
                    // Debug.Print("USBClientController.State is Running.  will disable ms & attempt VCOM");
                    ms.DisableLun(0);
                    sd.UnmountFileSystem();
                    Thread.Sleep(2000);
                    sd.Dispose();
                    USBClientController.Stop();
                    Thread.Sleep(1000);
                    // this code segment is for an xxx second window to try and connect to VCOM
                    // Start CDC - requires that the FEZ is set
                    USBC_CDC cdc = USBClientController.StandardDevices.StartCDC();
                    try
                    {
                        int l = 0;
                        while (true)
                        {
                            // Check if connected to PC
                            if (USBClientController.GetState() != USBClientController.State.Running)
                            {
                                // Debug.Print("Waiting to connect to PC...   " + l.ToString());
                                l++;
                            }
                            else
                            {
                                led.Write(true);
                                byte delim = 13, lf = 12;
                                while (true)
                                {
                                    // set this time infinite or at least very long if TeraTerm macro is the interface - settled on 60 seconds as a reasonable time
                                    cdc.ReadTimeout = 60000;
                                Start:
                                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes("Current ADS time is " + DateTime.Now.ToString() + "\r\n");
                                    cdc.Write(bytes, 0, bytes.Length);

Could you post finished function? I believe there will be a lot more after this. No need to be right format.

Here is the complete section of code where mass storage and VCOM are used.

            // all the mass storage/VCOM/dateset/mass storage stuff
            try
            {
                led.Write(false);
                USBC_MassStorage ms = USBClientController.StandardDevices.StartMassStorage();
                // inserted a number of Thread.sleeps as a precaution.Since this only happens once on powerup we can suffer the delay
                Thread.Sleep(200);
                // Assume SD card is connected
                PersistentStorage sd = new PersistentStorage("SD"); // instantiate SD card
                ms.AttachLun(0, sd, " ", " ");
                Thread.Sleep(200);
                // enable host access 
                ms.EnableLun(0);
                Thread.Sleep(200);
                // Debug.Print("Attached and enabled SD Card & will see if it's running");
                USBClientController.State state = USBClientController.GetState();
                // Debug.Print("State " + state.ToString());
                Thread.Sleep(200);
                if (state == USBClientController.State.Running)
                {
                    // Debug.Print("USBClientController.State is Running.  will disable ms & attempt VCOM");
                    ms.DisableLun(0);
                    sd.UnmountFileSystem();
                    Thread.Sleep(2000);
                    sd.Dispose();
                    USBClientController.Stop();
                    Thread.Sleep(1000);
                    // this code segment is for an xxx second window to try and connect to VCOM
                    // Start CDC - requires that the FEZ is set for serial debug
                    USBC_CDC cdc = USBClientController.StandardDevices.StartCDC();
                    try
                    {
                        int l = 0;
                        while (true)
                        {
                            // Check if connected to PC
                            if (USBClientController.GetState() != USBClientController.State.Running)
                            {
                                // Debug.Print("Waiting to connect to PC...   " + l.ToString());
                                l++;
                            }
                            else
                            {
                                led.Write(true);
                                byte delim = 13, lf = 12;
                                while (true)
                                {
                                    // set this time infinite or at least very long if TeraTerm macro is the interface - settled on 60 seconds as a reasonable time
                                    cdc.ReadTimeout = 60000;
                                Start:
                                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes("Current ADS time is " + DateTime.Now.ToString() + "\r\n");
                                    cdc.Write(bytes, 0, bytes.Length);
                                    bytes = System.Text.Encoding.UTF8.GetBytes("To change the time use this format yyyy, mm, dd, hh, mm, ss\r\n");
                                    cdc.Write(bytes, 0, bytes.Length);
                                    /// Simple loop that reads single chars until delim byte
                                    /// and returns the string. We could improve perf by reading more chars per read.
                                    // private string ReadLine()
                                    // Read and buffer chars until a newline char.
                                    ArrayList line = new ArrayList();
                                    byte[] buf = new byte[1];
                                    int count = 0;
                                    while ((count = cdc.Read(buf, 0, 1)) > 0)
                                    {
                                        // Debug.Print("A key was hit & there's a live connection count = " + count.ToString());
                                        cdc.ReadTimeout = -1;  // someone hit a key, wait forever for more characters
                                        if (buf[0] == delim)
                                        {
                                            line.Add(buf[0]);
                                            cdc.Write(buf, 0, buf.Length);
                                            buf[0] = lf;
                                            cdc.Write(buf, 0, buf.Length);
                                            line.Add(buf[0]);
                                            goto convert;
                                        }
                                        line.Add(buf[0]);
                                        cdc.Write(buf, 0, buf.Length);
                                        // byte echo = buf[0];
                                    }
                                    // Debug.Print("count after while segment = " + count.ToString());
                                    if (count == 0) goto sdcard;  // no key was hit before timeout
                                // Convert ArrayList to char[] using UTF8 encoding.
                                convert:
                                    if (line.Count < 24)
                                    {
                                        // Debug.Print("here is line[0]  " + line[0].ToString());
                                        if ((byte)line[0] == 47) goto sdcard;  //test for "/" key to goto mass storage
                                        byte[] err = System.Text.Encoding.UTF8.GetBytes("Please try again. \r\n");
                                        cdc.Write(err, 0, err.Length);
                                        goto Start;
                                    }
                                    // Debug.Print(DateTime.Now.ToString());
                                    byte[] inbytes = new byte[line.Count];
                                    int[] cb = new int[line.Count];
                                    for (int x = 0; x < inbytes.Length; x++)
                                    {
                                        inbytes[x] = (byte)line[x];
                                        cb[x] = inbytes[x] - 48;
                                        // Debug.Print(cb[x].ToString());
                                    }
                                    char[] chars = Encoding.UTF8.GetChars(inbytes);
                                    // try - catch in case the typed characters are wrong
                                    try
                                    {
                                        int y = cb[0] * 1000 + cb[1] * 100 + cb[2] * 10 + cb[3];
                                        int m = cb[6] * 10 + cb[7];
                                        int d = cb[10] * 10 + cb[11];
                                        int h = cb[14] * 10 + cb[15];
                                        int mn = cb[18] * 10 + cb[19];
                                        int s = cb[22] * 10 + cb[23];
                                        // Debug.Print(" here's y .....s print");
                                        // Debug.Print(y.ToString() + ", " + m.ToString() + ", " + d.ToString() + ", " + h.ToString() + ", " + mn.ToString() + ", " + s.ToString());
                                        // update the RTC with new time as received from keyborad input or from the ext pc clock if usingthe TeraTerm macro
                                        RTCDS.SetDateTime(new DateTime(y, m, d, h, mn, s, 0));
                                        //do I need both of these Utility statements ?
                                        Utility.SetLocalTime(RTCDS.GetDateTime());
                                    }
                                    catch
                                    {
                                        byte[] err = System.Text.Encoding.UTF8.GetBytes("Please try again. \r\n");
                                        cdc.Write(err, 0, err.Length);
                                    }
                                }
                            }
                        }
                    }
                    catch
                    {
                        byte[] err = System.Text.Encoding.UTF8.GetBytes("Please try again. \r\n");
                        cdc.Write(err, 0, err.Length);
                        // throw new Exception("buggered up the input");
                    }

                sdcard:
                    // Now reinstate mass storage if VCOM was never used or if user input a "/"
                    led.Write(false);
                    USBClientController.Stop();
                    Thread.Sleep(200);
                    // Debug.Print("OK, now starting ms2 for sdcard. will see if it is connected  ");
                    try
                    {
                        USBC_MassStorage ms2 = USBClientController.StandardDevices.StartMassStorage();
                        // Assume SD card is connected
                        PersistentStorage sd2 = new PersistentStorage("SD");
                        ms.AttachLun(0, sd2, " ", " ");
                        // enable host access 
                        ms.EnableLun(0);
                        Thread.Sleep(200);
                        // Check if connected to PC & MASS STORAGE UP AND RUNNING
                        i = 0;
                        while (USBClientController.GetState() != USBClientController.State.Running)
                        {
                            // Debug.Print("Waiting to connect to PC...   " + l.ToString());
                            i++;
                        }
                        i = 0;
                        // this blinking LED loop put in to trace where the program is - here mass storage is set up 7 blinks
                        while (i < 8)
                        {
                            led.Write(false);
                            Thread.Sleep(700);
                            led.Write(true);
                            Thread.Sleep(300);
                            i++;
                        }
                        i = 0;
                        // Debug.Print("USBClientController.State is Running.  You now have a mass storage device");
                        Thread.Sleep(Timeout.Infinite);
                    }
                    catch
                    {
                        // Debug.Print(" throw new Exception(SD card not detected)");
                        // throw new Exception("SD card not detected");
                        i = CatchBlink(led, 50);
                    }
                }
                else
                {
                    ms.DisableLun(0);
                    sd.UnmountFileSystem();
                    Thread.Sleep(200);
                    sd.Dispose();
                    // Debug.Print("SD Card wasn't running);
                }
            }
            catch
            {
                Debug.Print(" throw new Exception(SD card not detected)");
                //changed blink to 15 to distinguish from inner catch
                i = CatchBlink(led, 15);
            }

Thank, we will look into it soon.

I’d like to simplify my question about the GHI CDC and Bootloader drivers. The are installed and functioning on several different PCs, both WIN 10 and 11 but there’s an event message for both that says:

Device USB\VID_1B9F&PID_0104\5&30741cdd&0&10 requires further installation.

Device USB\VID_1B9F&PID_F001\0 requires further installation.

Note that that Device F001\0 is actually the CDC virtual com port and is using a Microsoft driver and not the GHI CDC driver. Microsoft doesn’t need the GHI CDC_driver.

Here’s the simple question. What is needed to do further installation? Is there a registry value that is missing?

I am thinking we are focusing on CDC drivers but problem is not CDC driver as long as it works as general tab say: “This device is working properly.” and everything really working, other messages are just more information.

We just tried, and same as your result, it works and have same messages as your side, and I don’t think we can find anything from these messages.

Problem is even harder when you can’t reproduce too, it only happened on your customer computer.

I am thinking something different on your customer PC that we need to know.

Did he try with hub or directly to USB port, other CDC devices work? Window USB driver work or blocked somehow?

CDC does not work at all or it work then switched to MSC mode then switch back CDC then does not work?

It could be our CDC firmware that is ~ 10 years, but it also some setup on their PC that stop detecting.

Try to ask them for more information or how to reproduce it on our side, I think

Thanks for your response. I agree that the issue really is with the customer’s PC as apparently everything you’ve tried and all the tests I’ve done on my PC’s show that the serial communications work even though the event message says the “device requires further installation”. My PCs aren’t using the GHI CDC_Driver but use the Microsoft “USB Serial Device driver dated 6/21/06. They do use the GHI Bootloader driver.

I asked AI about the message and got this response:

The message “Device requires further installation” is a generic event log message that often appears during the standard driver installation process for a new USB device … The message does not always indicate a problem.

So to sum up I will continue to troubleshoot with the customer on what’s going on with their PC’s but I really appreciate you helping to confirm the nature of the problem. If I find anything useful about why they couldn’t detect the device I’ll pass it on to the community.