|
@@ -46,18 +46,67 @@ typedef __u32 canid_t;
|
|
*/
|
|
*/
|
|
typedef __u32 can_err_mask_t;
|
|
typedef __u32 can_err_mask_t;
|
|
|
|
|
|
|
|
+/* CAN payload length and DLC definitions according to ISO 11898-1 */
|
|
|
|
+#define CAN_MAX_DLC 8
|
|
|
|
+#define CAN_MAX_DLEN 8
|
|
|
|
+
|
|
|
|
+/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
|
|
|
|
+#define CANFD_MAX_DLC 15
|
|
|
|
+#define CANFD_MAX_DLEN 64
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* struct can_frame - basic CAN frame structure
|
|
* struct can_frame - basic CAN frame structure
|
|
- * @can_id: the CAN ID of the frame and CAN_*_FLAG flags, see above.
|
|
|
|
- * @can_dlc: the data length field of the CAN frame
|
|
|
|
- * @data: the CAN frame payload.
|
|
|
|
|
|
+ * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
|
|
|
|
+ * @can_dlc: frame payload length in byte (0 .. 8) aka data length code
|
|
|
|
+ * N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
|
|
|
|
+ * mapping of the 'data length code' to the real payload length
|
|
|
|
+ * @data: CAN frame payload (up to 8 byte)
|
|
*/
|
|
*/
|
|
struct can_frame {
|
|
struct can_frame {
|
|
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
|
|
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
|
|
- __u8 can_dlc; /* data length code: 0 .. 8 */
|
|
|
|
- __u8 data[8] __attribute__((aligned(8)));
|
|
|
|
|
|
+ __u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
|
|
|
|
+ __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * defined bits for canfd_frame.flags
|
|
|
|
+ *
|
|
|
|
+ * As the default for CAN FD should be to support the high data rate in the
|
|
|
|
+ * payload section of the frame (HDR) and to support up to 64 byte in the
|
|
|
|
+ * data section (EDL) the bits are only set in the non-default case.
|
|
|
|
+ * Btw. as long as there's no real implementation for CAN FD network driver
|
|
|
|
+ * these bits are only preliminary.
|
|
|
|
+ *
|
|
|
|
+ * RX: NOHDR/NOEDL - info about received CAN FD frame
|
|
|
|
+ * ESI - bit from originating CAN controller
|
|
|
|
+ * TX: NOHDR/NOEDL - control per-frame settings if supported by CAN controller
|
|
|
|
+ * ESI - bit is set by local CAN controller
|
|
|
|
+ */
|
|
|
|
+#define CANFD_NOHDR 0x01 /* frame without high data rate */
|
|
|
|
+#define CANFD_NOEDL 0x02 /* frame without extended data length */
|
|
|
|
+#define CANFD_ESI 0x04 /* error state indicator */
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * struct canfd_frame - CAN flexible data rate frame structure
|
|
|
|
+ * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
|
|
|
|
+ * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN)
|
|
|
|
+ * @flags: additional flags for CAN FD
|
|
|
|
+ * @__res0: reserved / padding
|
|
|
|
+ * @__res1: reserved / padding
|
|
|
|
+ * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte)
|
|
|
|
+ */
|
|
|
|
+struct canfd_frame {
|
|
|
|
+ canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
|
|
|
|
+ __u8 len; /* frame payload length in byte */
|
|
|
|
+ __u8 flags; /* additional flags for CAN FD */
|
|
|
|
+ __u8 __res0; /* reserved / padding */
|
|
|
|
+ __u8 __res1; /* reserved / padding */
|
|
|
|
+ __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define CAN_MTU (sizeof(struct can_frame))
|
|
|
|
+#define CANFD_MTU (sizeof(struct canfd_frame))
|
|
|
|
+
|
|
/* particular protocols of the protocol family PF_CAN */
|
|
/* particular protocols of the protocol family PF_CAN */
|
|
#define CAN_RAW 1 /* RAW sockets */
|
|
#define CAN_RAW 1 /* RAW sockets */
|
|
#define CAN_BCM 2 /* Broadcast Manager */
|
|
#define CAN_BCM 2 /* Broadcast Manager */
|