summaryrefslogtreecommitdiffstats
path: root/src/target/firmware/apps
diff options
context:
space:
mode:
authorHarald Welte2010-02-18 16:46:36 +0100
committerHarald Welte2010-02-18 16:46:36 +0100
commitfbe7b94c9c65f2df74acd5dff7503c9833ec2579 (patch)
tree5f47a597f2f396662719c5a76ac6bf26eda69f6c /src/target/firmware/apps
downloadosmocom-fbe7b94c9c65f2df74acd5dff7503c9833ec2579.tar.gz
osmocom-fbe7b94c9c65f2df74acd5dff7503c9833ec2579.tar.xz
osmocom-fbe7b94c9c65f2df74acd5dff7503c9833ec2579.zip
Initial import of OsmocomBB into git repository
Diffstat (limited to 'src/target/firmware/apps')
-rw-r--r--src/target/firmware/apps/compal_dsp_dump/main.c78
-rw-r--r--src/target/firmware/apps/compal_dump/main.c90
-rw-r--r--src/target/firmware/apps/hello_world/main.c126
-rw-r--r--src/target/firmware/apps/l1test/main.c289
-rw-r--r--src/target/firmware/apps/layer1/main.c214
5 files changed, 797 insertions, 0 deletions
diff --git a/src/target/firmware/apps/compal_dsp_dump/main.c b/src/target/firmware/apps/compal_dsp_dump/main.c
new file mode 100644
index 0000000..468db23
--- /dev/null
+++ b/src/target/firmware/apps/compal_dsp_dump/main.c
@@ -0,0 +1,78 @@
+/* main program of Free Software for Calypso Phone */
+
+/* (C) 2010 Harald Welte <laforge@gnumonks.org>
+ * (C) 2010 Sylvain Munaut <tnt@246tNt.com>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <memory.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <rffe.h>
+#include <keypad.h>
+#include <board.h>
+#include <abb/twl3025.h>
+#include <display/st7558.h>
+#include <rf/trf6151.h>
+#include <calypso/clock.h>
+#include <calypso/tpu.h>
+#include <calypso/tsp.h>
+#include <calypso/dsp.h>
+#include <calypso/irq.h>
+
+/* FIXME: We need proper calibrated delay loops at some point! */
+void delay_us(unsigned int us)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < us*4; i++) { i; }
+}
+
+void delay_ms(unsigned int ms)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < ms*1300; i++) { i; }
+}
+
+/* Main Program */
+const char *hr = "======================================================================\n";
+
+void main(void)
+{
+ int i;
+ uint16_t twl_reg;
+
+ puts("\n\nCompal DSP data dumper\n");
+ puts(hr);
+
+ /* Dump device identification */
+ dump_dev_id();
+ puts(hr);
+
+ /* Initialize basic board support */
+ board_init();
+ puts(hr);
+
+ /* Dump DSP content */
+ dsp_dump();
+
+ while (1) {}
+}
+
diff --git a/src/target/firmware/apps/compal_dump/main.c b/src/target/firmware/apps/compal_dump/main.c
new file mode 100644
index 0000000..444dfd4
--- /dev/null
+++ b/src/target/firmware/apps/compal_dump/main.c
@@ -0,0 +1,90 @@
+/* main program of Free Software for Calypso Phone */
+
+/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <memory.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <cfi_flash.h>
+#include <abb/twl3025.h>
+#include <calypso/clock.h>
+#include <calypso/timer.h>
+#include <calypso/misc.h>
+
+/* FIXME: We need proper calibrated delay loops at some point! */
+void delay_us(unsigned int us)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < us*4; i++) { i; }
+}
+
+void delay_ms(unsigned int ms)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < ms*1300; i++) { i; }
+}
+
+#define KBIT 1024
+#define MBIT (1024*KBIT)
+
+#define REG_DEV_ID_CODE 0xfffef000
+#define REG_DEV_VER_CODE 0xfffef002
+#define REG_DEV_ARMVER_CODE 0xfffffe00
+#define REG_cDSP_ID_CODE 0xfffffe02
+#define REG_DIE_ID_CODE 0xfffef010
+
+/* Main Program */
+const char *hr = "======================================================================\n";
+
+int main(void)
+{
+ puts("\n\nCompal device data dumper\n");
+ puts(hr);
+
+ /* Disable watchdog (for phones that have it enabled after boot) */
+ wdog_enable(0);
+
+ /* Initialize TWL3025 for power control */
+ twl3025_init();
+
+ /* Dump device identification */
+ dump_dev_id();
+ puts(hr);
+
+ /* Initialize flash, dumping the protection area. */
+ cfi_flash_t f;
+ flash_init(&f, 0x00000000);
+ flash_dump_info(&f);
+ puts(hr);
+
+ /* Dump flash contents */
+ printf("Dump %d kbytes of external flash\n", f.f_size/1024);
+ memdump_range((void *)0x00000000, f.f_size);
+ puts(hr);
+
+ /* Power down */
+ twl3025_power_off();
+
+ while (1) {}
+}
+
diff --git a/src/target/firmware/apps/hello_world/main.c b/src/target/firmware/apps/hello_world/main.c
new file mode 100644
index 0000000..7f6aeef
--- /dev/null
+++ b/src/target/firmware/apps/hello_world/main.c
@@ -0,0 +1,126 @@
+/* main program of Free Software for Calypso Phone */
+
+/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <debug.h>
+#include <memory.h>
+#include <rffe.h>
+#include <keypad.h>
+#include <board.h>
+#include <abb/twl3025.h>
+#include <display/st7558.h>
+#include <rf/trf6151.h>
+#include <calypso/clock.h>
+#include <calypso/tpu.h>
+#include <calypso/tsp.h>
+#include <calypso/dsp.h>
+#include <calypso/irq.h>
+#include <calypso/misc.h>
+#include <comm/sercomm.h>
+
+/* FIXME: We need proper calibrated delay loops at some point! */
+void delay_us(unsigned int us)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < us*4; i++) { i; }
+}
+
+void delay_ms(unsigned int ms)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < ms*1300; i++) { i; }
+}
+
+/* Main Program */
+const char *hr = "======================================================================\n";
+
+void key_handler(enum key_codes code, enum key_states state);
+
+static void *console_rx_cb(uint8_t dlci, struct msgb *msg)
+{
+ if (dlci != SC_DLCI_CONSOLE) {
+ printf("Message for unknown DLCI %u\n", dlci);
+ return;
+ }
+
+ printf("Message on console DLCI: '%s'\n", msg->data);
+ st7558_puts(msg->data);
+ msgb_free(msg);
+}
+
+int main(void)
+{
+ board_init();
+ puts("\n\nHello World from " __FILE__ " program code\n");
+ puts(hr);
+ /* Dump device identification */
+ dump_dev_id();
+ puts(hr);
+
+ /* Dump clock config before PLL set */
+ calypso_clk_dump();
+ puts(hr);
+
+ keypad_set_handler(&key_handler);
+
+ /* Dump clock config aftee PLL set */
+ calypso_clk_dump();
+ puts(hr);
+
+ /* Dump all memory */
+ //dump_mem();
+#if 0
+ /* Dump Bootloader */
+ memdump_range((void *)0x00000000, 0x2000);
+ puts(hr);
+#endif
+
+ st7558_set_attr(DISP_ATTR_INVERT);
+ st7558_puts("Hello World");
+
+ sercomm_register_rx_cb(SC_DLCI_CONSOLE, console_rx_cb);
+
+ /* beyond this point we only react to interrupts */
+ puts("entering interrupt loop\n");
+ while (1) {
+ }
+
+ twl3025_power_off();
+
+ while (1) {}
+}
+
+void key_handler(enum key_codes code, enum key_states state)
+{
+ if (state != PRESSED)
+ return;
+
+ switch (code) {
+ default:
+ break;
+ }
+}
diff --git a/src/target/firmware/apps/l1test/main.c b/src/target/firmware/apps/l1test/main.c
new file mode 100644
index 0000000..b19f72c
--- /dev/null
+++ b/src/target/firmware/apps/l1test/main.c
@@ -0,0 +1,289 @@
+/* main program of Free Software for Calypso Phone */
+
+/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+
+#include <gsm.h>
+#include <debug.h>
+#include <memory.h>
+#include <rffe.h>
+#include <keypad.h>
+#include <board.h>
+
+#include <abb/twl3025.h>
+#include <display/st7558.h>
+#include <rf/trf6151.h>
+
+#include <comm/sercomm.h>
+
+#include <calypso/clock.h>
+#include <calypso/tpu.h>
+#include <calypso/tsp.h>
+#include <calypso/irq.h>
+#include <calypso/misc.h>
+
+#include <layer1/sync.h>
+#include <layer1/tpu_window.h>
+
+#define SCAN
+
+#ifdef SCAN
+/* if scanning is enabled, scan from 0 ... 124 */
+#define BASE_ARFCN 0
+#else
+/* fixed ARFCN in GSM1800 at which Harald has his GSM test license */
+#define BASE_ARFCN 871
+#endif
+
+/* FIXME: We need proper calibrated delay loops at some point! */
+void delay_us(unsigned int us)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < us*4; i++) { i; }
+}
+
+void delay_ms(unsigned int ms)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < ms*1300; i++) { i; }
+}
+
+/* Main Program */
+const char *hr = "======================================================================\n";
+
+/* Best ARFCN MAP ************************************************************/
+
+struct arfcn_map {
+ uint16_t arfcn;
+ int16_t dbm8;
+};
+
+static struct arfcn_map best_arfcn_map[10];
+static void best_arfcn_update(uint16_t arfcn, int16_t dbm8)
+{
+ unsigned int i;
+ for (i = 0; i < ARRAY_SIZE(best_arfcn_map); i++) {
+ if (best_arfcn_map[i].dbm8 < dbm8 ||
+ best_arfcn_map[i].dbm8 == 0) {
+ best_arfcn_map[i].dbm8 = dbm8;
+ best_arfcn_map[i].arfcn = arfcn;
+ return;
+ }
+ }
+}
+
+static void best_arfcn_dump(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(best_arfcn_map); i++) {
+ if (best_arfcn_map[i].dbm8 == 0)
+ continue;
+ printf("ARFCN %3d: %d dBm\n",
+ best_arfcn_map[i].arfcn,
+ best_arfcn_map[i].dbm8/8);
+ }
+}
+
+
+/* MAIN program **************************************************************/
+
+enum l1test_state {
+ STATE_NONE,
+ STATE_PM,
+ STATE_FB,
+};
+
+static enum l1test_state l1test_state;
+
+static void l1test_state_change(enum l1test_state new_state)
+{
+ switch (new_state) {
+ case STATE_PM:
+ puts("Performing power measurement over GSM900\n");
+ l1s_pm_test(1, BASE_ARFCN);
+ break;
+ case STATE_FB:
+ puts("Starting FCCH Recognition\n");
+ l1s_fb_test(1, 0);
+ break;
+ case STATE_NONE:
+ /* disable frame interrupts */
+ tpu_frame_irq_en(0, 0);
+ break;
+ }
+}
+
+/* completion call-back for the L1 Sync Pwer Measurement */
+static void l1s_signal_cb(struct l1_signal *sig)
+{
+ uint16_t i, next_arfcn;
+
+ switch (sig->signum) {
+ case L1_SIG_PM:
+ best_arfcn_update(sig->arfcn, sig->pm.dbm8[0]);
+ next_arfcn = sig->arfcn + 1;
+
+ if (next_arfcn >= 124) {
+ puts("ARFCN Top 10 Rx Level\n");
+ best_arfcn_dump();
+
+ trf6151_rx_window(0, best_arfcn_map[0].arfcn, 40, 0);
+ tpu_end_scenario();
+
+ /* PM phase completed, do FB det */
+ l1test_state_change(STATE_FB);
+
+ break;
+ }
+
+ /* restart Power Measurement */
+ l1s_pm_test(1, next_arfcn);
+ break;
+ case L1_SIG_NB:
+ puts("NB SNR ");
+ for (i = 0; i < 4; i++) {
+ uint16_t snr = sig->nb.meas[i].snr;
+ printf("%d.%03u ", l1s_snr_int(snr), l1s_snr_fract(snr));
+ }
+ putchar('\n');
+ printf("--> Frame %d %d 0x%04X ", sig->nb.fire, sig->nb.crc, sig->nb.num_biterr);
+ for (i = 0; i < ARRAY_SIZE(sig->nb.frame); i++)
+ printf("%02X ", sig->nb.frame[i]);
+ putchar('\n');
+ break;
+ }
+}
+
+static void key_handler(enum key_codes code, enum key_states state);
+
+int main(void)
+{
+ board_init();
+ puts("\n\nHello World from " __FILE__ " program code\n");
+
+ puts(hr);
+ /* Dump device identification */
+ dump_dev_id();
+ puts(hr);
+
+ keypad_set_handler(&key_handler);
+
+ /* Dump clock config aftee PLL set */
+ calypso_clk_dump();
+ puts(hr);
+
+ st7558_set_attr(DISP_ATTR_INVERT);
+ st7558_puts("l1test.bin");
+
+ layer1_init();
+ l1s_set_handler(&l1s_signal_cb);
+
+ //dsp_checksum_task();
+#ifdef SCAN
+ l1test_state_change(STATE_PM);
+#else
+ l1test_state_change(STATE_FB);
+#endif
+ tpu_frame_irq_en(1, 1);
+
+ while (1) {}
+
+ /* NOT REACHED */
+
+ twl3025_power_off();
+}
+
+static int8_t vga_gain = 40;
+static int high_gain = 0;
+static int afcout = 0;
+
+static void update_vga_gain(void)
+{
+ printf("VGA Gain: %u %s\n", vga_gain, high_gain ? "HIGH" : "LOW");
+ trf6151_set_gain(vga_gain, high_gain);
+ tpu_enq_sleep();
+ tpu_enable(1);
+ tpu_wait_idle();
+}
+
+static void tspact_toggle(uint8_t num)
+{
+ printf("TSPACT%u toggle\n", num);
+ tsp_act_toggle((1 << num));
+ tpu_enq_sleep();
+ tpu_enable(1);
+ tpu_wait_idle();
+}
+
+static void key_handler(enum key_codes code, enum key_states state)
+{
+ if (state != PRESSED)
+ return;
+
+ switch (code) {
+ case KEY_1: /* VGA gain decrement */
+ vga_gain -= 2;
+ if (vga_gain < 14)
+ vga_gain = 14;
+ update_vga_gain();
+ break;
+ case KEY_2: /* High/Low Rx gain */
+ high_gain ^= 1;
+ update_vga_gain();
+ break;
+ case KEY_3: /* VGA gain increment */
+ vga_gain += 2;
+ if (vga_gain > 40)
+ vga_gain = 40;
+ update_vga_gain();
+ break;
+ case KEY_4:
+ tspact_toggle(6); /* TRENA (RFFE) */
+ break;
+ case KEY_5:
+ tspact_toggle(8); /* GSM_TXEN (RFFE) */
+ break;
+ case KEY_6:
+ tspact_toggle(1); /* PAENA (RFFE) */
+ break;
+ case KEY_7: /* decrement AFC OUT */
+ afcout -= 100;
+ if (afcout < -4096)
+ afcout = -4096;
+ twl3025_afc_set(afcout);
+ printf("AFC OUT: %u\n", twl3025_afcout_get());
+ break;
+ case KEY_9: /* increase AFC OUT */
+ afcout += 100;
+ if (afcout > 4095)
+ afcout = 4095;
+ twl3025_afc_set(afcout);
+ printf("AFC OUT: %u\n", twl3025_afcout_get());
+ break;
+ default:
+ break;
+ }
+}
diff --git a/src/target/firmware/apps/layer1/main.c b/src/target/firmware/apps/layer1/main.c
new file mode 100644
index 0000000..3b1b686
--- /dev/null
+++ b/src/target/firmware/apps/layer1/main.c
@@ -0,0 +1,214 @@
+/* main program of Free Software for Calypso Phone */
+
+/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+
+#include <gsm.h>
+#include <debug.h>
+#include <memory.h>
+#include <rffe.h>
+#include <keypad.h>
+#include <board.h>
+
+#include <abb/twl3025.h>
+#include <display/st7558.h>
+#include <rf/trf6151.h>
+
+#include <comm/sercomm.h>
+
+#include <calypso/clock.h>
+#include <calypso/tpu.h>
+#include <calypso/tsp.h>
+#include <calypso/irq.h>
+#include <calypso/misc.h>
+
+#include <layer1/sync.h>
+#include <layer1/tpu_window.h>
+
+/* FIXME: We need proper calibrated delay loops at some point! */
+void delay_us(unsigned int us)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < us*4; i++) { i; }
+}
+
+void delay_ms(unsigned int ms)
+{
+ volatile unsigned int i;
+
+ for (i= 0; i < ms*1300; i++) { i; }
+}
+
+const char *hr = "======================================================================\n";
+
+/* MAIN program **************************************************************/
+
+/* completion call-back for the L1 Sync Pwer Measurement */
+static void l1s_signal_cb(struct l1_signal *sig)
+{
+ uint16_t i, next_arfcn;
+
+ switch (sig->signum) {
+ case L1_SIG_PM:
+ break;
+ case L1_SIG_NB:
+ break;
+ }
+}
+
+static void key_handler(enum key_codes code, enum key_states state);
+static void la1_l23_rx_cb(uint8_t dlci, struct msgb *msg);
+
+int main(void)
+{
+ board_init();
+ puts("\n\nHello World from " __FILE__ " program code\n");
+
+ puts(hr);
+ /* Dump device identification */
+ dump_dev_id();
+ puts(hr);
+
+ keypad_set_handler(&key_handler);
+
+ /* Dump clock config aftee PLL set */
+ calypso_clk_dump();
+ puts(hr);
+
+ st7558_set_attr(DISP_ATTR_INVERT);
+ st7558_puts("layer1.bin");
+
+ sercomm_register_rx_cb(SC_DLCI_L1A_L23, la1_l23_rx_cb);
+
+ layer1_init();
+ l1s_set_handler(&l1s_signal_cb);
+
+ tpu_frame_irq_en(1, 1);
+
+ while (1) {}
+
+ /* NOT REACHED */
+
+ twl3025_power_off();
+}
+
+static int8_t vga_gain = 40;
+static int high_gain = 0;
+static int afcout = 0;
+
+static void update_vga_gain(void)
+{
+ printf("VGA Gain: %u %s\n", vga_gain, high_gain ? "HIGH" : "LOW");
+ trf6151_set_gain(vga_gain, high_gain);
+ tpu_enq_sleep();
+ tpu_enable(1);
+ tpu_wait_idle();
+}
+
+static void tspact_toggle(uint8_t num)
+{
+ printf("TSPACT%u toggle\n", num);
+ tsp_act_toggle((1 << num));
+ tpu_enq_sleep();
+ tpu_enable(1);
+ tpu_wait_idle();
+}
+
+static void key_handler(enum key_codes code, enum key_states state)
+{
+ if (state != PRESSED)
+ return;
+
+ switch (code) {
+ case KEY_1: /* VGA gain decrement */
+ vga_gain -= 2;
+ if (vga_gain < 14)
+ vga_gain = 14;
+ update_vga_gain();
+ break;
+ case KEY_2: /* High/Low Rx gain */
+ high_gain ^= 1;
+ update_vga_gain();
+ break;
+ case KEY_3: /* VGA gain increment */
+ vga_gain += 2;
+ if (vga_gain > 40)
+ vga_gain = 40;
+ update_vga_gain();
+ break;
+ case KEY_4:
+ tspact_toggle(6); /* TRENA (RFFE) */
+ break;
+ case KEY_5:
+ tspact_toggle(8); /* GSM_TXEN (RFFE) */
+ break;
+ case KEY_6:
+ tspact_toggle(1); /* PAENA (RFFE) */
+ break;
+ case KEY_7: /* decrement AFC OUT */
+ afcout -= 100;
+ if (afcout < -4096)
+ afcout = -4096;
+ twl3025_afc_set(afcout);
+ printf("AFC OUT: %u\n", twl3025_afcout_get());
+ break;
+ case KEY_9: /* increase AFC OUT */
+ afcout += 100;
+ if (afcout > 4095)
+ afcout = 4095;
+ twl3025_afc_set(afcout);
+ printf("AFC OUT: %u\n", twl3025_afcout_get());
+ break;
+ default:
+ break;
+ }
+}
+
+static void la1_l23_rx_cb(uint8_t dlci, struct msgb *msg)
+{
+ struct l1_info_ul *ul = msg->data;
+ struct l1_sync_new_ccch_req *sync_req;
+
+ if (sizeof(*ul) > msg->len) {
+ printf("la1_l23_cb: Short message. %u\n", msg->len);
+ goto exit;
+ }
+
+ switch (ul->msg_type) {
+ case SYNC_NEW_CCCH_REQ:
+ if (sizeof(*ul) + sizeof(*sync_req) > msg->len) {
+ printf("Short sync msg. %u\n", msg->len);
+ break;
+ }
+
+ sync_req = (struct l1_sync_new_ccch_req *) (&msg->data[0] + sizeof(*ul));
+ printf("Asked to tune to frequency: %u\n", sync_req->band_arfcn);
+ break;
+ case DEDIC_MODE_EST_REQ:
+ break;
+ }
+
+exit:
+ msgb_free(msg);
+}