Can't connect to Wixel through USB on a Mac

Hi,

From the Wixel documentation, I understand that the firmware cannot be loaded on a Mac, but that it should be possible to connect to a Wixel through the virtual COM port from a Mac. But when I plug in the Wixel, I cannot find anything that looks likely to be the Wixel. I’m looking for /dev/ttyACM*. There are also no /dev/cu* entries that look promising and nothing in the /dev/ directory containing “usb”. Is there something else I should look for in the dev folder or elsewhere?

Details: I programmed and tested the device with the WirelessSerial app using VMware, and it worked fine. I then disconnected the Wixel from the VM, suspended the VM, then physically disconnected the Wixel and plugged it back in. I’m using a MacBook Pro running 10.5.8. The Wixel itself is fairly new and has “0J2377” on the back, which I’m guessing is some sort of hardware version.

I have read that Windows is more relaxed than Mac OS about some of the CDC descriptor details, so I wonder if that might be the problem, but I’m not sure what to change. Has anyone had any luck connecting to a Wixel from a Mac? As an aside, I’d like to put in a vote for general Mac support for the Wixel.

Thanks,
Jeremy

Here’s a little more information. I ran the USBProber, found the Wixel, and the results are pasted below. Is there anything in here that would indicate what tty device to look for? I also noticed this line:

Interface Subclass; 0 (Unknown Comm Class Model)

Is that likely to be a problem?

Thanks,
Jeremy

Full Speed device @ 4 (0x04100000): .............................................   Communication device: "Wixel"
    Device Descriptor   
        Descriptor Version Number:   0x0200
        Device Class:   2   (Communication)
        Device Subclass:   2
        Device Protocol:   1
        Device MaxPacketSize:   32
        Device VendorID/ProductID:   0x1FFB/0x2200   (unknown vendor)
        Device Version Number:   0x0000
        Number of Configurations:   1
        Manufacturer String:   1 "Pololu Corporation"
        Product String:   2 "Wixel"
        Serial Number String:   3 "4A-B7-71-3C"
    Configuration Descriptor   
        Length (and contents):   67
            Raw Descriptor (hex)    0000: 09 02 43 00 02 01 00 C0  32 09 04 00 00 01 02 02  
            Raw Descriptor (hex)    0010: 01 00 05 24 00 20 01 04  24 02 02 05 24 06 00 01  
            Raw Descriptor (hex)    0020: 05 24 01 00 01 07 05 81  03 0A 00 01 09 04 01 00  
            Raw Descriptor (hex)    0030: 02 0A 00 00 00 07 05 04  02 40 00 00 07 05 84 02  
            Raw Descriptor (hex)    0040: 40 00 00 
        Number of Interfaces:   2
        Configuration Value:   1
        Attributes:   0xC0 (self-powered)
        MaxPower:   100 ma
        Interface #0 - Communications-Control   
            Alternate Setting   0
            Number of Endpoints   1
            Interface Class:   2   (Communications-Control)
            Interface Subclass;   2
            Interface Protocol:   1
            Comm Class Header Functional Descriptor   
                Raw Descriptor (hex)   0000: 05 24 00 20 01 
            Comm Class Abstract Control Management Functional Descriptor   
                Raw Descriptor (hex)   0000: 04 24 02 02 
            Comm Class Union Functional Descriptor   
                Raw Descriptor (hex)   0000: 05 24 06 00 01 
            Comm Class Call Management Functional Descriptor   
                Raw Descriptor (hex)   0000: 05 24 01 00 01 
            Endpoint 0x81 - Interrupt Input   
                Address:   0x81  (IN)
                Attributes:   0x03  (Interrupt no synchronization data endpoint)
                Max Packet Size:   10
                Polling Interval:   1 ms
        Interface #1 - Communications-Data/Unknown Comm Class Model   
            Alternate Setting   0
            Number of Endpoints   2
            Interface Class:   10   (Communications-Data)
            Interface Subclass;   0   (Unknown Comm Class Model)
            Interface Protocol:   0
            Endpoint 0x04 - Bulk Output   
                Address:   0x04  (OUT)
                Attributes:   0x02  (Bulk no synchronization data endpoint)
                Max Packet Size:   64
                Polling Interval:   0 ms
            Endpoint 0x84 - Bulk Input   
                Address:   0x84  (IN)
                Attributes:   0x02  (Bulk no synchronization data endpoint)
                Max Packet Size:   64
                Polling Interval:   0 ms

