d501ad12867ed614af1c22027eda0b6cf979b3d7
[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 __xdata __at (0xdf04) uint8_t RF_PKTCTRL0;
113 #define RF_PKTCTRL0_OFF 0x04
114 #define RF_PKTCTRL0_WHITE_DATA                  (1 << 6)
115 #define RF_PKTCTRL0_PKT_FORMAT_NORMAL           (0 << 4)
116 #define RF_PKTCTRL0_PKT_FORMAT_RANDOM           (2 << 4)
117 #define RF_PKTCTRL0_CRC_EN                      (1 << 2)
118 #define RF_PKTCTRL0_LENGTH_CONFIG_FIXED         (0 << 0)
119 #define RF_PKTCTRL0_LENGTH_CONFIG_VARIABLE      (1 << 0)
120
121 __xdata __at (0xdf05) uint8_t RF_ADDR;
122 #define RF_ADDR_OFF     0x05
123
124 __xdata __at (0xdf06) uint8_t RF_CHANNR;
125 #define RF_CHANNR_OFF   0x06
126
127 __xdata __at (0xdf07) uint8_t RF_FSCTRL1;
128 #define RF_FSCTRL1_OFF  0x07
129
130 #define RF_FSCTRL1_FREQ_IF_SHIFT        (0)
131
132 __xdata __at (0xdf08) uint8_t RF_FSCTRL0;
133 #define RF_FSCTRL0_OFF  0x08
134
135 #define RF_FSCTRL0_FREQOFF_SHIFT        (0)
136
137 __xdata __at (0xdf09) uint8_t RF_FREQ2;
138 #define RF_FREQ2_OFF    0x09
139
140 __xdata __at (0xdf0a) uint8_t RF_FREQ1;
141 #define RF_FREQ1_OFF    0x0a
142
143 __xdata __at (0xdf0b) uint8_t RF_FREQ0;
144 #define RF_FREQ0_OFF    0x0b
145
146 __xdata __at (0xdf0c) uint8_t RF_MDMCFG4;
147 #define RF_MDMCFG4_OFF  0x0c
148
149 #define RF_MDMCFG4_CHANBW_E_SHIFT       6
150 #define RF_MDMCFG4_CHANBW_M_SHIFT       4
151 #define RF_MDMCFG4_DRATE_E_SHIFT        0
152
153 __xdata __at (0xdf0d) uint8_t RF_MDMCFG3;
154 #define RF_MDMCFG3_OFF  0x0d
155
156 #define RF_MDMCFG3_DRATE_M_SHIFT        0
157
158 __xdata __at (0xdf0e) uint8_t RF_MDMCFG2;
159 #define RF_MDMCFG2_OFF  0x0e
160
161 #define RF_MDMCFG2_DEM_DCFILT_OFF       (1 << 7)
162 #define RF_MDMCFG2_DEM_DCFILT_ON        (0 << 7)
163
164 #define RF_MDMCFG2_MOD_FORMAT_MASK      (7 << 4)
165 #define RF_MDMCFG2_MOD_FORMAT_2_FSK     (0 << 4)
166 #define RF_MDMCFG2_MOD_FORMAT_GFSK      (1 << 4)
167 #define RF_MDMCFG2_MOD_FORMAT_ASK_OOK   (3 << 4)
168 #define RF_MDMCFG2_MOD_FORMAT_MSK       (7 << 4)
169
170 #define RF_MDMCFG2_MANCHESTER_EN        (1 << 3)
171
172 #define RF_MDMCFG2_SYNC_MODE_MASK               (0x7 << 0)
173 #define RF_MDMCFG2_SYNC_MODE_NONE               (0x0 << 0)
174 #define RF_MDMCFG2_SYNC_MODE_15_16              (0x1 << 0)
175 #define RF_MDMCFG2_SYNC_MODE_16_16              (0x2 << 0)
176 #define RF_MDMCFG2_SYNC_MODE_30_32              (0x3 << 0)
177 #define RF_MDMCFG2_SYNC_MODE_NONE_THRES         (0x4 << 0)
178 #define RF_MDMCFG2_SYNC_MODE_15_16_THRES        (0x5 << 0)
179 #define RF_MDMCFG2_SYNC_MODE_16_16_THRES        (0x6 << 0)
180 #define RF_MDMCFG2_SYNC_MODE_30_32_THRES        (0x7 << 0)
181
182 __xdata __at (0xdf0f) uint8_t RF_MDMCFG1;
183 #define RF_MDMCFG1_OFF  0x0f
184
185 #define RF_MDMCFG1_FEC_EN                       (1 << 7)
186 #define RF_MDMCFG1_FEC_DIS                      (0 << 7)
187
188 #define RF_MDMCFG1_NUM_PREAMBLE_MASK            (7 << 4)
189 #define RF_MDMCFG1_NUM_PREAMBLE_2               (0 << 4)
190 #define RF_MDMCFG1_NUM_PREAMBLE_3               (1 << 4)
191 #define RF_MDMCFG1_NUM_PREAMBLE_4               (2 << 4)
192 #define RF_MDMCFG1_NUM_PREAMBLE_6               (3 << 4)
193 #define RF_MDMCFG1_NUM_PREAMBLE_8               (4 << 4)
194 #define RF_MDMCFG1_NUM_PREAMBLE_12              (5 << 4)
195 #define RF_MDMCFG1_NUM_PREAMBLE_16              (6 << 4)
196 #define RF_MDMCFG1_NUM_PREAMBLE_24              (7 << 4)
197
198 #define RF_MDMCFG1_CHANSPC_E_MASK               (3 << 0)
199 #define RF_MDMCFG1_CHANSPC_E_SHIFT              (0)
200
201 __xdata __at (0xdf10) uint8_t RF_MDMCFG0;
202 #define RF_MDMCFG0_OFF  0x10
203
204 #define RF_MDMCFG0_CHANSPC_M_SHIFT              (0)
205
206 __xdata __at (0xdf11) uint8_t RF_DEVIATN;
207 #define RF_DEVIATN_OFF  0x11
208
209 #define RF_DEVIATN_DEVIATION_E_SHIFT            4
210 #define RF_DEVIATN_DEVIATION_M_SHIFT            0
211
212 __xdata __at (0xdf12) uint8_t RF_MCSM2;
213 #define RF_MCSM2_OFF    0x12
214 #define RF_MCSM2_RX_TIME_RSSI                   (1 << 4)
215 #define RF_MCSM2_RX_TIME_QUAL                   (1 << 3)
216 #define RF_MCSM2_RX_TIME_MASK                   (0x7)
217 #define RF_MCSM2_RX_TIME_SHIFT                  0
218 #define RF_MCSM2_RX_TIME_END_OF_PACKET          (7)
219
220 __xdata __at (0xdf13) uint8_t RF_MCSM1;
221 #define RF_MCSM1_OFF    0x13
222 #define RF_MCSM1_CCA_MODE_ALWAYS                        (0 << 4)
223 #define RF_MCSM1_CCA_MODE_RSSI_BELOW                    (1 << 4)
224 #define RF_MCSM1_CCA_MODE_UNLESS_RECEIVING              (2 << 4)
225 #define RF_MCSM1_CCA_MODE_RSSI_BELOW_UNLESS_RECEIVING   (3 << 4)
226 #define RF_MCSM1_RXOFF_MODE_IDLE                        (0 << 2)
227 #define RF_MCSM1_RXOFF_MODE_FSTXON                      (1 << 2)
228 #define RF_MCSM1_RXOFF_MODE_TX                          (2 << 2)
229 #define RF_MCSM1_RXOFF_MODE_RX                          (3 << 2)
230 #define RF_MCSM1_TXOFF_MODE_IDLE                        (0 << 0)
231 #define RF_MCSM1_TXOFF_MODE_FSTXON                      (1 << 0)
232 #define RF_MCSM1_TXOFF_MODE_TX                          (2 << 0)
233 #define RF_MCSM1_TXOFF_MODE_RX                          (3 << 0)
234
235 __xdata __at (0xdf14) uint8_t RF_MCSM0;
236 #define RF_MCSM0_OFF    0x14
237 #define RF_MCSM0_FS_AUTOCAL_NEVER               (0 << 4)
238 #define RF_MCSM0_FS_AUTOCAL_FROM_IDLE           (1 << 4)
239 #define RF_MCSM0_FS_AUTOCAL_TO_IDLE             (2 << 4)
240 #define RF_MCSM0_FS_AUTOCAL_TO_IDLE_EVERY_4     (3 << 4)
241 #define RF_MCSM0_MAGIC_3                        (1 << 3)
242 #define RF_MCSM0_MAGIC_2                        (1 << 2)
243 #define RF_MCSM0_CLOSE_IN_RX_0DB                (0 << 0)
244 #define RF_MCSM0_CLOSE_IN_RX_6DB                (1 << 0)
245 #define RF_MCSM0_CLOSE_IN_RX_12DB               (2 << 0)
246 #define RF_MCSM0_CLOSE_IN_RX_18DB               (3 << 0)
247
248 __xdata __at (0xdf15) uint8_t RF_FOCCFG;
249 #define RF_FOCCFG_OFF   0x15
250 #define RF_FOCCFG_FOC_BS_CS_GATE                (1 << 5)
251 #define RF_FOCCFG_FOC_PRE_K_1K                  (0 << 3)
252 #define RF_FOCCFG_FOC_PRE_K_2K                  (1 << 3)
253 #define RF_FOCCFG_FOC_PRE_K_3K                  (2 << 3)
254 #define RF_FOCCFG_FOC_PRE_K_4K                  (3 << 3)
255 #define RF_FOCCFG_FOC_POST_K_PRE_K              (0 << 2)
256 #define RF_FOCCFG_FOC_POST_K_PRE_K_OVER_2       (1 << 2)
257 #define RF_FOCCFG_FOC_LIMIT_0                   (0 << 0)
258 #define RF_FOCCFG_FOC_LIMIT_BW_OVER_8           (1 << 0)
259 #define RF_FOCCFG_FOC_LIMIT_BW_OVER_4           (2 << 0)
260 #define RF_FOCCFG_FOC_LIMIT_BW_OVER_2           (3 << 0)
261
262 __xdata __at (0xdf16) uint8_t RF_BSCFG;
263 #define RF_BSCFG_OFF    0x16
264 #define RF_BSCFG_BS_PRE_K_1K                    (0 << 6)
265 #define RF_BSCFG_BS_PRE_K_2K                    (1 << 6)
266 #define RF_BSCFG_BS_PRE_K_3K                    (2 << 6)
267 #define RF_BSCFG_BS_PRE_K_4K                    (3 << 6)
268 #define RF_BSCFG_BS_PRE_KP_1KP                  (0 << 4)
269 #define RF_BSCFG_BS_PRE_KP_2KP                  (1 << 4)
270 #define RF_BSCFG_BS_PRE_KP_3KP                  (2 << 4)
271 #define RF_BSCFG_BS_PRE_KP_4KP                  (3 << 4)
272 #define RF_BSCFG_BS_POST_KI_PRE_KI              (0 << 3)
273 #define RF_BSCFG_BS_POST_KI_PRE_KI_OVER_2       (1 << 3)
274 #define RF_BSCFG_BS_POST_KP_PRE_KP              (0 << 2)
275 #define RF_BSCFG_BS_POST_KP_PRE_KP_OVER_2       (1 << 2)
276 #define RF_BSCFG_BS_LIMIT_0                     (0 << 0)
277 #define RF_BSCFG_BS_LIMIT_3_125                 (1 << 0)
278 #define RF_BSCFG_BS_LIMIT_6_25                  (2 << 0)
279 #define RF_BSCFG_BS_LIMIT_12_5                  (3 << 0)
280
281 __xdata __at (0xdf17) uint8_t RF_AGCCTRL2;
282 #define RF_AGCCTRL2_OFF 0x17
283
284 __xdata __at (0xdf18) uint8_t RF_AGCCTRL1;
285 #define RF_AGCCTRL1_OFF 0x18
286
287 __xdata __at (0xdf19) uint8_t RF_AGCCTRL0;
288 #define RF_AGCCTRL0_OFF 0x19
289
290 __xdata __at (0xdf1a) uint8_t RF_FREND1;
291 #define RF_FREND1_OFF   0x1a
292
293 #define RF_FREND1_LNA_CURRENT_SHIFT             6
294 #define RF_FREND1_LNA2MIX_CURRENT_SHIFT         4
295 #define RF_FREND1_LODIV_BUF_CURRENT_RX_SHIFT    2
296 #define RF_FREND1_MIX_CURRENT_SHIFT             0
297
298 __xdata __at (0xdf1b) uint8_t RF_FREND0;
299 #define RF_FREND0_OFF   0x1b
300
301 #define RF_FREND0_LODIV_BUF_CURRENT_TX_MASK     (0x3 << 4)
302 #define RF_FREND0_LODIV_BUF_CURRENT_TX_SHIFT    4
303 #define RF_FREND0_PA_POWER_MASK                 (0x7)
304 #define RF_FREND0_PA_POWER_SHIFT                0
305
306 __xdata __at (0xdf1c) uint8_t RF_FSCAL3;
307 #define RF_FSCAL3_OFF   0x1c
308
309 __xdata __at (0xdf1d) uint8_t RF_FSCAL2;
310 #define RF_FSCAL2_OFF   0x1d
311
312 __xdata __at (0xdf1e) uint8_t RF_FSCAL1;
313 #define RF_FSCAL1_OFF   0x1e
314
315 __xdata __at (0xdf1f) uint8_t RF_FSCAL0;
316 #define RF_FSCAL0_OFF   0x1f
317
318 __xdata __at (0xdf23) uint8_t RF_TEST2;
319 #define RF_TEST2_OFF    0x23
320
321 #define RF_TEST2_NORMAL_MAGIC           0x88
322 #define RF_TEST2_RX_LOW_DATA_RATE_MAGIC 0x81
323
324 __xdata __at (0xdf24) uint8_t RF_TEST1;
325 #define RF_TEST1_OFF    0x24
326
327 #define RF_TEST1_TX_MAGIC               0x31
328 #define RF_TEST1_RX_LOW_DATA_RATE_MAGIC 0x35
329
330 __xdata __at (0xdf25) uint8_t RF_TEST0;
331 #define RF_TEST0_OFF    0x25
332
333 #define RF_TEST0_7_2_MASK               (0xfc)
334 #define RF_TEST0_VCO_SEL_CAL_EN         (1 << 1)
335 #define RF_TEST0_0_MASK                 (1)
336
337 /* These are undocumented, and must be computed
338  * using the provided tool.
339  */
340 __xdata __at (0xdf27) uint8_t RF_PA_TABLE7;
341 #define RF_PA_TABLE7_OFF        0x27
342
343 __xdata __at (0xdf28) uint8_t RF_PA_TABLE6;
344 #define RF_PA_TABLE6_OFF        0x28
345
346 __xdata __at (0xdf29) uint8_t RF_PA_TABLE5;
347 #define RF_PA_TABLE5_OFF        0x29
348
349 __xdata __at (0xdf2a) uint8_t RF_PA_TABLE4;
350 #define RF_PA_TABLE4_OFF        0x2a
351
352 __xdata __at (0xdf2b) uint8_t RF_PA_TABLE3;
353 #define RF_PA_TABLE3_OFF        0x2b
354
355 __xdata __at (0xdf2c) uint8_t RF_PA_TABLE2;
356 #define RF_PA_TABLE2_OFF        0x2c
357
358 __xdata __at (0xdf2d) uint8_t RF_PA_TABLE1;
359 #define RF_PA_TABLE1_OFF        0x2d
360
361 __xdata __at (0xdf2e) uint8_t RF_PA_TABLE0;
362 #define RF_PA_TABLE0_OFF        0x2e
363
364 __xdata __at (0xdf36) uint8_t RF_PARTNUM;
365 #define RF_PARTNUM_OFF  0x36
366
367 __xdata __at (0xdf37) uint8_t RF_VERSION;
368 #define RF_VERSION_OFF  0x37
369
370 __xdata __at (0xdf38) uint8_t RF_FREQEST;
371 #define RF_FREQEST_OFF  0x38
372
373 __xdata __at (0xdf39) uint8_t RF_LQI;
374 #define RF_LQI_OFF      0x39
375
376 #define RF_LQI_CRC_OK                   (1 << 7)
377 #define RF_LQI_LQI_EST_MASK             (0x7f)
378
379 __xdata __at (0xdf3a) uint8_t RF_RSSI;
380 #define RF_RSSI_OFF     0x3a
381
382 __xdata __at (0xdf3b) uint8_t RF_MARCSTATE;
383 #define RF_MARCSTATE_OFF        0x3b
384
385 #define RF_MARCSTATE_MASK               0x0f
386 #define RF_MARCSTATE_SLEEP              0x00
387 #define RF_MARCSTATE_IDLE               0x01
388 #define RF_MARCSTATE_VCOON_MC           0x03
389 #define RF_MARCSTATE_REGON_MC           0x04
390 #define RF_MARCSTATE_MANCAL             0x05
391 #define RF_MARCSTATE_VCOON              0x06
392 #define RF_MARCSTATE_REGON              0x07
393 #define RF_MARCSTATE_STARTCAL           0x08
394 #define RF_MARCSTATE_BWBOOST            0x09
395 #define RF_MARCSTATE_FS_LOCK            0x0a
396 #define RF_MARCSTATE_IFADCON            0x0b
397 #define RF_MARCSTATE_ENDCAL             0x0c
398 #define RF_MARCSTATE_RX                 0x0d
399 #define RF_MARCSTATE_RX_END             0x0e
400 #define RF_MARCSTATE_RX_RST             0x0f
401 #define RF_MARCSTATE_TXRX_SWITCH        0x10
402 #define RF_MARCSTATE_RX_OVERFLOW        0x11
403 #define RF_MARCSTATE_FSTXON             0x12
404 #define RF_MARCSTATE_TX                 0x13
405 #define RF_MARCSTATE_TX_END             0x14
406 #define RF_MARCSTATE_RXTX_SWITCH        0x15
407 #define RF_MARCSTATE_TX_UNDERFLOW       0x16
408
409
410 __xdata __at (0xdf3c) uint8_t RF_PKTSTATUS;
411 #define RF_PKTSTATUS_OFF        0x3c
412
413 #define RF_PKTSTATUS_CRC_OK             (1 << 7)
414 #define RF_PKTSTATUS_CS                 (1 << 6)
415 #define RF_PKTSTATUS_PQT_REACHED        (1 << 5)
416 #define RF_PKTSTATUS_CCA                (1 << 4)
417 #define RF_PKTSTATUS_SFD                (1 << 3)
418
419 __xdata __at (0xdf3d) uint8_t RF_VCO_VC_DAC;
420 #define RF_VCO_VC_DAC_OFF       0x3d
421
422 #define PACKET_LEN      128
423
424 void
425 radio_init(void);
426
427 void
428 delay (unsigned char n);