File syn_iolink.h¶
File List > proto > syn_iolink.h
Go to the documentation of this file
#ifndef SYN_IOLINK_H
#define SYN_IOLINK_H
#include "../common/syn_defs.h"
#include "../net/syn_transport.h"
#include "../pt/syn_pt.h"
#include "../sched/syn_sched.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#if !defined(SYN_USE_IOLINK) || SYN_USE_IOLINK
#ifdef __cplusplus
extern "C" {
#endif
/* ── Constants & Parameter Page Addresses ───────────────────────────────── */
#define SYN_IOLINK_PAGE_MASTER_CYCLE_TIME 0x00U
#define SYN_IOLINK_PAGE_MIN_CYCLE_TIME 0x01U
#define SYN_IOLINK_PAGE_MSEQ_CAPABILITY 0x02U
#define SYN_IOLINK_PAGE_REVISION_ID 0x03U
#define SYN_IOLINK_PAGE_PD_IN_LEN 0x04U
#define SYN_IOLINK_PAGE_PD_OUT_LEN 0x05U
#define SYN_IOLINK_PAGE_VENDOR_ID_1 0x06U
#define SYN_IOLINK_PAGE_VENDOR_ID_2 0x07U
#define SYN_IOLINK_PAGE_DEVICE_ID_1 0x08U
#define SYN_IOLINK_PAGE_DEVICE_ID_2 0x09U
#define SYN_IOLINK_PAGE_DEVICE_ID_3 0x0AU
#define SYN_IOLINK_REV_1_0 0x10U
#define SYN_IOLINK_REV_1_1 0x11U
#define SYN_IOLINK_MAX_PD_LEN 32U
#define SYN_IOLINK_MAX_ISDU_LEN 64U
/* ── Type Definitions ────────────────────────────────────────────────────── */
typedef enum {
SYN_IOLINK_BAUD_COM1 = 0,
SYN_IOLINK_BAUD_COM2 = 1,
SYN_IOLINK_BAUD_COM3 = 2
} SYN_IOLink_Baud;
typedef enum {
SYN_IOLINK_PORT_INACTIVE = 0,
SYN_IOLINK_PORT_SIO,
SYN_IOLINK_PORT_STARTUP,
SYN_IOLINK_PORT_OPERATE,
SYN_IOLINK_PORT_FAULT
} SYN_IOLink_PortState;
typedef enum {
SYN_IOLINK_TYPE_0 = 0,
SYN_IOLINK_TYPE_1_1 = 1,
SYN_IOLINK_TYPE_1_2 = 2,
SYN_IOLINK_TYPE_2_1 = 3,
SYN_IOLINK_TYPE_2_2 = 4,
SYN_IOLINK_TYPE_2_V = 5
} SYN_IOLink_MSeqType;
typedef struct {
uint8_t master_cycle_time;
uint8_t min_cycle_time;
uint8_t mseq_capability;
uint8_t revision_id;
uint8_t pd_in_len;
uint8_t pd_out_len;
uint16_t vendor_id;
uint32_t device_id;
} SYN_IOLink_DirectParams;
typedef SYN_Status (*SYN_IOLink_ISDU_ReadCb)(uint16_t index, uint8_t subindex, uint8_t *out_data,
size_t max_len, size_t *out_len, void *user_data);
typedef SYN_Status (*SYN_IOLink_ISDU_WriteCb)(uint16_t index, uint8_t subindex, const uint8_t *data,
size_t len, void *user_data);
typedef struct {
SYN_IOLink_Baud target_baud;
SYN_Transport *transport;
uint32_t cycle_time_ms;
void *user_data;
uint8_t *rx_buf;
size_t rx_buf_size;
uint8_t *tx_buf;
size_t tx_buf_size;
} SYN_IOLink_MasterConfig;
typedef struct {
SYN_IOLink_MasterConfig cfg;
SYN_IOLink_PortState state;
SYN_PT pt;
SYN_IOLink_DirectParams dev_params;
SYN_IOLink_MSeqType mseq_type;
uint32_t last_cycle_ms;
uint8_t current_pd_in[SYN_IOLINK_MAX_PD_LEN];
size_t current_pd_in_len;
uint8_t current_pd_out[SYN_IOLINK_MAX_PD_LEN];
size_t current_pd_out_len;
} SYN_IOLink_Master;
typedef struct {
SYN_IOLink_DirectParams params;
SYN_IOLink_ISDU_ReadCb on_read;
SYN_IOLink_ISDU_WriteCb on_write;
void *user_data;
} SYN_IOLink_DeviceConfig;
typedef struct {
SYN_IOLink_DeviceConfig cfg;
SYN_IOLink_PortState state;
uint8_t pd_in[SYN_IOLINK_MAX_PD_LEN];
uint8_t pd_out[SYN_IOLINK_MAX_PD_LEN];
} SYN_IOLink_Device;
/* ── CRC & Framing Functions ─────────────────────────────────────────────── */
uint8_t syn_iolink_calc_checksum(const uint8_t *data, size_t len);
/* ── Master Public API ───────────────────────────────────────────────────── */
SYN_Status syn_iolink_master_init(SYN_IOLink_Master *master, const SYN_IOLink_MasterConfig *cfg);
SYN_Status syn_iolink_master_start(SYN_IOLink_Master *master);
SYN_Status syn_iolink_master_exchange_pd(SYN_IOLink_Master *master, const uint8_t *pd_out,
size_t out_len, uint8_t *pd_in, size_t *in_len);
SYN_Status syn_iolink_master_read_isdu(SYN_IOLink_Master *master, uint16_t index, uint8_t subindex,
uint8_t *data, size_t max_len, size_t *out_len);
SYN_Status syn_iolink_master_write_isdu(SYN_IOLink_Master *master, uint16_t index, uint8_t subindex,
const uint8_t *data, size_t len);
SYN_Status syn_iolink_master_step(SYN_IOLink_Master *master, uint32_t now_ms);
SYN_PT_Status syn_iolink_master_pt(SYN_PT *pt, SYN_Task *task);
/* ── Device Public API ───────────────────────────────────────────────────── */
SYN_Status syn_iolink_device_init(SYN_IOLink_Device *dev, const SYN_IOLink_DeviceConfig *cfg);
SYN_Status syn_iolink_device_set_pd_in(SYN_IOLink_Device *dev, const uint8_t *data, size_t len);
SYN_Status syn_iolink_device_get_pd_out(const SYN_IOLink_Device *dev, uint8_t *out_buf,
size_t max_len, size_t *out_len);
SYN_Status syn_iolink_device_process_frame(SYN_IOLink_Device *dev, const uint8_t *rx, size_t rx_len,
uint8_t *tx, size_t max_tx, size_t *out_len);
#ifdef __cplusplus
}
#endif
#endif /* SYN_USE_IOLINK */
#endif /* SYN_IOLINK_H */