• Bill Marr's avatar
    [PATCH] Status Query On My MCT-U232 Patch · 53f87a8f
    Bill Marr authored
    Brief Patch Description:
    
    Fix a problem in the 'mct_u232' driver whereby output data gets held up in the
    USB/RS-232 adapter for RS-232 devices which don't assert the 'CTS' signal.
    
    Background:
    
    The Belkin F5U109 is a 9-pin USB/RS-232 adapter that is supported by the
    existing 'mct_u232' kernel module.  Recently, I've been testing it under the
    2.4.22 (Slackware 9.1) kernel and the 2.6.0-test9 kernel.
    
    I've connected a Garmin 'GPS35 TracPak' GPS receiver (RS-232 interface) and an
    ordinary RS-232 external modem to my PC's USB port via the Belkin F5U109
    adapter.
    
    Problem:
    
    Although _reads_ from either of the RS-232 devices mentioned above work fine
    via the Belkin adapter, _writes_ to the GPS receiver are not being seen by
    the GPS.  Writes to the modem, however, work perfectly.
    
    Aside: The 'Linux USB Users' archives show that at least one other person
    (circa May 2002) had the exact same problem I'm having, but it sounds like no
    solution was ever determined because the person in question just bought a
    different USB/RS-232 adapter.
    
    Investigation:
    
    Using the 'seyon' terminal emulator in Linux and a crude hardware RS-232
    "breakout box" that I hacked together, I've determined that the problem is
    related to the RTS/CTS RS-232 hardware handshaking.
    
    After further investigation, I've concluded that RS-232 devices which do not
    assert the 'Clear To Send' ('CTS') signal prevent the Belkin F5U109 adapter
    from transmitting data to the RS-232 device when the current (version 1.1)
    'mct_u232' module is used. The data gets "queued up" (up to a point -- 16
    bytes, I think) in the adapter but never transmitted.
    
    Since this GPS receiver works perfectly (reads and writes) when connected to a
    PC running W98se using the same Belkin adapter and the Belkin-supplied
    Windows driver, the Linux driver became suspect.
    
    After some testing with SniffUSB, I found that the Windows driver sends a
    couple of unique undocumented USB 'device requests' that the Linux driver
    does not. As it turns out, the second of those 2 requests is critical in
    making the adapter transmit data to a device which doesn't assert 'CTS'.
    
    For completeness, the Windows driver in use was determined from the 'Device
    Manager', 'Driver File Details' page:
    
       U2SPORT.VXD
       Provider: Magic Control Technology
       File version: 1.21P.0104 for Win98/Me
    
    Solution:
    
    My patch adds the 2 missing USB 'device request' commands right after a
    baud-change command. This mimics the operation of the W98 driver.
    
    Unfortunately, after much testing, I found no other operation (besides a
    baud-change request) under Windows that triggers either of these 2 'device
    request' commands. This makes it impossible to fully document the behavior of
    these requests, but I've made entries for them alongside the others in the
    'mct_u232.h' file.
    
    Purely for clarity, the patch also modifies various comments in 'mct_u232.h',
    mostly to reflect proper sizes of the various 'USB Device Request' fields per
    the USB 1.1 specification.
    
    The patch also updates the version number of the driver, corrects a minor
    typographical error, and documents a difference in the length of the data in
    a 'baud rate change' command for certain adapters which use a coded baud-rate
    rather than the conventional RS-232 baud rate divisor.
    
    I've provided (tested) patches for both the 2.4.22 and the 2.6.0-test9
    kernels.
    
    Please note that the changes to 'mct_u232.h' apply to both 2.4.22 and
    2.6.0-test9 since that file has not changed between those kernel releases.
    Nevertheless, I've included that (same) portion of the patch in both
    attachments for simplicity.
    
    Bill Marr
    53f87a8f
mct_u232.h 18.5 KB