Files
E502_ADC_BF_PC_companion/x502/lboot_req.h

271 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***************************************************************************//**
@file lcspec.h
Файл содержит константы и типы, которые использует как загрузчик lboot,
так и приложение:
- константы и типы для запроса на перепрошивку со стороны application
- константы и типы для определения информации о прошивке, которая хранится
внутри прошивки и проверяется bootloader'ом
!!Файл должен быть один (или одинаковый) для обоих проектов!!
@date 16.11.2010
@author: Borisov Alexey <borisov@lcard.ru>
******************************************************************************/
#ifndef LBOOT_REQ_H_
#define LBOOT_REQ_H_
/** адрес, по которому должен быть сформирован запрос на перепрошивку */
#define LBOOT_REQ_ADDR 0x10000000
/** Адрес, начиная с кторого хранится информация о загрузчике */
#define LBOOT_INFO_ADDR 0x200
/******************* размеры полей ***************************************/
#define LBOOT_DEVNAME_SIZE 32
#define LBOOT_SERIAL_SIZE 32
#define LBOOT_SOFTVER_SIZE 32
#define LBOOT_REVISION_SIZE 16
#define LBOOT_IMPLEMENTATION_SIZE 16
#define LBOOT_SPECINFO_SIZE 64
#define LBOOT_MAC_ADDR_SIZE 6
#define LBOOT_REQ_MAX_FILENAME_SIZE 256
#define LBOOT_REQ_MAX_SIZE 4096
/** различные коды режимов загрузки */
#define LBOOT_BOOTMODE_MODBUS_RTU 0x100
#define LBOOT_BOOTMODE_TFTP_CLIENT 0x200
#define LBOOT_BOOTMODE_TFTP_SERVER 0x201
#define LBOOT_BOOTMODE_USB 0x300
#define LBOOT_BOOTMODE_CAN_LSS 0x400
#define LBOOT_BOOTMODE_TFTP LBOOT_BOOTMODE_TFTP_CLIENT
//режим работы устройства (application/bootloader) - в modbus сразу за device info
#define LBOOT_MODE_BOOT 0x1
#define LBOOT_MODE_APPL 0x2
#define LBOOT_TFTP_FLAGS_PACKED 0x2
#define LBOOT_SEED_CODE_NOSIGN 0xFFAA5500
/** признак, находящийся в информации о прошивке, по которому можно узнать
наличие этой информации. Признак означает, что поддерживается защита этой
информации CRC */
#define LBOOT_INFO_SIGNATURE 0x4C42A55A
/** общие для всех интерфейсов флаги, определяющие поведение загрузчика */
typedef enum {
/** - при активном запросе прошивки (tftp) - признак,
что перезависывется резервная копия, а не основная прошивка
- при пассивном приеме (mbrtu, usb, can_lss) - признак,
что разрешено перезаписывать резервную копию */
LBOOT_REQ_FLAGS_RECOVERY_WR = 0x01,
/** признак, что не нужно сверять имя устройства в прошивке */
LBOOT_REQ_FLAGS_DONT_CHECK_NAME = 0x02,
/** не проверять, что записывается стабильная прошивка (установлен флаг
#LBOOT_APP_FLAGS_STABLE в информации о прошивке)*/
LBOOT_REQ_FLAGS_DONT_CHECK_STABLE = 0x04,
/** разрешение записывать прошивку для разработчика (с установленным флагом
#LBOOT_APP_FLAGS_DEVELOP в информации о прошивке)*/
LBOOT_REQ_FLAGS_ENABLE_DEVELOP = 0x08,
/** разрешение записи прошивки без подписи (если поддерживается загрузчиком) */
LBOOT_REQ_FLAGS_ENABLE_NO_SIGN = 0x10
} t_lboot_req_flags;
/** флаги из #t_app_info */
typedef enum {
/** признак, что прошивка стабильная */
LBOOT_APP_FLAGS_STABLE = 0x1,
/** признак, что это прошивка для разработчиков */
LBOOT_APP_FLAGS_DEVELOP = 0x2
} t_lboot_app_flags;
#pragma pack(1)
/** Информация о программе, содержащаяся в прошивке */
struct st_app_info {
uint32_t size; /**< размер информции о прошивке */
uint32_t flags; /**< флаги */
/** название устройства, для которого предназначена прошивка*/
char devname[LBOOT_DEVNAME_SIZE];
};
typedef struct st_app_info t_app_info;
/** Информация о загрузчике, находящаяся непосредственно
в коде самого загрузчика */
struct lboot_info_st {
/** версия загрузчика (младший байт - минорная, старший - мажорная) */
uint16_t ver;
uint16_t flags; /**< флаги - резерв */
/** серийный номер устройства */
char serial[LBOOT_SERIAL_SIZE];
uint8_t mac[6]; /**< mac-адрес устройства */
/** ревизия платы (если вшита в загрузчик)*/
char brd_revision[LBOOT_REVISION_SIZE];
/** модификация (если вшита в загрузчик)*/
char brd_impl[LBOOT_IMPLEMENTATION_SIZE];
char creation_date[18]; /**< дата создания загрузчика */
/** признак, что эта структура действительна (только с v1.3) */
uint32_t sign;
/** размер структуры (включая два байта crc)
- для определения положения crc */
uint32_t size;
char devname[LBOOT_DEVNAME_SIZE];
/** поддерживаемые возможности загрузчика */
uint32_t features;
uint32_t reserv;
uint8_t ip_addr[4]; /**< ip-адрес устройства по-умолчанию */
uint8_t ip_mask[4]; /**< маска устройства по-умолчанию */
uint8_t gate[4]; /**< адрес шлюза по-умолчанию */
/** crc (но при проверке следует брать ее не отсюда,
а по адресу = адрес начала структуры + size - 2) */
uint16_t crc;
};
typedef struct lboot_info_st t_lboot_info;
/** информация о устройстве и прошивке */
struct lboot_devinfo_st {
char devname[LBOOT_DEVNAME_SIZE]; /**< название устройства */
char serial[LBOOT_SERIAL_SIZE]; /**< серийный номер */
char soft_ver[LBOOT_SOFTVER_SIZE]; /**< версия прошивки */
char brd_revision[LBOOT_REVISION_SIZE]; /**< ревизия платы */
char brd_impl[LBOOT_IMPLEMENTATION_SIZE]; /**< опции платы */
char spec_info[LBOOT_SPECINFO_SIZE]; /**< резерв */
};
typedef struct lboot_devinfo_st t_lboot_devinfo;
/** стандартный заголовок запроса на перепрошивку */
struct lboot_params_hdr_st {
uint32_t size; /**< размер структуры запроса (включая
специфические для интерфейса данные и crc) */
uint32_t bootmode; /**< режим загрузки - определяет интерфейс */
uint32_t flags; /**< общие флаги */
uint32_t timeout; /**< таймаут в мс - сколько загрузчик будет ожидать
запроса на перепрошивку (0 - бесконечно) */
uint32_t reserv[2]; /**< резерв */
t_lboot_devinfo devinfo; /**< информация о устройстве и прошивке */
};
typedef struct lboot_params_hdr_st t_lboot_params_hdr;
//специфические для tftp параметры
struct st_lboot_specpar_tftp {
uint16_t flags; //спец флаги (резерв)
uint16_t server_port;
uint8_t mac[6]; //mac-адрес
uint8_t l_ip[4]; //свой ip-адрес
uint8_t mask[4]; //mask - маска сети
uint8_t gate[4]; //адрес шлюза
uint8_t r_ip[4]; //адрес сервера tftp
char filename[LBOOT_REQ_MAX_FILENAME_SIZE]; //имя файла с прошивкой
uint16_t crc;
};
typedef struct st_lboot_specpar_tftp t_lboot_specpar_tftp;
//параметры для запроса прошивки по tftp
struct st_lboot_params_tftp {
t_lboot_params_hdr hdr;
uint16_t tftp_flags; //спец флаги (резерв)
uint16_t server_port;
uint8_t mac[6]; //mac-адрес
uint8_t l_ip[4]; //свой ip-адрес
uint8_t mask[4]; //mask - маска сети
uint8_t gate[4]; //адрес шлюза
uint8_t r_ip[4]; //адрес сервера tftp
char filename[LBOOT_REQ_MAX_FILENAME_SIZE]; //имя файла с прошивкой
uint16_t crc;
};
typedef struct st_lboot_params_tftp t_lboot_params_tftp;
struct st_lboot_specpar_modbus_rtu {
uint16_t flags ; //спец флаги
uint8_t addr ; //адрес устройства в modbus сети
uint8_t parity ;
uint16_t res ;
uint32_t baud_rate; //скорость передачи по rs-485/232
uint16_t crc;
};
typedef struct st_lboot_specpar_modbus_rtu t_lboot_specpar_modbus_rtu;
//параметры для перепрошивки по Modbus RTU
struct st_lboot_params_modbus_rtu {
t_lboot_params_hdr hdr ;
uint16_t flags ; //спец флаги
uint8_t addr ; //адрес устройства в modbus сети
uint8_t parity ;
uint16_t res ;
uint32_t baud_rate; //скорость передачи по rs-485/232
uint16_t crc;
};
typedef struct st_lboot_params_modbus_rtu t_lboot_params_modbus_rtu;
struct st_lboot_specpar_usb {
uint16_t flags ; //спец флаги
uint16_t crc;
};
typedef struct st_lboot_specpar_usb t_lboot_specpar_usb;
//параметры для перепрошивки по USB
struct st_lboot_params_usb {
t_lboot_params_hdr hdr ;
uint16_t flags ; //спец флаги
uint16_t crc;
};
typedef struct st_lboot_params_usb t_lboot_params_usb;
struct st_lboot_specpar_can_lss {
uint16_t flags;
uint8_t br_index; /* BaudRate Index */
uint8_t res;
uint32_t vid;
uint32_t pid;
uint32_t rev;
uint16_t crc;
};
typedef struct st_lboot_specpar_can_lss t_lboot_specpar_can_lss;
struct st_lboot_params_can_lss {
t_lboot_params_hdr hdr;
t_lboot_specpar_can_lss can;
};
typedef struct st_lboot_params_can_lss t_lboot_params_can_lss;
struct st_lboot_params {
t_lboot_params_hdr hdr ;
union {
t_lboot_specpar_tftp tftp;
t_lboot_specpar_modbus_rtu mbrtu;
t_lboot_specpar_usb usb;
t_lboot_specpar_can_lss can;
};
};
typedef struct st_lboot_params t_lboot_params;
#pragma pack()
#endif /* LBOOT_REQ_H_ */