FreeCalypso > hg > freecalypso-citrine
comparison doc/TCH-special-feature @ 28:cb00b90edaff
documentation write-ups imported from freecalypso-sw and updated for Citrine
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 12 Jun 2016 18:28:35 +0000 |
| parents | |
| children | 3362a76ab432 |
comparison
equal
deleted
inserted
replaced
| 27:3ecd6054a7f7 | 28:cb00b90edaff |
|---|---|
| 1 FreeCalypso Citrine firmware implements an optional special feature (needs to be | |
| 2 explicitly enabled at compile time) which we call TCH rerouting. When this | |
| 3 feature is enabled, it applies the following special handling to GSM voice | |
| 4 traffic channels (TCH): | |
| 5 | |
| 6 * All downlink TCH bits passing from the channel decoder to the vocoder block | |
| 7 (260 bits every 20 ms with the original FR codec) can be non-invasively | |
| 8 intercepted and forwarded to the external host connected to the RVTMUX serial | |
| 9 interface; | |
| 10 | |
| 11 * Using the same serial interface, the external host can supply substitute | |
| 12 uplink TCH bits which will be transmitted in the place of the built-in | |
| 13 vocoder output, i.e., the latter can be effectively suppressed. | |
| 14 | |
| 15 In order to use this feature, you need to compile our firmware in the voice+SMS | |
| 16 pseudo-modem configuration, i.e., the configuration in which the fw expects to | |
| 17 be controlled via AT commands wrapped in the RVTMUX binary packet serial | |
| 18 interface. You can use a target GSM device that has just one accessible serial | |
| 19 port (Mot C1xx and Pirelli DP-L10) or one that has two Calypso UARTs (Openmoko | |
| 20 GTA02 or our future FCDEV3B), but in the latter case you will be using only one | |
| 21 UART - whichever one you have configured to be RVTMUX. | |
| 22 | |
| 23 Whatever system you are building that will act as the source and sink for TCH | |
| 24 bits will need to interface to the FreeCalypso GSM device via a serial port in | |
| 25 the RVTMUX binary packet format. Your system will need to send RVTMUX packets | |
| 26 with AT commands inside them in order to command the FC GSM device to register | |
| 27 with the network and to dial and/or answer calls, and you will need to send | |
| 28 RVTMUX packets of a different kind in order to supply the uplink TCH bits | |
| 29 during calls. In the other direction, your system will receive responses to | |
| 30 the AT commands you send, asynchronous notifications of incoming calls and SMS, | |
| 31 downlink TCH bits and various debug trace output from our FreeCalypso firmware. | |
| 32 The last part (debug trace output) can be simply ignored and discarded if you | |
| 33 wish, but we strongly recommend that you provide a way to view and/or log it | |
| 34 for debugging purposes. | |
| 35 | |
| 36 Please see the RVTMUX document in the FreeCalypso host tools package for general | |
| 37 background information regarding the RVTMUX binary packet interface; this | |
| 38 document should be considered required reading for anyone interested in working | |
| 39 with the TCH rerouting special feature. | |
| 40 | |
| 41 All packets transferred over the RVTMUX interface begin and end with 0x02. If | |
| 42 a payload byte within a packet equals 0x02 or 0x10, it needs to be prepended | |
| 43 with 0x10 as a transparency escape; all other payload bytes are sent literally. | |
| 44 The first byte within each RVTMUX packet after the opening 0x02 is the packet | |
| 45 type; the two packet types you will need to handle (both generate and receive) | |
| 46 are 0x1A for AT commands and 0x1C for TCH configuration commands. | |
| 47 | |
| 48 To send an AT command to the FreeCalypso GSM device, prepend the 0x1A packet | |
| 49 type in front of the "AT" characters, wrap the packet with 0x02 bytes on both | |
| 50 ends, and send it to the modem. Responses to AT commands and asynchronous | |
| 51 notification messages such as "RING" for incoming calls will be sent to the | |
| 52 host as RVTMUX packets also beginning with the 0x1A packet type; they will be | |
| 53 interspersed among other packet types, mostly debug trace output. Your system | |
| 54 will need to receive the RVTMUX serial byte stream continuously, parsing the | |
| 55 packet structure and looking at the type of each packet (the first byte after | |
| 56 the opening 0x02) in order to detect if the modem has sent something you may be | |
| 57 interested in. | |
| 58 | |
| 59 If you wish to receive a copy of all downlink TCH bits on the serial channel, | |
| 60 you will need to send the following 5-byte command packet to the modem: | |
| 61 | |
| 62 0x02: opening flag | |
| 63 0x1C: RVTMUX packet type for TCH | |
| 64 0x11: TCH_CONFIG_REQ command opcode | |
| 65 0x01: payload byte indicating that the "forward downlink" state should be | |
| 66 set to enabled | |
| 67 0x02: closing flag | |
| 68 | |
| 69 The modem will respond with a TCH_CONFIG_CONF confirmation message (opcode | |
| 70 0x12), and then during all voice calls your external host will receive the | |
| 71 following packet every 20 ms: | |
| 72 | |
| 73 0x02: opening flag | |
| 74 0x1C: RVTMUX packet type for TCH | |
| 75 0x15: TCH_DLBITS_IND opcode | |
| 76 - 40 (decimal) bytes of payload - | |
| 77 0x02: closing flag | |
| 78 | |
| 79 The 40 bytes of payload sent in every TCH_DLBITS_IND packet directly correspond | |
| 80 to the 20 16-bit words provided by the Calypso DSP in its a_dd_0 buffer. The | |
| 81 first 3 words (6 bytes) contains the DSP's own status information (not fully | |
| 82 understood by us yet, but we let you see what the DSP tells us without redacting | |
| 83 anything out), and the remaining 17 words (34 bytes) are supposed to contain | |
| 84 the TCH bits received from the GSM network in the FR codec format. Each DSP | |
| 85 API word is sent in the big-endian byte order, i.e., the most significant byte | |
| 86 followed by the least significant byte. | |
| 87 | |
| 88 If you wish to send your own TCH uplink bits, replacing the output of the | |
| 89 built-in vocoder with your own alternate uplink data, you will need to send | |
| 90 your uplink TCH bits to the modem in packets of the following format: | |
| 91 | |
| 92 0x02: opening flag | |
| 93 0x1C: RVTMUX packet type for TCH | |
| 94 0x13: TCH_ULBITS_REQ opcode | |
| 95 - 33 or 34 (decimal) bytes of payload - | |
| 96 0x02: closing flag | |
| 97 | |
| 98 Sending 260 bits requires only 33 bytes, but the DSP operates in terms of | |
| 99 16-bit words, hence 17 of those words are used. The least significant byte of | |
| 100 the last word (i.e., the very last byte with our big-endian transmission order) | |
| 101 is not expected to be used, but if you send 34 bytes rather than 33, you will | |
| 102 have control over every bit going into the DSP API RAM in this case. | |
| 103 | |
| 104 There is a queue inside the firmware in which these TCH uplink data blocks are | |
| 105 stored; this queue is filled by the serial packet receiving handler and drained | |
| 106 by the L1S (synchronous) code that executes at the right times in the GSM TDMA | |
| 107 multiplex when uplink TCH transmission is expected. Up to 4 blocks can be | |
| 108 queued up; as each queued-up block is transmitted on the air (more precisely, | |
| 109 as it is passed to the DSP for channel encoding and transmission), a | |
| 110 TCH_ULBITS_CONF short packet (consisting of just the opcode and nothing more) | |
| 111 is sent to the host. These confirmation packets can be used to pace the sending | |
| 112 of further TCH_ULBITS_REQs. | |
| 113 | |
| 114 Testing | |
| 115 ======= | |
| 116 | |
| 117 The just-described mechanism has been tested as follows: | |
| 118 | |
| 119 1. I placed a call to WWV (+1-303-499-7111), and after verifying with my ear | |
| 120 that the downlink audio was good, I recorded the downlink TCH bits on that | |
| 121 call into a file with the tch record command in fc-shell. | |
| 122 | |
| 123 2. I placed a call to another phone (running over a live commercial GSM network) | |
| 124 and played the saved recording from WWV into the call uplink with the | |
| 125 tch play command in fc-shell. | |
| 126 | |
| 127 3. The audio heard on the other end of the call in the previous step: the | |
| 128 recording from WWV was definitely recognizable, but it didn't sound perfect, | |
| 129 i.e., it was rather garbled. | |
| 130 | |
| 131 [NOTE: the experiment described above was performed with an older version of | |
| 132 the firmware which is now codenamed Citrine, namely, the version with L1-2014. | |
| 133 I have not played with the TCH rerouting feature again since the transition to | |
| 134 L1-2016.] | |
| 135 | |
| 136 Further debugging of this mechanism will require two things which I currently | |
| 137 lack: (1) proper understanding of the workings of the GSM 06.10 FR codec and | |
| 138 (2) a test GSM network (as in OpenBTS/OpenBSC/etc) that could be used instead | |
| 139 of live commercial ones, so we could see exactly what the test MS is | |
| 140 transmitting on the air and what the BTS transmits in the downlink. | |
| 141 | |
| 142 Host side reference implementation | |
| 143 ================================== | |
| 144 | |
| 145 If you are going to implement your own system for talking to FreeCalypso GSM | |
| 146 pseudo-modems via the RVTMUX binary packet interface, we strongly recommend | |
| 147 that you use our rvinterf and fc-shell Unix/Linux host utilities as your | |
| 148 starting point. You can find their source code in the freecalypso-tools Hg | |
| 149 repository on Bitbucket. | |
| 150 | |
| 151 The following test commands have been added to fc-shell for exercising the | |
| 152 experimental TCH rerouting mechanism: | |
| 153 | |
| 154 tch record <filename> | |
| 155 | |
| 156 Sends a TCH_CONFIG_REQ packet to the target, commanding the firmware to | |
| 157 start forwarding TCH downlink bits to the external host, and starts | |
| 158 recording the bits it receives in the named file. The file is written | |
| 159 with the same ordering of GSM 06.10 bits as used by the popular libgsm | |
| 160 implementation of this codec, i.e., the bits received from the GSM | |
| 161 device (ultimately coming from TI's DSP) are reordered before being | |
| 162 written into the file. It is only a reordering of bits with no change | |
| 163 in the information content. | |
| 164 | |
| 165 I was hoping that the resulting files could be played with the SoX play | |
| 166 command under Slackware Linux, but all I got was garbled audio, and my | |
| 167 audio-fu is not good enough to figure out what is wrong. | |
| 168 | |
| 169 tch record stop | |
| 170 | |
| 171 Stops TCH downlink recording and closes the file into which the bytes | |
| 172 were being written; until the file is thus closed, it may not be | |
| 173 actually written out to the file system. | |
| 174 | |
| 175 tch play <filename> | |
| 176 | |
| 177 Plays GSM 06.10 FR speech frames from the named file in libgsm format | |
| 178 (same as written by the tch record command) into the call uplink. | |
| 179 | |
| 180 tch play stop | |
| 181 | |
| 182 Terminates the TCH UL play-from-file operation. This command is | |
| 183 normally not needed, as the play session will end automatically when | |
| 184 the end of file is reached. |
