diff options
-rw-r--r-- | .github/FUNDING.yml | 1 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/gsm48_rr.c | 1 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/tch_voice.c | 2 | ||||
-rw-r--r-- | src/host/trxcon/src/sched_lchan_tchf.c | 78 | ||||
-rw-r--r-- | src/host/trxcon/src/sched_lchan_tchh.c | 75 | ||||
-rw-r--r-- | src/host/trxcon/src/sched_prim.c | 3 | ||||
-rw-r--r-- | src/target/firmware/Makefile | 12 | ||||
-rw-r--r-- | src/target/firmware/board/se_k2xx/init.c (renamed from src/target/firmware/board/se_k2x0/init.c) | 4 | ||||
-rw-r--r-- | src/target/firmware/board/se_k2xx/keymap.h (renamed from src/target/firmware/board/se_k2x0/keymap.h) | 0 | ||||
-rw-r--r-- | src/target/firmware/board/se_k2xx/rffe_k2xx.c (renamed from src/target/firmware/board/se_k2x0/rffe_k2x0.c) | 0 | ||||
-rw-r--r-- | src/target/firmware/fb/fb_k2xx.c (renamed from src/target/firmware/fb/fb_k2x0.c) | 40 |
11 files changed, 107 insertions, 109 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..7592debf --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: osmocom diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index 83287c14..1750c57f 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -3703,6 +3703,7 @@ static int gsm48_rr_tx_meas_rep(struct osmocom_ms *ms) /* get 6 strongest measurements */ strongest = 127; /* infinite */ + strongest_i = -1; /* make gcc happy */ for (n = 0; n < 6; n++) { current = -128; /* -infinite */ index = 0; diff --git a/src/host/layer23/src/mobile/tch_voice.c b/src/host/layer23/src/mobile/tch_voice.c index ac793e84..a740f71f 100644 --- a/src/host/layer23/src/mobile/tch_voice.c +++ b/src/host/layer23/src/mobile/tch_voice.c @@ -122,8 +122,8 @@ int tch_voice_state_init(struct gsm_trans *trans, struct tch_voice_state *state) case TCH_VOICE_IOH_LOOPBACK: rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ; break; -#ifdef WITH_GAPK_IO case TCH_VOICE_IOH_GAPK: +#ifdef WITH_GAPK_IO if ((cd->chan_nr & RSL_CHAN_NR_MASK) == RSL_CHAN_Bm_ACCHs) state->gapk_io = gapk_io_state_alloc_mode_rate(ms, cd->mode, true); else /* RSL_CHAN_Lm_ACCHs */ diff --git a/src/host/trxcon/src/sched_lchan_tchf.c b/src/host/trxcon/src/sched_lchan_tchf.c index 37e0cea3..985bea48 100644 --- a/src/host/trxcon/src/sched_lchan_tchf.c +++ b/src/host/trxcon/src/sched_lchan_tchf.c @@ -3,7 +3,7 @@ * TDMA scheduler: handlers for DL / UL bursts on logical channels * * (C) 2017-2022 by Vadim Yanitskiy <axilirator@gmail.com> - * (C) 2021-2023 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> + * (C) 2021-2024 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * * All Rights Reserved * @@ -290,42 +290,49 @@ int tx_tchf_fn(struct l1sched_lchan_state *lchan, /* fall-through */ case GSM48_CMODE_SPEECH_V1: case GSM48_CMODE_SPEECH_EFR: - if (msg == NULL) { - /* transmit a dummy speech block with inverted CRC3 */ - gsm0503_tch_fr_encode(bursts_p, NULL, 0, 1); - goto send_burst; - } + /* if msg == NULL, transmit a dummy speech block with inverted CRC3 */ rc = gsm0503_tch_fr_encode(BUFPOS(bursts_p, 0), - msgb_l2(msg), - msgb_l2len(msg), 1); + msg ? msgb_l2(msg) : NULL, + msg ? msgb_l2len(msg) : 0, 1); + /* confirm traffic sending (pass ownership of the msgb/prim) */ + if (OSMO_LIKELY(rc == 0)) + l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); + else /* unlikely: encoding failed, drop msgb/prim */ + msgb_free(msg); + /* drop the other msgb/prim */ + msgb_free((msg == msg_facch) ? msg_tch : msg_facch); break; case GSM48_CMODE_SPEECH_AMR: { bool amr_fn_is_cmr = !sched_tchf_ul_amr_cmi_map[br->fn % 26]; - const uint8_t *data = msg ? msgb_l2(msg) : NULL; - size_t data_len = msg ? msgb_l2len(msg) : 0; + unsigned int offset = 0; - if (msg == NULL) { - /* TODO: It's not clear what to do for TCH/AFS. - * TODO: Send dummy FACCH maybe? */ - goto send_burst; /* send something */ - } - - if (data_len != GSM_MACBLOCK_LEN) { /* TCH/AFS: speech */ - if (!l1sched_lchan_amr_prim_is_valid(lchan, msg, amr_fn_is_cmr)) - goto free_bad_msg; + if (msg != NULL && msg != msg_facch) { /* TCH/AFS: speech */ + if (!l1sched_lchan_amr_prim_is_valid(lchan, msg, amr_fn_is_cmr)) { + msgb_free(msg); + msg_tch = NULL; + msg = NULL; + } /* pull the AMR header - sizeof(struct amr_hdr) */ - data_len -= 2; - data += 2; + offset = 2; } + /* if msg == NULL, transmit a dummy speech block with inverted CRC6 */ rc = gsm0503_tch_afs_encode(BUFPOS(bursts_p, 0), - data, data_len, + msg ? msgb_l2(msg) + offset : NULL, + msg ? msgb_l2len(msg) - offset : 0, amr_fn_is_cmr, lchan->amr.codec, lchan->amr.codecs, lchan->amr.ul_ft, lchan->amr.ul_cmr); + /* confirm traffic sending (pass ownership of the msgb/prim) */ + if (OSMO_LIKELY(rc == 0)) + l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); + else /* unlikely: encoding failed, drop prim */ + msgb_free(msg); + /* drop the other primitive */ + msgb_free((msg == msg_facch) ? msg_tch : msg_facch); break; } /* CSD (TCH/F14.4): 14.5 kbit/s radio interface rate */ @@ -345,7 +352,7 @@ int tx_tchf_fn(struct l1sched_lchan_state *lchan, /* Confirm FACCH sending (pass ownership of the msgb/prim) */ l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); } - goto send_burst; + break; /* CSD (TCH/F9.6): 12.0 kbit/s radio interface rate */ case GSM48_CMODE_DATA_12k0: if ((msg = msg_tch) != NULL) { @@ -363,7 +370,7 @@ int tx_tchf_fn(struct l1sched_lchan_state *lchan, /* Confirm FACCH sending (pass ownership of the msgb/prim) */ l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); } - goto send_burst; + break; /* CSD (TCH/F4.8): 6.0 kbit/s radio interface rate */ case GSM48_CMODE_DATA_6k0: if ((msg = msg_tch) != NULL) { @@ -381,42 +388,33 @@ int tx_tchf_fn(struct l1sched_lchan_state *lchan, /* Confirm FACCH sending (pass ownership of the msgb/prim) */ l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); } - goto send_burst; + break; /* CSD (TCH/F2.4): 3.6 kbit/s radio interface rate */ case GSM48_CMODE_DATA_3k6: if ((msg = msg_facch) != NULL) { /* FACCH/F does steal a TCH/F2.4 frame completely */ - rc = gsm0503_tch_fr_facch_encode(BUFPOS(bursts_p, 0), msgb_l2(msg)); + gsm0503_tch_fr_facch_encode(BUFPOS(bursts_p, 0), msgb_l2(msg)); + l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); + msgb_free(msg_tch); } else if ((msg = msg_tch) != NULL) { OSMO_ASSERT(msgb_l2len(msg) == 2 * 36); - rc = gsm0503_tch_fr24_encode(BUFPOS(bursts_p, 0), msgb_l2(msg)); + gsm0503_tch_fr24_encode(BUFPOS(bursts_p, 0), msgb_l2(msg)); + l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); } else { ubit_t idle[2 * 36]; memset(&idle[0], 0x01, sizeof(idle)); gsm0503_tch_fr24_encode(BUFPOS(bursts_p, 0), &idle[0]); - goto send_burst; } break; default: LOGP_LCHAND(lchan, LOGL_ERROR, "TCH mode %s is unknown or not supported\n", gsm48_chan_mode_name(lchan->tch_mode)); - goto free_bad_msg; - } - - if (rc) { - LOGP_LCHAND(lchan, LOGL_ERROR, "Failed to encode L2 payload (len=%u): %s\n", - msgb_l2len(msg), msgb_hexdump_l2(msg)); -free_bad_msg: msgb_free(msg_facch); msgb_free(msg_tch); - return -EINVAL; + break; } - /* Confirm data / traffic sending (pass ownership of the msgb/prim) */ - l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); - msgb_free((msg == msg_facch) ? msg_tch : msg_facch); - send_burst: /* Determine which burst should be sent */ burst = BUFPOS(bursts_p, br->bid); diff --git a/src/host/trxcon/src/sched_lchan_tchh.c b/src/host/trxcon/src/sched_lchan_tchh.c index 99e26808..d684976d 100644 --- a/src/host/trxcon/src/sched_lchan_tchh.c +++ b/src/host/trxcon/src/sched_lchan_tchh.c @@ -4,7 +4,7 @@ * * (C) 2018-2022 by Vadim Yanitskiy <axilirator@gmail.com> * (C) 2018 by Harald Welte <laforge@gnumonks.org> - * (C) 2020-2023 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> + * (C) 2020-2024 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de> * * All Rights Reserved * @@ -497,42 +497,53 @@ int tx_tchh_fn(struct l1sched_lchan_state *lchan, msg = l1sched_lchan_prim_dummy_lapdm(lchan); /* fall-through */ case GSM48_CMODE_SPEECH_V1: - if (msg == NULL) { - /* transmit a dummy speech block with inverted CRC3 */ - gsm0503_tch_hr_encode(bursts_p, NULL, 0); - goto send_burst; - } + /* if msg == NULL, transmit a dummy speech block with inverted CRC3 */ rc = gsm0503_tch_hr_encode(BUFPOS(bursts_p, 0), - msgb_l2(msg), - msgb_l2len(msg)); + msg ? msgb_l2(msg) : NULL, + msg ? msgb_l2len(msg) : 0); + /* confirm traffic sending (pass ownership of the msgb/prim) */ + if (OSMO_LIKELY(rc == 0)) { + if (msg && msgb_l2len(msg) == GSM_MACBLOCK_LEN) + lchan->ul_facch_blocks = 6; + l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); + } else /* unlikely: encoding failed, drop msgb/prim */ + msgb_free(msg); + /* drop the other msgb/prim */ + msgb_free((msg == msg_facch) ? msg_tch : msg_facch); break; case GSM48_CMODE_SPEECH_AMR: { bool amr_fn_is_cmr = !sched_tchh_ul_amr_cmi_map[br->fn % 26]; - const uint8_t *data = msg ? msgb_l2(msg) : NULL; - size_t data_len = msg ? msgb_l2len(msg) : 0; - - if (msg == NULL) { - /* TODO: It's not clear what to do for TCH/AHS. - * TODO: Send dummy FACCH maybe? */ - goto send_burst; /* send garbage */ - } + unsigned int offset = 0; - if (data_len != GSM_MACBLOCK_LEN) { /* TCH/AHS: speech */ - if (!l1sched_lchan_amr_prim_is_valid(lchan, msg, amr_fn_is_cmr)) - goto free_bad_msg; + if (msg != NULL && msg != msg_facch) { /* TCH/AHS: speech */ + if (!l1sched_lchan_amr_prim_is_valid(lchan, msg, amr_fn_is_cmr)) { + msgb_free(msg); + msg_tch = NULL; + msg = NULL; + } /* pull the AMR header - sizeof(struct amr_hdr) */ - data_len -= 2; - data += 2; + offset = 2; } + /* if msg == NULL, transmit a dummy speech block with inverted CRC6 */ rc = gsm0503_tch_ahs_encode(BUFPOS(bursts_p, 0), - data, data_len, + msg ? msgb_l2(msg) + offset : NULL, + msg ? msgb_l2len(msg) - offset : 0, amr_fn_is_cmr, lchan->amr.codec, lchan->amr.codecs, lchan->amr.ul_ft, lchan->amr.ul_cmr); + /* confirm traffic sending (pass ownership of the msgb/prim) */ + if (OSMO_LIKELY(rc == 0)) { + if (msg && msgb_l2len(msg) == GSM_MACBLOCK_LEN) + lchan->ul_facch_blocks = 6; + l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); + } else /* unlikely: encoding failed, drop msgb/prim */ + msgb_free(msg); + /* drop the other msgb/prim */ + msgb_free((msg == msg_facch) ? msg_tch : msg_facch); break; } /* CSD (TCH/H4.8): 6.0 kbit/s radio interface rate */ @@ -552,7 +563,7 @@ int tx_tchh_fn(struct l1sched_lchan_state *lchan, /* Confirm FACCH sending (pass ownership of the msgb/prim) */ l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); } - goto send_burst; + break; /* CSD (TCH/H2.4): 3.6 kbit/s radio interface rate */ case GSM48_CMODE_DATA_3k6: if ((msg = msg_tch) != NULL) { @@ -570,30 +581,16 @@ int tx_tchh_fn(struct l1sched_lchan_state *lchan, /* Confirm FACCH sending (pass ownership of the msgb/prim) */ l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); } - goto send_burst; + break; default: LOGP_LCHAND(lchan, LOGL_ERROR, "TCH mode %s is unknown or not supported\n", gsm48_chan_mode_name(lchan->tch_mode)); - goto free_bad_msg; - } - - if (rc) { - LOGP_LCHAND(lchan, LOGL_ERROR, "Failed to encode L2 payload (len=%u): %s\n", - msgb_l2len(msg), msgb_hexdump_l2(msg)); -free_bad_msg: msgb_free(msg_facch); msgb_free(msg_tch); - return -EINVAL; + break; } - if (msgb_l2len(msg) == GSM_MACBLOCK_LEN) - lchan->ul_facch_blocks = 6; - - /* Confirm data / traffic sending (pass ownership of the msgb/prim) */ - l1sched_lchan_emit_data_cnf(lchan, msg, br->fn); - msgb_free((msg == msg_facch) ? msg_tch : msg_facch); - send_burst: /* Determine which burst should be sent */ burst = BUFPOS(bursts_p, br->bid); diff --git a/src/host/trxcon/src/sched_prim.c b/src/host/trxcon/src/sched_prim.c index 67be75e5..49745570 100644 --- a/src/host/trxcon/src/sched_prim.c +++ b/src/host/trxcon/src/sched_prim.c @@ -337,7 +337,8 @@ int l1sched_lchan_emit_data_cnf(struct l1sched_lchan_state *lchan, { struct l1sched_prim *prim; - OSMO_ASSERT(msg != NULL); + if (msg == NULL) + return -ENODEV; /* convert from DATA.req to DATA.cnf */ prim = l1sched_prim_from_msgb(msg); diff --git a/src/target/firmware/Makefile b/src/target/firmware/Makefile index 2a376bc3..9be0bfbd 100644 --- a/src/target/firmware/Makefile +++ b/src/target/firmware/Makefile @@ -24,7 +24,7 @@ ENV_e88flash_OBJS=board/compal/start.rom.o board/compal/header.o board/compal/ex # # List of all supported boards (meant to be overridden on command line) -BOARDS?=compal_e88 compal_e86 compal_e99 se_j100 se_k2x0 gta0x gtm900b fcdev3b \ +BOARDS?=compal_e88 compal_e86 compal_e99 se_j100 se_k2xx gta0x gtm900b fcdev3b \ pirelli_dpl10 tr800 # Framebuffer support, board specific drivers @@ -36,7 +36,7 @@ FB_e99_OBJS=$(FB_OBJS) fb/fb_rgb332.o fb/fb_ssd1783.o FB_e86_OBJS=$(FB_OBJS) fb/fb_rgb332.o fb/fb_td014.o FB_j100_OBJS=$(FB_OBJS) fb/fb_rgb332.o fb/fb_ssd1963.o FB_dpl10_OBJS=$(FB_OBJS) fb/fb_rgb332.o fb/fb_s6b33b1x.o -FB_k2x0_OBJS=$(FB_OBJS) fb/fb_rgb332.o fb/fb_k2x0.o +FB_k2xx_OBJS=$(FB_OBJS) fb/fb_rgb332.o fb/fb_k2xx.o FB_dummy_OBJS=$(FB_OBJS) fb/fb_dummy.o # TI Calypso @@ -110,11 +110,11 @@ BOARD_se_j100_OBJS=$(compal_COMMON_OBJS) board/se_j100/init.o \ BOARD_se_j100_ENVIRONMENTS=$(compal_COMMON_ENVIRONMENTS) # Sony Ericsson K200i/K220i -BOARD_se_k2x0_OBJS=$(calypso_COMMON_OBJS) board/se_k2x0/init.o \ - board/se_k2x0/rffe_k2x0.o \ +BOARD_se_k2xx_OBJS=$(calypso_COMMON_OBJS) board/se_k2xx/init.o \ + board/se_k2xx/rffe_k2xx.o \ board/gta0x/rf_tables.o board/gta0x/afcparams.o \ - board/common/readcal_tiffs.o battery/dummy.o $(FB_k2x0_OBJS) -BOARD_se_k2x0_ENVIRONMENTS=highram + board/common/readcal_tiffs.o battery/dummy.o $(FB_k2xx_OBJS) +BOARD_se_k2xx_ENVIRONMENTS=highram # # Applications diff --git a/src/target/firmware/board/se_k2x0/init.c b/src/target/firmware/board/se_k2xx/init.c index 71218670..631a87f4 100644 --- a/src/target/firmware/board/se_k2x0/init.c +++ b/src/target/firmware/board/se_k2xx/init.c @@ -132,9 +132,9 @@ void board_init(int with_irq) /* Initialize ABB driver (uses SPI) */ twl3025_init(); - /* K200i uses 13 sectors of 256 KiB each */ + /* SPANSION flash has 13 sectors of 256 KiB each */ if (tiffs_init(0x01800000, 0x40000, 13) < 0) { - /* K220i uses 52 sectors of 64 KiB each */ + /* SAMSUNG flash has 52 sectors of 64 KiB each */ tiffs_init(0x01800000, 0x10000, 52); } } diff --git a/src/target/firmware/board/se_k2x0/keymap.h b/src/target/firmware/board/se_k2xx/keymap.h index aa2d8a56..aa2d8a56 100644 --- a/src/target/firmware/board/se_k2x0/keymap.h +++ b/src/target/firmware/board/se_k2xx/keymap.h diff --git a/src/target/firmware/board/se_k2x0/rffe_k2x0.c b/src/target/firmware/board/se_k2xx/rffe_k2xx.c index f9965acd..f9965acd 100644 --- a/src/target/firmware/board/se_k2x0/rffe_k2x0.c +++ b/src/target/firmware/board/se_k2xx/rffe_k2xx.c diff --git a/src/target/firmware/fb/fb_k2x0.c b/src/target/firmware/fb/fb_k2xx.c index 7e433cd8..fe1ad335 100644 --- a/src/target/firmware/fb/fb_k2x0.c +++ b/src/target/firmware/fb/fb_k2xx.c @@ -25,8 +25,8 @@ #include <delay.h> #include <memory.h> -#define K2X0_WIDTH 128 -#define K2X0_HEIGHT 128 +#define K2XX_WIDTH 128 +#define K2XX_HEIGHT 128 #define ARMIO_LATCH_OUT 0xfffe4802 #define CS3_ADDR 0x02000000 @@ -38,11 +38,11 @@ #define CL761_CLK (1 << 4) #define CL761_RESET (1 << 9) -#define K2X0_ENABLE_BACKLIGHT (1 << 3) +#define K2XX_ENABLE_BACKLIGHT (1 << 3) -static uint8_t fb_k2x0_mem[K2X0_WIDTH * K2X0_HEIGHT]; +static uint8_t fb_k2xx_mem[K2XX_WIDTH * K2XX_HEIGHT]; -static const uint8_t k2x0_initdata[] = { +static const uint8_t k2xx_initdata[] = { 0x2c, /* CMD: Standby Mode off */ 0x02, /* CMD: Oscillation Mode Set */ 0x01, /* DATA: oscillator on */ @@ -95,7 +95,7 @@ void cl761_write_reg(uint8_t reg, uint16_t data) writew(data, CL761_DATA_ADDR); } -static void fb_k2x0_init(void) +static void fb_k2xx_init(void) { unsigned int i; uint16_t reg; @@ -116,14 +116,14 @@ static void fb_k2x0_init(void) delay_ms(1); reg &= ~CL761_CLK; - reg |= (1 << 1) | K2X0_ENABLE_BACKLIGHT; + reg |= (1 << 1) | K2XX_ENABLE_BACKLIGHT; writew(reg, ARMIO_LATCH_OUT); - for (i = 0; i < sizeof(k2x0_initdata); i++) - writew(k2x0_initdata[i], DISPLAY_CMD_ADDR); + for (i = 0; i < sizeof(k2xx_initdata); i++) + writew(k2xx_initdata[i], DISPLAY_CMD_ADDR); } -static void fb_k2x0_flush(void) +static void fb_k2xx_flush(void) { unsigned int i; int x, y; @@ -170,21 +170,21 @@ static void fb_k2x0_flush(void) fb_rgb332->damage_y1 = fb_rgb332->damage_y2 = 0; } -static struct framebuffer fb_k2x0_framebuffer = { - .name = "k2x0", - .init = fb_k2x0_init, +static struct framebuffer fb_k2xx_framebuffer = { + .name = "k2xx", + .init = fb_k2xx_init, .clear = fb_rgb332_clear, .boxto = fb_rgb332_boxto, .lineto = fb_rgb332_lineto, .putstr = fb_rgb332_putstr, - .flush = fb_k2x0_flush, - .width = K2X0_WIDTH, - .height = K2X0_HEIGHT + .flush = fb_k2xx_flush, + .width = K2XX_WIDTH, + .height = K2XX_HEIGHT }; -static struct fb_rgb332 fb_k2x0_rgb332 = { - .mem = fb_k2x0_mem +static struct fb_rgb332 fb_k2xx_rgb332 = { + .mem = fb_k2xx_mem }; -struct framebuffer *framebuffer = &fb_k2x0_framebuffer; -struct fb_rgb332 *fb_rgb332 = &fb_k2x0_rgb332; +struct framebuffer *framebuffer = &fb_k2xx_framebuffer; +struct fb_rgb332 *fb_rgb332 = &fb_k2xx_rgb332; |