Chirp SonicLib  4.5.2
ch_common.h
Go to the documentation of this file.
1 
15 /*
16  Copyright 2016-2023, InvenSense, Inc. All rights reserved.
17 
18  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  DISCLAIMED.
22 
23  */
24 
25 #ifndef CH_COMMON_H_
26 #define CH_COMMON_H_
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #include <stdint.h>
33 #include <stdbool.h>
34 #include <invn/soniclib/soniclib.h>
35 #ifdef INCLUDE_WHITNEY_SUPPORT
38 #endif
39 
40 /* All sensor common definitions */
41 #define CH_COMMON_RTC_CAL_PULSE_MS 100 // typical (default) rtc calibration pulse, in ms
42 
43 #ifdef INCLUDE_WHITNEY_SUPPORT
44 
45 /* CH-x01 common definitions */
46 #define CHX01_SCALEFACTOR_INDEX 4 // sample of BIST data for scale factor calc
47 #define CHX01_BANDWIDTH_INDEX_1 6 // first sample of BIST data for b/w calc
48 #define CHX01_BANDWIDTH_INDEX_2 7 // second sample of BIST data for b/w calc
49 
50 #if (CH101_DATA_MEM_SIZE == CH201_DATA_MEM_SIZE) // make sure CH101 and CH201 are the same
51 #define CHX01_DATA_MEM_SIZE CH101_DATA_MEM_SIZE // data memory size
52 #endif
53 #if (CH101_DATA_MEM_ADDR == CH201_DATA_MEM_ADDR)
54 #define CHX01_DATA_MEM_ADDR CH101_DATA_MEM_ADDR // data memory address
55 #endif
56 #if (CH101_PROG_MEM_SIZE == CH201_PROG_MEM_SIZE)
57 #define CHX01_PROG_MEM_SIZE CH101_PROG_MEM_SIZE // program memory size
58 #endif
59 #if (CH101_PROG_MEM_ADDR == CH201_PROG_MEM_ADDR)
60 #define CHX01_PROG_MEM_ADDR CH101_PROG_MEM_ADDR // program memory address
61 #endif
62 #if (CH101_FW_SIZE == CH201_FW_SIZE)
63 #define CHX01_FW_SIZE CH101_FW_SIZE // sensor f/w size
64 #endif
65 
66 #define CHX01_COMMON_CAL_TRIG_USE_BUS (0x80) // calibration trigger cmd to use bus speed
67 #define CHX01_I2C_RTC_CYCLES (128) // RTC counter duration when using bus calibration
68 
69 /* CH-101 common definitions */
70 
71 #define CH101_COMMON_REG_OPMODE 0x01
72 #define CH101_COMMON_REG_TICK_INTERVAL 0x02
73 #define CH101_COMMON_REG_PERIOD 0x05
74 #define CH101_COMMON_REG_CAL_TRIG 0x06
75 #define CH101_COMMON_REG_MAX_RANGE 0x07
76 #define CH101_COMMON_REG_TIME_PLAN 0x09
77 #define CH101_COMMON_REG_TX_LENGTH 0x10
78 #define CH101_COMMON_REG_CAL_RESULT 0x0A
79 #define CH101_COMMON_REG_REV_CYCLES 0x0C
80 #define CH101_COMMON_REG_DCO_PERIOD 0x0E
81 #define CH101_COMMON_REG_RX_HOLDOFF 0x11
82 #define CH101_COMMON_REG_STAT_RANGE 0x12
83 #define CH101_COMMON_REG_STAT_COEFF 0x13
84 #define CH101_COMMON_REG_READY 0x14
85 #define CH101_COMMON_REG_TOF_SF 0x16
86 #define CH101_COMMON_REG_TOF 0x18
87 #define CH101_COMMON_REG_AMPLITUDE 0x1A
88 #define CH101_COMMON_REG_DATA 0x1C
89 
90 #define CH101_COMMON_I2CREGS_OFFSET 0
91 
92 #define CH101_COMMON_READY_FREQ_LOCKED (0x02)
93 
94 #define CH101_COMMON_FREQCOUNTERCYCLES (128)
95 
96 #define CH101_COMMON_STAT_COEFF_DEFAULT (6) // default value for stationary target coefficient
97 
98 /* CH-201 common definitions */
99 
100 #define CH201_COMMON_REG_OPMODE 0x01
101 #define CH201_COMMON_REG_TICK_INTERVAL 0x02
102 #define CH201_COMMON_REG_LOW_GAIN_RXLEN 0x04
103 #define CH201_COMMON_REG_PERIOD 0x05
104 #define CH201_COMMON_REG_CAL_TRIG 0x06
105 #define CH201_COMMON_REG_MAX_RANGE 0x07
106 #define CH201_COMMON_REG_THRESH_LEN_0 0x08
107 #define CH201_COMMON_REG_THRESH_LEN_1 0x09
108 #define CH201_COMMON_REG_CAL_RESULT 0x0A
109 #define CH201_COMMON_REG_THRESH_LEN_2 0x0C
110 #define CH201_COMMON_REG_THRESH_LEN_3 0x0D
111 #define CH201_COMMON_REG_TX_LENGTH 0x10
112 #define CH201_COMMON_REG_RX_HOLDOFF 0x11
113 #define CH201_COMMON_REG_ST_RANGE 0x12
114 #define CH201_COMMON_REG_READY 0x14
115 #define CH201_COMMON_REG_THRESH_LEN_4 0x15
116 #define CH201_COMMON_REG_THRESHOLDS 0x16 // start of array of six 2-byte threshold levels
117 #define CH201_COMMON_REG_TOF_SF 0x22
118 #define CH201_COMMON_REG_TOF 0x24
119 #define CH201_COMMON_REG_AMPLITUDE 0x26
120 #define CH201_COMMON_REG_DATA 0x28
121 
122 #define CH201_COMMON_I2CREGS_OFFSET 0
123 
124 #define CH201_COMMON_READY_FREQ_LOCKED (0x02)
125 
126 #define CH201_COMMON_FREQCOUNTERCYCLES (128)
127 #define CH201_COMMON_RX_LOW_GAIN_MIN (8) // minimum low-gain sample count
128 
129 #define CHX01_GPRMT_REG_OPMODE 0x01
130 #define CHX01_GPRMT_REG_TICK_INTERVAL 0x02
131 #define CHX01_GPRMT_REG_LOW_GAIN_RXLEN 0x04
132 #define CHX01_GPRMT_REG_PERIOD 0x05
133 #define CHX01_GPRMT_REG_CAL_TRIG 0x06
134 #define CHX01_GPRMT_REG_MAX_RANGE 0x07
135 #define CHX01_GPRMT_REG_THRESH_LEN_0 0x08
136 #define CHX01_GPRMT_REG_THRESH_LEN_1 0x09
137 #define CHX01_GPRMT_REG_CAL_RESULT 0x0A
138 #define CHX01_GPRMT_REG_THRESH_LEN_2 0x0C
139 #define CHX01_GPRMT_REG_THRESH_LEN_3 0x0D
140 #define CHX01_GPRMT_REG_TX_LENGTH 0x10
141 #define CHX01_GPRMT_REG_RX_HOLDOFF 0x11
142 #define CHX01_GPRMT_REG_ST_RANGE 0x12
143 #define CHX01_GPRMT_REG_READY 0x14
144 #define CHX01_GPRMT_REG_THRESH_LEN_4 0x15
145 #define CHX01_GPRMT_REG_THRESHOLDS 0x16 // start of array of six 2-byte threshold levels
146 #define CHX01_GPRMT_REG_TOF_SF 0x22
147 #define CHX01_GPRMT_REG_TOF 0x24
148 #define CHX01_GPRMT_REG_AMPLITUDE 0x26
149 #define CHX01_GPRMT_REG_DATA 0x28
150 
151 #endif /* INCLUDE_WHITNEY_SUPPORT */
152 
153 #ifndef NSEC_PER_SEC
154 #define NSEC_PER_SEC (1000000000U)
155 #endif
156 #define PMUT_FREQUENCY_ERROR_CODE (1) // this indicates some error in the frequency measurement
157 
158 /* Function prototypes */
159 uint8_t ch_common_init(ch_dev_t *dev_ptr, ch_group_t *grp_ptr, uint8_t dev_num, ch_fw_init_func_t fw_init_func);
160 
161 uint8_t ch_common_set_init_firmware(ch_dev_t *dev_ptr, ch_fw_init_func_t fw_init_func);
162 
163 uint8_t ch_common_group_start(ch_group_t *grp_ptr);
164 
165 uint8_t ch_common_set_mode(ch_dev_t *dev_ptr, ch_mode_t mode);
166 
167 uint8_t ch_common_fw_load(ch_dev_t *dev_ptr);
168 
169 uint8_t ch_common_set_rtc(ch_dev_t *dev_ptr, ch_rtc_src_t rtc_source, uint16_t rtc_freq);
170 
171 uint8_t ch_common_set_sample_interval(ch_dev_t *dev_ptr, uint16_t interval_ms); // deprecated
172 uint8_t ch_common_set_freerun_interval(ch_dev_t *dev_ptr, uint16_t interval_ms);
173 
174 uint8_t ch_common_set_freerun_interval_us(ch_dev_t *dev_ptr, uint32_t interval_us);
175 
176 uint8_t ch_common_set_freerun_interval_ticks(ch_dev_t *dev_ptr, uint32_t interval_periods);
177 
178 uint8_t ch_common_set_freerun_time_hop(ch_dev_t *dev_ptr, uint8_t meas_num, bool enable);
179 
180 uint8_t ch_common_set_num_samples(ch_dev_t *dev_ptr, uint16_t num_samples);
181 
182 uint16_t ch_common_get_num_samples(ch_dev_t *dev_ptr);
183 
184 uint8_t ch_common_set_max_range(ch_dev_t *dev_ptr, uint16_t max_range_mm);
185 
186 uint8_t ch_common_get_locked_state(ch_dev_t *dev_ptr);
187 
188 uint32_t ch_common_get_op_freq(ch_dev_t *dev_ptr);
189 
190 void ch_common_prepare_pulse_timer(ch_dev_t *dev_ptr);
191 
192 void ch_common_store_pt_result(ch_dev_t *dev_ptr);
193 
194 void ch_common_store_op_freq(ch_dev_t *dev_ptr);
195 
196 void ch_common_store_bandwidth(ch_dev_t *dev_ptr);
197 
198 void ch_common_store_scale_factor(ch_dev_t *dev_ptr);
199 
200 uint16_t ch_common_mm_to_samples(ch_dev_t *dev_ptr, uint16_t num_mm);
201 
202 uint16_t ch_common_samples_to_mm(ch_dev_t *dev_ptr, uint16_t num_samples);
203 
204 uint8_t ch_common_get_iq_data(ch_dev_t *dev_ptr, ch_iq_sample_t *buf_ptr, uint16_t start_sample, uint16_t num_samples,
205  ch_io_mode_t nonblock);
206 
207 uint8_t ch_common_set_sample_window(ch_dev_t *dev_ptr, uint16_t start_sample, uint16_t end_sample);
208 
209 uint16_t ch_common_get_amplitude_avg(ch_dev_t *dev_ptr);
210 
211 uint8_t ch_common_get_amplitude_data(ch_dev_t *dev_ptr, uint16_t *buf_ptr, uint16_t start_sample, uint16_t num_samples,
212  ch_io_mode_t mode);
213 uint8_t ch_common_get_amp_thresh_data(ch_dev_t *dev_ptr, ch_amp_thresh_t *buf_ptr, uint16_t start_sample,
214  uint16_t num_samples, ch_io_mode_t mode);
215 
216 uint8_t ch_common_set_rx_low_gain(ch_dev_t *dev_ptr, uint16_t num_samples);
217 uint16_t ch_common_get_rx_low_gain(ch_dev_t *dev_ptr);
218 
219 uint8_t ch_common_set_tx_length(ch_dev_t *dev_ptr, uint16_t num_cycles);
220 uint16_t ch_common_get_tx_length(ch_dev_t *dev_ptr);
221 
222 uint8_t ch_common_set_cal_result(ch_dev_t *dev_ptr, ch_cal_result_t *cal_ptr);
223 uint8_t ch_common_get_cal_result(ch_dev_t *dev_ptr, ch_cal_result_t *cal_ptr);
224 
225 uint8_t ch_common_check_program(ch_dev_t *dev_ptr);
226 uint8_t ch_common_set_frequency(ch_dev_t *dev_ptr, uint32_t target_freq_hz);
227 uint8_t ch_common_group_set_frequency(ch_group_t *grp_ptr, uint32_t frequency);
228 uint8_t ch_common_set_pmut_clock(ch_dev_t *dev_ptr, ch_pmut_clk_cfg_t clock_cfg);
229 uint8_t ch_common_watchdog_enable(ch_dev_t *dev_ptr);
230 uint8_t ch_common_watchdog_disable(ch_dev_t *dev_ptr);
231 
232 #ifdef INCLUDE_SHASTA_SUPPORT
233 uint8_t ch_common_meas_init_queue(ch_dev_t *dev_ptr);
234 uint8_t ch_common_meas_reset(ch_dev_t *dev_ptr, uint8_t meas_num);
235 uint8_t ch_common_meas_init(ch_dev_t *dev_ptr, uint8_t meas_num, const ch_meas_config_t *meas_config_ptr);
236 
237 uint8_t ch_common_write_data_validation_cfg(ch_dev_t *dev_ptr, uint8_t en, int16_t seed);
238 
239 uint8_t ch_common_get_mfg_info(ch_dev_t *dev_ptr, ch_mfg_info_t *info_ptr);
240 
241 uint8_t ch_common_meas_import(ch_dev_t *dev_ptr, measurement_queue_t *meas_queue_ptr, void *algo_cfg_ptr);
242 uint8_t ch_common_meas_add_segment(ch_dev_t *dev_ptr, uint8_t meas_num, ch_meas_segment_t *seg_ptr);
243 uint8_t ch_common_meas_insert_instruction(ch_dev_t *dev_ptr, uint8_t meas_num, const ch_meas_segment_t *const inst_ptr,
244  uint8_t inst_num_to_insert);
245 uint8_t ch_common_meas_remove_instruction(ch_dev_t *dev_ptr, uint8_t meas_num, uint8_t inst_num_to_remove);
246 uint8_t ch_common_meas_add_segment_count(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t num_cycles, uint8_t int_enable);
247 uint8_t ch_common_meas_add_segment_rx(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t num_samples, uint8_t gain,
248  uint8_t atten, uint8_t int_enable);
249 uint8_t ch_common_meas_add_segment_tx(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t num_cycles, uint8_t pulse_width,
250  uint8_t phase, uint8_t int_enable);
251 void ch_common_meas_init_segment_count(ch_meas_segment_t *seg_ptr, uint16_t num_cycles, uint8_t int_enable);
252 void ch_common_meas_init_segment_rx(ch_meas_segment_t *seg_ptr, uint16_t num_samples, ch_odr_t odr, uint8_t gain,
253  uint8_t atten, uint8_t int_enable);
254 void ch_common_meas_init_segment_tx(ch_meas_segment_t *seg_ptr, uint16_t num_cycles, uint8_t pulse_width, uint8_t phase,
255  uint8_t int_enable);
256 uint8_t ch_common_meas_optimize(ch_dev_t *dev_ptr, measurement_queue_t *meas_queue_ptr, void *algo_cfg_ptr);
257 uint8_t ch_common_meas_write_config(ch_dev_t *dev_ptr);
258 uint8_t ch_common_meas_update_counts(ch_dev_t *dev_ptr, uint8_t meas_num, measurement_t *meas_ptr);
259 void ch_common_meas_activate(ch_dev_t *dev_ptr, uint8_t meas_num);
260 void ch_common_meas_standby(ch_dev_t *dev_ptr, uint8_t meas_num);
261 uint8_t ch_common_meas_switch(ch_dev_t *dev_ptr);
262 uint8_t ch_common_meas_get_last_num(ch_dev_t *dev_ptr);
263 void ch_common_meas_get_info(ch_dev_t *dev_ptr, uint8_t meas_num, ch_meas_info_t *info_ptr);
264 void ch_common_meas_get_queue_info(ch_dev_t *dev_ptr, ch_meas_queue_info_t *info_ptr);
265 void ch_common_meas_get_seg_info(ch_dev_t *dev_ptr, uint8_t meas_num, uint8_t seg_num, ch_meas_seg_info_t *info_ptr);
266 uint8_t ch_common_meas_set_interval(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t interval_ms);
267 uint8_t ch_common_meas_set_interval_us(ch_dev_t *dev_ptr, uint8_t meas_num, uint32_t interval_us);
268 uint8_t ch_common_meas_set_interval_ticks(ch_dev_t *dev_ptr, uint8_t meas_num, uint32_t rtc_periods);
269 uint16_t ch_common_meas_get_interval(ch_dev_t *dev_ptr, uint8_t meas_num);
270 uint32_t ch_common_meas_get_interval_us(ch_dev_t *dev_ptr, uint8_t meas_num);
271 uint32_t ch_common_meas_get_interval_ticks(ch_dev_t *dev_ptr, uint8_t meas_num);
272 uint8_t ch_common_meas_set_num_samples(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t num_samples);
273 uint16_t ch_common_meas_get_num_samples(ch_dev_t *dev_ptr, uint8_t meas_num);
274 uint8_t ch_common_meas_set_max_range(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t max_range_mm);
275 uint8_t ch_common_meas_set_odr(ch_dev_t *dev_ptr, uint8_t meas_num, ch_odr_t odr);
276 ch_odr_t ch_common_meas_get_odr(ch_dev_t *dev_ptr, uint8_t meas_num);
277 uint16_t ch_common_meas_mm_to_samples(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t num_mm);
278 uint16_t ch_common_meas_samples_to_mm(ch_dev_t *dev_ptr, uint8_t meas_num, uint16_t num_samples);
279 
298 uint8_t ch_common_read_meas_config(ch_dev_t *dev_ptr);
299 
300 uint8_t ch_common_init_algo(ch_dev_t *dev_ptr);
301 uint8_t ch_common_get_algo_info(ch_dev_t *dev_ptr, ICU_ALGO_SHASTA_INFO *algo_info_ptr);
302 uint8_t ch_common_get_algo_config(ch_dev_t *dev_ptr, void *algo_cfg_ptr);
303 uint8_t ch_common_set_algo_config(ch_dev_t *dev_ptr, const void *algo_cfg_ptr);
304 uint8_t ch_common_get_algo_output(ch_dev_t *dev_ptr, void *algo_out_ptr);
305 uint8_t ch_common_get_algo_state(ch_dev_t *dev_ptr, void *algo_state_ptr);
306 
307 uint8_t ch_common_set_interrupt_mode(ch_dev_t *dev_ptr, ch_interrupt_mode_t mode);
308 ch_interrupt_mode_t ch_common_get_interrupt_mode(ch_dev_t *dev_ptr);
309 
310 uint8_t ch_common_set_interrupt_drive(ch_dev_t *dev_ptr, ch_interrupt_drive_t drive);
311 ch_interrupt_drive_t ch_common_get_interrupt_drive(ch_dev_t *dev_ptr);
312 
313 #endif // INCLUDE_SHASTA_SUPPORT
314 
315 uint8_t ch_common_set_target_interrupt(ch_dev_t *dev_ptr, ch_tgt_int_filter_t tgt_filter_mode);
316 ch_tgt_int_filter_t ch_common_get_target_interrupt(ch_dev_t *dev_ptr);
317 
335 uint32_t ch_common_range_lsb_to_mm(const ch_dev_t *dev_ptr, uint32_t time_of_flight, ch_range_t range_type);
336 
337 uint32_t ch_common_samples_to_cycles(uint16_t num_samples, ch_odr_t odr);
338 uint16_t ch_common_cycles_to_samples(uint32_t num_cycles, ch_odr_t odr, bool include_s0);
339 uint32_t ch_common_usec_to_cycles(ch_dev_t *dev_ptr, uint32_t num_usec);
340 uint32_t ch_common_cycles_to_usec(ch_dev_t *dev_ptr, uint32_t num_cycles);
341 uint16_t ch_common_usec_to_ticks(const ch_dev_t *dev_ptr, uint32_t num_usec);
342 uint32_t ch_common_ticks_to_usec(const ch_dev_t *dev_ptr, uint16_t num_rtc_periods);
343 
344 uint16_t ch_common_get_num_output_samples(ch_dev_t *dev_ptr);
345 
357 uint32_t ch_common_measure_pmut_frequency(ch_dev_t *dev_ptr);
358 
359 #ifdef __cplusplus
360 }
361 #endif
362 
363 #endif /* CH_COMMON_H_ */
Internal definitions for the Chirp CH101 ultrasonic sensor.
Internal definitions for the Chirp CH201 ultrasonic sensor.
uint8_t ch_common_read_meas_config(ch_dev_t *dev_ptr)
Read configuration settings associated with the last measurement.
Definition: ch_common.c:2978
uint32_t ch_common_range_lsb_to_mm(const ch_dev_t *dev_ptr, uint32_t time_of_flight, ch_range_t range_type)
Convert the raw range from the sensor to millimeters.
Definition: ch_common.c:686
uint8_t ch_common_set_frequency(ch_dev_t *dev_ptr, uint32_t target_freq_hz)
Set the closest available operating frequency to a desired operating frequency.
Definition: ch_common.c:1703
uint32_t ch_common_measure_pmut_frequency(ch_dev_t *dev_ptr)
Measure PMUT frequency on an ICU device.
Definition: ch_common.c:874
SonicLib public API and support functions for TDK/InvenSense ultrasonic sensors (originally developed...
ch_mode_t
Sensor operating modes.
Definition: soniclib.h:225
ch_range_t
Range data types.
Definition: soniclib.h:218
ch_interrupt_drive_t
Sensor interrupt drive type.
Definition: soniclib.h:283
ch_interrupt_mode_t
Sensor interrupt modes.
Definition: soniclib.h:277
ch_io_mode_t
I/O blocking mode flags.
Definition: soniclib.h:384
uint8_t(* ch_fw_init_func_t)(ch_dev_t *dev_ptr, fw_info_t **fw_info)
ASIC firmware init function pointer typedef.
Definition: soniclib.h:687
ch_odr_t
Sensor output data rate (ODR).
Definition: soniclib.h:339
ch_rtc_src_t
Sensor real-time clock sources.
Definition: soniclib.h:349
ch_tgt_int_filter_t
Target interrupt filter modes.
Definition: soniclib.h:328
ch_pmut_clk_cfg_t
PMUT clock configuration (ICU sensors)
Definition: soniclib.h:374
Sensor combined amplitude + detection threshold sample value.
Definition: soniclib.h:430
Calibration result structure.
Definition: soniclib.h:442
Chirp sensor device descriptor structure.
Definition: soniclib.h:732
Chirp sensor group descriptor structure.
Definition: soniclib.h:704
Sensor I/Q data value.
Definition: soniclib.h:424
Measurement configuration - used during ch_meas_init()
Definition: soniclib.h:494
Measurement info.
Definition: soniclib.h:523
Measurement queue info.
Definition: soniclib.h:547
Measurement segment info.
Definition: soniclib.h:534
Measurement segment.
Definition: soniclib.h:517
Sensor manufacturing info.
Definition: soniclib.h:557
Definition: icu_algo_info.h:10