HardFOC Core
API reference
Loading...
Searching...
No Matches
hf_co_driver.h
Go to the documentation of this file.
1
42#ifndef HF_CO_DRIVER_H
43#define HF_CO_DRIVER_H
44
45#include <stdbool.h>
46#include <stddef.h>
47#include <stdint.h>
48
49#ifdef __cplusplus
50extern "C" {
51#endif
52
53/* ── Build configuration (override with -D) ─────────────────────────────── */
54
56#ifndef HF_CO_CAN_MAX_LEN
57#if defined(HF_CO_CAN_FD) && HF_CO_CAN_FD
58#define HF_CO_CAN_MAX_LEN 64U
59#else
60#define HF_CO_CAN_MAX_LEN 8U
61#endif
62#endif
63
65#ifndef HF_CO_MAX_PORTS
66#define HF_CO_MAX_PORTS 4U
67#endif
68
70#ifndef HF_CO_RX_RING_LEN
71#define HF_CO_RX_RING_LEN 64U
72#endif
73
75#ifndef HF_CO_MAX_DRIVERS
76#define HF_CO_MAX_DRIVERS 2U
77#endif
78
80#ifndef HF_CO_BUSOFF_RETRY_CALLS
81#define HF_CO_BUSOFF_RETRY_CALLS 100U
82#endif
83
84#if (HF_CO_RX_RING_LEN & (HF_CO_RX_RING_LEN - 1U)) != 0U
85#error "HF_CO_RX_RING_LEN must be a power of two"
86#endif
87#if HF_CO_MAX_PORTS > 8U
88#error "HF_CO_MAX_PORTS is limited to 8 (one pending bit per port in a uint8_t)"
89#endif
90
91/* ── Frame ──────────────────────────────────────────────────────────────── */
92
94#define HF_CO_FRAME_MAX_LEN 64U
95
97#define HF_CO_FRAME_EXT 0x01U
98#define HF_CO_FRAME_RTR 0x02U
99#define HF_CO_FRAME_FDF 0x04U
100#define HF_CO_FRAME_BRS 0x08U
101#define HF_CO_FRAME_ESI 0x10U
104typedef struct hf_co_frame {
105 uint32_t id;
106 uint8_t len;
107 uint8_t flags;
108 uint8_t data[HF_CO_FRAME_MAX_LEN];
109 uint32_t ts_us;
111
112/* ── Port ───────────────────────────────────────────────────────────────── */
113
121
130
132typedef struct hf_co_port_status {
133 uint8_t state;
134 uint16_t tec;
135 uint16_t rec;
136 uint32_t rx_overruns;
137 uint32_t tx_queue_full;
138 uint32_t bus_off_count;
140
142typedef struct hf_co_port_ops {
144 hf_co_tx_result_t (*send)(void* ctx, const hf_co_frame_t* frame);
146 bool (*status)(void* ctx, hf_co_port_status_t* out);
148 bool (*recover)(void* ctx);
150
152#define HF_CO_PORT_ERROR_SOURCE 0x01U
153
155typedef struct hf_co_port_stats {
156 uint32_t rx_frames;
158 uint32_t rx_rejected;
159 uint32_t rx_dispatched;
160 uint32_t rx_unhandled;
161 uint32_t rx_denied;
162 uint32_t tx_frames;
163 uint32_t tx_queue_full;
164 uint32_t tx_retried;
165 uint32_t tx_dropped;
166 uint32_t tx_denied;
169
170/* ── Policy and wake hooks ──────────────────────────────────────────────── */
171
176typedef bool (*hf_co_rx_policy_fn)(void* ctx, uint8_t port, uint16_t rx_index, const void* consumer,
177 const hf_co_frame_t* frame);
182typedef bool (*hf_co_tx_policy_fn)(void* ctx, uint8_t port, uint16_t tx_index, const hf_co_frame_t* frame);
184typedef void (*hf_co_wake_fn)(void* ctx);
185
186/* ── Driver instance ────────────────────────────────────────────────────── */
187
189typedef struct hf_co_driver hf_co_driver_t;
190
192hf_co_driver_t* hf_co_driver_acquire(void);
194void hf_co_driver_release(hf_co_driver_t* drv);
195
202bool hf_co_driver_attach_port(hf_co_driver_t* drv, uint8_t index, const hf_co_port_ops_t* ops, void* ctx,
203 uint8_t max_len, uint8_t flags);
205void hf_co_driver_detach_port(hf_co_driver_t* drv, uint8_t index);
206
208void hf_co_driver_set_policy(hf_co_driver_t* drv, hf_co_rx_policy_fn rx, hf_co_tx_policy_fn tx, void* ctx);
210void hf_co_driver_set_wake(hf_co_driver_t* drv, hf_co_wake_fn wake, void* ctx);
211
217bool hf_co_driver_rx_push(hf_co_driver_t* drv, uint8_t port, const hf_co_frame_t* frame);
218
224bool hf_co_driver_rx_offer(hf_co_driver_t* drv, uint8_t port, const hf_co_frame_t* frame);
225
227void hf_co_driver_tx_done(hf_co_driver_t* drv, uint8_t port);
228
235uint32_t hf_co_driver_rx_drain(hf_co_driver_t* drv, uint32_t max);
236
238uint32_t hf_co_driver_rx_pending(const hf_co_driver_t* drv);
240uint32_t hf_co_driver_tx_pending(const hf_co_driver_t* drv);
241
243void hf_co_driver_get_stats(const hf_co_driver_t* drv, uint8_t port, hf_co_port_stats_t* out);
244
245#ifdef __cplusplus
246}
247#endif
248
249#endif /* HF_CO_DRIVER_H */
void hf_co_driver_detach_port(hf_co_driver_t *drv, uint8_t index)
Definition CO_driver_hardfoc.c:227
hf_co_tx_result_t
Definition hf_co_driver.h:115
@ HF_CO_TX_QUEUE_FULL
Definition hf_co_driver.h:117
@ HF_CO_TX_BUS_OFF
Definition hf_co_driver.h:118
@ HF_CO_TX_OK
Definition hf_co_driver.h:116
@ HF_CO_TX_NOT_ALLOWED
Definition hf_co_driver.h:119
void hf_co_driver_set_wake(hf_co_driver_t *drv, hf_co_wake_fn wake, void *ctx)
Definition CO_driver_hardfoc.c:263
hf_co_driver_t * hf_co_driver_acquire(void)
Definition CO_driver_hardfoc.c:158
bool(* hf_co_rx_policy_fn)(void *ctx, uint8_t port, uint16_t rx_index, const void *consumer, const hf_co_frame_t *frame)
Definition hf_co_driver.h:176
void hf_co_driver_set_policy(hf_co_driver_t *drv, hf_co_rx_policy_fn rx, hf_co_tx_policy_fn tx, void *ctx)
Definition CO_driver_hardfoc.c:251
void(* hf_co_wake_fn)(void *ctx)
Definition hf_co_driver.h:184
hf_co_bus_state_t
Definition hf_co_driver.h:123
@ HF_CO_BUS_STOPPED
Definition hf_co_driver.h:124
@ HF_CO_BUS_OFF
Definition hf_co_driver.h:128
@ HF_CO_BUS_ERROR_ACTIVE
Definition hf_co_driver.h:125
@ HF_CO_BUS_ERROR_WARNING
Definition hf_co_driver.h:126
@ HF_CO_BUS_ERROR_PASSIVE
Definition hf_co_driver.h:127
bool hf_co_driver_rx_push(hf_co_driver_t *drv, uint8_t port, const hf_co_frame_t *frame)
Definition CO_driver_hardfoc.c:310
bool hf_co_driver_rx_offer(hf_co_driver_t *drv, uint8_t port, const hf_co_frame_t *frame)
Definition CO_driver_hardfoc.c:314
void hf_co_driver_release(hf_co_driver_t *drv)
Definition CO_driver_hardfoc.c:193
bool hf_co_driver_attach_port(hf_co_driver_t *drv, uint8_t index, const hf_co_port_ops_t *ops, void *ctx, uint8_t max_len, uint8_t flags)
Definition CO_driver_hardfoc.c:204
uint32_t hf_co_driver_rx_drain(hf_co_driver_t *drv, uint32_t max)
Definition CO_driver_hardfoc.c:412
#define HF_CO_FRAME_MAX_LEN
Definition hf_co_driver.h:94
uint32_t hf_co_driver_rx_pending(const hf_co_driver_t *drv)
Definition CO_driver_hardfoc.c:326
void hf_co_driver_get_stats(const hf_co_driver_t *drv, uint8_t port, hf_co_port_stats_t *out)
Definition CO_driver_hardfoc.c:350
void hf_co_driver_tx_done(hf_co_driver_t *drv, uint8_t port)
Definition CO_driver_hardfoc.c:318
bool(* hf_co_tx_policy_fn)(void *ctx, uint8_t port, uint16_t tx_index, const hf_co_frame_t *frame)
Definition hf_co_driver.h:182
uint32_t hf_co_driver_tx_pending(const hf_co_driver_t *drv)
Definition CO_driver_hardfoc.c:339
Definition CO_driver_hardfoc.c:68
CO_CANmodule_t *hf_co_port_slot_t port[HF_CO_MAX_PORTS]
Definition CO_driver_hardfoc.c:71
Definition hf_co_driver.h:104
uint8_t flags
Definition hf_co_driver.h:107
uint32_t ts_us
Definition hf_co_driver.h:109
uint8_t len
Definition hf_co_driver.h:106
uint32_t id
Definition hf_co_driver.h:105
Definition hf_co_driver.h:142
Definition hf_co_driver.h:155
uint32_t rx_ring_overruns
Definition hf_co_driver.h:157
uint32_t recover_requests
Definition hf_co_driver.h:167
uint32_t rx_rejected
Definition hf_co_driver.h:158
uint32_t tx_frames
Definition hf_co_driver.h:162
uint32_t rx_dispatched
Definition hf_co_driver.h:159
uint32_t tx_dropped
Definition hf_co_driver.h:165
uint32_t rx_denied
Definition hf_co_driver.h:161
uint32_t rx_frames
Definition hf_co_driver.h:156
uint32_t tx_retried
Definition hf_co_driver.h:164
uint32_t tx_denied
Definition hf_co_driver.h:166
uint32_t rx_unhandled
Definition hf_co_driver.h:160
uint32_t tx_queue_full
Definition hf_co_driver.h:163
Definition hf_co_driver.h:132
uint32_t rx_overruns
Definition hf_co_driver.h:136
uint16_t tec
Definition hf_co_driver.h:134
uint8_t state
Definition hf_co_driver.h:133
uint16_t rec
Definition hf_co_driver.h:135
uint32_t tx_queue_full
Definition hf_co_driver.h:137
uint32_t bus_off_count
Definition hf_co_driver.h:138