This is a post about the tragedy of Chinese semiconductor counterfeits and an uneven pricing landscape causing a terrible outcome for me.
For one of the projects I’m currently hacking on around the house, I went looking for a bunch of USB-to-RS232 serial converters, for as cheap as I could find on eBay.
I ended up with a packet of four of them, for 10 EUR. They generally look something like this:
And they work, for the most part. If you aren’t trying to do anything too complex or use more than one of them at a time.
Unfortunately, 99% of the converters come from China (that’s a given), and 99% of them use electrically-compatible counterfeits of a popular Scottish-designed chip, the FTDI RS232R. There is a fantastic write-up of the differences at the semiconductor level.
The problem occurs when you try to use more than one of these devices at the same time, on the same computer. This is what Linux will tell you, when you plug them in:
[ 2.837034] usb 6-2.3.1: new full-speed USB device number 4 using uhci_hcd [ 2.998030] usb 6-2.3.1: New USB device found, idVendor=0403, idProduct=6001 [ 2.998033] usb 6-2.3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 2.998036] usb 6-2.3.1: Product: FT232R USB UART [ 2.998039] usb 6-2.3.1: Manufacturer: FTDI [ 2.998041] usb 6-2.3.1: SerialNumber: A50285BI [ 3.081031] usb 6-2.3.2: new full-speed USB device number 5 using uhci_hcd [ 3.242030] usb 6-2.3.2: New USB device found, idVendor=0403, idProduct=6001 [ 3.242033] usb 6-2.3.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 3.242036] usb 6-2.3.2: Product: FT232R USB UART [ 3.242038] usb 6-2.3.2: Manufacturer: FTDI [ 3.242041] usb 6-2.3.2: SerialNumber: A50285BI
The SerialNumber is identical on every device, because the Serial Number is etched straight into the device’s semiconductor mask. It’s supposed to be unique for each chip. It’s not configurable, like on a genuine FTDI device. On real devices, the SerialNumber is stored in EEPROM, meaning that you can change it around to your liking. Additionally, the SerialNumbers on non-counterfeit FTDI devices are already set to randomized values, and this is visible when the devices are being enumerated.
And, if you try to use FTDI’s FTProg program on Windows or the ft232r_prog program on Linux to change the SerialNumber field, you get an error like:
$ sudo ./ft232r_prog --new-serial-number ABCD0123 ft232r_prog: version 1.25, by Mark Lord. eeprom_size = 128 vendor_id = 0x0403 product_id = 0x6001 self_powered = 0 remote_wakeup = 1 suspend_pull_downs = 0 max_bus_power = 90 mA manufacturer = FTDI product = FT232R USB UART serialnum = ABCD0123 high_current_io = 0 load_d2xx_driver = 0 txd_inverted = 0 rxd_inverted = 0 rts_inverted = 0 cts_inverted = 0 dtr_inverted = 0 dsr_inverted = 0 dcd_inverted = 0 ri_inverted = 0 cbus = TxLED cbus = RxLED cbus = TxDEN cbus = PwrEn cbus = Sleep Rewriting eeprom with new contents. Readback test failed, results may be botched
So why is this a problem? What’s the big deal, they were only 2.50 EUR apiece.
Well the problem is that it is impossible to uniquely identify these devices, meaning that using udev rules to persistently name certain USB devices becomes impossible. And that means that if you want to configure these serial converters to be named after the devices they connect to, say, an Arduino, or a Raspberry Pi, or whatever, it is impossible to do so. The closest you can get is to set a name based on the device’s location on the USB connection hierarchy, but that suuuucks.
And, unfortunately, the company producing the genuine article, Future Technology Devices International charges a seemingly extortionate rate for cables that have their chips integrated. It’s 5x the cost of the counterfeits. It is such a large difference, and the market is now so saturated with cheap knock-offs, that it is actually impossible to source a reputable and non-counterfeit chip from China. The only way to get the real deal is to pay the 500% markup. But that’s an untenable position. As much as I support the need for companies to protect their IP rights and recoup the costs of R & D, there has to be some middle ground that lets me buy the real deal without feeling totally ripped off.
In addition, FTDI recently engaged in a pretty bad-faith tactic of physically disabling counterfeit chips. It’s an interesting discussion about the fate of a market. Since they’re not commoditizing their chips, and charging prices that the market finds too high, others have stepped in to soak up value that FTDI originally created, and continues to maintain with their driver development and other forms of support. Had FTDI instead met the supply/demand curve, providing their chips at a price people thought was fair (by lowering their margins), maybe this situation could have been avoided, and I would be able to get my hands on an affordable and genuine device. But the market has now been entirely saturated with cheap clones, and FTDI has no option but to attempt to salvage their development costs with high-priced, certified goods that lose massively in volume.