Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
iomcu.c File Reference

Driver to communicate with the ardupilot IO MCU. More...

#include "iomcu.h"
#include "mcu_periph/uart.h"
#include <string.h>
+ Include dependency graph for iomcu.c:

Go to the source code of this file.

Data Structures

struct  IOPacket
 
struct  page_config
 
struct  page_reg_status
 
struct  page_rc_input
 
struct  page_mixing
 
struct  page_GPIO
 

Macros

#define PKT_MAX_REGS   22
 
#define IOMCU_MAX_CHANNELS   16
 
#define PAGE_REG_SETUP_FEATURES   0
 
#define P_SETUP_FEATURES_SBUS1_OUT   1
 
#define P_SETUP_FEATURES_SBUS2_OUT   2
 
#define P_SETUP_FEATURES_PWM_RSSI   4
 
#define P_SETUP_FEATURES_ADC_RSSI   8
 
#define P_SETUP_FEATURES_ONESHOT   16
 
#define P_SETUP_FEATURES_BRUSHED   32
 
#define PAGE_REG_SETUP_ARMING   1
 
#define P_SETUP_ARMING_IO_ARM_OK   (1<<0)
 
#define P_SETUP_ARMING_FMU_ARMED   (1<<1)
 
#define P_SETUP_ARMING_RC_HANDLING_DISABLED   (1<<6)
 
#define P_SETUP_ARMING_SAFETY_DISABLE_ON   (1 << 11)
 
#define P_SETUP_ARMING_SAFETY_DISABLE_OFF   (1 << 12)
 
#define PAGE_REG_SETUP_PWM_RATE_MASK   2
 
#define PAGE_REG_SETUP_DEFAULTRATE   3
 
#define PAGE_REG_SETUP_ALTRATE   4
 
#define PAGE_REG_SETUP_REBOOT_BL   10
 
#define PAGE_REG_SETUP_CRC   11
 
#define PAGE_REG_SETUP_SBUS_RATE   19
 
#define PAGE_REG_SETUP_IGNORE_SAFETY   20 /* bitmask of surfaces to ignore the safety status */
 
#define PAGE_REG_SETUP_HEATER_DUTY_CYCLE   21
 
#define PAGE_REG_SETUP_DSM_BIND   22
 
#define PAGE_REG_SETUP_RC_PROTOCOLS   23
 
#define PAGE_CONFIG_PROTOCOL_VERSION   0
 
#define PAGE_CONFIG_PROTOCOL_VERSION2   1
 
#define IOMCU_PROTOCOL_VERSION   4
 
#define IOMCU_PROTOCOL_VERSION2   10
 
#define REBOOT_BL_MAGIC   14662
 
#define PAGE_REG_SETUP_FORCE_SAFETY_OFF   12
 
#define PAGE_REG_SETUP_FORCE_SAFETY_ON   14
 
#define FORCE_SAFETY_MAGIC   22027
 

Enumerations

enum  iocode {
  CODE_READ = 0 , CODE_WRITE = 1 , CODE_SUCCESS = 0 , CODE_CORRUPT = 1 ,
  CODE_ERROR = 2
}
 
enum  iopage {
  PAGE_CONFIG = 0 , PAGE_STATUS = 1 , PAGE_ACTUATORS = 2 , PAGE_SERVOS = 3 ,
  PAGE_RAW_RCIN = 4 , PAGE_RCIN = 5 , PAGE_RAW_ADC = 6 , PAGE_PWM_INFO = 7 ,
  PAGE_SETUP = 50 , PAGE_DIRECT_PWM = 54 , PAGE_FAILSAFE_PWM = 55 , PAGE_MIXING = 200 ,
  PAGE_GPIO = 201
}
 

Functions

static uint8_t crc_crc8 (const uint8_t *p, uint8_t len)
 
static void iomcu_write_registers (uint8_t page, uint8_t offset, uint8_t count, const uint16_t *regs)
 Write registers to the IO MCU. More...
 
