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.
33 #include <abb/twl3025.h>
34 #include <display/st7558.h>
35 #include <rf/trf6151.h>
37 #include <comm/sercomm.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>
48 /* FIXME: We need proper calibrated delay loops at some point! */
49 void delay_us(unsigned int us)
51 volatile unsigned int i;
53 for (i= 0; i < us*4; i++) { i; }
56 void delay_ms(unsigned int ms)
58 volatile unsigned int i;
60 for (i= 0; i < ms*1300; i++) { i; }
63 const char *hr = "======================================================================\n";
65 /* MAIN program **************************************************************/
67 /* completion call-back for the L1 Sync Pwer Measurement */
68 static void l1s_signal_cb(struct l1_signal *sig)
70 uint16_t i, next_arfcn;
72 switch (sig->signum) {
80 static void key_handler(enum key_codes code, enum key_states state);
81 static void la1_l23_rx_cb(uint8_t dlci, struct msgb *msg);
86 puts("\n\nHello World from " __FILE__ " program code\n");
89 /* Dump device identification */
93 keypad_set_handler(&key_handler);
95 /* Dump clock config aftee PLL set */
99 st7558_set_attr(DISP_ATTR_INVERT);
100 st7558_puts("layer1.bin");
102 sercomm_register_rx_cb(SC_DLCI_L1A_L23, la1_l23_rx_cb);
105 l1s_set_handler(&l1s_signal_cb);
107 tpu_frame_irq_en(1, 1);
116 static int8_t vga_gain = 40;
117 static int high_gain = 0;
118 static int afcout = 0;
120 static void update_vga_gain(void)
122 printf("VGA Gain: %u %s\n", vga_gain, high_gain ? "HIGH" : "LOW");
123 trf6151_set_gain(vga_gain, high_gain);
129 static void tspact_toggle(uint8_t num)
131 printf("TSPACT%u toggle\n", num);
132 tsp_act_toggle((1 << num));
138 static void key_handler(enum key_codes code, enum key_states state)
140 if (state != PRESSED)
144 case KEY_1: /* VGA gain decrement */
150 case KEY_2: /* High/Low Rx gain */
154 case KEY_3: /* VGA gain increment */
161 tspact_toggle(6); /* TRENA (RFFE) */
164 tspact_toggle(8); /* GSM_TXEN (RFFE) */
167 tspact_toggle(1); /* PAENA (RFFE) */
169 case KEY_7: /* decrement AFC OUT */
173 twl3025_afc_set(afcout);
174 printf("AFC OUT: %u\n", twl3025_afcout_get());
176 case KEY_9: /* increase AFC OUT */
180 twl3025_afc_set(afcout);
181 printf("AFC OUT: %u\n", twl3025_afcout_get());
188 static void la1_l23_rx_cb(uint8_t dlci, struct msgb *msg)
190 struct l1_info_ul *ul = msg->data;
191 struct l1_sync_new_ccch_req *sync_req;
193 if (sizeof(*ul) > msg->len) {
194 printf("la1_l23_cb: Short message. %u\n", msg->len);
198 switch (ul->msg_type) {
199 case SYNC_NEW_CCCH_REQ:
200 if (sizeof(*ul) + sizeof(*sync_req) > msg->len) {
201 printf("Short sync msg. %u\n", msg->len);
205 sync_req = (struct l1_sync_new_ccch_req *) (&msg->data[0] + sizeof(*ul));
206 printf("Asked to tune to frequency: %u\n", sync_req->band_arfcn);
208 case DEDIC_MODE_EST_REQ: