/** * @ingroup can * @defgroup can_bitops Bit operations and constants * @brief Bit operations and constants * @copyright 2016 Dual Inventive Technology Centre B.V. * * descr * @{ */ #ifndef LIBDI_INCLUDE_DI_CAN_BITOPS_H_ #define LIBDI_INCLUDE_DI_CAN_BITOPS_H_ #include /** * CAN ID field offsets */ enum di_can_canid_offsets { DI_CAN_CANID_OFFSET_MSGTYPE = 27, DI_CAN_CANID_OFFSET_DATATYPE = 16, DI_CAN_CANID_OFFSET_TRANSFERTYPE = 14, DI_CAN_CANID_OFFSET_FRAME = 5, DI_CAN_CANID_OFFSET_TRANSACTION = 1 }; /** Set canid msgtype */ #define DI_CAN_SET_MSGTYPE(canid, msgtype) \ canid = ((canid) & (uint32_t)(~0x18000000)) | \ (uint32_t)(((msgtype) & 0x3) << DI_CAN_CANID_OFFSET_MSGTYPE) /** Set canid datatype */ #define DI_CAN_SET_DATATYPE(canid, datatype) \ canid = ((canid) & (uint32_t)(~0x07ff0000)) | \ (uint32_t)(((datatype) & 0x7ff) << DI_CAN_CANID_OFFSET_DATATYPE) /** Set canid transfertype */ #define DI_CAN_SET_TRANSFERTYPE(canid, transfertype) \ canid = ((canid) & (uint32_t)(~0x0000c000)) | \ (uint32_t)(((transfertype) & 0x3) << DI_CAN_CANID_OFFSET_TRANSFERTYPE) /** Set canid frame index */ #define DI_CAN_SET_FRAME(canid, frame) \ canid = ((canid) & (uint32_t)(~0x00003fe0)) | \ (uint32_t)(((frame) & 0x1ff) << DI_CAN_CANID_OFFSET_FRAME) /** Set canid next frame index */ #define DI_CAN_SET_FRAME_NEXT(canid) \ DI_CAN_SET_FRAME(canid, DI_CAN_GET_FRAME(canid) + 1) /** Set canid transaction id */ #define DI_CAN_SET_TRANSACTION(canid, transaction) \ canid = ((canid) & (uint32_t)(~0x0000001e)) | \ (uint32_t)((transaction & 0xf) << DI_CAN_CANID_OFFSET_TRANSACTION) /** Set canid last frame marker */ #define DI_CAN_SET_LAST_FRAME(canid, last) \ canid = ((canid) & (uint32_t)(~0x00000001)) | (uint32_t)(last & 0x1) /** Extract message type from canid */ #define DI_CAN_GET_MSGTYPE(canid) \ (enum di_can_msgtype)(((canid) >> DI_CAN_CANID_OFFSET_MSGTYPE) & 0x3) /** Extract data type id from canid */ #define DI_CAN_GET_DATATYPE(canid) \ (((canid) >> DI_CAN_CANID_OFFSET_DATATYPE) & 0x7ff) /** Extract transfer type id from canid */ #define DI_CAN_GET_TRANSFERTYPE(canid) \ (enum di_can_transfertype)(((canid) >> DI_CAN_CANID_OFFSET_TRANSFERTYPE) & 0x3) /** Extract frame index from canid */ #define DI_CAN_GET_FRAME(canid) \ (((canid) >> DI_CAN_CANID_OFFSET_FRAME) & 0x1ff) /** Extract transaction id from canid */ #define DI_CAN_GET_TRANSACTION(canid) \ (((canid) >> DI_CAN_CANID_OFFSET_TRANSACTION) & 0xf) /** Extract last frame flag from canid */ #define DI_CAN_GET_LAST_FRAME(canid) \ ((canid) & 0x1) /** Calculate the amount of frames */ #define DI_CAN_GET_FRAME_COUNT(bytes) \ ((bytes) >> 3) /** Calculate the amount of remaining bytes */ #define DI_CAN_GET_REMAINING(bytes) \ ((bytes) & (DI_CAN_FRAME_SIZE_MASK)) /** @} */ #endif /* LIBDI_INCLUDE_DI_CAN_BITOPS_H_ */