static void iomcu_write_register (uint8_t page, uint8_t offset, uint16_t v)
 Write a single register to the IO MCU. More...
 
void iomcu_set_heater_duty_cycle (uint8_t duty_cycle)
 Set the IO MCU heater duty cycle. More...
 

Variables

static const uint8_t crc8_table []
 

Detailed Description

Driver to communicate with the ardupilot IO MCU.

Definition in file iomcu.c.


Data Structure Documentation

◆ IOPacket

struct IOPacket

Definition at line 35 of file iomcu.c.

Data Fields
uint8_t code: 2
uint8_t count: 6
uint8_t count_code
uint8_t crc
uint8_t offset
uint8_t page
uint16_t regs[PKT_MAX_REGS]

◆ page_config

struct page_config

Definition at line 115 of file iomcu.c.

Data Fields
uint16_t protocol_version
uint16_t protocol_version2

◆ page_reg_status

struct page_reg_status

Definition at line 120 of file iomcu.c.

Data Fields
uint8_t err_bad_opcode
uint8_t err_crc
uint8_t err_read
uint8_t err_uart
uint8_t err_write
uint8_t flag_safety_off
uint16_t freemem
uint32_t num_errors
uint32_t timestamp_ms
uint32_t total_pkts
uint16_t vrssi
uint16_t vservo

◆ page_rc_input

struct page_rc_input

Definition at line 135 of file iomcu.c.

Data Fields
uint8_t count
uint8_t flags_failsafe: 1
uint8_t flags_rc_ok: 1
uint16_t pwm[IOMCU_MAX_CHANNELS]
uint8_t rc_protocol
int16_t rssi

◆ page_mixing

struct page_mixing

Definition at line 147 of file iomcu.c.

Data Fields
uint8_t enabled
uint16_t manual_rc_mask
uint16_t mixing_gain
uint8_t pad
int8_t rc_chan_override
uint8_t rc_channel[4]
uint16_t rc_max[4]
uint16_t rc_min[4]
uint8_t rc_reversed[IOMCU_MAX_CHANNELS]
uint16_t rc_trim[4]
uint8_t servo_function[IOMCU_MAX_CHANNELS]
uint16_t servo_max[IOMCU_MAX_CHANNELS]
uint16_t servo_min[IOMCU_MAX_CHANNELS]
uint8_t servo_reversed[IOMCU_MAX_CHANNELS]
uint16_t servo_trim[IOMCU_MAX_CHANNELS]
uint8_t throttle_is_angle

◆ page_GPIO

struct page_GPIO

Definition at line 179 of file iomcu.c.

Data Fields
uint8_t channel_mask
uint8_t output_mask

Macro Definition Documentation

◆ FORCE_SAFETY_MAGIC

#define FORCE_SAFETY_MAGIC   22027

Definition at line 113 of file iomcu.c.

◆ IOMCU_MAX_CHANNELS

#define IOMCU_MAX_CHANNELS   16

Definition at line 33 of file iomcu.c.

◆ IOMCU_PROTOCOL_VERSION

#define IOMCU_PROTOCOL_VERSION   4

Definition at line 105 of file iomcu.c.

◆ IOMCU_PROTOCOL_VERSION2

#define IOMCU_PROTOCOL_VERSION2   10

Definition at line 106 of file iomcu.c.

◆ P_SETUP_ARMING_FMU_ARMED

#define P_SETUP_ARMING_FMU_ARMED   (1<<1)

Definition at line 86 of file iomcu.c.

◆ P_SETUP_ARMING_IO_ARM_OK

#define P_SETUP_ARMING_IO_ARM_OK   (1<<0)

Definition at line 85 of file iomcu.c.

◆ P_SETUP_ARMING_RC_HANDLING_DISABLED

#define P_SETUP_ARMING_RC_HANDLING_DISABLED   (1<<6)

