Paparazzi UAS  v5.14.0_stable-0-g3f680d1
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
protocol.h
Go to the documentation of this file.
1 /****************************************************************************
2  *
3  * Copyright (c) 2012-2014 PX4 Development Team. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in
13  * the documentation and/or other materials provided with the
14  * distribution.
15  * 3. Neither the name PX4 nor the names of its contributors may be
16  * used to endorse or promote products derived from this software
17  * without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
26  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  *
32  ****************************************************************************/
33 
34 #pragma once
35 
36 #define __STDC_FORMAT_MACROS
37 #include "std.h"
38 
73 /* Per C, this is safe for all 2's complement systems */
74 #define REG_TO_SIGNED(_reg) ((int16_t)(_reg))
75 #define SIGNED_TO_REG(_signed) ((uint16_t)(_signed))
76 
77 #define REG_TO_FLOAT(_reg) ((float)REG_TO_SIGNED(_reg) / 10000.0f)
78 #define FLOAT_TO_REG(_float) SIGNED_TO_REG((int16_t)((_float) * 10000.0f))
79 
80 #define PX4IO_PROTOCOL_VERSION 4
81 
82 /* maximum allowable sizes on this protocol version */
83 #define PX4IO_PROTOCOL_MAX_CONTROL_COUNT 8
85 /* static configuration page */
86 #define PX4IO_PAGE_CONFIG 0
87 #define PX4IO_P_CONFIG_PROTOCOL_VERSION 0 /* PX4IO_PROTOCOL_VERSION */
88 #define PX4IO_P_CONFIG_HARDWARE_VERSION 1 /* magic numbers TBD */
89 #define PX4IO_P_CONFIG_BOOTLOADER_VERSION 2 /* get this how? */
90 #define PX4IO_P_CONFIG_MAX_TRANSFER 3 /* maximum I2C transfer size */
91 #define PX4IO_P_CONFIG_CONTROL_COUNT 4 /* hardcoded max control count supported */
92 #define PX4IO_P_CONFIG_ACTUATOR_COUNT 5 /* hardcoded max actuator output count */
93 #define PX4IO_P_CONFIG_RC_INPUT_COUNT 6 /* hardcoded max R/C input count supported */
94 #define PX4IO_P_CONFIG_ADC_INPUT_COUNT 7 /* hardcoded max ADC inputs */
95 #define PX4IO_P_CONFIG_RELAY_COUNT 8 /* hardcoded # of relay outputs */
96 #define PX4IO_P_CONFIG_CONTROL_GROUP_COUNT 8
98 /* dynamic status page */
99 #define PX4IO_PAGE_STATUS 1
100 #define PX4IO_P_STATUS_FREEMEM 0
101 #define PX4IO_P_STATUS_CPULOAD 1
102 
103 #define PX4IO_P_STATUS_FLAGS 2 /* monitoring flags */
104 #define PX4IO_P_STATUS_FLAGS_OUTPUTS_ARMED (1 << 0) /* arm-ok and locally armed */
105 #define PX4IO_P_STATUS_FLAGS_OVERRIDE (1 << 1) /* in manual override */
106 #define PX4IO_P_STATUS_FLAGS_RC_OK (1 << 2) /* RC input is valid */
107 #define PX4IO_P_STATUS_FLAGS_RC_PPM (1 << 3) /* PPM input is valid */
108 #define PX4IO_P_STATUS_FLAGS_RC_DSM (1 << 4) /* DSM input is valid */
109 #define PX4IO_P_STATUS_FLAGS_RC_SBUS (1 << 5) /* SBUS input is valid */
110 #define PX4IO_P_STATUS_FLAGS_FMU_OK (1 << 6) /* controls from FMU are valid */
111 #define PX4IO_P_STATUS_FLAGS_RAW_PWM (1 << 7) /* raw PWM from FMU is bypassing the mixer */
112 #define PX4IO_P_STATUS_FLAGS_MIXER_OK (1 << 8) /* mixer is OK */
113 #define PX4IO_P_STATUS_FLAGS_ARM_SYNC (1 << 9) /* the arming state between IO and FMU is in sync */
114 #define PX4IO_P_STATUS_FLAGS_INIT_OK (1 << 10) /* initialisation of the IO completed without error */
115 #define PX4IO_P_STATUS_FLAGS_FAILSAFE (1 << 11) /* failsafe is active */
116 #define PX4IO_P_STATUS_FLAGS_SAFETY_OFF (1 << 12) /* safety is off */
117 #define PX4IO_P_STATUS_FLAGS_FMU_INITIALIZED (1 << 13) /* FMU was initialized and OK once */
118 #define PX4IO_P_STATUS_FLAGS_RC_ST24 (1 << 14) /* ST24 input is valid */
119 #define PX4IO_P_STATUS_FLAGS_RC_SUMD (1 << 15) /* SUMD input is valid */
120 
121 #define PX4IO_P_STATUS_ALARMS 3 /* alarm flags - alarms latch, write 1 to a bit to clear it */
122 #define PX4IO_P_STATUS_ALARMS_VBATT_LOW (1 << 0) /* [1] VBatt is very close to regulator dropout */
123 #define PX4IO_P_STATUS_ALARMS_TEMPERATURE (1 << 1) /* board temperature is high */
124 #define PX4IO_P_STATUS_ALARMS_SERVO_CURRENT (1 << 2) /* [1] servo current limit was exceeded */
125 #define PX4IO_P_STATUS_ALARMS_ACC_CURRENT (1 << 3) /* [1] accessory current limit was exceeded */
126 #define PX4IO_P_STATUS_ALARMS_FMU_LOST (1 << 4) /* timed out waiting for controls from FMU */
127 #define PX4IO_P_STATUS_ALARMS_RC_LOST (1 << 5) /* timed out waiting for RC input */
128 #define PX4IO_P_STATUS_ALARMS_PWM_ERROR (1 << 6) /* PWM configuration or output was bad */
129 #define PX4IO_P_STATUS_ALARMS_VSERVO_FAULT (1 << 7) /* [2] VServo was out of the valid range (2.5 - 5.5 V) */
130 
131 #define PX4IO_P_STATUS_VBATT 4 /* [1] battery voltage in mV */
132 #define PX4IO_P_STATUS_IBATT 5 /* [1] battery current (raw ADC) */
133 #define PX4IO_P_STATUS_VSERVO 6 /* [2] servo rail voltage in mV */
134 #define PX4IO_P_STATUS_VRSSI 7 /* [2] RSSI voltage */
135 #define PX4IO_P_STATUS_PRSSI 8 /* [2] RSSI PWM value */
136 
137 #define PX4IO_P_STATUS_MIXER 9 /* mixer actuator limit flags */
138 #define PX4IO_P_STATUS_MIXER_LOWER_LIMIT (1 << 0)
139 #define PX4IO_P_STATUS_MIXER_UPPER_LIMIT (1 << 1)
140 #define PX4IO_P_STATUS_MIXER_YAW_LIMIT (1 << 2)
142 /* array of post-mix actuator outputs, -10000..10000 */
143 #define PX4IO_PAGE_ACTUATORS 2 /* 0..CONFIG_ACTUATOR_COUNT-1 */
144 
145 /* array of PWM servo output values, microseconds */
146 #define PX4IO_PAGE_SERVOS 3 /* 0..CONFIG_ACTUATOR_COUNT-1 */
147 
148 /* array of raw RC input values, microseconds */
149 #define PX4IO_PAGE_RAW_RC_INPUT 4
150 #define PX4IO_P_RAW_RC_COUNT 0 /* number of valid channels */
151 #define PX4IO_P_RAW_RC_FLAGS 1 /* RC detail status flags */
152 #define PX4IO_P_RAW_RC_FLAGS_FRAME_DROP (1 << 0) /* single frame drop */
153 #define PX4IO_P_RAW_RC_FLAGS_FAILSAFE (1 << 1) /* receiver is in failsafe mode */
154 #define PX4IO_P_RAW_RC_FLAGS_RC_DSM11 (1 << 2) /* DSM decoding is 11 bit mode */
155 #define PX4IO_P_RAW_RC_FLAGS_MAPPING_OK (1 << 3) /* Channel mapping is ok */
156 #define PX4IO_P_RAW_RC_FLAGS_RC_OK (1 << 4) /* RC reception ok */
157 
158 #define PX4IO_P_RAW_RC_NRSSI 2 /* [2] Normalized RSSI value, 0: no reception, 255: perfect reception */
159 #define PX4IO_P_RAW_RC_DATA 3 /* [1] + [2] Details about the RC source (PPM frame length, Spektrum protocol type) */
160 #define PX4IO_P_RAW_FRAME_COUNT 4 /* Number of total received frames (wrapping counter) */
161 #define PX4IO_P_RAW_LOST_FRAME_COUNT 5 /* Number of total dropped frames (wrapping counter) */
162 #define PX4IO_P_RAW_RC_BASE 6 /* CONFIG_RC_INPUT_COUNT channels from here */
163 
164 /* array of scaled RC input values, -10000..10000 */
165 #define PX4IO_PAGE_RC_INPUT 5
166 #define PX4IO_P_RC_VALID 0 /* bitmask of valid controls */
167 #define PX4IO_P_RC_BASE 1 /* CONFIG_RC_INPUT_COUNT controls from here */
168 
169 /* array of raw ADC values */
170 #define PX4IO_PAGE_RAW_ADC_INPUT 6 /* 0..CONFIG_ADC_INPUT_COUNT-1 */
171 
172 /* PWM servo information */
173 #define PX4IO_PAGE_PWM_INFO 7
174 #define PX4IO_RATE_MAP_BASE 0 /* 0..CONFIG_ACTUATOR_COUNT bitmaps of PWM rate groups */
175 
176 /* setup page */
177 #define PX4IO_PAGE_SETUP 50
178 #define PX4IO_P_SETUP_FEATURES 0
179 #define PX4IO_P_SETUP_FEATURES_SBUS1_OUT (1 << 0)
180 #define PX4IO_P_SETUP_FEATURES_SBUS2_OUT (1 << 1)
181 #define PX4IO_P_SETUP_FEATURES_PWM_RSSI (1 << 2)
182 #define PX4IO_P_SETUP_FEATURES_ADC_RSSI (1 << 3)
184 #define PX4IO_P_SETUP_ARMING 1 /* arming controls */
185 #define PX4IO_P_SETUP_ARMING_IO_ARM_OK (1 << 0) /* OK to arm the IO side */
186 #define PX4IO_P_SETUP_ARMING_FMU_ARMED (1 << 1) /* FMU is already armed */
187 #define PX4IO_P_SETUP_ARMING_MANUAL_OVERRIDE_OK (1 << 2) /* OK to switch to manual override via override RC channel */
188 #define PX4IO_P_SETUP_ARMING_FAILSAFE_CUSTOM (1 << 3) /* use custom failsafe values, not 0 values of mixer */
189 #define PX4IO_P_SETUP_ARMING_INAIR_RESTART_OK (1 << 4) /* OK to try in-air restart */
190 #define PX4IO_P_SETUP_ARMING_ALWAYS_PWM_ENABLE (1 << 5) /* Output of PWM right after startup enabled to help ESCs initialize and prevent them from beeping */
191 #define PX4IO_P_SETUP_ARMING_RC_HANDLING_DISABLED (1 << 6) /* Disable the IO-internal evaluation of the RC */
192 #define PX4IO_P_SETUP_ARMING_LOCKDOWN (1 << 7) /* If set, the system operates normally, but won't actuate any servos */
193 #define PX4IO_P_SETUP_ARMING_FORCE_FAILSAFE (1 << 8) /* If set, the system will always output the failsafe values */
194 #define PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE (1 << 9) /* If set, the system will never return from a failsafe, but remain in failsafe once triggered. */
195 #define PX4IO_P_SETUP_ARMING_OVERRIDE_IMMEDIATE (1 << 10) /* If set then on FMU failure override is immediate. Othewise it waits for the mode switch to go past the override thrshold */
196 
197 #define PX4IO_P_SETUP_PWM_RATES 2 /* bitmask, 0 = low rate, 1 = high rate */
198 #define PX4IO_P_SETUP_PWM_DEFAULTRATE 3 /* 'low' PWM frame output rate in Hz */
199 #define PX4IO_P_SETUP_PWM_ALTRATE 4 /* 'high' PWM frame output rate in Hz */
200 
201 #if defined(CONFIG_ARCH_BOARD_PX4IO_V1) || defined(CONFIG_ARCH_BOARD_PX4FMU_V1)
202 #define PX4IO_P_SETUP_RELAYS 5 /* bitmask of relay/switch outputs, 0 = off, 1 = on */
203 #define PX4IO_P_SETUP_RELAYS_POWER1 (1<<0) /* hardware rev [1] power relay 1 */
204 #define PX4IO_P_SETUP_RELAYS_POWER2 (1<<1) /* hardware rev [1] power relay 2 */
205 #define PX4IO_P_SETUP_RELAYS_ACC1 (1<<2) /* hardware rev [1] accessory power 1 */
206 #define PX4IO_P_SETUP_RELAYS_ACC2 (1<<3) /* hardware rev [1] accessory power 2 */
207 #else
208 #define PX4IO_P_SETUP_RELAYS_PAD 5
209 #endif
210 
211 #define PX4IO_P_SETUP_VBATT_SCALE 6 /* hardware rev [1] battery voltage correction factor (float) */
212 #define PX4IO_P_SETUP_VSERVO_SCALE 6 /* hardware rev [2] servo voltage correction factor (float) */
213 #define PX4IO_P_SETUP_DSM 7 /* DSM bind state */
214 enum { /* DSM bind states */
220 };
221 /* 8 */
222 #define PX4IO_P_SETUP_SET_DEBUG 9 /* debug level for IO board */
223 
224 #define PX4IO_P_SETUP_REBOOT_BL 10 /* reboot IO into bootloader */
225 #define PX4IO_REBOOT_BL_MAGIC 14662 /* required argument for reboot (random) */
226 
227 #define PX4IO_P_SETUP_CRC 11 /* get CRC of IO firmware */
228 /* storage space of 12 occupied by CRC */
229 #define PX4IO_P_SETUP_FORCE_SAFETY_OFF 12 /* force safety switch into
230  'armed' (PWM enabled) state - this is a non-data write and
231  hence index 12 can safely be used. */
232 #define PX4IO_P_SETUP_RC_THR_FAILSAFE_US 13
234 #define PX4IO_P_SETUP_FORCE_SAFETY_ON 14 /* force safety switch into 'disarmed' (PWM disabled state) */
235 #define PX4IO_FORCE_SAFETY_MAGIC 22027 /* required argument for force safety (random) */
236 
237 #define PX4IO_P_SETUP_PWM_REVERSE 15
238 #define PX4IO_P_SETUP_TRIM_ROLL 16
239 #define PX4IO_P_SETUP_TRIM_PITCH 17
240 #define PX4IO_P_SETUP_TRIM_YAW 18
242 /* autopilot control values, -10000..10000 */
243 #define PX4IO_PAGE_CONTROLS 51
244 #define PX4IO_P_CONTROLS_GROUP_0 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 0)
245 #define PX4IO_P_CONTROLS_GROUP_1 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 1)
246 #define PX4IO_P_CONTROLS_GROUP_2 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 2)
247 #define PX4IO_P_CONTROLS_GROUP_3 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 3)
249 #define PX4IO_P_CONTROLS_GROUP_VALID 64
250 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP0 (1 << 0)
251 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP1 (1 << 1)
252 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP2 (1 << 2)
253 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP3 (1 << 3)
255 /* raw text load to the mixer parser - ignores offset */
256 #define PX4IO_PAGE_MIXERLOAD 52
257 
258 /* R/C channel config */
259 #define PX4IO_PAGE_RC_CONFIG 53
260 #define PX4IO_P_RC_CONFIG_MIN 0
261 #define PX4IO_P_RC_CONFIG_CENTER 1
262 #define PX4IO_P_RC_CONFIG_MAX 2
263 #define PX4IO_P_RC_CONFIG_DEADZONE 3
264 #define PX4IO_P_RC_CONFIG_ASSIGNMENT 4
265 #define PX4IO_P_RC_CONFIG_ASSIGNMENT_MODESWITCH 100
266 #define PX4IO_P_RC_CONFIG_OPTIONS 5
267 #define PX4IO_P_RC_CONFIG_OPTIONS_ENABLED (1 << 0)
268 #define PX4IO_P_RC_CONFIG_OPTIONS_REVERSE (1 << 1)
269 #define PX4IO_P_RC_CONFIG_STRIDE 6
271 /* PWM output - overrides mixer */
272 #define PX4IO_PAGE_DIRECT_PWM 54
274 /* PWM failsafe values - zero disables the output */
275 #define PX4IO_PAGE_FAILSAFE_PWM 55
277 /* PWM failsafe values - zero disables the output */
278 #define PX4IO_PAGE_SENSORS 56
279 #define PX4IO_P_SENSORS_ALTITUDE 0
281 /* Debug and test page - not used in normal operation */
282 #define PX4IO_PAGE_TEST 127
283 #define PX4IO_P_TEST_LED 0
285 /* PWM minimum values for certain ESCs */
286 #define PX4IO_PAGE_CONTROL_MIN_PWM 106
288 /* PWM maximum values for certain ESCs */
289 #define PX4IO_PAGE_CONTROL_MAX_PWM 107
291 /* PWM disarmed values that are active, even when SAFETY_SAFE */
292 #define PX4IO_PAGE_DISARMED_PWM 108 /* 0..CONFIG_ACTUATOR_COUNT-1 */
293 
300 #pragma pack(push, 1)
303 #define F2I_MIXER_MAGIC 0x6d74
304 
306 #define F2I_MIXER_ACTION_RESET 0
307 #define F2I_MIXER_ACTION_APPEND 1
308 
309  char text[0]; /* actual text size may vary */
310 };
311 #pragma pack(pop)
312 
317 #define PKT_MAX_REGS 32 // by agreement w/FMU
318 
319 #pragma pack(push, 1)
320 struct IOPacket {
326 };
327 #pragma pack(pop)
328 
329 #define PKT_CODE_READ 0x00 /* FMU->IO read transaction */
330 #define PKT_CODE_WRITE 0x40 /* FMU->IO write transaction */
331 #define PKT_CODE_SUCCESS 0x00 /* IO->FMU success reply */
332 #define PKT_CODE_CORRUPT 0x40 /* IO->FMU bad packet reply */
333 #define PKT_CODE_ERROR 0x80 /* IO->FMU register op error reply */
334 
335 #define PKT_CODE_MASK 0xc0
336 #define PKT_COUNT_MASK 0x3f
337 
338 #define PKT_COUNT(_p) ((_p).count_code & PKT_COUNT_MASK)
339 #define PKT_CODE(_p) ((_p).count_code & PKT_CODE_MASK)
340 #define PKT_SIZE(_p) ((size_t)((uint8_t *)&((_p).regs[PKT_COUNT(_p)]) - ((uint8_t *)&(_p))))
341 
342 static const uint8_t crc8_tab[256] __attribute__((unused)) = {
343  0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
344  0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
345  0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
346  0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
347  0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
348  0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
349  0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
350  0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
351  0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
352  0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
353  0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
354  0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
355  0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
356  0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
357  0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
358  0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
359  0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
360  0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
361  0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
362  0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
363  0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
364  0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
365  0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
366  0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
367  0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
368  0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
369  0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
370  0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
371  0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
372  0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
373  0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
374  0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
375 };
376 
377 static uint8_t crc_packet(struct IOPacket *pkt) __attribute__((unused));
378 static uint8_t
379 crc_packet(struct IOPacket *pkt)
380 {
381  uint8_t *end = (uint8_t *)(&pkt->regs[PKT_COUNT(*pkt)]);
382  uint8_t *p = (uint8_t *)pkt;
383  uint8_t c = 0;
384 
385  while (p < end) {
386  c = crc8_tab[c ^ * (p++)];
387  }
388 
389  return c;
390 }
As-needed mixer data upload.
Definition: protocol.h:301
unsigned short uint16_t
Definition: types.h:16
uint8_t count_code
Definition: protocol.h:321
uint8_t offset
Definition: protocol.h:324
static const uint8_t crc8_tab[256]
Definition: protocol.h:342
uint8_t page
Definition: protocol.h:323
static uint8_t crc_packet(struct IOPacket *pkt)
Definition: protocol.h:379
uint16_t f2i_mixer_magic
Definition: protocol.h:302
#define PKT_COUNT(_p)
Definition: protocol.h:338
uint8_t action
Definition: protocol.h:305
unsigned char uint8_t
Definition: types.h:14
uint8_t crc
Definition: protocol.h:322
char text[0]
Definition: protocol.h:309
uint16_t regs[PKT_MAX_REGS]
Definition: protocol.h:325
static float p[2][2]
#define PKT_MAX_REGS
Serial protocol encapsulation.
Definition: protocol.h:317