#ifndef __YMODEM_H__ #define __YMODEM_H__ #include "bsp_common.h" #include "firmware.h" /* YModem 协议 */ #define YMODEM_SOH 0x01 #define YMODEM_STX 0x02 #define YMODEM_EOT 0x04 #define YMODEM_ACK 0x06 #define YMODEM_NAK 0x15 #define YMODEM_CAN 0x18 // graceful abort: two CAN (0x18) #define YMODEM_FRAME_FIXED_LEN (5) #define YMODEM_SOH_DATA_LEN (128) #define YMODEM_STX_DATA_LEN (1024) #define YMODEM_SOH_FRAME_LEN (YMODEM_FRAME_FIXED_LEN + YMODEM_SOH_DATA_LEN) #define YMODEM_STX_FRAME_LEN (YMODEM_FRAME_FIXED_LEN + YMODEM_STX_DATA_LEN) #define YMODEM_C 'C' /* 协议包数据最大长度定义,因以下两个宏定义在 app.c 中也使用,因此不建议修改宏定义名称,更改宏定义内容即可 */ #define YM_BODY_SIZE_MAX YMODEM_STX_DATA_LEN #define YM_MSG_SIZE_MAX YMODEM_STX_FRAME_LEN typedef enum { YMODEM_FLOW_NONE = 0x00, YMODEM_FLOW_START, YMODEM_FLOW_FIRST_EOT, YMODEM_FLOW_SECOND_EOT, YMODEM_FLOW_ASK, YMODEM_FLOW_SUCCESS, YMODEM_FLOW_FAILED, YMODEM_FLOW_CANCEL } eYmFLOW; #pragma pack(1) union message_raw_t { uint8_t raw_data[YM_MSG_SIZE_MAX]; /* 数据缓存池,接收到来自上位机的原始数据 */ struct { uint8_t header; /* start of header */ uint8_t pkt_num; /* packet number */ uint8_t not_pkt_num; /* the invert of packet number's bit */ uint8_t data[]; /* packet data */ } pkg; }; #pragma pack() /* 协议包含的指令 */ typedef enum { YM_CMD_NONE = 0x00, YM_CMD_SOH = YMODEM_SOH, YM_CMD_STX = YMODEM_STX, YM_CMD_EOT = YMODEM_EOT, YM_CMD_CAN = YMODEM_CAN } eYmCMD; /* 协议指令的执行结果 */ typedef enum { YM_RESULT_OK = 0x00, /* 执行成功 */ YM_RESULT_PROCESS = 0x01, /* 执行中 */ YM_RESULT_FAILED = 0x02, /* 执行失败,重试 */ YM_RESULT_CANCEL = 0x03 /* 执行失败,取消传输 */ } eRESULT; /* 对协议析构层的配置选项 */ typedef enum { YM_MODE_NONE = 0x00, YM_MODE_RESET = 0x01, YM_MODE_RECV = 0x02 } eYmMODE; /* 需要打包发送至上位机的数据 */ struct tx_raw_t { uint8_t response; }; /* typedef of function */ typedef void (*ymSend)(uint8_t *data, uint16_t len, uint32_t timeout); typedef void (*ymPrepareCallback)(eYmCMD cmd, uint8_t *data, uint16_t data_len); typedef void (*ymReplyCallback)(eYmCMD cmd, eRESULT *result, uint8_t *data, uint16_t *data_len); /* 函数定义 */ extern void ymodem_init (ymSend Send, ymPrepareCallback PrepareCallback, ymReplyCallback Set_ResponseInfo); extern eErrCode ymodemHandler (uint8_t *data, uint16_t len); extern void ymodemConfig (eYmMODE para, void *value); #endif /* __YMODEM_H__ */