FreeCalypso > hg > fc-tourmaline
comparison src/g23m-fad/fad/fad_sbm.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 16 Oct 2020 06:25:50 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:4e78acac3d88 | 1:fa8dc04885d8 |
|---|---|
| 1 /* | |
| 2 +----------------------------------------------------------------------------- | |
| 3 | Project : GSM-F&D (8411) | |
| 4 | Modul : FAD_SBM | |
| 5 +----------------------------------------------------------------------------- | |
| 6 | Copyright 2002 Texas Instruments Berlin, AG | |
| 7 | All rights reserved. | |
| 8 | | |
| 9 | This file is confidential and a trade secret of Texas | |
| 10 | Instruments Berlin, AG | |
| 11 | The receipt of or possession of this file does not convey | |
| 12 | any rights to reproduce or disclose its contents or to | |
| 13 | manufacture, use, or sell anything it may describe, in | |
| 14 | whole, or in part, without the specific written consent of | |
| 15 | Texas Instruments Berlin, AG. | |
| 16 +----------------------------------------------------------------------------- | |
| 17 | Purpose : This Modul defines the send buffer manager for | |
| 18 | the component Fax Adaptation 3.45 of the mobile station | |
| 19 +----------------------------------------------------------------------------- | |
| 20 */ | |
| 21 | |
| 22 #ifndef FAD_SBM_C | |
| 23 #define FAD_SBM_C | |
| 24 #endif | |
| 25 | |
| 26 #define ENTITY_FAD | |
| 27 | |
| 28 /*==== INCLUDES ===================================================*/ | |
| 29 | |
| 30 #include <string.h> | |
| 31 #include "typedefs.h" | |
| 32 #include "pconst.cdg" | |
| 33 #include "vsi.h" | |
| 34 #include "custom.h" | |
| 35 #include "gsm.h" | |
| 36 #include "cnf_fad.h" | |
| 37 #include "mon_fad.h" | |
| 38 #include "prim.h" | |
| 39 #include "pei.h" | |
| 40 #include "tok.h" | |
| 41 #include "ccdapi.h" | |
| 42 #include "cl_ribu.h" | |
| 43 #include "fad.h" | |
| 44 | |
| 45 /*==== CONST =======================================================*/ | |
| 46 | |
| 47 /*==== TYPES =======================================================*/ | |
| 48 | |
| 49 /*==== VAR EXPORT ==================================================*/ | |
| 50 | |
| 51 /*==== VAR LOCAL ===================================================*/ | |
| 52 | |
| 53 /*==== FUNCTIONS ===================================================*/ | |
| 54 | |
| 55 /* | |
| 56 +--------------------------------------------------------------------+ | |
| 57 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM | | |
| 58 | STATE : code ROUTINE : sbm_init | | |
| 59 +--------------------------------------------------------------------+ | |
| 60 | |
| 61 PURPOSE : | |
| 62 | |
| 63 */ | |
| 64 GLOBAL void sbm_init(USHORT frameSize) | |
| 65 { | |
| 66 T_SBM *sbm = &fad_data->sbm; | |
| 67 USHORT n; | |
| 68 | |
| 69 TRACE_FUNCTION ("sbm_init()"); | |
| 70 | |
| 71 cl_ribu_init(&sbm->ribu, SBM_PRIMBUF_SIZE); | |
| 72 | |
| 73 for (n = 0; n < sbm->ribu.depth; n++) | |
| 74 sbm->Prim[n].Prim = NULL; | |
| 75 | |
| 76 sbm->PA = 0; | |
| 77 sbm->CurrPrimOff = 0; | |
| 78 sbm->CurrPrimLen = 0; | |
| 79 sbm->FrameSize = frameSize; | |
| 80 | |
| 81 fad_data->snd.FD.buf = fad_data->snd.FD_buf; | |
| 82 } | |
| 83 | |
| 84 /* | |
| 85 +--------------------------------------------------------------------+ | |
| 86 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM | | |
| 87 | STATE : code ROUTINE : sbm_store_prim | | |
| 88 +--------------------------------------------------------------------+ | |
| 89 | |
| 90 PURPOSE : | |
| 91 | |
| 92 */ | |
| 93 | |
| 94 GLOBAL void sbm_store_prim(T_SBM_PRIM *sendPrim) | |
| 95 { | |
| 96 T_SBM *sbm = &fad_data->sbm; | |
| 97 | |
| 98 #ifdef _SIMULATION_ | |
| 99 TRACE_FUNCTION ("sbm_store_prim()"); | |
| 100 #endif | |
| 101 | |
| 102 sbm->Prim[sbm->ribu.wi].Prim = sendPrim; | |
| 103 | |
| 104 if (!sbm->ribu.filled) /* Initialize new primitive for read out */ | |
| 105 { | |
| 106 sbm->CurrPrimOff = sendPrim->sdu.o_buf >> 3; | |
| 107 sbm->CurrPrimLen = sendPrim->sdu.l_buf >> 3; | |
| 108 } | |
| 109 cl_ribu_write_index(&sbm->ribu); | |
| 110 } | |
| 111 | |
| 112 /* | |
| 113 +--------------------------------------------------------------------+ | |
| 114 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM | | |
| 115 | STATE : code ROUTINE : sbm_free_empty_prims| | |
| 116 +--------------------------------------------------------------------+ | |
| 117 | |
| 118 PURPOSE : | |
| 119 | |
| 120 */ | |
| 121 | |
| 122 GLOBAL void sbm_free_empty_prims(void) | |
| 123 { | |
| 124 T_SBM *sbm = &fad_data->sbm; | |
| 125 | |
| 126 #ifdef _SIMULATION_ | |
| 127 TRACE_FUNCTION ("sbm_free_empty_prims()"); | |
| 128 #endif | |
| 129 | |
| 130 while (sbm->PA NEQ sbm->ribu.ri) | |
| 131 { | |
| 132 PFREE (sbm->Prim[sbm->PA].Prim); | |
| 133 sbm->PA++; | |
| 134 if (sbm->PA EQ sbm->ribu.depth) | |
| 135 sbm->PA = 0; | |
| 136 } | |
| 137 } | |
| 138 | |
| 139 /* | |
| 140 +--------------------------------------------------------------------+ | |
| 141 | PROJECT : GSM-F&D (8411) MODULE : FAD_SBM | | |
| 142 | STATE : code ROUTINE : sbm_get_frame | | |
| 143 +--------------------------------------------------------------------+ | |
| 144 | |
| 145 PURPOSE : | |
| 146 | |
| 147 */ | |
| 148 | |
| 149 GLOBAL BOOL sbm_get_frame(T_FRAME_DESC *ul_FD, UBYTE reqFrames) | |
| 150 { | |
| 151 T_SBM *sbm = &fad_data->sbm; | |
| 152 | |
| 153 USHORT requiredData; | |
| 154 BOOL insertSync; | |
| 155 | |
| 156 #ifdef _SIMULATION_ | |
| 157 TRACE_FUNCTION ("sbm_get_frame()"); | |
| 158 #endif | |
| 159 | |
| 160 cl_set_frame_desc_0(ul_FD, NULL, 0); | |
| 161 | |
| 162 if (!sbm->ribu.filled) /* There is no primitive */ | |
| 163 { | |
| 164 return FALSE; | |
| 165 } | |
| 166 | |
| 167 insertSync = FALSE; | |
| 168 | |
| 169 if (sbm->syncCycle NEQ SYNC_CYCLE_NONE) | |
| 170 { | |
| 171 if (reqFrames > sbm->framesUntilSync) | |
| 172 { | |
| 173 insertSync = TRUE; | |
| 174 reqFrames--; | |
| 175 } | |
| 176 else | |
| 177 sbm->framesUntilSync -= reqFrames; | |
| 178 } | |
| 179 | |
| 180 requiredData = sbm->FrameSize * (USHORT)reqFrames; | |
| 181 | |
| 182 if (sbm->CurrPrimLen > requiredData) | |
| 183 { | |
| 184 /* Current primitive holds more than enough data */ | |
| 185 cl_set_frame_desc_0(ul_FD, sbm->Prim[sbm->ribu.ri].Prim->sdu.buf + sbm->CurrPrimOff, requiredData); | |
| 186 | |
| 187 sbm->CurrPrimOff += requiredData; | |
| 188 sbm->CurrPrimLen -= requiredData; | |
| 189 } | |
| 190 else | |
| 191 { | |
| 192 /* | |
| 193 * Current primitive doesn't hold enough data | |
| 194 * or just the right amount of data. | |
| 195 * -> Switch to next primitive | |
| 196 */ | |
| 197 | |
| 198 /* Take all data from first primitive */ | |
| 199 cl_set_frame_desc_0(ul_FD, sbm->Prim[sbm->ribu.ri].Prim->sdu.buf + sbm->CurrPrimOff, sbm->CurrPrimLen); | |
| 200 | |
| 201 cl_ribu_read_index(&sbm->ribu); /* Switch to next primitive */ | |
| 202 | |
| 203 if (!sbm->ribu.filled) /* There is no second primitive */ | |
| 204 { | |
| 205 ul_FD->Adr[1] = (UBYTE *) NULL; | |
| 206 ul_FD->Len[1] = 0; | |
| 207 sbm->CurrPrimOff = 0; | |
| 208 sbm->CurrPrimLen = 0; | |
| 209 } | |
| 210 else /* Second primitive is available */ | |
| 211 { | |
| 212 requiredData -= sbm->CurrPrimLen; | |
| 213 | |
| 214 sbm->CurrPrimOff = sbm->Prim[sbm->ribu.ri].Prim->sdu.o_buf >> 3; | |
| 215 sbm->CurrPrimLen = sbm->Prim[sbm->ribu.ri].Prim->sdu.l_buf >> 3; | |
| 216 | |
| 217 if (requiredData EQ 0) | |
| 218 { | |
| 219 /* | |
| 220 * First primitive was just used up. | |
| 221 * We had to switch to next primitive, but don't need data. | |
| 222 */ | |
| 223 ul_FD->Adr[1] = (UBYTE *) NULL; | |
| 224 ul_FD->Len[1] = 0; | |
| 225 } | |
| 226 else | |
| 227 { | |
| 228 /* Data from next primitive is required */ | |
| 229 ul_FD->Adr[1] = sbm->Prim[sbm->ribu.ri].Prim->sdu.buf + sbm->CurrPrimOff; | |
| 230 | |
| 231 if (sbm->CurrPrimLen > requiredData) | |
| 232 { | |
| 233 /* Enough data found in second primitive */ | |
| 234 ul_FD->Len[1] = requiredData; | |
| 235 sbm->CurrPrimOff += requiredData; | |
| 236 sbm->CurrPrimLen -= requiredData; | |
| 237 } | |
| 238 else | |
| 239 { | |
| 240 /* Even with the second primitive there are not enough data! */ | |
| 241 ul_FD->Len[1] = sbm->CurrPrimLen; | |
| 242 | |
| 243 /* Second primitive is also emptied, switch to next primitve */ | |
| 244 cl_ribu_read_index(&sbm->ribu); | |
| 245 | |
| 246 if (sbm->ribu.filled) | |
| 247 { | |
| 248 sbm->CurrPrimOff = sbm->Prim[sbm->ribu.ri].Prim->sdu.o_buf >> 3; | |
| 249 sbm->CurrPrimLen = sbm->Prim[sbm->ribu.ri].Prim->sdu.l_buf >> 3; | |
| 250 | |
| 251 } | |
| 252 else | |
| 253 { | |
| 254 sbm->CurrPrimOff = 0; | |
| 255 sbm->CurrPrimLen = 0; | |
| 256 } | |
| 257 } | |
| 258 } | |
| 259 } | |
| 260 } | |
| 261 | |
| 262 if ((ul_FD->Len[0]+ul_FD->Len[1]) < requiredData) | |
| 263 { | |
| 264 /* | |
| 265 * If there are not enough data available align the length to 64 bit | |
| 266 * align the length to 64 bit boundaries. | |
| 267 * This alignment should normally occur at the end of the message phase. | |
| 268 * The required data are always a multiple of 64 bits. | |
| 269 */ | |
| 270 int i, k = 0; | |
| 271 int diff = requiredData - (ul_FD->Len[0]+ul_FD->Len[1]); | |
| 272 | |
| 273 if (ul_FD->Len[1] > 0) | |
| 274 k = 1; | |
| 275 | |
| 276 for (i = 0; i < ul_FD->Len[k]; i++) | |
| 277 fad_data->snd.ul_FD_align[i] = ul_FD->Adr[k][i]; | |
| 278 | |
| 279 for (i = ul_FD->Len[k]; i < ul_FD->Len[k] + diff; i++) | |
| 280 fad_data->snd.ul_FD_align[i] = 0; | |
| 281 | |
| 282 ul_FD->Len[k] += diff; | |
| 283 ul_FD->Adr[k] = fad_data->snd.ul_FD_align; | |
| 284 } | |
| 285 | |
| 286 if (insertSync) | |
| 287 { | |
| 288 USHORT framesUntilSync = sbm->framesUntilSync; | |
| 289 USHORT frame_off = 0, i, j; | |
| 290 | |
| 291 for (i=0; i<2; i++) | |
| 292 { | |
| 293 for (j=0; j<ul_FD->Len[i]; j+=FRAME_SIZE) | |
| 294 { | |
| 295 if (framesUntilSync-- EQ 0) | |
| 296 { | |
| 297 memcpy((char*)&sbm->frames[frame_off], (char*)FR_SEQ_SYNC, FRAME_SIZE); | |
| 298 frame_off+=FRAME_SIZE; | |
| 299 } | |
| 300 memcpy((char*)&sbm->frames[frame_off], (char*)ul_FD->Adr[i], FRAME_SIZE); | |
| 301 frame_off+=FRAME_SIZE; | |
| 302 | |
| 303 sbm->framesUntilSync = sbm->syncCycle - reqFrames + framesUntilSync; | |
| 304 } | |
| 305 } | |
| 306 cl_set_frame_desc_0(ul_FD, sbm->frames, (USHORT)((reqFrames+1)*FRAME_SIZE)); | |
| 307 } | |
| 308 return TRUE; | |
| 309 } | |
| 310 |
