|
25 | 25 | */ |
26 | 26 |
|
27 | 27 | #include "common-hal/canio/__init__.h" |
28 | | -#include "shared-bindings/canio/RemoteTransmissionRequest.h" |
29 | | - |
30 | | -// Convert from back from FLEXCAN IDs to normal CAN IDs. |
31 | | -#define FLEXCAN_ID_TO_CAN_ID_STD(id) \ |
32 | | - ((uint32_t)((((uint32_t)(id)) & CAN_ID_STD_MASK) >> CAN_ID_STD_SHIFT)) |
33 | | - |
34 | | -#define FLEXCAN_ID_TO_CAN_ID_EXT(id) \ |
35 | | - ((uint32_t)((((uint32_t)(id)) & (CAN_ID_STD_MASK | CAN_ID_EXT_MASK)) \ |
36 | | - >> CAN_ID_EXT_SHIFT)) |
37 | | - |
38 | | -bool mimxrt_canio_message_obj_to_flexcan_frame(canio_message_obj_t *src, flexcan_frame_t *dst) |
39 | | -{ |
40 | | - memset(dst, 0, sizeof(*dst)); // Zero out output. |
41 | | - if (src == NULL) return false; // Missing input. |
42 | | - |
43 | | - if (src->extended) { // CAN Frame Identifier (STD or EXT format). |
44 | | - dst->id = FLEXCAN_ID_EXT(src->id); // CAN Frame Identifier (EXT). |
45 | | - dst->format = kFLEXCAN_FrameFormatExtend; |
46 | | - } else { |
47 | | - dst->id = FLEXCAN_ID_STD(src->id); // CAN Frame Identifier (STD). |
48 | | - dst->format = kFLEXCAN_FrameFormatStandard; |
49 | | - } |
50 | | - |
51 | | - bool rtr = src->base.type == &canio_remote_transmission_request_type; |
52 | | - if (rtr) { // CAN Frame Type(DATA or REMOTE). |
53 | | - dst->type = kFLEXCAN_FrameTypeRemote; |
54 | | - } else { |
55 | | - dst->type = kFLEXCAN_FrameTypeData; |
56 | | - } |
57 | | - |
58 | | - dst->length = src->size; // CAN frame data length in bytes (Range: 0~8). |
59 | | - |
60 | | - dst->dataByte0 = src->data[0]; |
61 | | - dst->dataByte1 = src->data[1]; |
62 | | - dst->dataByte2 = src->data[2]; |
63 | | - dst->dataByte3 = src->data[3]; |
64 | | - dst->dataByte4 = src->data[4]; |
65 | | - dst->dataByte5 = src->data[5]; |
66 | | - dst->dataByte6 = src->data[6]; |
67 | | - dst->dataByte7 = src->data[7]; |
68 | | - |
69 | | - return true; |
70 | | -} |
71 | | - |
72 | | -bool mimxrt_flexcan_frame_to_canio_message_obj(flexcan_frame_t *src, canio_message_obj_t *dst) |
73 | | -{ |
74 | | - memset(dst, 0, sizeof(*dst)); // Zero out output. |
75 | | - if (src == NULL) return false; // Missing input. |
76 | | - |
77 | | - if (src->format == kFLEXCAN_FrameFormatExtend) { // CAN Frame Identifier (STD or EXT format). |
78 | | - dst->extended = true; |
79 | | - dst->id = FLEXCAN_ID_TO_CAN_ID_EXT(src->id); // CAN Frame Identifier (EXT). |
80 | | - } else { |
81 | | - dst->extended = false; |
82 | | - dst->id = FLEXCAN_ID_TO_CAN_ID_STD(src->id); // CAN Frame Identifier (STD). |
83 | | - } |
84 | | - |
85 | | - if (src->type == kFLEXCAN_FrameTypeRemote) { // CAN Frame Type(DATA or REMOTE). |
86 | | - dst->base.type = &canio_remote_transmission_request_type; |
87 | | - } else { |
88 | | - dst->base.type = &canio_message_type; |
89 | | - } |
90 | | - |
91 | | - dst->size = src->length; // CAN frame data length in bytes (Range: 0~8). |
92 | | - |
93 | | - dst->data[0] = src->dataByte0; |
94 | | - dst->data[1] = src->dataByte1; |
95 | | - dst->data[2] = src->dataByte2; |
96 | | - dst->data[3] = src->dataByte3; |
97 | | - dst->data[4] = src->dataByte4; |
98 | | - dst->data[5] = src->dataByte5; |
99 | | - dst->data[6] = src->dataByte6; |
100 | | - dst->data[7] = src->dataByte7; |
101 | | - |
102 | | - return true; |
103 | | -} |
0 commit comments