FreeCalypso > hg > ice1-trau-tester
view ater/tx_func.c @ 19:1e375472d5a5
ater: implement TRAU frame output
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 24 Jun 2024 08:07:45 +0000 |
parents | 61862af2247f |
children | 0d70444b5070 |
line wrap: on
line source
/* * Here we are going to implement Tx on Ater toward the TRAU. */ #include <stdint.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <osmocom/core/msgb.h> #include <osmocom/core/select.h> #include <osmocom/isdn/i460_mux.h> #include "globals.h" #include "submux.h" void init_trau_ul_frame(int nr) { struct ater_subslot *at = &subslots[nr]; struct osmo_trau_frame *fr = &at->ul_frame; fr->type = at->is_efr ? OSMO_TRAU16_FT_EFR : OSMO_TRAU16_FT_FR; fr->dir = OSMO_TRAU_DIR_UL; memset(fr->c_bits + 5, 0, 6); memset(fr->c_bits + 15, 1, 6); memset(fr->t_bits, 1, 4); } static void tx_service_subslot(int nr) { struct ater_subslot *at = &subslots[nr]; struct osmo_trau_frame *fr = &at->ul_frame; struct msgb *msg; int len; if (!at->is_active) return; at->mfrm_count++; if (at->mfrm_count >= 24) { at->mfrm_count = 0; fr->c_bits[14] = 1; } else { fr->c_bits[14] = 0; } msg = msgb_alloc_c(g_ctx, 640, "TRAU-UL-frame"); if (!msg) return; len = osmo_trau_frame_encode(msg->tail, msgb_tailroom(msg), fr); msgb_put(msg, len); osmo_i460_mux_enqueue(at->schan, msg); } void transmit_e1_ts(void) { uint8_t buf[160]; int nr; for (nr = 0; nr < ATER_SUBSLOTS; nr++) tx_service_subslot(nr); osmo_i460_mux_out(&i460_ts, buf, 160); write(ts_fd, buf, 160); }