119 lines
4.8 KiB
C
119 lines
4.8 KiB
C
/*
|
|
* kl_protocol.h
|
|
* Shared constants, enums, and types for the K-Line protocol stack.
|
|
*/
|
|
|
|
#ifndef KL_PROTOCOL_H
|
|
#define KL_PROTOCOL_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
/* ================================================================
|
|
* Hardware pin mapping (USART1 on PA9/PA10)
|
|
* ================================================================ */
|
|
#define KL_RX_PIN GPIO_PIN_10
|
|
#define KL_TX_PIN GPIO_PIN_9
|
|
#define KL_GPIO_PORT GPIOA
|
|
|
|
/* ================================================================
|
|
* Protocol constants
|
|
* ================================================================ */
|
|
#define KL_SLAVE_ADDR 0xF1
|
|
#define KL_SYNC_BYTE 0x55
|
|
#define KL_KEYWORD_LSB 0x8C
|
|
#define KL_KEYWORD_MSB 0x51
|
|
#define KL_PACKET_END 0x03
|
|
|
|
/* ================================================================
|
|
* Timing (milliseconds)
|
|
* ================================================================ */
|
|
#define KL_5BAUD_BIT_MS 200U /* 5-baud bit period */
|
|
#define KL_5BAUD_FIRST_MS 300U /* 1.5 bit times for first sample */
|
|
#define KL_W1_MS 200U /* Post-5baud delay before sync */
|
|
#define KL_W2_MS 11U /* Sync to keyword LSB */
|
|
#define KL_W3_MS 11U /* Keyword LSB to MSB */
|
|
#define KL_HS_RETRY_MS 43U /* Between handshake retries */
|
|
#define KL_P1_GAP_MS 5U /* ECU inter-byte gap */
|
|
#define KL_SESSION_TMO_MS 5250U /* Session keepalive timeout */
|
|
#define KL_BYTE_TMO_MS 50U /* Per-byte RX timeout */
|
|
#define KL_PKT_TMO_MS 800U /* Overall packet RX timeout */
|
|
#define KL_COMPL_TMO_MS 25U /* Complement wait timeout */
|
|
#define KL_ECHO_TMO_MS 3U /* Max time to wait for echo */
|
|
|
|
/* ================================================================
|
|
* Buffer sizing
|
|
* ================================================================ */
|
|
#define KL_MAX_PACKET_PAYLOAD 16 /* KWP1281 max block data */
|
|
#define KL_MAX_PACKET_RAW 20 /* LEN+CNT+CMD+16+0x03+margin */
|
|
#define KL_RX_FIFO_SIZE 64
|
|
#define KL_IDENT_BUF_SIZE 64
|
|
#define KL_STREAM_BUF_SIZE 64
|
|
|
|
/* ================================================================
|
|
* Handshake
|
|
* ================================================================ */
|
|
#define KL_HANDSHAKE_MAX_RETRIES 5
|
|
|
|
/* ================================================================
|
|
* ASCII / DTC chunk sizes
|
|
* ================================================================ */
|
|
#define KL_ASCII_CHUNK_SIZE 13 /* Data bytes per ASCII packet */
|
|
#define KL_DTC_CHUNK_SIZE 15 /* Data bytes per DTC packet */
|
|
#define KL_DTC_RECORD_SIZE 8
|
|
#define KL_DTC_TOTAL_RECORDS 8
|
|
|
|
/* ================================================================
|
|
* Packet command enum
|
|
* ================================================================ */
|
|
typedef enum {
|
|
KL_CMD_ReadIdent = 0x00,
|
|
KL_CMD_ReadRam = 0x01,
|
|
KL_CMD_WriteRam = 0x02,
|
|
KL_CMD_ReadRomEeprom = 0x03,
|
|
KL_CMD_ActuatorTest = 0x04,
|
|
KL_CMD_FaultCodesDelete = 0x05,
|
|
KL_CMD_End = 0x06,
|
|
KL_CMD_FaultCodesRead = 0x07,
|
|
KL_CMD_SingleRead = 0x08,
|
|
KL_CMD_ACK = 0x09,
|
|
KL_CMD_NAK = 0x0A,
|
|
KL_CMD_SoftwareCoding = 0x10,
|
|
KL_CMD_LoginEeprom = 0x18,
|
|
KL_CMD_ReadEeprom = 0x19,
|
|
KL_CMD_WriteEeprom = 0x1A,
|
|
KL_CMD_Custom = 0x1B,
|
|
KL_CMD_GroupReading = 0x29,
|
|
KL_CMD_Login = 0x2B,
|
|
KL_CMD_GroupReadingResponse = 0xE7,
|
|
KL_CMD_ReadEepromResponse = 0xEF,
|
|
KL_CMD_EepromLoginResponse = 0xF0,
|
|
KL_CMD_ActuatorTestResponse = 0xF5,
|
|
KL_CMD_AsciiData = 0xF6,
|
|
KL_CMD_WriteEepromResponse = 0xF9,
|
|
KL_CMD_SingleReadResponse = 0xFB,
|
|
KL_CMD_FaultCodesResponse = 0xFC,
|
|
KL_CMD_ReadRomResponse = 0xFD
|
|
} KL_PacketCmd;
|
|
|
|
/* ================================================================
|
|
* Packet structure (parsed)
|
|
* ================================================================ */
|
|
typedef struct {
|
|
uint8_t length; /* LENGTH field from wire */
|
|
uint8_t counter; /* COUNTER field */
|
|
uint8_t command; /* COMMAND field */
|
|
uint8_t data[KL_MAX_PACKET_PAYLOAD]; /* Data bytes after COMMAND */
|
|
uint8_t data_len; /* Number of data bytes */
|
|
} KL_Packet;
|
|
|
|
/* ================================================================
|
|
* Inline helper
|
|
* ================================================================ */
|
|
static inline int32_t kl_tick_diff(uint32_t now, uint32_t ref)
|
|
{
|
|
return (int32_t)(now - ref);
|
|
}
|
|
|
|
#endif /* KL_PROTOCOL_H */
|