Statistics
| Branch: | Tag: | Revision:

amiro-os / include / amiro / radio / a2500r24a.hpp @ 58fe0e0b

History | View | Annotate | Download (3.243 KB)

1 58fe0e0b Thomas Schöpping
#ifndef A2500R24A_HPP_
2
#define A2500R24A_HPP_
3
4
#include <ch.hpp>
5
6
namespace amiro {
7
8
class HWSPIDriver;
9
10
class A2500R24A : public chibios_rt::BaseStaticThread<256> {
11
12
 public:
13
14
  struct A2500R24AConfig {
15
  };
16
17
  /**
18
   * Return types of getCheck()
19
   */
20
  enum {
21
    CHECK_OK = 0x00u,
22
    CHECK_FAIL = 0x01u,
23
  };
24
25
  //private:
26
27
  struct registers {
28
    uint8_t IOCFG2;
29
    uint8_t IOCFG1;
30
    uint8_t IOCFG0;
31
    uint8_t FIFOTHR;
32
    uint8_t SYNC1;
33
    uint8_t SYNC0;
34
    uint8_t PKTLEN;
35
    uint8_t PKTCTRL1;
36
    uint8_t PKTCTRL0;
37
    uint8_t ADDR;
38
    uint8_t CHANNR;
39
    uint8_t FSCTRL1;
40
    uint8_t FSCTRL0;
41
    uint8_t FREQ2;
42
    uint8_t FREQ1;
43
    uint8_t FREQ0;
44
    uint8_t MDMCFG4;
45
    uint8_t MDMCFG3;
46
    uint8_t MDMCFG2;
47
    uint8_t MDMCFG1;
48
    uint8_t MDMCFG0;
49
    uint8_t DEVIATN;
50
    uint8_t MCSM2;
51
    uint8_t MCSM1;
52
    uint8_t MCSM0;
53
    uint8_t FOCCFG;
54
    uint8_t BSCFG;
55
    uint8_t AGCCTRL2;
56
    uint8_t AGCCTRL1;
57
    uint8_t AGCCTRL0;
58
    uint8_t WOREVT1;
59
    uint8_t WOREVT0;
60
    uint8_t WORCTRL;
61
    uint8_t FREND1;
62
    uint8_t FREND0;
63
    uint8_t FSCAL3;
64
    uint8_t FSCAL2;
65
    uint8_t FSCAL1;
66
    uint8_t FSCAL0;
67
    uint8_t RCCTRL1;
68
    uint8_t RCCTRL0;
69
    uint8_t FSTEST;
70
    uint8_t PTEST;
71
    uint8_t AGCTEST;
72
    uint8_t TEST2;
73
    uint8_t TEST1;
74
    uint8_t TEST0;
75
    uint8_t reserved_0x2F;
76
  }__attribute__((packed));
77
78
  struct registerStrobe {
79
    uint8_t configurationRegister[offsetof(A2500R24A::registers, reserved_0x2F)+1];
80
    uint8_t SRES;
81
    uint8_t SFSTXON;
82
    uint8_t SXOFF;
83
    uint8_t SCAL;
84
    uint8_t SRX;
85
    uint8_t STX;
86
    uint8_t SIDLE;
87
    uint8_t reserved_0x37;
88
    uint8_t SWOR;
89
    uint8_t SPWD;
90
    uint8_t SFRX;
91
    uint8_t SFTX;
92
    uint8_t SWORRST;
93
    uint8_t SNOP;
94
    uint8_t PATABLE;
95
    uint8_t RX_TX_FIFO;
96
  }__attribute__((packed));
97
98
  struct registerStatus {
99
    uint8_t configurationRegister[offsetof(A2500R24A::registers, reserved_0x2F)+1];
100
    uint8_t PARTNUM;
101
    uint8_t VERSION;
102
    uint8_t FREQEST;
103
    uint8_t LQI;
104
    uint8_t RSSI;
105
    uint8_t MARCSTATE;
106
    uint8_t WORTIME1;
107
    uint8_t WORTIME0;
108
    uint8_t PKTSTATUS;
109
    uint8_t VCO_VC_DAC;
110
    uint8_t TXBYTES;
111
    uint8_t RXBYTES;
112
    uint8_t RCCTRL1_STATUS;
113
    uint8_t RCCTRL0_STATUS;
114
  }__attribute__((packed));
115
116
  enum {
117
    A2500R24A_PARTNUM = 0x80u,
118
    A2500R24A_VERSION = 0x03u,
119
  };
120
121
  enum {
122
    // For register access below address 0x30 the burst mode is available
123
    // to read multiple bytes
124
    SPI_BURST_ENA     = 0x40u,
125
    SPI_BURST_DIS     = 0x00u,
126
    // For addresses above (and including) 0x30 either the status or strobe access
127
    // has to be choosen, instead of burst mode
128
    SPI_STATUS_ACCESS = 0x40u,
129
    SPI_STROBE_ACCESS = 0x00u,
130
    // Read or write the register address
131
    SPI_READ      = 0x80u,
132
    SPI_WRITE     = 0x00u,
133
  };
134
135
 public:
136
  A2500R24A(HWSPIDriver* driver);
137
  virtual ~A2500R24A();
138
139
  chibios_rt::EvtSource* getEventSource();
140
  msg_t configure(A2500R24AConfig* config);
141
142
  /**
143
   * Check the presence of the radio chip by reading
144
   * the identifier register and comparing it to the standard
145
   * value
146
   */
147
  uint8_t getCheck();
148
149
 protected:
150
  virtual msg_t main();
151
152
 private:
153
  inline void updateSensorData();
154
155
 private:
156
157
  HWSPIDriver* driver;
158
  chibios_rt::EvtSource eventSource;
159
160
};
161
162
} /* amiro */
163
164
#endif /* A2500R24A_HPP_ */