summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/FUNDING.yml1
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c1
-rw-r--r--src/host/layer23/src/mobile/tch_voice.c2
-rw-r--r--src/host/trxcon/src/sched_lchan_tchf.c78
-rw-r--r--src/host/trxcon/src/sched_lchan_tchh.c75
-rw-r--r--src/host/trxcon/src/sched_prim.c3
-rw-r--r--src/target/firmware/Makefile12
-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;