|
@@ -0,0 +1,80 @@
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#ifndef _CANXLEXT_H
|
|
|
|
+#define _CANXLEXT_H
|
|
|
|
+
|
|
|
|
+#include <linux/types.h>
|
|
|
|
+#include <linux/socket.h>
|
|
|
|
+#include <linux/stddef.h> /* for offsetof */
|
|
|
|
+
|
|
|
|
+/* controller area network (CAN) kernel definitions */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define CANXL_PRIO_MASK CAN_SFF_MASK /* 11 bit priority mask */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Controller Area Network Identifier structure
|
|
|
|
+ *
|
|
|
|
+ * bit 0-28 : CAN identifier (11/29 bit)
|
|
|
|
+ * bit 29 : error message frame flag (0 = data frame, 1 = error message)
|
|
|
|
+ * bit 30 : remote transmission request flag (1 = rtr frame)
|
|
|
|
+ * bit 31 : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
|
|
|
|
+ */
|
|
|
|
+#define CANXL_PRIO_BITS CAN_SFF_ID_BITS
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * CAN XL payload length and DLC definitions according to ISO 11898-1
|
|
|
|
+ * CAN XL DLC ranges from 0 .. 2047 => data length from 1 .. 2048 byte
|
|
|
|
+ */
|
|
|
|
+#define CANXL_MIN_DLC 0
|
|
|
|
+#define CANXL_MAX_DLC 2047
|
|
|
|
+#define CANXL_MAX_DLC_MASK 0x07FF
|
|
|
|
+#define CANXL_MIN_DLEN 1
|
|
|
|
+#define CANXL_MAX_DLEN 2048
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#define CANXL_MTU (sizeof(struct canxl_frame))
|
|
|
|
+#define CANXL_HDR_SIZE (offsetof(struct canxl_frame, data))
|
|
|
|
+#define CANXL_MIN_MTU (CANXL_HDR_SIZE + 64)
|
|
|
|
+#define CANXL_MAX_MTU CANXL_MTU
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * defined bits for canxl_frame.flags
|
|
|
|
+ *
|
|
|
|
+ * The canxl_frame.flags element contains two bits CANXL_XLF and CANXL_SEC
|
|
|
|
+ * and shares the relative position of the struct can[fd]_frame.len element.
|
|
|
|
+ * The CANXL_XLF bit ALWAYS needs to be set to indicate a valid CAN XL frame.
|
|
|
|
+ * As a side effect setting this bit intentionally breaks the length checks
|
|
|
|
+ * for Classical CAN and CAN FD frames.
|
|
|
|
+ *
|
|
|
|
+ * Undefined bits in canxl_frame.flags are reserved and shall be set to zero.
|
|
|
|
+ */
|
|
|
|
+#define CANXL_XLF 0x80 /* mandatory CAN XL frame flag (must always be set!) */
|
|
|
|
+#define CANXL_SEC 0x01 /* Simple Extended Content (security/segmentation) */
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * struct canxl_frame - CAN with e'X'tended frame 'L'ength frame structure
|
|
|
|
+ * @prio: 11 bit arbitration priority with zero'ed CAN_*_FLAG flags
|
|
|
|
+ * @flags: additional flags for CAN XL
|
|
|
|
+ * @sdt: SDU (service data unit) type
|
|
|
|
+ * @len: frame payload length in byte (CANXL_MIN_DLEN .. CANXL_MAX_DLEN)
|
|
|
|
+ * @af: acceptance field
|
|
|
|
+ * @data: CAN XL frame payload (CANXL_MIN_DLEN .. CANXL_MAX_DLEN byte)
|
|
|
|
+ *
|
|
|
|
+ * @prio shares the same position as @can_id from struct can[fd]_frame.
|
|
|
|
+ */
|
|
|
|
+struct canxl_frame {
|
|
|
|
+ canid_t prio; /* 11 bit priority for arbitration (canid_t) */
|
|
|
|
+ __u8 flags; /* additional flags for CAN XL */
|
|
|
|
+ __u8 sdt; /* SDU (service data unit) type */
|
|
|
|
+ __u16 len; /* frame payload length in byte */
|
|
|
|
+ __u32 af; /* acceptance field */
|
|
|
|
+ __u8 data[CANXL_MAX_DLEN];
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+#endif /* !_UAPI_CAN_H */
|