Not being a Mac person, how is the Mac supposed to know that the Wixel should act as a tty device?

Hello, Jeremy.

Thank you for all the details. Mac OS X tends to be more strict about the requirements for the CDC ACM descriptors, and the strictness has changed over the years. You are the second customer who has had trouble using the Wixel with Mac OS 10.5.8. The fix that worked for the first customer is to change the device subclass and device protocol (in the device descriptor) both to 0. This is required according to USB CDC Spec Revision 1.2, Table 8, so it is our fault for not doing it, and we didn’t catch the problem because the Wixel worked in Windows, Linux, and the Mac OS that we tested.

Can you try this version of the wireless serial app that I just compiled now and see if it works for you?

wireless_serial.wxl (25 KB)

I have not yet gotten around to incorporating this change into the Wixel SDK and re-releasing all of our precompiled apps, but I would like to do that eventually.

–David

Hello, Jim. Just as with most USB devices, the Mac queries the Wixel for its USB descriptors and assigns the right driver to it based on that. In order for the Mac to recognize the Wixel as a virtual COM port, certain fields in those descriptors must be set correctly.

–David

Hi David,

Thanks for the quick response. The version of the wireless serial app you posted works, but when I try to do the same thing, it does not work. I changed the two lines in usb_cdc_acm.c as below.

// USB Subclass Codes
// Changed this from 2 to 0.  16NOV2011JHH
#define CDC_SUBCLASS_ACM  0           // (CDC 1.20 Section 4.3: Communications Class Subclass Codes).  Refer to USBPSTN1.2.

// USB Protocol Codes
// Changed this from 1 to 0.  16NOV2011JHH
#define CDC_PROTOCOL_V250 0          // (CDC 1.20 Section 4.4: Communications Class Protocol Codes).

Now under USBProber, the device subclass and protocol are both 0, but using your wxl file, I can see /dev/tty.usbmodem411, but with mine I do not. Running USBProbe on both and diff’ing the results, I see that in both the device subclass and protocol are 0. In mine the interface subclass and protocol are also both 0, while with yours, the interface subclass and protocol are 2 and 1. I’ve attached both dumps from USBProbe.wixel_breaks.txt (2.92 KB)wixel_works.txt (2.92 KB)

I’ve never done any USB programming before, so I’m getting a bit lost trying to figure out where to set the interface properties separately from the device properties. Is there anything else I should be changing? Better yet, could you post the source files you modified to generate the wxl file you posted? I’m also attaching my entire modified usb_cdc_acm.c file, in case that helps.usb_cdc_acm.c (21.6 KB)

Thanks,
Jeremy

Hello, Jeremy.

I wasn’t sure if you wanted to write your own Wixel apps or just use the wireless serial app. Now that I know it is the former, I have pushed my changes to a new branch on the wixel-sdk repository on github. The branch is named dev/david/cdc_acm_descriptors. You can see the change I made to usb_cdc_acm.c here (I really only changed two lines and fixed indentation on the others):

github.com/pololu/wixel-sdk/com … 23e512e02e

I recommend that you install git and get the latest version of the Wixel SDK, including my change to usb_cdc_acm.c, by running these commands:

git clone -o pololu git://github.com/pololu/wixel-sdk.git
cd wixel-sdk
git pull pololu dev/david/cdc_acm_descriptors

–David

It works! Also, I can compile it from within Mac OS, using the SDCC downloaded from MacPorts. So now I only have to go into windows to flash in the wxl files.

Thanks for the help.
Jeremy