-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathcan.h
104 lines (86 loc) · 3.21 KB
/
can.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* @file can.h
* @author Sebastien CAUX (sebcaux)
* @copyright UniSwarm 2017-2023
*
* @date December 8 2017, 09:10 AM
*
* @brief CAN low level support driver for udevkit
*/
#ifndef CAN_H
#define CAN_H
#ifdef __cplusplus
extern "C" {
#endif
#include "can_device.h"
// ====== bus assignation ======
#define can(d) MKDEV(DEV_CLASS_CAN, (d)-1)
rt_dev_t can_getFreeDevice(void);
int can_open(rt_dev_t device);
int can_close(rt_dev_t device);
bool can_isOpened(rt_dev_t device);
// ==== bus enable/disable =====
int can_enable(rt_dev_t device);
int can_disable(rt_dev_t device);
bool can_isEnabled(rt_dev_t device);
// ======== bus settings =======
typedef enum
{
CAN_MODE_NORMAL = 0x0, ///< CAN normal mode of operation
CAN_MODE_NORMAL_FD, ///< CAN normal FD mode of operation
CAN_MODE_LISTENONLY, ///< CAN only listen mode
CAN_MODE_LISTENALL, ///< CAN listen all without taking care of adresses
CAN_MODE_LOOPBACK, ///< CAN loopback mode for test purpose and self diagnostics
CAN_MODE_DISABLED, ///< CAN disabled
CAN_MODE_CONFIGURATION ///< CAN disabled
} CAN_MODE;
int can_setMode(rt_dev_t device, CAN_MODE mode);
CAN_MODE can_mode(rt_dev_t device);
int can_setBitTiming(rt_dev_t device, uint32_t bitRate, uint8_t propagSeg, uint8_t s1Seg, uint8_t s2Seg);
uint32_t can_bitRate(rt_dev_t device);
uint32_t can_effectiveBitRate(rt_dev_t device);
uint8_t can_propagSeg(rt_dev_t device);
uint8_t can_s1Seg(rt_dev_t device);
uint8_t can_s2Seg(rt_dev_t device);
// ===== fifo interface =====
int can_setTxFifo(rt_dev_t device, uint8_t fifo, uint8_t messageCount);
int can_setRxFifo(rt_dev_t device, uint8_t fifo, uint8_t messageCount);
int can_setFifoHandler(rt_dev_t device, void (*handler)(uint8_t fifo, uint8_t event));
int can_setFifoEventsHandler(rt_dev_t device, uint8_t fifo, CAN_FIFO_EVENTS eventBits);
typedef enum
{
CAN_VERS1 = 0x00, ///< CAN version 1 with standard 11 bits identifier
CAN_VERS2A = 0x01, ///< CAN version 2A, extended identifier are error
CAN_VERS2BP = 0x02, ///< CAN version 2B pasive, extended ignored
CAN_VERS2BA = 0x03, ///< CAN version 2B active, work with extended 29 bits
/// identifier and standard 11 bits identifier
CAN_RTR = 0x04, ///< Remote transmit request
CAN_FDF = 0x08 ///< CAN FD trame
} CAN_FLAGS;
typedef struct
{
uint32_t id;
CAN_FLAGS flags;
uint8_t size;
} CAN_MSG_HEADER;
int can_send(rt_dev_t device, uint8_t fifo, CAN_MSG_HEADER *header, const char *data);
int can_rec(rt_dev_t device, uint8_t fifo, CAN_MSG_HEADER *header, char *data);
// ===== filter interface =====
typedef enum
{
CAN_FRAME_STD = 0x01, ///< CAN standard frames only
CAN_FRAME_EXT = 0x02, ///< CAN extended frames only
CAN_FRAME_BOTH = 0x03, ///< CAN standard and extended frames
} CAN_FRAME_FORMAT_FLAGS;
int can_filterSet(rt_dev_t device, uint8_t nFilter, uint8_t fifo, uint32_t idFilter, uint32_t mask, CAN_FRAME_FORMAT_FLAGS frame);
int can_filterEnable(rt_dev_t device, uint8_t nFilter);
int can_filterDisable(rt_dev_t device, uint8_t nFilter);
// ======= dynamic clock =======
void can_reconfig(void);
#ifdef SIMULATOR
# include "can_sim.h"
#endif
#ifdef __cplusplus
}
#endif
#endif // CAN_H