BlinkyTape not identifying as TTY device on older Macs
Hi All,
In my quest to repurpose a couple of older Macs to work with BlinkyTape, I'm in a similar situation to BlinkyTape not identifying as TTY device on Linux where the Mac detects the BlinkyTape but doesn't create the TTY. The following is on a PowerPC Mac running OS X 10.5.8 (Leopard).
The Mac equivalent of a Linux lsusb
shows:
Bus 027 Device 000: ID 1d50:605e 1d50 BlinkyTape
The dmesg
log shows:
0 0 AppleUSBCDCACMControl: start - Failed to find the CDC driver
AppleUSBCDCACMData: start: InterfaceMappings dictionary not found for this device. Assume CDC Device...
0 0 AppleUSBCDCACMData: start - Find CDC driver failed
I found the same error for a Microchip MCP2200 controller. Here is some troubleshooting info with way-over-my-head-highly-technical-details on why it isn't working -- MCP2200 not recognized on a mac/OS X and MCP2200 CDC for Mac OS X and Linux.
The solution is described at Serial connection on Mac OS X and [Traumflug/Generation_7_Electronics/USB tool/](https://github.com/Traumflug/Generation_7_Electronics/tree/master/USB tool).
I modified [mcp2200-forwarder.c](https://github.com/Traumflug/Generation_7_Electronics/blob/master/USB tool/mcp2200-forwarder/mcp2200-forwarder.c) lines 49 and 50 to be the hardcoded BlinkyTape USB vendor:product ID's of 1d50:605e. (There are references to ATmega at the above links, and I know the BlinkyTape uses an Atmega 32u4. I'm hoping this means the code is close enough.)
When compiled and run with the highest verbose mode, I get:
$ ./mcp2200-forwarder -vvv -l /tmp/ACM0
device_added()
Device added.
find_interfaces()
Scanning interfaces ...
Interface 0x00001703.
Interface class 2, subclass 2.
Interface has 1 endpoints.
PipeRef 1: direction in, transfer type interrupt, maxPacketSize 16.
Choosing this interface as Interrupt.
Interface 0x00001A03.
Interface class 10, subclass 0.
Interface has 2 endpoints.
PipeRef 1: direction out, transfer type bulk, maxPacketSize 64.
PipeRef 2: direction in, transfer type bulk, maxPacketSize 64.
Choosing this interface as Bulk.
... interface scan done.
send_bridge_setup()
Failed to take down DTE & RTS. Ignoring. (e000404f)
Failed to set baud rate & co. Ignoring. (e000404f)
Failed to raise DTE & RTS. Ignoring. (e000404f)
Unable to set up USB-UART bridge. (e000404f)
close_interface()
device_removed()
pty_open()
Terminal name: /dev/ttys002
Created symlink to /tmp/ACM0
When I start a second shell session and run Oskari Okko Ojala’s Perl Device::BlinkyTape example code pointing to 'dev' => '/tmp/ACM0'
, it sits there thinking for a few seconds and doesn't send anything to the screen (as expected), not even an error. And, the BlinkyTape just gives me a blank stare .
The first shell session running mcp2200-forwarder shows only one new line:
pty_read(), event 0x0002
HERE'S MY QUESTION:
I'm wondering if someone here who is familiar with the BlinkyTape USB hardware could look at [mcp2200-forwarder.c](https://github.com/Traumflug/Generation_7_Electronics/blob/master/USB tool/mcp2200-forwarder/mcp2200-forwarder.c) and tell me if, or what, needs changing? I know enough to change the hardcoded vendor:product ID but that's the limit of what I know about what mcp2200-forwarder.c is doing with the USB code.
If this isn't practical to get going and there's no longer much of a reason for my older Macs to justify their existence and electric bill, I'll quite understand, but I would appreciate knowing either way.
Comments
Well, shoot. How come the Markdown didn't render?
It's a little hard to tell from the source code, but a potential issue is that the BlinkyTape is actually a composite USB device, meaning that it supports a few other interfaces besides TTY-ACM (this was to make it compatible with the default Arduino Leonardo firmware). It looks like that code is trying to automatically figure out what interfaces to use, but I don't quite understand the logic it's using. It's possible that it just needs a little more filtering to only select the interfaces/endpoints associated with the BlinkyTape device
Ah sorry, i missed the section where it's printing out which interface it is using >.<
It looks like it is finding the right interfaces, however I'm not sure how to interpret the addresses '0x00001703' or '0x00001A03'.
For reference, Linux gives me this device configuration for the BlinkyTape:
$ sudo lsusb -v
Bus 001 Device 003: ID 1d50:605e OpenMoko, Inc.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1d50 OpenMoko, Inc.
idProduct 0x605e
bcdDevice 1.00
iManufacturer 1 Blinkinlabs
iProduct 2 BlinkyTape
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 75
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 500mA
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
bFunctionClass 2 Communications
bFunctionSubClass 2 Abstract (modem)
bFunctionProtocol 1 AT-commands (v.25ter)
iFunction 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 0 None
iInterface 0
CDC Header:
bcdCDC 1.10
CDC Call Management:
bmCapabilities 0x01
call management
bDataInterface 1
CDC ACM:
bmCapabilities 0x06
sends break
line coding and serial state
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 64
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0000
(Bus Powered)
I found an Xcode utility called USB Prober that gives a more detailed dump like your verbose output above. See http://pastebin.com/Br0najQt starting at line 79. Does this help? I don't know what I should be looking for.
It shows that the computer is seeing the USB device just fine, so I think you're on the right track. I'm unfortunately not sure what would need to be changed to get the driver to work, though :-(
Thanks for the encouragement. I'll see if I can contact the author of mcp2200-forwarder.c.
For my tracking purposes, new mcp2200-forwarder issue created at: https://github.com/Traumflug/Generation_7_Electronics/issues/24