diff options
Diffstat (limited to 'src/drivers/boards/px4cannode-v1/bootloader/uavcan/protocol.h')
-rw-r--r-- | src/drivers/boards/px4cannode-v1/bootloader/uavcan/protocol.h | 425 |
1 files changed, 215 insertions, 210 deletions
diff --git a/src/drivers/boards/px4cannode-v1/bootloader/uavcan/protocol.h b/src/drivers/boards/px4cannode-v1/bootloader/uavcan/protocol.h index f1530a692..faee7ae10 100644 --- a/src/drivers/boards/px4cannode-v1/bootloader/uavcan/protocol.h +++ b/src/drivers/boards/px4cannode-v1/bootloader/uavcan/protocol.h @@ -1,4 +1,9 @@ #pragma once +/**************************************************************************** + * Included Files + ****************************************************************************/ + +# include <nuttx/compiler.h> #include <stdint.h> #include <stdlib.h> @@ -15,219 +20,219 @@ typedef enum } can_error_t; /* UAVCAN message formats */ - typedef enum { - SERVICE_RESPONSE = 0, - SERVICE_REQUEST = 1, - MESSAGE_BROADCAST = 2, - MESSAGE_UNICAST = 3 - } uavcan_transfertype_t; - - typedef struct { +typedef enum { + SERVICE_RESPONSE = 0, + SERVICE_REQUEST = 1, + MESSAGE_BROADCAST = 2, + MESSAGE_UNICAST = 3 +} uavcan_transfertype_t; + +typedef struct packed_struct uavcan_frame_id_t { uint8_t transfer_id; uint8_t last_frame; uint8_t frame_index; uint8_t source_node_id; uavcan_transfertype_t transfer_type; uint16_t data_type_id; - } __attribute__((packed)) uavcan_frame_id_t; - - typedef struct { - uint32_t uptime_sec; - uint8_t status_code; - uint16_t vendor_specific_status_code; - } __attribute__((packed)) uavcan_nodestatus_t; - - #define UAVCAN_NODESTATUS_DTID 550u - #define UAVCAN_NODESTATUS_PUBLICATION_CYCLES (72000000u / 2u) - #define UAVCAN_NODESTATUS_STATUS_OK 0u - #define UAVCAN_NODESTATUS_STATUS_INITIALIZING 1u - #define UAVCAN_NODESTATUS_STATUS_WARNING 2u - #define UAVCAN_NODESTATUS_STATUS_CRITICAL 3u - - - typedef struct { - uint8_t major; - uint8_t minor; - uint8_t optional_field_mask; - uint32_t vcs_commit; - uint64_t image_crc; - } __attribute__((packed)) uavcan_softwareversion_t; - - typedef struct { - uint8_t major; - uint8_t minor; - uint8_t unique_id[16]; - uint8_t certificate_of_authenticity_length; - uint8_t certificate_of_authenticity[255]; - } __attribute__((packed)) uavcan_hardwareversion_t; - - typedef struct { - uint8_t nodestatus[6]; - - uavcan_softwareversion_t software_version; - uavcan_hardwareversion_t hardware_version; - - uint8_t name[80]; - uint8_t name_length; - } __attribute__((packed)) uavcan_getnodeinfo_response_t; - - #define UAVCAN_GETNODEINFO_DTID 551u - #define UAVCAN_GETNODEINFO_CRC 0x14BBu - - - typedef struct { - uint8_t node_id; /* bottom bit is the first part flag */ - uint8_t unique_id[16]; - } __attribute__((packed)) uavcan_allocation_t; - - #define UAVCAN_DYNAMICNODEIDALLOCATION_DTID 559u - - - typedef struct { - uint8_t level; - uint8_t message[2]; - } __attribute__((packed)) uavcan_logmessage_t; - - #define UAVCAN_LOGMESSAGE_DTID 1023u - #define UAVCAN_LOGMESSAGE_LEVEL_DEBUG 0u - #define UAVCAN_LOGMESSAGE_LEVEL_INFO 1u - #define UAVCAN_LOGMESSAGE_LEVEL_WARNING 2u - #define UAVCAN_LOGMESSAGE_LEVEL_ERROR 3u - #define UAVCAN_LOGMESSAGE_SOURCE_0 'B' - #define UAVCAN_LOGMESSAGE_SOURCE_1 'O' - #define UAVCAN_LOGMESSAGE_SOURCE_2 'O' - #define UAVCAN_LOGMESSAGE_SOURCE_3 'T' - - #define UAVCAN_LOGMESSAGE_STAGE_INIT 'I' - #define UAVCAN_LOGMESSAGE_STAGE_GET_INFO 'G' - #define UAVCAN_LOGMESSAGE_STAGE_ERASE 'E' - #define UAVCAN_LOGMESSAGE_STAGE_READ 'R' - #define UAVCAN_LOGMESSAGE_STAGE_PROGRAM 'P' - #define UAVCAN_LOGMESSAGE_STAGE_VALIDATE 'V' - #define UAVCAN_LOGMESSAGE_STAGE_FINALIZE 'F' - #define UAVCAN_LOGMESSAGE_RESULT_START 's' - #define UAVCAN_LOGMESSAGE_RESULT_FAIL 'f' - #define UAVCAN_LOGMESSAGE_RESULT_OK 'o' - - - typedef struct { - uint8_t source_node_id; - uint8_t path[200]; - uint8_t path_length; - } __attribute__((packed)) uavcan_beginfirmwareupdate_request_t; - - typedef struct { - uint8_t error; - } __attribute__((packed)) uavcan_beginfirmwareupdate_response_t; - - #define UAVCAN_BEGINFIRMWAREUPDATE_DTID 580u - #define UAVCAN_BEGINFIRMWAREUPDATE_CRC 0x729Eu - #define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_OK 0u - #define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_INVALID_MODE 1u - #define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_IN_PROGRESS 2u - #define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_UNKNOWN 255u - - - typedef struct { - uint8_t path[200]; - uint8_t path_length; - } __attribute__((packed)) uavcan_getinfo_request_t; - - typedef struct { - uint64_t crc64; - uint32_t size; - uint16_t error; - uint8_t entry_type; - } __attribute__((packed)) uavcan_getinfo_response_t; - - #define UAVCAN_GETINFO_DTID 585u - #define UAVCAN_GETINFO_CRC 0x37A0u - #define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_FILE 0x01u - #define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_DIRECTORY 0x02u - #define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_SYMLINK 0x04u - #define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_READABLE 0x08u - #define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_WRITEABLE 0x10u - - - typedef struct { - uint32_t offset; - uint8_t path[200]; - uint8_t path_length; - } __attribute__((packed)) uavcan_read_request_t; - - typedef struct { - uint16_t error; - uint8_t data[250]; - uint8_t data_length; - } __attribute__((packed)) uavcan_read_response_t; - - #define UAVCAN_READ_DTID 588u - #define UAVCAN_READ_CRC 0x2921u - - #define UAVCAN_FILE_ERROR_OK 0u - /* Left the others out for now because we don't really care why it failed */ - - - #define UAVCAN_ALLOCATION_CRC 0x7BAAu - - - size_t uavcan_pack_nodestatus( - uint8_t *data, - const uavcan_nodestatus_t *payload - ); - size_t uavcan_pack_logmessage( - uint8_t *data, - const uavcan_logmessage_t *payload - ); - uint32_t uavcan_make_message_id(const uavcan_frame_id_t *frame_id); - int uavcan_parse_message_id(uavcan_frame_id_t *frame_id, uint32_t message_id, - uint16_t expected_id); - void uavcan_tx_nodestatus( - uint8_t node_id, - uint32_t uptime_sec, - uint8_t status_code - ); - void uavcan_tx_allocation_message( - uint8_t requested_node_id, - size_t unique_id_length, - const uint8_t *unique_id, - uint8_t unique_id_offset, - uint8_t transfer_id - ); - void uavcan_tx_getnodeinfo_response( - uint8_t node_id, - uavcan_getnodeinfo_response_t *response, - uint8_t dest_node_id, - uint8_t transfer_id - ); - can_error_t uavcan_rx_beginfirmwareupdate_request( - uint8_t node_id, - uavcan_beginfirmwareupdate_request_t *request, - uavcan_frame_id_t *out_frame_id - ); - void uavcan_tx_read_request( - uint8_t node_id, - const uavcan_read_request_t *request, - uint8_t dest_node_id, - uint8_t transfer_id - ); - can_error_t uavcan_rx_read_response( - uint8_t node_id, - uavcan_read_response_t *response, - uint8_t dest_node_id, - uint8_t transfer_id, - uint32_t timeout_ticks - ); - void uavcan_tx_getinfo_request( - uint8_t node_id, - const uavcan_getinfo_request_t *request, - uint8_t dest_node_id, - uint8_t transfer_id - ); - can_error_t uavcan_rx_getinfo_response( - uint8_t node_id, - uavcan_getinfo_response_t *response, - uint8_t dest_node_id, - uint8_t transfer_id, - uint32_t timeout_ticks - ); + } uavcan_frame_id_t; + +typedef struct packed_struct uavcan_nodestatus_t { + uint32_t uptime_sec; + uint8_t status_code; + uint16_t vendor_specific_status_code; +} uavcan_nodestatus_t; + +#define UAVCAN_NODESTATUS_DTID 550u +#define UAVCAN_NODESTATUS_PUBLICATION_CYCLES (72000000u / 2u) +#define UAVCAN_NODESTATUS_STATUS_OK 0u +#define UAVCAN_NODESTATUS_STATUS_INITIALIZING 1u +#define UAVCAN_NODESTATUS_STATUS_WARNING 2u +#define UAVCAN_NODESTATUS_STATUS_CRITICAL 3u + + +typedef struct packed_struct uavcan_softwareversion_t { + uint8_t major; + uint8_t minor; + uint8_t optional_field_mask; + uint32_t vcs_commit; + uint64_t image_crc; +} uavcan_softwareversion_t; + +typedef struct packed_struct uavcan_hardwareversion_t { + uint8_t major; + uint8_t minor; + uint8_t unique_id[16]; + uint8_t certificate_of_authenticity_length; + uint8_t certificate_of_authenticity[255]; +} uavcan_hardwareversion_t; + +typedef struct packed_struct uavcan_getnodeinfo_response_t { + uint8_t nodestatus[6]; + + uavcan_softwareversion_t software_version; + uavcan_hardwareversion_t hardware_version; + + uint8_t name[80]; + uint8_t name_length; +} uavcan_getnodeinfo_response_t; + +#define UAVCAN_GETNODEINFO_DTID 551u +#define UAVCAN_GETNODEINFO_CRC 0x14BBu + + +typedef struct packed_struct uavcan_allocation_t { + uint8_t node_id; /* bottom bit is the first part flag */ + uint8_t unique_id[16]; +} uavcan_allocation_t; + +#define UAVCAN_DYNAMICNODEIDALLOCATION_DTID 559u + + +typedef struct packed_struct uavcan_logmessage_t { + uint8_t level; + uint8_t message[2]; +} uavcan_logmessage_t; + +#define UAVCAN_LOGMESSAGE_DTID 1023u +#define UAVCAN_LOGMESSAGE_LEVEL_DEBUG 0u +#define UAVCAN_LOGMESSAGE_LEVEL_INFO 1u +#define UAVCAN_LOGMESSAGE_LEVEL_WARNING 2u +#define UAVCAN_LOGMESSAGE_LEVEL_ERROR 3u +#define UAVCAN_LOGMESSAGE_SOURCE_0 'B' +#define UAVCAN_LOGMESSAGE_SOURCE_1 'O' +#define UAVCAN_LOGMESSAGE_SOURCE_2 'O' +#define UAVCAN_LOGMESSAGE_SOURCE_3 'T' + +#define UAVCAN_LOGMESSAGE_STAGE_INIT 'I' +#define UAVCAN_LOGMESSAGE_STAGE_GET_INFO 'G' +#define UAVCAN_LOGMESSAGE_STAGE_ERASE 'E' +#define UAVCAN_LOGMESSAGE_STAGE_READ 'R' +#define UAVCAN_LOGMESSAGE_STAGE_PROGRAM 'P' +#define UAVCAN_LOGMESSAGE_STAGE_VALIDATE 'V' +#define UAVCAN_LOGMESSAGE_STAGE_FINALIZE 'F' +#define UAVCAN_LOGMESSAGE_RESULT_START 's' +#define UAVCAN_LOGMESSAGE_RESULT_FAIL 'f' +#define UAVCAN_LOGMESSAGE_RESULT_OK 'o' + + +typedef struct packed_struct uavcan_beginfirmwareupdate_request_t { + uint8_t source_node_id; + uint8_t path[200]; + uint8_t path_length; +} uavcan_beginfirmwareupdate_request_t; + +typedef struct packed_struct uavcan_beginfirmwareupdate_response_t { + uint8_t error; +} uavcan_beginfirmwareupdate_response_t; + +#define UAVCAN_BEGINFIRMWAREUPDATE_DTID 580u +#define UAVCAN_BEGINFIRMWAREUPDATE_CRC 0x729Eu +#define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_OK 0u +#define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_INVALID_MODE 1u +#define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_IN_PROGRESS 2u +#define UAVCAN_BEGINFIRMWAREUPDATE_ERROR_UNKNOWN 255u + + +typedef struct packed_struct uavcan_getinfo_request_t { + uint8_t path[200]; + uint8_t path_length; +} uavcan_getinfo_request_t; + +typedef struct packed_struct uavcan_getinfo_response_t { + uint64_t crc64; + uint32_t size; + uint16_t error; + uint8_t entry_type; +} uavcan_getinfo_response_t; + +#define UAVCAN_GETINFO_DTID 585u +#define UAVCAN_GETINFO_CRC 0x37A0u +#define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_FILE 0x01u +#define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_DIRECTORY 0x02u +#define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_SYMLINK 0x04u +#define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_READABLE 0x08u +#define UAVCAN_GETINFO_ENTRY_TYPE_FLAG_WRITEABLE 0x10u + + +typedef struct packed_struct uavcan_read_request_t { + uint32_t offset; + uint8_t path[200]; + uint8_t path_length; +} uavcan_read_request_t; + +typedef struct packed_struct uavcan_read_response_t { + uint16_t error; + uint8_t data[250]; + uint8_t data_length; +} uavcan_read_response_t; + +#define UAVCAN_READ_DTID 588u +#define UAVCAN_READ_CRC 0x2921u + +#define UAVCAN_FILE_ERROR_OK 0u +/* Left the others out for now because we don't really care why it failed */ + + +#define UAVCAN_ALLOCATION_CRC 0x7BAAu + + +size_t uavcan_pack_nodestatus( + uint8_t *data, + const uavcan_nodestatus_t *payload +); +size_t uavcan_pack_logmessage( + uint8_t *data, + const uavcan_logmessage_t *payload +); +uint32_t uavcan_make_message_id(const uavcan_frame_id_t *frame_id); +int uavcan_parse_message_id(uavcan_frame_id_t *frame_id, uint32_t message_id, + uint16_t expected_id); +void uavcan_tx_nodestatus( + uint8_t node_id, + uint32_t uptime_sec, + uint8_t status_code +); +void uavcan_tx_allocation_message( + uint8_t requested_node_id, + size_t unique_id_length, + const uint8_t *unique_id, + uint8_t unique_id_offset, + uint8_t transfer_id +); +void uavcan_tx_getnodeinfo_response( + uint8_t node_id, + uavcan_getnodeinfo_response_t *response, + uint8_t dest_node_id, + uint8_t transfer_id +); +can_error_t uavcan_rx_beginfirmwareupdate_request( + uint8_t node_id, + uavcan_beginfirmwareupdate_request_t *request, + uavcan_frame_id_t *out_frame_id +); +void uavcan_tx_read_request( + uint8_t node_id, + const uavcan_read_request_t *request, + uint8_t dest_node_id, + uint8_t transfer_id +); +can_error_t uavcan_rx_read_response( + uint8_t node_id, + uavcan_read_response_t *response, + uint8_t dest_node_id, + uint8_t transfer_id, + uint32_t timeout_ticks +); +void uavcan_tx_getinfo_request( + uint8_t node_id, + const uavcan_getinfo_request_t *request, + uint8_t dest_node_id, + uint8_t transfer_id +); +can_error_t uavcan_rx_getinfo_response( + uint8_t node_id, + uavcan_getinfo_response_t *response, + uint8_t dest_node_id, + uint8_t transfer_id, + uint32_t timeout_ticks +); |