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>
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 void l1test_state_change(enum l1test_state new_state)
123 puts("Performing power measurement over GSM900\n");
124 l1s_pm_test(1, BASE_ARFCN);
127 puts("Starting FCCH Recognition\n");
131 /* disable frame interrupts */
132 tpu_frame_irq_en(0, 0);
137 /* completion call-back for the L1 Sync Pwer Measurement */
138 static void l1s_signal_cb(struct l1_signal *sig)
140 uint16_t i, next_arfcn;
142 switch (sig->signum) {
144 best_arfcn_update(sig->arfcn, sig->pm.dbm8[0]);
145 next_arfcn = sig->arfcn + 1;
147 if (next_arfcn >= 124) {
148 puts("ARFCN Top 10 Rx Level\n");
151 trf6151_rx_window(0, best_arfcn_map[0].arfcn, 40, 0);
154 /* PM phase completed, do FB det */
155 l1test_state_change(STATE_FB);
160 /* restart Power Measurement */
161 l1s_pm_test(1, next_arfcn);
165 for (i = 0; i < 4; i++) {
166 uint16_t snr = sig->nb.meas[i].snr;
167 printf("%d.%03u ", l1s_snr_int(snr), l1s_snr_fract(snr));
170 printf("--> Frame %d %d 0x%04X ", sig->nb.fire, sig->nb.crc, sig->nb.num_biterr);
171 for (i = 0; i < ARRAY_SIZE(sig->nb.frame); i++)
172 printf("%02X ", sig->nb.frame[i]);
178 static void key_handler(enum key_codes code, enum key_states state);
183 puts("\n\nHello World from " __FILE__ " program code\n");
186 /* Dump device identification */
190 keypad_set_handler(&key_handler);
192 /* Dump clock config aftee PLL set */
196 display_set_attr(DISP_ATTR_INVERT);
197 display_puts("l1test.bin");
200 l1s_set_handler(&l1s_signal_cb);
202 //dsp_checksum_task();
204 l1test_state_change(STATE_PM);
206 l1test_state_change(STATE_FB);
208 tpu_frame_irq_en(1, 1);
219 static int8_t vga_gain = 40;
220 static int high_gain = 0;
221 static int afcout = 0;
223 static void update_vga_gain(void)
225 printf("VGA Gain: %u %s\n", vga_gain, high_gain ? "HIGH" : "LOW");
226 trf6151_set_gain(vga_gain, high_gain);
232 static void tspact_toggle(uint8_t num)
234 printf("TSPACT%u toggle\n", num);
235 tsp_act_toggle((1 << num));
241 static void key_handler(enum key_codes code, enum key_states state)
243 if (state != PRESSED)
247 case KEY_1: /* VGA gain decrement */
253 case KEY_2: /* High/Low Rx gain */
257 case KEY_3: /* VGA gain increment */
264 tspact_toggle(6); /* TRENA (RFFE) */
267 tspact_toggle(8); /* GSM_TXEN (RFFE) */
270 tspact_toggle(1); /* PAENA (RFFE) */
272 case KEY_7: /* decrement AFC OUT */
276 twl3025_afc_set(afcout);
277 printf("AFC OUT: %u\n", twl3025_afcout_get());
279 case KEY_9: /* increase AFC OUT */
283 twl3025_afc_set(afcout);
284 printf("AFC OUT: %u\n", twl3025_afcout_get());