Definition at line 87 of file iomcu.c.

◆ P_SETUP_ARMING_SAFETY_DISABLE_OFF

#define P_SETUP_ARMING_SAFETY_DISABLE_OFF   (1 << 12)

Definition at line 89 of file iomcu.c.

◆ P_SETUP_ARMING_SAFETY_DISABLE_ON

#define P_SETUP_ARMING_SAFETY_DISABLE_ON   (1 << 11)

Definition at line 88 of file iomcu.c.

◆ P_SETUP_FEATURES_ADC_RSSI

#define P_SETUP_FEATURES_ADC_RSSI   8

Definition at line 80 of file iomcu.c.

◆ P_SETUP_FEATURES_BRUSHED

#define P_SETUP_FEATURES_BRUSHED   32

Definition at line 82 of file iomcu.c.

◆ P_SETUP_FEATURES_ONESHOT

#define P_SETUP_FEATURES_ONESHOT   16

Definition at line 81 of file iomcu.c.

◆ P_SETUP_FEATURES_PWM_RSSI

#define P_SETUP_FEATURES_PWM_RSSI   4

Definition at line 79 of file iomcu.c.

◆ P_SETUP_FEATURES_SBUS1_OUT

#define P_SETUP_FEATURES_SBUS1_OUT   1

Definition at line 77 of file iomcu.c.

◆ P_SETUP_FEATURES_SBUS2_OUT

#define P_SETUP_FEATURES_SBUS2_OUT   2

Definition at line 78 of file iomcu.c.

◆ PAGE_CONFIG_PROTOCOL_VERSION

#define PAGE_CONFIG_PROTOCOL_VERSION   0

Definition at line 103 of file iomcu.c.

◆ PAGE_CONFIG_PROTOCOL_VERSION2

#define PAGE_CONFIG_PROTOCOL_VERSION2   1

Definition at line 104 of file iomcu.c.

◆ PAGE_REG_SETUP_ALTRATE

#define PAGE_REG_SETUP_ALTRATE   4

Definition at line 93 of file iomcu.c.

◆ PAGE_REG_SETUP_ARMING

#define PAGE_REG_SETUP_ARMING   1

Definition at line 84 of file iomcu.c.

◆ PAGE_REG_SETUP_CRC

#define PAGE_REG_SETUP_CRC   11

Definition at line 95 of file iomcu.c.

◆ PAGE_REG_SETUP_DEFAULTRATE

#define PAGE_REG_SETUP_DEFAULTRATE   3

Definition at line 92 of file iomcu.c.

◆ PAGE_REG_SETUP_DSM_BIND

#define PAGE_REG_SETUP_DSM_BIND   22

Definition at line 99 of file iomcu.c.

◆ PAGE_REG_SETUP_FEATURES

#define PAGE_REG_SETUP_FEATURES   0

Definition at line 76 of file iomcu.c.

◆ PAGE_REG_SETUP_FORCE_SAFETY_OFF

#define PAGE_REG_SETUP_FORCE_SAFETY_OFF   12

Definition at line 111 of file iomcu.c.

◆ PAGE_REG_SETUP_FORCE_SAFETY_ON

#define PAGE_REG_SETUP_FORCE_SAFETY_ON   14

Definition at line 112 of file iomcu.c.

◆ PAGE_REG_SETUP_HEATER_DUTY_CYCLE

#define PAGE_REG_SETUP_HEATER_DUTY_CYCLE   21

Definition at line 98 of file iomcu.c.

◆ PAGE_REG_SETUP_IGNORE_SAFETY

#define PAGE_REG_SETUP_IGNORE_SAFETY   20 /* bitmask of surfaces to ignore the safety status */

Definition at line 97 of file iomcu.c.

◆ PAGE_REG_SETUP_PWM_RATE_MASK

#define PAGE_REG_SETUP_PWM_RATE_MASK   2

