rcbench
Servo and ESC test bench: panel, IOmcu and shared C
Loading...
Searching...
No Matches
kst_wire.h
Go to the documentation of this file.
1
40
41#ifndef KST_WIRE_H
42#define KST_WIRE_H
43
44#include <stdbool.h>
45#include <stddef.h>
46#include <stdint.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52/* --- registers ------------------------------------------------------------ */
53
55#define KST_REG_COUNT 32u
56#define KST_REG_MAX 0x1Fu
57
58/* --- bit timing ----------------------------------------------------------- */
59
66#define KST_HALF_CELL_NS 25400u
68#define KST_HALF_CELL_CYCLES_150MHZ 3810u
75#define KST_SERVO_CELL_NS 51150u
76#define KST_SERVO_HALF_CELL_NS 25575u
77
78#define KST_FRAME_BITS 27u
79#define KST_REPLY_BITS 11u
85#define KST_SYNC_PULSES 64u
86
88#define KST_FRAME_MAX_HALF_CELLS 127u
89#define KST_FRAME_LEVEL_BYTES 16u
90
91/* --- line handling, for the driver ---------------------------------------- */
92
99#define KST_RELEASE_NS 50000u
100
101/* --- reply windows, from the master's last edge to the first rising edge -- */
102
104#define KST_READ_ACCEPT_MIN_NS 350000u
105#define KST_READ_ACCEPT_MAX_NS 600000u
107#define KST_READ_WINDOW_NS 1500000u
109#define KST_WRITE_ACCEPT_MIN_NS 3300000u
110#define KST_WRITE_ACCEPT_MAX_NS 4200000u
112#define KST_WRITE_WINDOW_NS 8000000u
113
114/* --- decoder -------------------------------------------------------------- */
115
117#define KST_GLITCH_NS 1500u
119#define KST_RX_SEARCH_NS 8000u
124#define KST_RX_CONFIRM_NS 12800u
130#define KST_RX_HALF_CELL_MIN_NS 24300u
131#define KST_RX_HALF_CELL_MAX_NS 26900u
138#define KST_RX_FINAL_EDGE_MAX_NS 100000u
140#define KST_RX_QUIET_AFTER_NS 200000u
141
147#define KST_CAP_MAX_EDGES 48u
148
149/* --- frames --------------------------------------------------------------- */
150
157
166typedef struct {
167 uint8_t kind;
168 uint8_t n_half;
169 uint8_t level[KST_FRAME_LEVEL_BYTES];
172
182bool kst_frame_read(uint8_t reg, kst_frame_t *out);
183
195bool kst_frame_write(uint8_t reg, uint8_t value, kst_frame_t *out);
196
202void kst_frame_sync(kst_frame_t *out);
203
211bool kst_frame_level(const kst_frame_t *frame, unsigned index);
212
219uint32_t kst_frame_duration_ns(const kst_frame_t *frame);
220
221/* --- reply capture -------------------------------------------------------- */
222
230typedef struct {
231 uint32_t window_ns;
232 uint8_t level0;
234 uint8_t overflow;
236 uint8_t n_edges;
239
248
269
271typedef struct {
272 uint8_t result;
273 uint8_t value;
274 uint8_t flags;
275 uint8_t glitches;
276 uint32_t delay_ns;
277 uint32_t half_cell_ns;
279
286uint32_t kst_reply_window_ns(kst_expect_t expect);
287
306 kst_reply_t *out);
307
308#ifdef __cplusplus
309}
310#endif
311
312#endif /* KST_WIRE_H */
bool kst_frame_read(uint8_t reg, kst_frame_t *out)
Read frame for register reg.
Definition kst_wire.c:68
kst_rx_t kst_reply_decode(const kst_capture_t *cap, kst_expect_t expect, kst_reply_t *out)
Decode a reply window.
Definition kst_wire.c:306
bool kst_frame_write(uint8_t reg, uint8_t value, kst_frame_t *out)
Write frame.
Definition kst_wire.c:77
void kst_frame_sync(kst_frame_t *out)
The sync burst that puts a servo into programming mode.
Definition kst_wire.c:86
bool kst_frame_level(const kst_frame_t *frame, unsigned index)
Level of half-cell index; false past the end.
Definition kst_wire.c:98
kst_expect_t
What the master sent, which decides the accept window and the flags.
Definition kst_wire.h:243
@ KST_EXPECT_READ
Definition kst_wire.h:244
@ KST_EXPECT_SYNC
Definition kst_wire.h:246
@ KST_EXPECT_WRITE
Definition kst_wire.h:245
kst_frame_kind_t
Kind of a master frame.
Definition kst_wire.h:152
@ KST_FRAME_READ
Definition kst_wire.h:153
@ KST_FRAME_WRITE
Definition kst_wire.h:154
@ KST_FRAME_SYNC
Definition kst_wire.h:155
uint32_t kst_frame_duration_ns(const kst_frame_t *frame)
Time the frame takes on the wire, in ns.
Definition kst_wire.c:106
uint32_t kst_reply_window_ns(kst_expect_t expect)
Accept window and capture length for expect.
Definition kst_wire.c:113
#define KST_CAP_MAX_EDGES
Edges a capture holds.
Definition kst_wire.h:147
kst_rx_t
Result of decoding one reply window.
Definition kst_wire.h:254
@ KST_RX_CELL
Definition kst_wire.h:260
@ KST_RX_FLAGS
Definition kst_wire.h:263
@ KST_RX_CAPTURE
Definition kst_wire.h:267
@ KST_RX_OVERFLOW
Definition kst_wire.h:266
@ KST_RX_LATE
Definition kst_wire.h:259
@ KST_RX_OK
Definition kst_wire.h:255
@ KST_RX_WINDOW
Definition kst_wire.h:265
@ KST_RX_QUIET
Definition kst_wire.h:257
@ KST_RX_FINAL_EDGE
Definition kst_wire.h:264
@ KST_RX_START_LEVEL
Definition kst_wire.h:258
@ KST_RX_LENGTH
Definition kst_wire.h:261
@ KST_RX_NO_REPLY
Definition kst_wire.h:256
@ KST_RX_RATE
Definition kst_wire.h:262
The reply window as the driver saw it.
Definition kst_wire.h:230
uint8_t level0
Definition kst_wire.h:232
uint32_t edge_ns[KST_CAP_MAX_EDGES]
Definition kst_wire.h:237
uint8_t overflow
Definition kst_wire.h:234
uint32_t window_ns
Definition kst_wire.h:231
uint8_t n_edges
Definition kst_wire.h:236
A master frame as line levels, one per half-cell.
Definition kst_wire.h:166
uint8_t kind
Definition kst_wire.h:167
uint8_t n_half
Definition kst_wire.h:168
uint8_t level[KST_FRAME_LEVEL_BYTES]
Definition kst_wire.h:169
A decoded reply window.
Definition kst_wire.h:271
uint8_t glitches
Definition kst_wire.h:275
uint8_t flags
Definition kst_wire.h:274
uint8_t result
Definition kst_wire.h:272
uint32_t delay_ns
Definition kst_wire.h:276
uint8_t value
Definition kst_wire.h:273
uint32_t half_cell_ns
Definition kst_wire.h:277