+uint32_t calc_bitmap_crc(uint32_t *bitmap, unsigned start, unsigned end)
+{
+ crc_t crc = 0;
+ crc = crc_update(crc, bitmap[0] << start, 32 - start);
+ crc = crc_update(crc, bitmap[1], 32);
+ crc = crc_update(crc, bitmap[2], end - 64 > 32 ? 32 : end - 64);
+ crc = crc_update(crc, bitmap[3], end > 96 ? end - 96 : 0);
+ return (uint32_t)htons(crc) << 17;
+}
+
+void write_crc_to_bitmap(uint32_t crc, uint32_t *bitmap, struct can_frame *frame)
+{
+ unsigned index = frame->can_id & CAN_EFF_FLAG ? 2 : 1;
+ if (frame->can_dlc < 4)
+ bitmap[index] |= crc >> (frame->can_dlc*8);
+ if (frame->can_dlc == 3)
+ bitmap[index + 1] |= crc << 8;
+ if (frame->can_dlc >= 4 && frame->can_dlc < 8)
+ {
+ bitmap[index + 1] |= crc >> (frame->can_dlc*8);
+ if (frame->can_dlc == 7)
+ bitmap[index + 2] = crc << 8;
+ }
+ else if (frame->can_dlc == 8)
+ bitmap[index + 2] = crc;
+}
+