+/* Functions and types for CRC checks.
+ *
+ * Generated on Wed Sep 21 22:30:11 2011,
+ * by pycrc v0.7.8, http://www.tty1.net/pycrc/
+ * using the configuration:
+ * Width = 15
+ * Poly = 0x4599
+ * XorIn = 0x0000
+ * ReflectIn = False
+ * XorOut = 0x0000
+ * ReflectOut = False
+ * Algorithm = table-driven
+ *****************************************************************************/
+typedef uint16_t crc_t;
+
+static const crc_t crc_table[2] = {
+ 0x0000, 0x4599
+};
+
+crc_t crc_update(crc_t crc, uint32_t data, size_t bit_len)
+{
+ unsigned int tbl_idx;
+/* crc_t bc = crc; */
+/* uint32_t bd = data; */
+/* size_t bl = bit_len; */
+
+ while (bit_len--) {
+ tbl_idx = (crc >> 14) ^ (data >> 31);
+ crc = crc_table[tbl_idx & 0x01] ^ (crc << 1);
+ data <<= 1;
+ }
+ crc = crc & 0x7fff;
+/* printf("crc: 0x%04x -> 0x%04x data: 0x%08x len: %d\n", */
+/* bc, crc, bd, bl); */
+ return crc;
+}
+
+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;
+}
+