Definition at line 91 of file iomcu.c.

◆ PAGE_REG_SETUP_RC_PROTOCOLS

#define PAGE_REG_SETUP_RC_PROTOCOLS   23

Definition at line 100 of file iomcu.c.

◆ PAGE_REG_SETUP_REBOOT_BL

#define PAGE_REG_SETUP_REBOOT_BL   10

Definition at line 94 of file iomcu.c.

◆ PAGE_REG_SETUP_SBUS_RATE

#define PAGE_REG_SETUP_SBUS_RATE   19

Definition at line 96 of file iomcu.c.

◆ PKT_MAX_REGS

#define PKT_MAX_REGS   22

Definition at line 32 of file iomcu.c.

◆ REBOOT_BL_MAGIC

#define REBOOT_BL_MAGIC   14662

Definition at line 109 of file iomcu.c.

Enumeration Type Documentation

◆ iocode

enum iocode
Enumerator
CODE_READ 
CODE_WRITE 
CODE_SUCCESS 
CODE_CORRUPT 
CODE_ERROR 

Definition at line 47 of file iomcu.c.

◆ iopage

enum iopage
Enumerator
PAGE_CONFIG 
PAGE_STATUS 
PAGE_ACTUATORS 
PAGE_SERVOS 
PAGE_RAW_RCIN 
PAGE_RCIN 
PAGE_RAW_ADC 
PAGE_PWM_INFO 
PAGE_SETUP 
PAGE_DIRECT_PWM 
PAGE_FAILSAFE_PWM 
PAGE_MIXING 
PAGE_GPIO 

Definition at line 59 of file iomcu.c.

Function Documentation

◆ crc_crc8()

static uint8_t crc_crc8 ( const uint8_t p,
uint8_t  len 
)
static

Definition at line 212 of file iomcu.c.

References logger_uart_parse::crc, crc8_table, and p.

Referenced by iomcu_write_registers().

+ Here is the caller graph for this function:

◆ iomcu_set_heater_duty_cycle()

void iomcu_set_heater_duty_cycle ( uint8_t  duty_cycle)

Set the IO MCU heater duty cycle.

External functions.

Parameters
duty_cycleThe duty cycle to set the heater to [0-100%]

Definition at line 274 of file iomcu.c.

References iomcu_write_register(), PAGE_REG_SETUP_HEATER_DUTY_CYCLE, and PAGE_SETUP.

Referenced by imu_heater_periodic_10hz().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ iomcu_write_register()

static void iomcu_write_register ( uint8_t  page,
uint8_t  offset,
uint16_t  v 
)
static

Write a single register to the IO MCU.

Parameters
pageThe page of the register
offsetThe offset on the page
vThe value to write to the single register

Definition at line 264 of file iomcu.c.

References iomcu_write_registers(), offset, and IOPacket::page.

Referenced by iomcu_set_heater_duty_cycle().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ iomcu_write_registers()

static void iomcu_write_registers ( uint8_t  page,
uint8_t  offset,
uint8_t  count,
const uint16_t regs 
)
static

Write registers to the IO MCU.

Parameters
pageThe page of the register
offsetThe offset on the page
countThe amount of registers to write
regsThe register data

Definition at line 232 of file iomcu.c.

References IOPacket::code, CODE_WRITE, IOPacket::count, IOPacket::crc, crc_crc8(), offset, IOPacket::offset, IOPacket::page, PKT_MAX_REGS, and IOPacket::regs.

Referenced by iomcu_write_register().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ crc8_table

const uint8_t crc8_table[]
static
Initial value:
= {
0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31,
0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9,
0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1,
0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe,
0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16,
0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, 0x89, 0x8e, 0x87, 0x80,
0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8,
0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10,
0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f,
0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7,
0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef,
0xfa, 0xfd, 0xf4, 0xf3
}

Definition at line 184 of file iomcu.c.

Referenced by crc_crc8().