CSD and GPRS on FCDEV3B with Magnetite

Mychaela Falconia mychaela.falconia at gmail.com
Sat Jun 3 18:12:05 UTC 2017


Hello FC community,

I just got to play a little with CSD and GPRS, which was not possible
prior to our own FCDEV3B hardware.  CSD and GPRS have been standard
(though perhaps advanced and optionally included) features of TI's
official modem fw, and they are included in FreeCalypso Magnetite,
although not in Citrine and most certainly not in OsmocomBB.  But even
though we have had TI's code for CSD and GPRS in our Magnetite fw all
along (and in leo2moko prior to that), there was no practical way to
exercise this functionality prior to our FCDEV3B hw.  TI's implementation
of CSD and GPRS presents the associated data channel (as well as the
AT command interface for dialing CSD calls and establishing GPRS
connections) on the Calypso chip's MODEM UART, and we could not get to
this UART channel on any of our pre-existing hw targets:

* On the Pirelli the Calypso's MODEM UART signals are wired to an
  unpopulated FPC/FFC connector footprint; access would require
  disassembling a phone to shreds, soldering the normally-unpopulated
  debug connector onto the board, and then making a special FPC/FFC
  debug adapter - and the LCD module can't be put back on properly
  with that debug connector populated.  Alternatively one can solder
  little wires directly to the pads on the PCB, but the phone still
  cannot be put back together properly in that state, and the 0.5 mm
  pad spacing would make such a hack difficult.

* On the FreeRunner the Calypso's MODEM UART goes to the phone's AP.
  I was previously able to dial CSD calls using a terminal program on
  the AP, and presumably the Openmoko community had GPRS working once
  upon a time back when that community existed, but it was not a
  convenient environment for my needs as a modem fw developer.

* On the C139 the MODEM UART is the only one that is brought out, not
  the other one.  We could not give up the debug trace interface, so
  we gave up the standard AT command interface with CSD and GPRS
  instead.

The FCDEV3B solves this problem by bringing out BOTH Calypso UARTs on
the dual UART header, and the FT2232D adapter boards we use with our
FCDEV3B present both UARTs to the host as two /dev/ttyUSBx serial
devices under a single USB device.  With no other USB-serial devices,
ttyUSB1 is the Calypso's IrDA UART, i.e., the port to which you connect
with rvinterf, but there is also a classic ASCII AT command interface
on ttyUSB0.  By connecting to the latter one can conveniently play
with CSD and GPRS.

I have played a little with GPRS last weekend, and I just played some
more with both GPRS and CSD.  Here are my findings:

* GPRS works on our FCDEV3B modem with both classic/l1reconst and
  hybrid configurations of FC Magnetite, i.e., not only with the same
  binary blob version of the G23M protocol stack that was used by
  Openmoko (which was fully expected to work given that it worked for
  Om), but also with the full source version of G23M PS which we took
  from TCS3/LoCosto - the latter is much more exciting, as the GPRS
  functions of this L23 PS version have *never* been exercised before!
  With both l1reconst and hybrid fw versions running on the board, I
  was able to connect to the Internet and check my Gmail over the GPRS
  connection provided by the FCDEV3B modem, with no other Internet
  connection available on my laptop during the test.

* It is worth noting that TI had reworked the architecture of their
  GPRS code at some point in between 20070608 (the build date of the
  binary blobs version used by both us and Om) and 20090327 (the date
  of our full source TCS3/LoCosto version): the new version adds a new
  protocol stack entity named UPM that didn't exist before, and
  reworked the SM and SNDCP entities to work with this new UPM.  We
  don't have a corresponding source for the old 20070608 way, so the
  new GPRS code with UPM is what I've integrated in the TCS2/TCS3
  hybrid config of Magnetite - it is definitely delightful to see this
  previously untested code working without any apparent problems.

* Outbound (MO) CSD calls work with the l1reconst config of Magnetite,
  i.e., with 20070608 G23M blobs, to the best of my currently limited
  ability to test them.  I used to test CSD by calling NIST's time-by-
  modem service (ACTS) at +1-303-494-4774, but that test depends on
  the gateway between Operator 310260's GSM network and PSTN (land
  lines) doing the magic to translate CSD to analog modem emulation,
  and that gateway seems to have either been shut down or fallen into
  disrepair, as I keep getting the NO CARRIER error most of the time.
  When I make a CSD call to my own POTS line, my POTS phone does ring,
  so perhaps I can make mobile-to-land CSD work if I connect my trusty
  USR Courier to my POTS line and get it configured correctly, but I
  haven't got around to it yet.

* Mobile-to-mobile CSD calls seem to be much more reliable than
  mobile-to-land, for understandable reasons: for mobile-to-mobile CSD
  the network does not have to do anything more than pass 240-bit
  frames every 20 ms from one end to the other, whereas for mobile-to-
  land CSD to work there has to be a gateway somewhere that emulates
  the tones and modulation schemes of an analog modem.  But in order
  to test mobile-to-mobile CSD properly I would need two FCDEV3B
  modems up and running simultaneously, with two SIMs (two lines on
  the family plan) dedicated to this test, and I am not ready to
  pursue such an elaborate setup yet.

* Interestingly enough, it IS possible to test mobile-to-mobile CSD to
  a limited extent by placing a CSD call from an FCDEV3B (or from a
  Neo FreeRunner, from TI's D-Sample or from one of a few pre-existing
  phones with an AT command interface) to a Pirelli DP-L10 running its
  original proprietary fw.  When Pirelli's fw receives a CSD call, the
  phone rings, and the displays says "Incoming data".  I conjecture
  that if one were to connect to the MODEM UART via that unpopulated
  connector footprint on the PCB, buried deep inside the phone, there
  might be a working AT command interface lurking in there, such that
  one could answer the incoming CSD call with ATA and get the data
  connection, but I don't feel like doing the necessary level of
  hardware surgery to test this hypothesis.  In any case, if I simply
  press "Accept" to answer the incoming CSD call when the display says
  "Incoming data", I get a CONNECT response on the CSD originating
  end, suggesting to me that the CSD connection establishment was
  successful, but there is no way to test the data path with an
  unhacked Pirelli running its original fw on the receiving end of the
  CSD call.

* The same CSD call test that works with the l1reconst config (dialing
  a call from the FCDEV3B to the number of the SIM in my end-user-hat
  Pirelli running one of the original proprietary fw versions) did not
  work with the hybrid config, and the AT command channel got stuck in
  a non-functional state, requiring a reboot via RVTMUX.  To be
  debugged later; the bug seems more likely to be in the ACI layer
  than somewhere deeper in the protocol stack.  The TCS2/TCS3 hybrid
  config of Magnetite uses the TCS3 version of ACI: we do have the
  source for the TCS211 version, but attempting to graft the TCS211
  version of ACI atop the TCS3 version of G23M would be more trouble
  than shaking the bugs out of the TCS3 version of ACI, hence I am
  taking the latter approach.

That's all from me for now - back to preparing for the REcon
presentation in two weeks.

Hasta la Victoria, Siempre,
Mychaela aka The Mother


More information about the Community mailing list