chen
2024-11-01 631a90c1116fa33382a88a747c89bf761bc0fa9b
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
/*
 * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
 * its subsidiaries and affiliates (collectly called MKSEMI).
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form, except as embedded into an MKSEMI
 *    integrated circuit in a product or a software update for such product,
 *    must reproduce the above copyright notice, this list of conditions and
 *    the following disclaimer in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. Neither the name of MKSEMI nor the names of its contributors may be used
 *    to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * 4. This software, with or without modification, must only be used with a
 *    MKSEMI integrated circuit.
 *
 * 5. Any software provided in binary form under this license must not be
 *    reverse engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
#ifndef LIB_CCC_H_
#define LIB_CCC_H_
#include "mk_mac.h"
#include "uwb_api.h"
 
#if defined(XTAL32K_CALIBRATED) && (XTAL32K_CALIBRATED == 1)
// Event prefetch time for event program - 180us
#define UWB_EVT_PREFETCH_TIME US_TO_PHY_TIMER_COUNT(180)
 
// RX window open in advance time - 10us
#define UWB_RX_OPEN_IN_ADVANCE US_TO_PHY_TIMER_COUNT(10)
#else
// Event prefetch time for event program - 250us
#define UWB_EVT_PREFETCH_TIME US_TO_PHY_TIMER_COUNT(250)
 
// RX window open in advance time - 80us
#define UWB_RX_OPEN_IN_ADVANCE US_TO_PHY_TIMER_COUNT(80)
#endif
 
// RX window - 375us
#define UWB_RX_WINDOW US_TO_PHY_TIMER_COUNT(375)
 
/* CCC hopping mode */
enum HOPPING_MODE_T
{
    HOPPING_MODE_NO_HOPPING = 0,
    HOPPING_MODE_FIRA,
    HOPPING_MODE_CONT_DEF_SEQ = 0xA0,
    HOPPING_MODE_ADAP_DEF_SEQ,
    HOPPING_MODE_CONT_AES_SEQ,
    HOPPING_MODE_ADAP_AES_SEQ,
};
 
/* CCC timestamp structure */
struct TIMESTAMP_T
{
    uint8_t resp_idx;
    uint32_t Tround1;
    uint8_t resp_fom;
    uint8_t resp_nlos;
    uint8_t status;
};
 
/* CCC ranging environment variable */
struct RANGING_ENV_T
{
    uint8_t enable;
    uint8_t keys_available;
    uint8_t lost_cnt;
    uint8_t responder_num;
    uint8_t slot_idx;
    uint8_t hopping_mode;
    uint8_t count;
    uint8_t count_last;
 
    uint32_t session_id;
    uint32_t sts_index0;
    uint32_t frame_counter;
 
    uint32_t anchor_point;
    uint32_t last_anchor_point;
    uint32_t block_duration;
    uint32_t slot_duration;
    uint32_t block_idx;
    uint16_t round_idx;
    uint16_t next_round_idx;
    uint32_t sts_idx;
    uint32_t hop_mode_key;
 
    uint8_t hop_flag;
    uint8_t rounds_per_block;
    uint8_t slots_per_round;
    uint8_t responder_slot_idx;
 
    uint8_t poll_fom;
    uint8_t poll_nlos;
    uint8_t final_fom;
    uint8_t final_nlos;
 
    uint8_t azimuth_fom;
    uint8_t elevation_fom;
    int16_t azimuth;
    int16_t elevation;
 
    int64_t tx_poll_time;
    int64_t tx_response_time;
    int64_t tx_final_time;
    int64_t rx_poll_time;
    int64_t rx_final_time;
 
    uint8_t main_ant_id[RESPONDER_NUM_MAX];
    struct TIMESTAMP_T timstamp[RESPONDER_NUM_MAX];
    struct RANGE_DATA_T range_data;
};
 
#ifdef __cplusplus
extern "C" {
#endif
 
extern struct RANGING_ENV_T ranging_env;
 
/**
 * @brief Start ranging procedure.
 */
void ranging_start(void);
 
/**
 * @brief Stop ranging procedure.
 */
void ranging_stop(void);
 
/**
 * @brief Restart ranging procedure.
 * @note This function can be called once detected link loss from peer device
 */
void ranging_restart(void);
 
/**
 * @brief Get ranging UWB TX power.
 * @return ranging UWB TX power in dBm
 */
int8_t ranging_tx_power_get(void);
 
/**
 * @brief Set local device short address.
 * @param[in] short_addr          device short address
 */
void ranging_local_addr_set(uint16_t short_addr);
 
/**
 * @brief Set peer device short address.
 * @param[in] short_addr          device short address
 */
void ranging_peer_addr_set(uint16_t short_addr);
 
/**
 * @brief Get initiator short address.
 * @return short address of initiator
 */
uint16_t ranging_initiator_addr_get(void);
 
/**
 * @brief Get responder short address from responder device list.
 * @param[in] idx               responder device index
 * @return short address of responder
 */
uint16_t ranging_responder_addr_get(uint8_t idx);
 
/**
 * @brief Add responder device into responder device list for one-to-many case.
 * @param[in] addr              device short address
 * @return 1: successful, 0: fail
 */
uint8_t ranging_responder_addr_add(uint16_t addr);
 
/**
 * @brief Get responder devices number.
 * @return number of responder
 */
uint8_t ranging_responder_num_get(void);
 
/**
 * @brief Clear responder list.
 */
void ranging_responder_list_clr(void);
 
/**
 * @brief Set CCC URSK.
 * @param[in] ursk                  Pointer of URSK buffer
 */
void ranging_set_ccc_ursk(const uint8_t *ursk);
 
/**
 * @brief Update ranging keys.
 * @param[in] sts_idx               STS index
 * @param[in] key_type              key type
 */
void ranging_update_keys(uint32_t sts_idx, uint8_t key_type);
 
#ifdef __cplusplus
}
#endif
 
#endif /* LIB_CCC_H_ */