dc31-addon-addon-badge-firm.../bootloader_hk32f030m_uart_x.../code/inc/xmodem.h

82 lines
2.3 KiB
C

/*
* xmodem.h
*
* Created on: Jun 23, 2023
* Author: true
*
* originally Copyright (c) 2018 Ferenc Nemeth - https://github.com/ferenc-nemeth - 21 Dec 2018
* modified for use with HK32F and my coding style.
*
* under MIT license.
*/
#ifndef CODE_INC_XMODEM_H_
#define CODE_INC_XMODEM_H_
#include <stdbool.h>
#include <stdint.h>
#include "flash.h"
#include "usart.h"
/* Xmodem (128 bytes) packet format
* Byte 0: Header
* Byte 1: Packet number
* Byte 2: Packet number complement
* Bytes 3-130: Data
* Bytes 131-132: CRC
*/
/* Xmodem (1024 bytes) packet format
* Byte 0: Header
* Byte 1: Packet number
* Byte 2: Packet number complement
* Bytes 3-1026: Data
* Bytes 1027-1028: CRC
*/
/* Maximum allowed errors (user defined). */
#define X_MAX_ERRORS ((uint8_t)3u)
/* Sizes of the packets. */
#define X_PACKET_NUMBER_SIZE ((uint16_t)2u)
#define X_PACKET_128_SIZE ((uint16_t)128u)
#define X_PACKET_1024_SIZE ((uint16_t)1024u)
#define X_PACKET_CRC_SIZE ((uint16_t)2u)
/* Indexes inside packets. */
#define X_PACKET_NUMBER_INDEX ((uint16_t)0u)
#define X_PACKET_NUMBER_COMPLEMENT_INDEX ((uint16_t)1u)
#define X_PACKET_CRC_HIGH_INDEX ((uint16_t)0u)
#define X_PACKET_CRC_LOW_INDEX ((uint16_t)1u)
/* Bytes defined by the protocol. */
#define X_SOH ((uint8_t)0x01u) /**< Start Of Header (128 bytes). */
#define X_STX ((uint8_t)0x02u) /**< Start Of Header (1024 bytes). */
#define X_EOT ((uint8_t)0x04u) /**< End Of Transmission. */
#define X_ACK ((uint8_t)0x06u) /**< Acknowledge. */
#define X_NAK ((uint8_t)0x15u) /**< Not Acknowledge. */
#define X_CAN ((uint8_t)0x18u) /**< Cancel. */
#define X_C ((uint8_t)0x43u) /**< ASCII "C" to notify the host we want to use CRC16. */
/* Status report for the functions. */
typedef enum {
X_OK = 0x00u, /**< The action was successful. */
X_ERROR_CRC = 0x01u, /**< CRC calculation error. */
X_ERROR_NUMBER = 0x02u, /**< Packet number mismatch error. */
X_ERROR_UART = 0x04u, /**< UART communication error. */
X_ERROR_FLASH = 0x08u, /**< Flash related error. */
X_ERROR = 0xFFu /**< Generic error. */
} BL_xmodem_status;
BL_xmodem_status xmodem_receive(void);
#endif /* XMODEM_H_ */