FTDI once again updated their firmware, this time to 1.4.2. The release notes are promising. My goal for today is to try and validate as many of the fixes as I can. If enough of the regressions are fixed, the intended fix to USB host polling rates would actually make my device playable!
The 1.4.2 release did manage to fix the most glaring of bugs, most of the crashers and obvious incorrect behavior is now resolved: Issues Page. Even some of the bigger ones appeared to have progress made, specifically, the USB host polling rate problem. It did now appear that the host driver polled at 8ms for my device which requested a 10ms poll rate.
That was the upside. The downside was that for some reason the device only responded to every 3 out of 4 poll requests for data. (On my linux host, which also polls at 8ms, it responds to every single one). Additionally, something got broken about enumeration for devices which are connected at powerup that made enumeration moderately unreliable. That is a little bit ironic, given that I never had any problems with this before, and the release notes indicate that problems related to this were fixed in 1.4.2.
At this point, I’ve decided against freshening up my scope USB decoding skills again to see what the VNC2 library is doing wrong during enumeration or during the 1/4 interrupt IN polls that nothing comes in. Besides, rock band isn’t as popular as it was 8 months ago anyways. On to other projects, and maybe in a couple more years the VNC2 firmware will be usable enough to revisit.
Two items of note: First, FTDI released a service patch to version 1.4.0 which looks to contain many bugfixes. Second, they’ve finally gotten back to me about the specific issues I have been having trying to use the firmware in my project.
This release looks like it did fix one of the issues I had (#11), although it was only a regression from 1.2, so it wasn’t one of my original showstoppers.
FTDI also indicated that a number of the other problems are scheduled to be fixed in a 1.4.2 point release due out in mid-July. Fingers crossed.
I worked through all the issues I had uncovered, testing each with the 1.4.0 version of FTDI’s toolchain and firmware. I can’t say a single one was actually fixed. The results by the numbers:
- Fixed: 0
- Still Broken: 6
- Feature Partially Removed: 1
- New: 4
Hopefully the next firmware update will actually fix enough that I can make progress again.
I was hopeful today when I discovered that FTDI had released a new version of their toolchain and firmware for the VNC2. As mentioned previously, I have been having a large number of problems with my rhythm controller adapter application, due largely to bugs and lack of features in the 1.2.2-SP1 version that had been current until today.
My hope lasted only a very short time.
The immediate problem I had been working on was with link-time optimizations producing bogus output. In 1.4.0, the GUI option to select link time optimization was removed, but the command line tool still supported it and produced corrupted output. Half points.
Then, as soon as I tried to reproduce the most critical of my issues I started having real fun. First, the compiler just segfaulted trying to compile my source. Then, once I had narrowed down the code which caused it to crash I fired up a new project so as to create the minimal reproduction recipe. However, the fresh project didn’t compile due to a trivial symbol mismatch in some FTDI generated code. Finally, after fixing that, I went to rename my reproduction recipe for transmission, and discovered that 1.4.0 started encoding absolute file paths into the .vproj files so that you can’t easily move or rename projects any more.
Eventually, I will get around to testing all of my existing issues with the new toolchain, although it may take a bit as many of the FTDI provided examples have been re-worked to rely on the more advanced evaluation boards like the Vinculo, not my V2DIP2. At least that is my current theory, we’ll see as I dig in more.
The rhythm game adapter work has basically been stalled for the last two weeks waiting on the microprocessor vendor, FTDI, to try and come up with any type of resolution for the problems I’ve found in their firmware. While they have been gracious to respond at all, until now the responses have been less than useful. If I had an alternate platform with the same properties that had open firmware, or at least a source license, I would switch to it in a heartbeat at this point.
First things first, I am using the VNC2 from FTDI for this project largely because it is the only part I have found that has both a USB slave and an independent USB host controller on the same chip. Plenty of microcontrollers have a USB OTG controller, but that only lets you use one modality at a time. For the USB HID proxying to work, you need to have both simultaneously. One alternative would be to use a micro with a built in USB controller, then an external serial interface controller to handle the other end. Or you could just use two USB enabled microcontrollers, like an AVR, back to back. My goal on this project was to keep the part cost below $10, so that it could be produced in large quantities. Unfortunately AVRs with enough memory to hold a reasonable USB host stack are much more expensive even in quantity than the VNC2, much less the fact that you would need two of them. As far as external USB controllers, you can’t seem to find any low/full speed external controllers that are any cheaper than an entire microcontroller
In the hope that someone has had similar problems and knows how to work around them, I am going to start cataloging all the problems I’ve had with the FTDI toolchain and firmware here on my website. If nothing else, that will give me a clear record of what they may have fixed in subsequent versions.
One thing I am considering, although hesitantly, is reverse engineering enough of the register level interface to the peripherals on the chip to fix the problems myself. As part of debugging some of these other issues, I’ve been hand assembling bits of code to patch interrupt vectors and their code. However, looking through binutils, it isn’t hard to guess that bringing up a brand new architecture with 0 documentation is likely to take several man months of effort, which is a rather large yak to shave for such a small project.