1 /* main program of Free Software for Calypso Phone */
3 /* (C) 2010 by Harald Welte <laforge@gnumonks.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include <abb/twl3025.h>
33 #include <display/st7558.h>
34 #include <rf/trf6151.h>
36 #include <comm/sercomm.h>
37 #include <comm/timer.h>
39 #include <calypso/clock.h>
40 #include <calypso/tpu.h>
41 #include <calypso/tsp.h>
42 #include <calypso/irq.h>
43 #include <calypso/misc.h>
45 #include <layer1/sync.h>
46 #include <layer1/tpu_window.h>
51 /* if scanning is enabled, scan from 0 ... 124 */
54 /* fixed ARFCN in GSM1800 at which Harald has his GSM test license */
55 #define BASE_ARFCN 871
58 /* FIXME: We need proper calibrated delay loops at some point! */
59 void delay_us(unsigned int us)
61 volatile unsigned int i;
63 for (i= 0; i < us*4; i++) { i; }
66 void delay_ms(unsigned int ms)
68 volatile unsigned int i;
70 for (i= 0; i < ms*1300; i++) { i; }
74 const char *hr = "======================================================================\n";
76 /* Best ARFCN MAP ************************************************************/
83 static struct arfcn_map best_arfcn_map[10];
84 static void best_arfcn_update(uint16_t arfcn, int16_t dbm8)
87 for (i = 0; i < ARRAY_SIZE(best_arfcn_map); i++) {
88 if (best_arfcn_map[i].dbm8 < dbm8 ||
89 best_arfcn_map[i].dbm8 == 0) {
90 best_arfcn_map[i].dbm8 = dbm8;
91 best_arfcn_map[i].arfcn = arfcn;
97 static void best_arfcn_dump(void)
101 for (i = 0; i < ARRAY_SIZE(best_arfcn_map); i++) {
102 if (best_arfcn_map[i].dbm8 == 0)
104 printf("ARFCN %3d: %d dBm\n",
105 best_arfcn_map[i].arfcn,
106 best_arfcn_map[i].dbm8/8);
111 /* MAIN program **************************************************************/
119 static enum l1test_state l1test_state;
121 static void l1test_state_change(enum l1test_state new_state)
125 puts("Performing power measurement over GSM900\n");
126 l1s_pm_test(1, BASE_ARFCN);
129 puts("Starting FCCH Recognition\n");
133 /* disable frame interrupts */
134 tpu_frame_irq_en(0, 0);
139 /* completion call-back for the L1 Sync Pwer Measurement */
140 static void l1s_signal_cb(struct l1_signal *sig)
142 uint16_t i, next_arfcn;
144 switch (sig->signum) {
146 best_arfcn_update(sig->arfcn, sig->pm.dbm8[0]);
147 next_arfcn = sig->arfcn + 1;
149 if (next_arfcn >= 124) {
150 puts("ARFCN Top 10 Rx Level\n");
153 trf6151_rx_window(0, best_arfcn_map[0].arfcn, 40, 0);
156 /* PM phase completed, do FB det */
157 l1test_state_change(STATE_FB);
162 /* restart Power Measurement */
163 l1s_pm_test(1, next_arfcn);
167 for (i = 0; i < 4; i++) {
168 uint16_t snr = sig->nb.meas[i].snr;
169 printf("%d.%03u ", l1s_snr_int(snr), l1s_snr_fract(snr));
172 printf("--> Frame %d %d 0x%04X ", sig->nb.fire, sig->nb.crc, sig->nb.num_biterr);
173 for (i = 0; i < ARRAY_SIZE(sig->nb.frame); i++)
174 printf("%02X ", sig->nb.frame[i]);
180 static void key_handler(enum key_codes code, enum key_states state);
185 puts("\n\nHello World from " __FILE__ " program code\n");
188 /* Dump device identification */
192 keypad_set_handler(&key_handler);
194 /* Dump clock config aftee PLL set */
198 st7558_set_attr(DISP_ATTR_INVERT);
199 st7558_puts("l1test.bin");
202 l1s_set_handler(&l1s_signal_cb);
204 //dsp_checksum_task();
206 l1test_state_change(STATE_PM);
208 l1test_state_change(STATE_FB);
210 tpu_frame_irq_en(1, 1);
221 static int8_t vga_gain = 40;
222 static int high_gain = 0;
223 static int afcout = 0;
225 static void update_vga_gain(void)
227 printf("VGA Gain: %u %s\n", vga_gain, high_gain ? "HIGH" : "LOW");
228 trf6151_set_gain(vga_gain, high_gain);
234 static void tspact_toggle(uint8_t num)
236 printf("TSPACT%u toggle\n", num);
237 tsp_act_toggle((1 << num));
243 static void key_handler(enum key_codes code, enum key_states state)
245 if (state != PRESSED)
249 case KEY_1: /* VGA gain decrement */
255 case KEY_2: /* High/Low Rx gain */
259 case KEY_3: /* VGA gain increment */
266 tspact_toggle(6); /* TRENA (RFFE) */
269 tspact_toggle(8); /* GSM_TXEN (RFFE) */
272 tspact_toggle(1); /* PAENA (RFFE) */
274 case KEY_7: /* decrement AFC OUT */
278 twl3025_afc_set(afcout);
279 printf("AFC OUT: %u\n", twl3025_afcout_get());
281 case KEY_9: /* increase AFC OUT */
285 twl3025_afc_set(afcout);
286 printf("AFC OUT: %u\n", twl3025_afcout_get());