Merge ccdbg and altos sources into one giant repository
[fw/altos] / target / radio / radio.h
1 /*
2  * Copyright © 2008 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #include <stdint.h>
20
21 sfr at 0x80 P0;
22 sfr at 0x90 P1;
23 sbit at 0x90 P1_0;
24 sbit at 0x91 P1_1;
25 sbit at 0x92 P1_2;
26 sbit at 0x93 P1_3;
27 sbit at 0x94 P1_4;
28 sbit at 0x95 P1_5;
29 sbit at 0x96 P1_6;
30 sbit at 0x97 P1_7;
31
32 sfr at 0xA0 P2;
33 sfr at 0xC6 CLKCON;
34
35 sfr at 0xF1 PERCFG;
36 sfr at 0xF2 ADCCFG;
37 sfr at 0xF3 P0SEL;
38 sfr at 0xF4 P1SEL;
39 sfr at 0xF5 P2SEL;
40
41 sfr at 0xFD P0DIR;
42 sfr at 0xFE P1DIR;
43 sfr at 0xFF P2DIR;
44 sfr at 0x8F P0INP;
45 sfr at 0xF6 P1INP;
46 sfr at 0xF7 P2INP;
47
48 sfr at 0x89 P0IFG;
49 sfr at 0x8A P1IFG;
50 sfr at 0x8B P2IFG;
51
52 sfr at 0xD9 RFD;
53 sfr at 0xE9 RFIF;
54 #define RFIF_IM_TXUNF   (1 << 7)
55 #define RFIF_IM_RXOVF   (1 << 6)
56 #define RFIF_IM_TIMEOUT (1 << 5)
57 #define RFIF_IM_DONE    (1 << 4)
58 #define RFIF_IM_CS      (1 << 3)
59 #define RFIF_IM_PQT     (1 << 2)
60 #define RFIF_IM_CCA     (1 << 1)
61 #define RFIF_IM_SFD     (1 << 0)
62
63 sfr at 0xE1 RFST;
64
65 sfr at 0x88 TCON;
66
67 sfr at 0xbe SLEEP;
68
69 # define SLEEP_USB_EN           (1 << 7)
70 # define SLEEP_XOSC_STB         (1 << 6)
71
72 sbit at 0x89 RFTXRXIF;
73
74 #define TCON_RFTXRXIF   (1 << 1)
75
76 #define RFST_SFSTXON    0x00
77 #define RFST_SCAL       0x01
78 #define RFST_SRX        0x02
79 #define RFST_STX        0x03
80 #define RFST_SIDLE      0x04
81
82 __xdata __at (0xdf00) uint8_t RF[0x3c];
83
84 __xdata __at (0xdf2f) uint8_t RF_IOCFG2;
85 #define RF_IOCFG2_OFF   0x2f
86
87 __xdata __at (0xdf30) uint8_t RF_IOCFG1;
88 #define RF_IOCFG1_OFF   0x30
89
90 __xdata __at (0xdf31) uint8_t RF_IOCFG0;
91 #define RF_IOCFG0_OFF   0x31
92
93 __xdata __at (0xdf00) uint8_t RF_SYNC1;
94 #define RF_SYNC1_OFF    0x00
95
96 __xdata __at (0xdf01) uint8_t RF_SYNC0;
97 #define RF_SYNC0_OFF    0x01
98
99 __xdata __at (0xdf02) uint8_t RF_PKTLEN;
100 #define RF_PKTLEN_OFF   0x02
101
102 __xdata __at (0xdf03) uint8_t RF_PKTCTRL1;
103 #define RF_PKTCTRL1_OFF 0x03
104 #define PKTCTRL1_PQT_MASK                       (0x7 << 5)
105 #define PKTCTRL1_PQT_SHIFT                      5
106 #define PKTCTRL1_APPEND_STATUS                  (1 << 2)
107 #define PKTCTRL1_ADR_CHK_NONE                   (0 << 0)
108 #define PKTCTRL1_ADR_CHK_NO_BROADCAST           (1 << 0)
109 #define PKTCTRL1_ADR_CHK_00_BROADCAST           (2 << 0)
110 #define PKTCTRL1_ADR_CHK_00_FF_BROADCAST        (3 << 0)
111
112 /* If APPEND_STATUS is used, two bytes will be added to the packet data */
113 #define PKT_APPEND_STATUS_0_RSSI_MASK           (0xff)
114 #define PKT_APPEND_STATUS_0_RSSI_SHIFT          0
115 #define PKT_APPEND_STATUS_1_CRC_OK              (1 << 7)
116 #define PKT_APPEND_STATUS_1_LQI_MASK            (0x7f)
117 #define PKT_APPEND_STATUS_1_LQI_SHIFT           0
118
119 __xdata __at (0xdf04) uint8_t RF_PKTCTRL0;
120 #define RF_PKTCTRL0_OFF 0x04
121 #define RF_PKTCTRL0_WHITE_DATA                  (1 << 6)
122 #define RF_PKTCTRL0_PKT_FORMAT_NORMAL           (0 << 4)
123 #define RF_PKTCTRL0_PKT_FORMAT_RANDOM           (2 << 4)
124 #define RF_PKTCTRL0_CRC_EN                      (1 << 2)
125 #define RF_PKTCTRL0_LENGTH_CONFIG_FIXED         (0 << 0)
126 #define RF_PKTCTRL0_LENGTH_CONFIG_VARIABLE      (1 << 0)
127
128 __xdata __at (0xdf05) uint8_t RF_ADDR;
129 #define RF_ADDR_OFF     0x05
130
131 __xdata __at (0xdf06) uint8_t RF_CHANNR;
132 #define RF_CHANNR_OFF   0x06
133
134 __xdata __at (0xdf07) uint8_t RF_FSCTRL1;
135 #define RF_FSCTRL1_OFF  0x07
136
137 #define RF_FSCTRL1_FREQ_IF_SHIFT        (0)
138
139 __xdata __at (0xdf08) uint8_t RF_FSCTRL0;
140 #define RF_FSCTRL0_OFF  0x08
141
142 #define RF_FSCTRL0_FREQOFF_SHIFT        (0)
143
144 __xdata __at (0xdf09) uint8_t RF_FREQ2;
145 #define RF_FREQ2_OFF    0x09
146
147 __xdata __at (0xdf0a) uint8_t RF_FREQ1;
148 #define RF_FREQ1_OFF    0x0a
149
150 __xdata __at (0xdf0b) uint8_t RF_FREQ0;
151 #define RF_FREQ0_OFF    0x0b
152
153 __xdata __at (0xdf0c) uint8_t RF_MDMCFG4;
154 #define RF_MDMCFG4_OFF  0x0c
155
156 #define RF_MDMCFG4_CHANBW_E_SHIFT       6
157 #define RF_MDMCFG4_CHANBW_M_SHIFT       4
158 #define RF_MDMCFG4_DRATE_E_SHIFT        0
159
160 __xdata __at (0xdf0d) uint8_t RF_MDMCFG3;
161 #define RF_MDMCFG3_OFF  0x0d
162
163 #define RF_MDMCFG3_DRATE_M_SHIFT        0
164
165 __xdata __at (0xdf0e) uint8_t RF_MDMCFG2;
166 #define RF_MDMCFG2_OFF  0x0e
167
168 #define RF_MDMCFG2_DEM_DCFILT_OFF       (1 << 7)
169 #define RF_MDMCFG2_DEM_DCFILT_ON        (0 << 7)
170
171 #define RF_MDMCFG2_MOD_FORMAT_MASK      (7 << 4)
172 #define RF_MDMCFG2_MOD_FORMAT_2_FSK     (0 << 4)
173 #define RF_MDMCFG2_MOD_FORMAT_GFSK      (1 << 4)
174 #define RF_MDMCFG2_MOD_FORMAT_ASK_OOK   (3 << 4)
175 #define RF_MDMCFG2_MOD_FORMAT_MSK       (7 << 4)
176
177 #define RF_MDMCFG2_MANCHESTER_EN        (1 << 3)
178
179 #define RF_MDMCFG2_SYNC_MODE_MASK               (0x7 << 0)
180 #define RF_MDMCFG2_SYNC_MODE_NONE               (0x0 << 0)
181 #define RF_MDMCFG2_SYNC_MODE_15_16              (0x1 << 0)
182 #define RF_MDMCFG2_SYNC_MODE_16_16              (0x2 << 0)
183 #define RF_MDMCFG2_SYNC_MODE_30_32              (0x3 << 0)
184 #define RF_MDMCFG2_SYNC_MODE_NONE_THRES         (0x4 << 0)
185 #define RF_MDMCFG2_SYNC_MODE_15_16_THRES        (0x5 << 0)
186 #define RF_MDMCFG2_SYNC_MODE_16_16_THRES        (0x6 << 0)
187 #define RF_MDMCFG2_SYNC_MODE_30_32_THRES        (0x7 << 0)
188
189 __xdata __at (0xdf0f) uint8_t RF_MDMCFG1;
190 #define RF_MDMCFG1_OFF  0x0f
191
192 #define RF_MDMCFG1_FEC_EN                       (1 << 7)
193 #define RF_MDMCFG1_FEC_DIS                      (0 << 7)
194
195 #define RF_MDMCFG1_NUM_PREAMBLE_MASK            (7 << 4)
196 #define RF_MDMCFG1_NUM_PREAMBLE_2               (0 << 4)
197 #define RF_MDMCFG1_NUM_PREAMBLE_3               (1 << 4)
198 #define RF_MDMCFG1_NUM_PREAMBLE_4               (2 << 4)
199 #define RF_MDMCFG1_NUM_PREAMBLE_6               (3 << 4)
200 #define RF_MDMCFG1_NUM_PREAMBLE_8               (4 << 4)
201 #define RF_MDMCFG1_NUM_PREAMBLE_12              (5 << 4)
202 #define RF_MDMCFG1_NUM_PREAMBLE_16              (6 << 4)
203 #define RF_MDMCFG1_NUM_PREAMBLE_24              (7 << 4)
204
205 #define RF_MDMCFG1_CHANSPC_E_MASK               (3 << 0)
206 #define RF_MDMCFG1_CHANSPC_E_SHIFT              (0)
207
208 __xdata __at (0xdf10) uint8_t RF_MDMCFG0;
209 #define RF_MDMCFG0_OFF  0x10
210
211 #define RF_MDMCFG0_CHANSPC_M_SHIFT              (0)
212
213 __xdata __at (0xdf11) uint8_t RF_DEVIATN;
214 #define RF_DEVIATN_OFF  0x11
215
216 #define RF_DEVIATN_DEVIATION_E_SHIFT            4
217 #define RF_DEVIATN_DEVIATION_M_SHIFT            0
218
219 __xdata __at (0xdf12) uint8_t RF_MCSM2;
220 #define RF_MCSM2_OFF    0x12
221 #define RF_MCSM2_RX_TIME_RSSI                   (1 << 4)
222 #define RF_MCSM2_RX_TIME_QUAL                   (1 << 3)
223 #define RF_MCSM2_RX_TIME_MASK                   (0x7)
224 #define RF_MCSM2_RX_TIME_SHIFT                  0
225 #define RF_MCSM2_RX_TIME_END_OF_PACKET          (7)
226
227 __xdata __at (0xdf13) uint8_t RF_MCSM1;
228 #define RF_MCSM1_OFF    0x13
229 #define RF_MCSM1_CCA_MODE_ALWAYS                        (0 << 4)
230 #define RF_MCSM1_CCA_MODE_RSSI_BELOW                    (1 << 4)
231 #define RF_MCSM1_CCA_MODE_UNLESS_RECEIVING              (2 << 4)
232 #define RF_MCSM1_CCA_MODE_RSSI_BELOW_UNLESS_RECEIVING   (3 << 4)
233 #define RF_MCSM1_RXOFF_MODE_IDLE                        (0 << 2)
234 #define RF_MCSM1_RXOFF_MODE_FSTXON                      (1 << 2)
235 #define RF_MCSM1_RXOFF_MODE_TX                          (2 << 2)
236 #define RF_MCSM1_RXOFF_MODE_RX                          (3 << 2)
237 #define RF_MCSM1_TXOFF_MODE_IDLE                        (0 << 0)
238 #define RF_MCSM1_TXOFF_MODE_FSTXON                      (1 << 0)
239 #define RF_MCSM1_TXOFF_MODE_TX                          (2 << 0)
240 #define RF_MCSM1_TXOFF_MODE_RX                          (3 << 0)
241
242 __xdata __at (0xdf14) uint8_t RF_MCSM0;
243 #define RF_MCSM0_OFF    0x14
244 #define RF_MCSM0_FS_AUTOCAL_NEVER               (0 << 4)
245 #define RF_MCSM0_FS_AUTOCAL_FROM_IDLE           (1 << 4)
246 #define RF_MCSM0_FS_AUTOCAL_TO_IDLE             (2 << 4)
247 #define RF_MCSM0_FS_AUTOCAL_TO_IDLE_EVERY_4     (3 << 4)
248 #define RF_MCSM0_MAGIC_3                        (1 << 3)
249 #define RF_MCSM0_MAGIC_2                        (1 << 2)
250 #define RF_MCSM0_CLOSE_IN_RX_0DB                (0 << 0)
251 #define RF_MCSM0_CLOSE_IN_RX_6DB                (1 << 0)
252 #define RF_MCSM0_CLOSE_IN_RX_12DB               (2 << 0)
253 #define RF_MCSM0_CLOSE_IN_RX_18DB               (3 << 0)
254
255 __xdata __at (0xdf15) uint8_t RF_FOCCFG;
256 #define RF_FOCCFG_OFF   0x15
257 #define RF_FOCCFG_FOC_BS_CS_GATE                (1 << 5)
258 #define RF_FOCCFG_FOC_PRE_K_1K                  (0 << 3)
259 #define RF_FOCCFG_FOC_PRE_K_2K                  (1 << 3)
260 #define RF_FOCCFG_FOC_PRE_K_3K                  (2 << 3)
261 #define RF_FOCCFG_FOC_PRE_K_4K                  (3 << 3)
262 #define RF_FOCCFG_FOC_POST_K_PRE_K              (0 << 2)
263 #define RF_FOCCFG_FOC_POST_K_PRE_K_OVER_2       (1 << 2)
264 #define RF_FOCCFG_FOC_LIMIT_0                   (0 << 0)
265 #define RF_FOCCFG_FOC_LIMIT_BW_OVER_8           (1 << 0)
266 #define RF_FOCCFG_FOC_LIMIT_BW_OVER_4           (2 << 0)
267 #define RF_FOCCFG_FOC_LIMIT_BW_OVER_2           (3 << 0)
268
269 __xdata __at (0xdf16) uint8_t RF_BSCFG;
270 #define RF_BSCFG_OFF    0x16
271 #define RF_BSCFG_BS_PRE_K_1K                    (0 << 6)
272 #define RF_BSCFG_BS_PRE_K_2K                    (1 << 6)
273 #define RF_BSCFG_BS_PRE_K_3K                    (2 << 6)
274 #define RF_BSCFG_BS_PRE_K_4K                    (3 << 6)
275 #define RF_BSCFG_BS_PRE_KP_1KP                  (0 << 4)
276 #define RF_BSCFG_BS_PRE_KP_2KP                  (1 << 4)
277 #define RF_BSCFG_BS_PRE_KP_3KP                  (2 << 4)
278 #define RF_BSCFG_BS_PRE_KP_4KP                  (3 << 4)
279 #define RF_BSCFG_BS_POST_KI_PRE_KI              (0 << 3)
280 #define RF_BSCFG_BS_POST_KI_PRE_KI_OVER_2       (1 << 3)
281 #define RF_BSCFG_BS_POST_KP_PRE_KP              (0 << 2)
282 #define RF_BSCFG_BS_POST_KP_PRE_KP_OVER_2       (1 << 2)
283 #define RF_BSCFG_BS_LIMIT_0                     (0 << 0)
284 #define RF_BSCFG_BS_LIMIT_3_125                 (1 << 0)
285 #define RF_BSCFG_BS_LIMIT_6_25                  (2 << 0)
286 #define RF_BSCFG_BS_LIMIT_12_5                  (3 << 0)
287
288 __xdata __at (0xdf17) uint8_t RF_AGCCTRL2;
289 #define RF_AGCCTRL2_OFF 0x17
290
291 __xdata __at (0xdf18) uint8_t RF_AGCCTRL1;
292 #define RF_AGCCTRL1_OFF 0x18
293
294 __xdata __at (0xdf19) uint8_t RF_AGCCTRL0;
295 #define RF_AGCCTRL0_OFF 0x19
296
297 __xdata __at (0xdf1a) uint8_t RF_FREND1;
298 #define RF_FREND1_OFF   0x1a
299
300 #define RF_FREND1_LNA_CURRENT_SHIFT             6
301 #define RF_FREND1_LNA2MIX_CURRENT_SHIFT         4
302 #define RF_FREND1_LODIV_BUF_CURRENT_RX_SHIFT    2
303 #define RF_FREND1_MIX_CURRENT_SHIFT             0
304
305 __xdata __at (0xdf1b) uint8_t RF_FREND0;
306 #define RF_FREND0_OFF   0x1b
307
308 #define RF_FREND0_LODIV_BUF_CURRENT_TX_MASK     (0x3 << 4)
309 #define RF_FREND0_LODIV_BUF_CURRENT_TX_SHIFT    4
310 #define RF_FREND0_PA_POWER_MASK                 (0x7)
311 #define RF_FREND0_PA_POWER_SHIFT                0
312
313 __xdata __at (0xdf1c) uint8_t RF_FSCAL3;
314 #define RF_FSCAL3_OFF   0x1c
315
316 __xdata __at (0xdf1d) uint8_t RF_FSCAL2;
317 #define RF_FSCAL2_OFF   0x1d
318
319 __xdata __at (0xdf1e) uint8_t RF_FSCAL1;
320 #define RF_FSCAL1_OFF   0x1e
321
322 __xdata __at (0xdf1f) uint8_t RF_FSCAL0;
323 #define RF_FSCAL0_OFF   0x1f
324
325 __xdata __at (0xdf23) uint8_t RF_TEST2;
326 #define RF_TEST2_OFF    0x23
327
328 #define RF_TEST2_NORMAL_MAGIC           0x88
329 #define RF_TEST2_RX_LOW_DATA_RATE_MAGIC 0x81
330
331 __xdata __at (0xdf24) uint8_t RF_TEST1;
332 #define RF_TEST1_OFF    0x24
333
334 #define RF_TEST1_TX_MAGIC               0x31
335 #define RF_TEST1_RX_LOW_DATA_RATE_MAGIC 0x35
336
337 __xdata __at (0xdf25) uint8_t RF_TEST0;
338 #define RF_TEST0_OFF    0x25
339
340 #define RF_TEST0_7_2_MASK               (0xfc)
341 #define RF_TEST0_VCO_SEL_CAL_EN         (1 << 1)
342 #define RF_TEST0_0_MASK                 (1)
343
344 /* These are undocumented, and must be computed
345  * using the provided tool.
346  */
347 __xdata __at (0xdf27) uint8_t RF_PA_TABLE7;
348 #define RF_PA_TABLE7_OFF        0x27
349
350 __xdata __at (0xdf28) uint8_t RF_PA_TABLE6;
351 #define RF_PA_TABLE6_OFF        0x28
352
353 __xdata __at (0xdf29) uint8_t RF_PA_TABLE5;
354 #define RF_PA_TABLE5_OFF        0x29
355
356 __xdata __at (0xdf2a) uint8_t RF_PA_TABLE4;
357 #define RF_PA_TABLE4_OFF        0x2a
358
359 __xdata __at (0xdf2b) uint8_t RF_PA_TABLE3;
360 #define RF_PA_TABLE3_OFF        0x2b
361
362 __xdata __at (0xdf2c) uint8_t RF_PA_TABLE2;
363 #define RF_PA_TABLE2_OFF        0x2c
364
365 __xdata __at (0xdf2d) uint8_t RF_PA_TABLE1;
366 #define RF_PA_TABLE1_OFF        0x2d
367
368 __xdata __at (0xdf2e) uint8_t RF_PA_TABLE0;
369 #define RF_PA_TABLE0_OFF        0x2e
370
371 __xdata __at (0xdf36) uint8_t RF_PARTNUM;
372 #define RF_PARTNUM_OFF  0x36
373
374 __xdata __at (0xdf37) uint8_t RF_VERSION;
375 #define RF_VERSION_OFF  0x37
376
377 __xdata __at (0xdf38) uint8_t RF_FREQEST;
378 #define RF_FREQEST_OFF  0x38
379
380 __xdata __at (0xdf39) uint8_t RF_LQI;
381 #define RF_LQI_OFF      0x39
382
383 #define RF_LQI_CRC_OK                   (1 << 7)
384 #define RF_LQI_LQI_EST_MASK             (0x7f)
385
386 __xdata __at (0xdf3a) uint8_t RF_RSSI;
387 #define RF_RSSI_OFF     0x3a
388
389 __xdata __at (0xdf3b) uint8_t RF_MARCSTATE;
390 #define RF_MARCSTATE_OFF        0x3b
391
392 #define RF_MARCSTATE_MASK               0x0f
393 #define RF_MARCSTATE_SLEEP              0x00
394 #define RF_MARCSTATE_IDLE               0x01
395 #define RF_MARCSTATE_VCOON_MC           0x03
396 #define RF_MARCSTATE_REGON_MC           0x04
397 #define RF_MARCSTATE_MANCAL             0x05
398 #define RF_MARCSTATE_VCOON              0x06
399 #define RF_MARCSTATE_REGON              0x07
400 #define RF_MARCSTATE_STARTCAL           0x08
401 #define RF_MARCSTATE_BWBOOST            0x09
402 #define RF_MARCSTATE_FS_LOCK            0x0a
403 #define RF_MARCSTATE_IFADCON            0x0b
404 #define RF_MARCSTATE_ENDCAL             0x0c
405 #define RF_MARCSTATE_RX                 0x0d
406 #define RF_MARCSTATE_RX_END             0x0e
407 #define RF_MARCSTATE_RX_RST             0x0f
408 #define RF_MARCSTATE_TXRX_SWITCH        0x10
409 #define RF_MARCSTATE_RX_OVERFLOW        0x11
410 #define RF_MARCSTATE_FSTXON             0x12
411 #define RF_MARCSTATE_TX                 0x13
412 #define RF_MARCSTATE_TX_END             0x14
413 #define RF_MARCSTATE_RXTX_SWITCH        0x15
414 #define RF_MARCSTATE_TX_UNDERFLOW       0x16
415
416
417 __xdata __at (0xdf3c) uint8_t RF_PKTSTATUS;
418 #define RF_PKTSTATUS_OFF        0x3c
419
420 #define RF_PKTSTATUS_CRC_OK             (1 << 7)
421 #define RF_PKTSTATUS_CS                 (1 << 6)
422 #define RF_PKTSTATUS_PQT_REACHED        (1 << 5)
423 #define RF_PKTSTATUS_CCA                (1 << 4)
424 #define RF_PKTSTATUS_SFD                (1 << 3)
425
426 __xdata __at (0xdf3d) uint8_t RF_VCO_VC_DAC;
427 #define RF_VCO_VC_DAC_OFF       0x3d
428
429 #define PACKET_LEN      128
430
431 void
432 radio_init(void);
433
434 void
435 delay (unsigned char n);