FreeCalypso > hg > freecalypso-docs
view Calypso-digital-voice @ 105:72a272083f46
Linux-DTR-RTS-flaw: link to new fc-linux-patch repository
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 11 Dec 2023 19:02:01 +0000 |
parents | 9baf6215285b |
children |
line wrap: on
line source
Digital voice on FreeCalypso modems via MCSI ============================================ The Calypso chip provides a little-used auxiliary synchronous serial interface called MCSI. It is an auxiliary interface to the DSP part of the Calypso (controlled solely by the DSP and not directly accessible to the ARM part); it is not clear what other uses TI may have had in mind for this interface, but one advertised feature of TI's TCS211 chipset+firmware solution is Bluetooth support in the form of using MCSI as a digital voice channel to be connected to TI's Bluetooth Island chip. In FreeCalypso we are not interested in Bluetooth per se, but we are interested in getting a digital voice channel out of our modem for GSM voice calls in order to compete with the mainstream proprietary GSM modem modules which do provide such digital voice channels. Our current development board (FCDEV3B) has MCSI brought out on a header for experimentation, and as of 2019-03 we finally got this MCSI working as a proper digital voice interface. Hardware interface ================== MCSI consists of 4 hardware signals: * MCSI_CLK is the bit clock output from the Calypso; in pure hardware terms this signal is bidirectional, but unless you are going to develop your own DSP code patches, its direction is determined by the DSP ROM code, which configures MCSI_CLK as an output, i.e., the Calypso acts as the clock master. * MCSI_FSYNCH is the frame sync output from the Calypso; it is the same deal as with MCSI_CLK: bidirectional in pure hardware terms, but if you are not changing the DSP code with your own custom patches, it is an output from the Calypso. * MCSI_RXD is the voice uplink bits input to the Calypso: the user's application processor needs to feed voice uplink bits to this pin as timed by MCSI_CLK and MCSI_FSYNCH. * MCSI_TXD is the voice downlink output from the Calypso: as the vocoder in the Calypso DSP decodes received downlink speech from GSM codecs into linear PCM, this PCM voice downlink is put out on this MCSI_TXD pin, in synchrony with MCSI_CLK and MCSI_FSYNCH. The format in which digital voice samples are exchanged via MCSI between the Calypso and the user's application processor is 16-bit linear PCM, 8000 samples per second, thus requiring 128 kbps of bandwidth. The synchronous serial interface details are as follows: * When MCSI is enabled, the Calypso puts out a 520 kHz clock on MCSI_CLK, produced by dividing the 13 MHz master clock by 25. This clock as put out by the Calypso has a perfect 50% duty cycle. * Given that a new pair of samples (uplink and downlink) needs to be transferred once every 125 us (1/8000th of a second, for 8000 samples per second), this 520 kHz bit clock is further divided by 65 to produce an 8 kHz clock on MCSI_FSYNCH, i.e., every 65 bits there is a frame synchronization pulse on MCSI_FSYNCH. The width of this frame sync pulse is one full bit time, the pulse is active high, and the MCSI_FSYNCH line stays low the rest of the time. * Calypso outputs MCSI_FSYNCH and MCSI_TXD are updated on the rising edge of MCSI_CLK and should be sampled on the falling edge of the same clock by the user's application processor. The MCSI_RXD input is sampled on the falling edge of MCSI_CLK by the Calypso, and should be updated on the rising edge of the same clock by the user's application processor. * Each voice sample (both uplink and downlink) is transferred from the most significant bit to the least significant bit (MSB first), starting with the clock cycle immediately following the frame sync cycle, i.e., the cycle in which MCSI_FSYNCH is asserted by the Calypso. * Given that each frame is 65 bits long (520 kHz bit clock divided by 8 kHz frame rate) and that 16 bit slots out of every frame are used to transfer voice sample bits, plus one bit slot for frame sync, it follows that 48 bit slots out of every frame are dummies. The Calypso puts out 0 bits on MCSI_TXD in all bit slots that don't carry voice sample bits. A graphical depiction of what I just described verbally can be found on page 3074 of this TI OMAP document: ftp://ftp.freecalypso.org/pub/ARM/OMAP/sprugn4r.pdf Calypso MCSI corresponds to what this OMAP document calls "Mode 1", i.e., Figure 21-14 at the top of the page, NOT the other one below it. Enabling and disabling MCSI for digital voice ============================================= TI's DSP ROM code supports two modes of operation in which MCSI is activated, called "Bluetooth cordless" and "Bluetooth headset". In the "BT cordless" mode the voice path is connected between the chipset's native analog voice hw and MCSI, with GSM out of the picture; in the "BT headset" mode the voice path is connected between the GSM vocoder and MCSI, with the local analog voice hw out of the picture. The latter "BT headset" mode is the only one which we currently support in FreeCalypso; the "BT cordless" mode does not work properly as of this writing - the step of enabling the Voice Band Codec block in the Iota ABB for this mode is currently missing. Proper support for the "BT cordless" mode can be added if a real need for it ever arises, but it would take some work, and right now there is no business case for it. In TI's TCS211 firmware architecture (see TCS211-fw-arch document) entry into and exit from these "Bluetooth" MCSI voice routing modes is handled via the RiViera Audio Service fw component, specifically its Audio Mode facility, usually via the audio_full_access_write() API call. When asked to switch voice routing modes, this RV Audio Service component sends an MMI_AUDIO_MODE_REQ message to L1, the L1A component passes the request to L1S, and L1S finally twiddles the magic control bits in the DSP API RAM. In FreeCalypso we currently provide two ways for the end user to enter the "BT headset" mode for digital access to GSM voice: * The original way is the AT@VPATH=n command, which provides "raw" access to the RV Audio Service's voice routing mode switch call. Setting AT@VPATH=2 enters the "BT headset" mode, AT@VPATH=0 returns to the normal "GSM only" mode (MCSI disabled), and AT@VPATH=1 enters the currently not-working "BT cordless" mode. * The new way is the session-long AT@VSEL=n boolean setting. In the default AT@VSEL=0 mode the firmware functions like before (MCSI disabled, voice calls go to the analog voice hw), but if your application needs the digital voice interface instead of analog, you can set AT@VSEL=1 once at the beginning of your modem session. In this AT@VSEL=1 mode, whenever a GSM voice call is connected (dialed or answered), the MCSI clocks are switched on (MCSI_CLK and MCSI_FSYNCH outputs come to life) and the "BT headset" voice routing mode is entered at the appropriate point in the call establishment process; when the call disconnects (either side hangs up), MCSI is turned off. The new logic internally performs the equivalent of AT@VPATH=2 and AT@VPATH=0 at appropriate times. Why does one need our new AT@VSEL=1 logic for dynamic switching into and out of MCSI "BT headset" mode, why not simply set AT@VPATH=2 upfront and run with it? Two reasons: 1) If MCSI is enabled continuously and not just when needed during voice calls, the DSP never goes quiescent during idle periods, and the Calypso is not allowed to enter deep sleep. Both of these factors are detrimental to proper power management - the whole idea is that when a GSM modem is idle (not in a call, but listening to paging and ready to accept incoming calls), most of the hw needs to be powered down as much as possible, to reduce power consumption to a minimum and prolong standby battery life. 2) There is a bug in the DSP code (present in the ROM and not corrected by the patches we are using) that manifests if MCSI is already running when the very first voice call after system boot is connected. Our AT@VSEL=1 mechanism reliably avoids this DSP bug (ensured by the timing sequence of when we turn on the vocoder and when we turn on MCSI), and it is my (Mother Mychaela's) guess that TI probably missed this DSP bug because their own Bluetooth handling code most likely worked very similarly to my AT@VSEL=1 implementation. Thus the short story is that if you are using the digital voice interface via MCSI, just set AT@VSEL=1 at the beginning of your modem session, and whatever hardware you connect to MCSI needs to be OK with the clocks (MCSI_CLK and MCSI_FSYNCH) appearing only during active voice calls, and being off at other times. It should also be noted that the new AT@VSEL=1 mechanism is implemented properly only in our new hybrid firmwares, i.e., Magnetite hybrid and Selenite. The legacy configs (l1reconst etc) using the blob version of G23M PS and ACI from Openmoko (maintained only for regression testing and debugging purposes) also implement the AT@VSEL command, but the AT@VSEL=1 mode will work somewhat erratically in that version: the modem may enable MCSI at the wrong time, and it will sometimes fail to turn it off at the end of a call. The implementation of this functionality resides entirely in the "high-level audio driver" module in ACI, this module is different between TCS2 and TCS3 versions of ACI, and there is no justification for expending the effort to make the new feature work in the old version of ACI: it is an entirely new feature added in FreeCalypso, not present in any old Calypso modems, hybrid fw is the way forward in FC, thus we only need to support new features in our hybrid firmwares. The alternative approach of tapping VSP ======================================= MCSI is not the only digital voice interface in the Calypso chipset: there is also another interface called VSP (Voice Serial Port), which is a private interface between Calypso and Iota chips. Because it was always intended to be a private interface internal to the core chipset, not an external application interface like MCSI, none of the standard Calypso-based phone or modem board designs expose it in any accessible way - instead it goes from one BGA to the other on inner PCB layers with zero accessibility for probing. Our FCDEV3B is no exception in this regard, as our modem core is based on a commercial modem design from a decade before our time. Because it took us a very long time to get MCSI working as a practically usable digital voice interface (the new AT@VSEL=1 mechanism is the key, without this firmware piece MCSI is not practically usable), much thought has been given earlier to the alternative idea of tapping into VSP. There are two possibilities with that one: 1) Given that Calypso VSP is a clock slave (it expects the ABB chip to provide the clock and frame sync signals), those who desire their digital voice i/f to be a PCM slave (not a PCM master like TI's "BT headset" function over MCSI) will likely be very tempted to disconnect Calypso VSP from the Iota chip entirely and to connect it to their own application instead. However, in the absence of source code for the DSP ROM this approach would be incredibly risky (if the DSP is not too happy with the non-Calypso-sourced timing you feed to the VSP, how are you going to debug it deep within the DSP black box?), and I (Mother Mychaela) consider it so risky that if anyone wants to do it, you will be entirely on your own - don't expect any help from me. 2) A much safer approach would be to keep the VSP clock and frame sync connections between Calypso and Iota chips, but also make them available externally, i.e., have your application logic sync itself to these clocks. Voice downlink could then be received just by passively tapping VSP lines, and sending your own voice uplink via VSP would require cutting only the one line that carries voice uplink bits from Iota to Calypso. It would then effectively be just like MCSI (a PCM master to the user's application), but without requiring any support in the firmware, instead being completely invisible to the Calypso firmware and to the DSP. However, because we don't have any board on which VSP signals are accessible to probing, there are several unknowns with this interface: * Is the VSP clock produced by the Iota chip 500 kHz (13 MHz master clock divided by 26) or 520 kHz (same master clock divided by 25)? The available Iota datasheet says 500 kHz, but if that is correct, how is the frame sync handled? 500 kHz does not divide evenly by 8 kHz. Does Iota's clock + frame sync output alternate between 62-bit and 63-bit frames, producing an 8 kHz frame rate on average? Sounds messy and convoluted... * It is not clear at all exactly when Iota's VSP clocks are started and stopped, and whether the bit clock runs continuously during an active call (like MCSI_CLK does), or if it is gated on only for those bit slots that carry actual voice sample bits. If we are going to produce a new FreeCalypso modem based on our current FCDEV3B, but repackaged into some end use form factor, as things stand today (2019-03), we are going to use MCSI rather than VSP for the digital voice interface. While MCSI has definitely been a huge hassle and requires the user to issue one extra setup command (AT@VSEL=1) at the beginning of each modem session, at least it is now a known beast, and a known-working one. Committing to VSP in a commercial product design without ever having seen these VSP signals on an oscilloscope would be very irresponsible; if someone really wishes to go with VSP instead of MCSI, the responsible approach would be to first design and build another development board with VSP signals brought out for experimentation, and only then possibly use it in a commercial product design after it becomes a known beast. From the standpoint of pure curiosity, I would be very interested in a development board with VSP access, just to answer the above questions and fill that gap in my Calypso knowledge. But switching to a more practical hat, spending some 10 to 15 kUSD just to satisfy that curiosity would be very difficult to justify - thus there is a very strong chance that VSP will never be explored, Which is not really a problem at all, as for a practically usable external digital voice channel we now have working MCSI.