1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
/*
 * Copyright (c) 2021 Shanghai Panchip Microelectronics Co.,Ltd.
 *
 * SPDX-License-Identifier: Apache-2.0
 */
 
#ifdef __cplusplus
extern "C" {
#endif
 
#ifndef COMM_PRF_H
#define COMM_PRF_H
 
#include "pan_pri_rf.h"
#include "pan_phy.h"
 
#ifndef __ramfunc
#define __ramfunc __attribute__((section(".ramfunc")))
#endif
 
#define PRF_LL_IRQ_PRIORITY     0
#define PRF_DATA_MAX_SIZE     255
 
#define TX_WINDOW               (5)
#define RX_WINDOW               (1)
#define RX_LEGENCY_1M           (11)
#define RX_LEGENCY_2M           (5)
 
 
typedef enum {
    PRF_CHIP_MODE_SEL_BLE          = 1,
    PRF_CHIP_MODE_SEL_XN297        = 2,
    PRF_CHIP_MODE_SEL_NRF           = 3,
}prf_chip_mode_sel_t;
 
typedef enum PRF_ADDR_LENGTH_SEL {
    PRF_ADDR_LENGTH_SEL_3   = 3,
    PRF_ADDR_LENGTH_SEL_4   = 4,
    PRF_ADDR_LENGTH_SEL_5   = 5,
}prf_addr_length_sel_t;
 
typedef enum PRF_CRC_SEL {
    PRF_CRC_SEL_NOCRC       = 0,
    PRF_CRC_SEL_CRC8        = 1,
    PRF_CRC_SEL_CRC16       = 2,
    PRF_CRC_SEL_CRC24       = 3,
}prf_crc_sel_t;
 
typedef enum PRF_SCRAMBLE_SEL {
    PRF_SRC_SEL_NOSRC       = 0,
    PRF_SRC_SEL_EN          = 1,
}prf_scramble_sel_t;
 
typedef enum PRF_MODE {
    PRF_MODE_NORMAL       = 0,
    PRF_MODE_ENHANCE          = 1,
    PRF_MODE_NORMAL_M1    = 2,
}prf_mode_t;
 
typedef enum PRF_PHY {
    PRF_PHY_1M          = 1,
    PRF_PHY_2M          = 2,
    PRF_PHY_CODED_S8    = 3,
    PRF_PHY_CODED       = 4,
    PRF_PHY_250K        = 5,
}prf_phy_t;
 
typedef enum PRF_TRX_MODE {
    PRF_TX_MODE          = 0,
    PRF_RX_MODE          = 1,
}prf_trx_mode_t;
 
typedef enum PRF_MODE_CONF_SEL {
    PRF_BLE_CONF          = 1,
    PRF_NRF_CONF          = 2,
    PRF_G_250k_CONF       = 3,
    PRF_B_250K_CONF       = 4,
}prf_mode_conf_sel_t;
 
typedef enum PRF_PIPE {
    PRF_PIPE0        = (0x1<<0),
    PRF_PIPE1        = (0x1<<1),
    PRF_PIPE2        = (0x1<<2),
    PRF_PIPE3        = (0x1<<3),
    PRF_PIPE4        = (0x1<<4),
    PRF_PIPE5        = (0x1<<5),
    PRF_PIPE6        = (0x1<<6),
    PRF_PIPE7        = (0x1<<7),
}prf_pipe_t;
 
typedef enum PRF_TRANSFER_TYPE {
    PRF_TRF_NORMAL     = (0),
    PRF_TRF_NRF52      = (1),
    PRF_TRF_B250K      = (2),
}prf_trf_t;
 
typedef enum PRF_ENDIAN {
    PRF_BIG_ENDIAN          = 0,
    PRF_LITTLE_ENDIAN       = 1,
}prf_endian_t;
 
typedef enum PRF_ENC_DEC_MODE {
    PRF_ENCRYPT_MODE          = 0,
    PRF_DECRYPT_MODE          = 1,
}prf_enc_dec_mode_t;
 
typedef enum PRF_SPEED_SEL {
    PRF_TRANSFER_SPEED_LOW  = 0,
    PRF_TRANSFER_SPEED_4K   = 1,
    PRF_TRANSFER_SPEED_8K   = 2,
} prf_speed_sel_t;
 
 
typedef struct {
    uint32_t data_length;
    uint8_t data[PRF_DATA_MAX_SIZE];
}panchip_prf_payload_t;
 
typedef struct
{
    prf_mode_t                  work_mode;
    prf_chip_mode_sel_t             chip_mode;
    prf_trx_mode_t                trx_mode;
 
    prf_phy_t                   phy;
    prf_crc_sel_t               crc;
    prf_scramble_sel_t            src;
    prf_mode_conf_sel_t            mode_conf;
 
    uint16_t                     rx_timeout;
    uint16_t                     rf_channel;
    uint8_t                        tx_no_ack;
    prf_trf_t                    trf_type;
    uint8_t                        rx_length;
 
    uint8_t                        sync_length;
    uint8_t                        sync[5];
 
    int8_t                        tx_power;
    uint8_t                        pid_manual_flag;
    uint8_t                        crc_include_sync;
    uint8_t                        src_include_sync;
 
    prf_pipe_t                    pipe;
} pan_prf_config_t;
 
typedef void (*RRF_CallbackFunc)(void);
 
typedef struct
{
    RRF_CallbackFunc            tx_cb;
    RRF_CallbackFunc            rx_timeout_cb;
    RRF_CallbackFunc            rx_cb;
    RRF_CallbackFunc            rx_crc_err_cb;
    RRF_CallbackFunc            rx_len_err_cb;
    RRF_CallbackFunc            rx_acc_adr_err_cb;
    RRF_CallbackFunc            rx_pid_err_cb;
} pan_prf_callback_t;
 
typedef struct {
    uint32_t major;
    uint32_t minor;
    uint32_t patch;
    uint32_t commit_id;
} pan_prf_version_t;
 
 
#define SLPTMR1_SLPTMR_CMPR_BUS_ENA             (3 << 2)
#define SLPTMR1_SLPTMR_CMPR_BUS_ENA_MSK         0x40   /* 1'b0: disable  - 1'b1: Enable */
#define SLPTMR1_SLPTMR_CMPR_BUS_ENA_SHFT        6
#define SLPTMR2_SLPTMR_CMPR_STRT_EVENT_DIN         (4<<2)
#define SLPTMR4_SLPTMR_CMPR_BUS_DIN                (6<<2)
 
#define CTRL_PM_PWR_STATE                       (2<<2)
#define CTRL_PM_PWR_STATE_MSK                   0x3f0
#define CTRL_PM_PWR_STATE_SHFT                  4
 
#define CTRL_PWR_MOD                            (2<<2)
#define CTRL_PWR_MOD_MSK                        0x7             
#define CTRL_PWR_MOD_SHFT                       0
 
#define CTRL_MEM_SOFT_RST_N                     (2<<2)
#define CTRL_MEM_SOFT_RST_N_MSK                 0x8
#define CTRL_MEM_SOFT_RST_N_SHFT                3
 
#define SLPTMR1_SLPTMR_REST_N                      (3<<2)
#define SLPTMR1_SLPTMR_REST_N_MSK                  0x4             /* active low sleep timer reset signal */
#define SLPTMR1_SLPTMR_REST_N_SHFT                 2
 
#define SLPTMR1_SLPTMR_ENA                         (3<<2)
#define SLPTMR1_SLPTMR_ENA_MSK                     0x2             /* This field specifies the enable for sleep timer */
#define SLPTMR1_SLPTMR_ENA_SHFT                    1
 
#define DSLP1_LL_PHY_DRIVER_NRST                    (7<<2)
#define DSLP1_LL_PHY_DRIVER_NRST_MSK                0x2
#define DSLP1_LL_PHY_DRIVER_NRST_SHFT               1
 
 
#define SLPTMR1_SLPTMR_CMPR_STRT_EVENT_ENA         (3<<2)
#define SLPTMR1_SLPTMR_CMPR_STRT_EVENT_ENA_MSK     0x1             /* This field specifies the control compare units status function.  - 1'b0: disable  - 1'b1: Enable */
#define SLPTMR1_SLPTMR_CMPR_STRT_EVENT_ENA_SHFT    0
 
 
#define SLPTMR2_SLPTMR_CMPR_STRT_EVENT_DIN         (4<<2)
#define SLPTMR2_SLPTMR_CMPR_STRT_EVENT_DIN_MSK     0xffffffff      /* This field specifies the compare unit inputs (compare values). */
#define SLPTMR2_SLPTMR_CMPR_STRT_EVENT_DIN_SHFT    0
 
 
#define SLPTMR3_SLPTMR_CURRENT                     (5<<2)
#define SLPTMR3_SLPTMR_CURRENT_MSK                 0xffffffff      /* This field specifies the sleep timer current value. */
#define SLPTMR3_SLPTMR_CURRENT_SHFT                0
 
 
#define LLHWC_WRITE_MASK32_REG(base_addr, reg_ofst, mask, shift, data)           \
    LLHWC_WRITE32_REG(base_addr, reg_ofst,                       \
              ((LLHWC_READ32_REG((base_addr), (reg_ofst)) & ~(mask)) | \
               ((mask) & ((data) << (shift)))))
 
#define LLHWC_READ_MASK32_REG(base_addr, reg_ofst, mask, shift) \
        ((LLHWC_READ32_REG((base_addr), (reg_ofst)) & (mask)) >> (shift))
#define LLHWC_READ_MASK32_REG_EXT(base_addr, reg)           LLHWC_READ_MASK32_REG(base_addr, reg, reg##_MSK, reg##_SHFT)
 
 
 
extern uint8_t panchip_prf_data_rec(panchip_prf_payload_t *p_payload);
extern void panchip_prf_set_data(panchip_prf_payload_t *p_payload);
extern void panchip_prf_set_ack_data(panchip_prf_payload_t *p_payload);
extern void panchip_prf_init(pan_prf_config_t *p_config);
extern void panchip_prf_trx_start(void);
extern void panchip_prf_module_init(void);
extern void panchip_prf_ble_resume(void);
extern void panchip_switch_prf(pan_prf_config_t *p_config);
extern void panchip_prf_set_chn(uint16_t rf_channel);
extern void panchip_prf_trx_trans_time(pan_prf_config_t *p_config);
extern uint8_t panchip_prf_isr_resume_ble_cb(void);
extern void panchip_prf_dual_mode_start(pan_prf_config_t *prf_config);
extern uint8_t panchip_prf_ble_handler(void);
extern void panchip_prf_isr_proc(void);
extern void panchip_prf_irq_enable(void);
extern void panchip_prf_set_tx_pwr(int8_t tx_pwr);
extern void panchip_prf_module_enable(pan_prf_config_t *p_config);
extern pan_prf_version_t *panchip_prf_get_version(void);
extern void panchip_prf_mode_conf_set(prf_mode_conf_sel_t conf);
extern void panchip_prf_set_phy(prf_phy_t phy);
extern void panchip_prf_rx_length_irq_cfg(uint8_t value);
 
extern void panchip_prf_set_trx_mode(prf_trx_mode_t trx_mode);
extern void panchip_prf_set_work_mode(prf_mode_t work_mode);
extern void panchip_prf_set_addr(uint8_t *addr, uint8_t len, prf_pipe_t pipe, uint8_t trx_addr);
extern void panchip_prf_set_tx_noack(bool flag);
extern void panchip_prf_rx_timeout(uint16_t time);
extern void panchip_prf_rx_stop(void);
extern void panchip_prf_reset(void);
extern void panchip_prf_pid_cfg(pan_prf_config_t *prf_config, uint8_t pid);
extern void panchip_white_init_value(uint8_t value);
extern void panchip_prf_carrier_start(uint16_t  tx_channel);
extern void panchip_prf_carrier_stop(void);
extern int16_t panchip_prf_read_rssi(void);
extern void panchip_prf_enable_carrier_rssi(void);
extern void panchip_prf_disable_carrier_rssi(void);
extern int16_t panchip_prf_read_carrier_rssi(void);
extern void panchip_prf_b250k_init(void);
extern void panchip_prf_isr_init(void);
extern void panchip_prf_b250k_set_channel(uint8_t idx);
extern uint32_t panchip_prf_encrypt_decrypt(uint8_t *plain_text,
                            uint16_t plain_text_len,
                            uint8_t *key,
                            uint8_t *iv,
                            uint8_t *encry_data,
                            prf_enc_dec_mode_t enc_mode);
extern void panchip_prf_rx_patch_handler(void);
extern void panchip_prf_get_current_stamp(void);
extern uint8_t panchip_prf_get_pipe(void);
extern void panchip_prf_set_crc(prf_crc_sel_t crc, uint8_t crc_include_sync);
extern void panchip_prf_set_whitening(prf_scramble_sel_t src, uint8_t src_include_sync);
extern void panchip_prf_set_endian(prf_endian_t endian);
extern void panchip_prf_reduce_trx_pre_post_delay_time(pan_prf_config_t *p_config, bool restore);
extern int16_t panchip_prf_set_trx_trans_time(pan_prf_config_t *p_config,
                          prf_speed_sel_t speed,
                          uint16_t transfer_time);
 
extern uint32_t data_addr_tx;
extern uint32_t data_addr_rx;
extern int8_t prf_rssi;
 
extern pan_prf_config_t rf_config;
extern pan_prf_callback_t isr_cb;
extern volatile bool wake_from_lp_mode;
 
#endif
 
#ifdef __cplusplus
}
#endif