11#if DETWS_ENABLE_IOLINK
13uint8_t iol_mc(
bool read, uint8_t channel, uint8_t address)
15 return (uint8_t)((read ? IOL_MC_READ : 0u) | ((channel & 0x03u) << 5) | (address & 0x1Fu));
18bool iol_mc_is_read(uint8_t mc)
20 return (mc & IOL_MC_READ) != 0;
23uint8_t iol_mc_channel(uint8_t mc)
25 return (uint8_t)((mc >> 5) & 0x03u);
28uint8_t iol_mc_address(uint8_t mc)
30 return (uint8_t)(mc & 0x1Fu);
33uint8_t iol_ckt(uint8_t mseq_type, uint8_t checksum6)
35 return (uint8_t)(((mseq_type & 0x03u) << 6) | (checksum6 & IOL_CHECK_SUM_MASK));
38uint8_t iol_cks(
bool event,
bool pd_invalid, uint8_t checksum6)
40 return (uint8_t)((
event ? IOL_CKS_EVENT : 0u) | (pd_invalid ? IOL_CKS_PD_INVALID : 0u) |
41 (checksum6 & IOL_CHECK_SUM_MASK));
45static uint8_t compress6(uint8_t b)
47 uint8_t b0 = b & 1u, b1 = (b >> 1) & 1u, b2 = (b >> 2) & 1u, b3 = (b >> 3) & 1u;
48 uint8_t b4 = (b >> 4) & 1u, b5 = (b >> 5) & 1u, b6 = (b >> 6) & 1u, b7 = (b >> 7) & 1u;
49 uint8_t d5 = (uint8_t)(b7 ^ b5 ^ b3 ^ b1);
50 uint8_t d4 = (uint8_t)(b6 ^ b4 ^ b2 ^ b0);
51 uint8_t d3 = (uint8_t)(b7 ^ b6);
52 uint8_t d2 = (uint8_t)(b5 ^ b4);
53 uint8_t d1 = (uint8_t)(b3 ^ b2);
54 uint8_t d0 = (uint8_t)(b1 ^ b0);
55 return (uint8_t)((d5 << 5) | (d4 << 4) | (d3 << 3) | (d2 << 2) | (d1 << 1) | d0);
58uint8_t iol_checksum6(
const uint8_t *msg,
size_t len)
60 uint8_t x = IOL_CHECKSUM_SEED;
61 for (
size_t i = 0; i < len; i++)
66uint8_t iol_finalize(uint8_t *msg,
size_t len,
size_t check_idx)
68 if (!msg || check_idx >= len)
70 msg[check_idx] = (uint8_t)(msg[check_idx] & IOL_CHECK_HIGH_MASK);
71 uint8_t c6 = iol_checksum6(msg, len);
72 msg[check_idx] = (uint8_t)(msg[check_idx] | (c6 & IOL_CHECK_SUM_MASK));
73 return msg[check_idx];
76bool iol_verify(
const uint8_t *msg,
size_t len,
size_t check_idx)
78 if (!msg || check_idx >= len)
80 uint8_t x = IOL_CHECKSUM_SEED;
81 for (
size_t i = 0; i < len; i++)
82 x ^= (i == check_idx) ? (uint8_t)(msg[i] & IOL_CHECK_HIGH_MASK) : msg[i];
83 return compress6(x) == (uint8_t)(msg[check_idx] & IOL_CHECK_SUM_MASK);
IO-Link (SDCI, IEC 61131-9) data-link message codec (DETWS_ENABLE_IOLINK).