75 #define REG_TO_SIGNED(_reg) ((int16_t)(_reg)) 76 #define SIGNED_TO_REG(_signed) ((uint16_t)(_signed)) 78 #define REG_TO_FLOAT(_reg) ((float)REG_TO_SIGNED(_reg) / 10000.0f) 79 #define FLOAT_TO_REG(_float) SIGNED_TO_REG((int16_t)floorf((_float + 0.00005f) * 10000.0f)) 81 #define REG_TO_BOOL(_reg) ((bool)(_reg)) 83 #define PX4IO_PROTOCOL_VERSION 4 86 #define PX4IO_PROTOCOL_MAX_CONTROL_COUNT 8 89 #define PX4IO_PAGE_CONFIG 0 90 #define PX4IO_P_CONFIG_PROTOCOL_VERSION 0 91 #define PX4IO_P_CONFIG_HARDWARE_VERSION 1 92 #define PX4IO_P_CONFIG_BOOTLOADER_VERSION 2 93 #define PX4IO_P_CONFIG_MAX_TRANSFER 3 94 #define PX4IO_P_CONFIG_CONTROL_COUNT 4 95 #define PX4IO_P_CONFIG_ACTUATOR_COUNT 5 96 #define PX4IO_P_CONFIG_RC_INPUT_COUNT 6 97 #define PX4IO_P_CONFIG_ADC_INPUT_COUNT 7 98 #define PX4IO_P_CONFIG_RELAY_COUNT 8 99 #define PX4IO_MAX_TRANSFER_LEN 64 102 #define PX4IO_PAGE_STATUS 1 103 #define PX4IO_P_STATUS_FREEMEM 0 104 #define PX4IO_P_STATUS_CPULOAD 1 106 #define PX4IO_P_STATUS_FLAGS 2 107 #define PX4IO_P_STATUS_FLAGS_OUTPUTS_ARMED (1 << 0) 108 #define PX4IO_P_STATUS_FLAGS_OVERRIDE (1 << 1) 109 #define PX4IO_P_STATUS_FLAGS_RC_OK (1 << 2) 110 #define PX4IO_P_STATUS_FLAGS_RC_PPM (1 << 3) 111 #define PX4IO_P_STATUS_FLAGS_RC_DSM (1 << 4) 112 #define PX4IO_P_STATUS_FLAGS_RC_SBUS (1 << 5) 113 #define PX4IO_P_STATUS_FLAGS_FMU_OK (1 << 6) 114 #define PX4IO_P_STATUS_FLAGS_RAW_PWM (1 << 7) 115 #define PX4IO_P_STATUS_FLAGS_MIXER_OK (1 << 8) 116 #define PX4IO_P_STATUS_FLAGS_ARM_SYNC (1 << 9) 117 #define PX4IO_P_STATUS_FLAGS_INIT_OK (1 << 10) 118 #define PX4IO_P_STATUS_FLAGS_FAILSAFE (1 << 11) 119 #define PX4IO_P_STATUS_FLAGS_SAFETY_OFF (1 << 12) 120 #define PX4IO_P_STATUS_FLAGS_FMU_INITIALIZED (1 << 13) 121 #define PX4IO_P_STATUS_FLAGS_RC_ST24 (1 << 14) 122 #define PX4IO_P_STATUS_FLAGS_RC_SUMD (1 << 15) 124 #define PX4IO_P_STATUS_ALARMS 3 125 #define PX4IO_P_STATUS_ALARMS_VBATT_LOW (1 << 0) 126 #define PX4IO_P_STATUS_ALARMS_TEMPERATURE (1 << 1) 127 #define PX4IO_P_STATUS_ALARMS_SERVO_CURRENT (1 << 2) 128 #define PX4IO_P_STATUS_ALARMS_ACC_CURRENT (1 << 3) 129 #define PX4IO_P_STATUS_ALARMS_FMU_LOST (1 << 4) 130 #define PX4IO_P_STATUS_ALARMS_RC_LOST (1 << 5) 131 #define PX4IO_P_STATUS_ALARMS_PWM_ERROR (1 << 6) 132 #define PX4IO_P_STATUS_ALARMS_VSERVO_FAULT (1 << 7) 134 #define PX4IO_P_STATUS_VSERVO 6 135 #define PX4IO_P_STATUS_VRSSI 7 136 #define PX4IO_P_STATUS_PRSSI 8 138 #define PX4IO_P_STATUS_MIXER 9 141 #define PX4IO_PAGE_ACTUATORS 2 144 #define PX4IO_PAGE_SERVOS 3 147 #define PX4IO_PAGE_RAW_RC_INPUT 4 148 #define PX4IO_P_RAW_RC_COUNT 0 149 #define PX4IO_P_RAW_RC_FLAGS 1 150 #define PX4IO_P_RAW_RC_FLAGS_FRAME_DROP (1 << 0) 151 #define PX4IO_P_RAW_RC_FLAGS_FAILSAFE (1 << 1) 152 #define PX4IO_P_RAW_RC_FLAGS_RC_DSM11 (1 << 2) 153 #define PX4IO_P_RAW_RC_FLAGS_MAPPING_OK (1 << 3) 154 #define PX4IO_P_RAW_RC_FLAGS_RC_OK (1 << 4) 156 #define PX4IO_P_RAW_RC_NRSSI 2 157 #define PX4IO_P_RAW_RC_DATA 3 158 #define PX4IO_P_RAW_FRAME_COUNT 4 159 #define PX4IO_P_RAW_LOST_FRAME_COUNT 5 160 #define PX4IO_P_RAW_RC_BASE 6 163 #define PX4IO_PAGE_RC_INPUT 5 164 #define PX4IO_P_RC_VALID 0 165 #define PX4IO_P_RC_BASE 1 168 #define PX4IO_PAGE_RAW_ADC_INPUT 6 171 #define PX4IO_PAGE_PWM_INFO 7 172 #define PX4IO_RATE_MAP_BASE 0 175 #define PX4IO_PAGE_SETUP 50 176 #define PX4IO_P_SETUP_FEATURES 0 177 #define PX4IO_P_SETUP_FEATURES_SBUS1_OUT (1 << 0) 178 #define PX4IO_P_SETUP_FEATURES_SBUS2_OUT (1 << 1) 179 #define PX4IO_P_SETUP_FEATURES_PWM_RSSI (1 << 2) 180 #define PX4IO_P_SETUP_FEATURES_ADC_RSSI (1 << 3) 182 #define PX4IO_P_SETUP_ARMING 1 183 #define PX4IO_P_SETUP_ARMING_IO_ARM_OK (1 << 0) 184 #define PX4IO_P_SETUP_ARMING_FMU_ARMED (1 << 1) 185 #define PX4IO_P_SETUP_ARMING_FMU_PREARMED (1 << 2) 186 #define PX4IO_P_SETUP_ARMING_MANUAL_OVERRIDE_OK (1 << 3) 187 #define PX4IO_P_SETUP_ARMING_FAILSAFE_CUSTOM (1 << 4) 188 #define PX4IO_P_SETUP_ARMING_INAIR_RESTART_OK (1 << 5) 189 #define PX4IO_P_SETUP_ARMING_ALWAYS_PWM_ENABLE (1 << 6) 190 #define PX4IO_P_SETUP_ARMING_RC_HANDLING_DISABLED (1 << 7) 191 #define PX4IO_P_SETUP_ARMING_LOCKDOWN (1 << 8) 192 #define PX4IO_P_SETUP_ARMING_FORCE_FAILSAFE (1 << 9) 193 #define PX4IO_P_SETUP_ARMING_TERMINATION_FAILSAFE (1 << 10) 194 #define PX4IO_P_SETUP_ARMING_OVERRIDE_IMMEDIATE (1 << 11) 196 #define PX4IO_P_SETUP_PWM_RATES 2 197 #define PX4IO_P_SETUP_PWM_DEFAULTRATE 3 198 #define PX4IO_P_SETUP_PWM_ALTRATE 4 199 #define PX4IO_P_SETUP_RELAYS_PAD 5 201 #define PX4IO_P_SETUP_VSERVO_SCALE 6 202 #define PX4IO_P_SETUP_DSM 7 211 #define PX4IO_P_SETUP_SET_DEBUG 9 213 #define PX4IO_P_SETUP_REBOOT_BL 10 214 #define PX4IO_REBOOT_BL_MAGIC 14662 216 #define PX4IO_P_SETUP_CRC 11 218 #define PX4IO_P_SETUP_FORCE_SAFETY_OFF 12 221 #define PX4IO_P_SETUP_RC_THR_FAILSAFE_US 13 223 #define PX4IO_P_SETUP_FORCE_SAFETY_ON 14 224 #define PX4IO_FORCE_SAFETY_MAGIC 22027 226 #define PX4IO_P_SETUP_PWM_REVERSE 15 227 #define PX4IO_P_SETUP_TRIM_ROLL 16 228 #define PX4IO_P_SETUP_TRIM_PITCH 17 229 #define PX4IO_P_SETUP_TRIM_YAW 18 230 #define PX4IO_P_SETUP_SCALE_ROLL 19 231 #define PX4IO_P_SETUP_SCALE_PITCH 20 232 #define PX4IO_P_SETUP_SCALE_YAW 21 234 #define PX4IO_P_SETUP_SBUS_RATE 22 236 #define PX4IO_P_SETUP_MOTOR_SLEW_MAX 24 238 #define PX4IO_P_SETUP_THR_MDL_FAC 25 240 #define PX4IO_P_SETUP_THERMAL 26 242 #define PX4IO_P_SETUP_AIRMODE 27 244 #define PX4IO_P_SETUP_ENABLE_FLIGHTTERMINATION 28 246 #define PX4IO_THERMAL_IGNORE UINT16_MAX 247 #define PX4IO_THERMAL_OFF 0 248 #define PX4IO_THERMAL_FULL 10000 251 #define PX4IO_PAGE_CONTROLS 51 252 #define PX4IO_P_CONTROLS_GROUP_0 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 0) 253 #define PX4IO_P_CONTROLS_GROUP_1 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 1) 254 #define PX4IO_P_CONTROLS_GROUP_2 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 2) 255 #define PX4IO_P_CONTROLS_GROUP_3 (PX4IO_PROTOCOL_MAX_CONTROL_COUNT * 3) 257 #define PX4IO_P_CONTROLS_GROUP_VALID 64 258 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP0 (1 << 0) 259 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP1 (1 << 1) 260 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP2 (1 << 2) 261 #define PX4IO_P_CONTROLS_GROUP_VALID_GROUP3 (1 << 3) 264 #define PX4IO_PAGE_MIXERLOAD 52 267 #define PX4IO_PAGE_RC_CONFIG 53 268 #define PX4IO_P_RC_CONFIG_MIN 0 269 #define PX4IO_P_RC_CONFIG_CENTER 1 270 #define PX4IO_P_RC_CONFIG_MAX 2 271 #define PX4IO_P_RC_CONFIG_DEADZONE 3 272 #define PX4IO_P_RC_CONFIG_ASSIGNMENT 4 273 #define PX4IO_P_RC_CONFIG_ASSIGNMENT_MODESWITCH 100 274 #define PX4IO_P_RC_CONFIG_OPTIONS 5 275 #define PX4IO_P_RC_CONFIG_OPTIONS_ENABLED (1 << 0) 276 #define PX4IO_P_RC_CONFIG_OPTIONS_REVERSE (1 << 1) 277 #define PX4IO_P_RC_CONFIG_STRIDE 6 280 #define PX4IO_PAGE_DIRECT_PWM 54 283 #define PX4IO_PAGE_FAILSAFE_PWM 55 286 #define PX4IO_PAGE_SENSORS 56 287 #define PX4IO_P_SENSORS_ALTITUDE 0 290 #define PX4IO_PAGE_TEST 127 291 #define PX4IO_P_TEST_LED 0 294 #define PX4IO_PAGE_CONTROL_MIN_PWM 106 297 #define PX4IO_PAGE_CONTROL_MAX_PWM 107 300 #define PX4IO_PAGE_CONTROL_TRIM_PWM 108 303 #define PX4IO_PAGE_DISARMED_PWM 109 311 #pragma pack(push, 1) 314 #define F2I_MIXER_MAGIC 0x6d74 317 #define F2I_MIXER_ACTION_RESET 0 318 #define F2I_MIXER_ACTION_APPEND 1 328 #define PKT_MAX_REGS 32 // by agreement w/FMU 330 #pragma pack(push, 1) 340 #if (PX4IO_MAX_TRANSFER_LEN > PKT_MAX_REGS * 2) 341 #error The max transfer length of the IO protocol must not be larger than the IO packet size 344 #define PKT_CODE_READ 0x00 345 #define PKT_CODE_WRITE 0x40 346 #define PKT_CODE_SUCCESS 0x00 347 #define PKT_CODE_CORRUPT 0x40 348 #define PKT_CODE_ERROR 0x80 350 #define PKT_CODE_MASK 0xc0 351 #define PKT_COUNT_MASK 0x3f 353 #define PKT_COUNT(_p) ((_p).count_code & PKT_COUNT_MASK) 354 #define PKT_CODE(_p) ((_p).count_code & PKT_CODE_MASK) 355 #define PKT_SIZE(_p) ((size_t)((uint8_t *)&((_p).regs[PKT_COUNT(_p)]) - ((uint8_t *)&(_p)))) 357 static const uint8_t crc8_tab[256]
__attribute__((unused)) = {
358 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
359 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
360 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
361 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
362 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
363 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
364 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
365 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
366 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
367 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
368 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
369 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
370 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
371 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
372 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
373 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
374 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
375 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
376 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
377 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
378 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
379 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
380 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
381 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
382 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
383 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
384 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
385 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
386 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
387 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
388 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
389 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
397 uint8_t *p = (uint8_t *)pkt;
401 c = crc8_tab[c ^ * (p++)];
As-needed mixer data upload.
static uint8_t crc_packet(struct IOPacket *pkt) __attribute__((unused))
uint16_t regs[PKT_MAX_REGS]
static const uint8_t crc8_tab [256] __attribute__((unused))
#define PKT_MAX_REGS
Serial protocol encapsulation.