]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - latester/latester.c
Simplify writing CRC to the bitmap
[can-benchmark.git] / latester / latester.c
index a5a7c474dbd837073a932e8bc9ac4fbf39d3bb1f..6f4aefd614e1222103e2ce14db63eb51c063860d 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************/
 /* CAN latency tester                                                     */
-/* Copyright (C) 2010, 2011, 2012 Michal Sojka, DCE FEE CTU Prague        */
+/* Copyright (C) 2010, 2011, 2012, 2013 Michal Sojka, DCE FEE CTU Prague  */
 /* License: GPLv2                                                        */
 /**************************************************************************/
 
@@ -202,26 +202,9 @@ 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[2], end - 64 > 32 ? 32 : end - 64); /* FIXME: This seems to be broken for 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;
+    return crc << 17;
 }
 
 unsigned calc_stuff_bits(struct can_frame *frame) {
@@ -237,6 +220,11 @@ unsigned calc_stuff_bits(struct can_frame *frame) {
 /*     printf("Frame: %s\n", received); */
        
        if (frame->can_id & CAN_EFF_FLAG) {
+               // bit 31                              0
+               // [0] |...........................sBBBB| s = SOF, B = Base ID (11 bits)
+               // [1] |BBBBBBBSIEEEEEEEEEEEEEEEEEER10DLC4| S = SRR, I = IDE, E = Extended ID (18 bits), DLC4 = DLC
+               // [2] |00000000111111112222222233333333| Data bytes, MSB first
+               // [3] |44444444555555556666666677777777|
                bitmap[0] =
                        ((frame->can_id & CAN_EFF_MASK) >> 25);
                bitmap[1] =
@@ -246,24 +234,27 @@ unsigned calc_stuff_bits(struct can_frame *frame) {
                        (!!(frame->can_id & CAN_RTR_FLAG)) << 6         |
                        0 << 4                                          |
                        frame->can_dlc & 0xf;
-               bitmap[2] = htonl(((uint32_t*)frame->data)[0]);
-               bitmap[3] = htonl(((uint32_t*)frame->data)[1]);
+               memcpy(&bitmap[2], &frame->data, frame->can_dlc);
                start = 27;
                end = 64 + 8*frame->can_dlc;
        } else {
+               // bit 31                              0
+               // [0] |.............sIIIIIIIIIIIRE0DLC4| s = SOF, I = ID (11 bits), R = RTR, E = IDE, DLC4 = DLC
+               // [1] |00000000111111112222222233333333| Data bytes, MSB first
+               // [2] |44444444555555556666666677777777|
                bitmap[0] =
                        (frame->can_id << 7) |
                        (!!(frame->can_id & CAN_RTR_FLAG)) << 6 |
                        0 << 4                                  |
                        frame->can_dlc & 0xf;
-               bitmap[1] = htonl(((uint32_t*)frame->data)[0]);
-               bitmap[2] = htonl(((uint32_t*)frame->data)[1]);
+               memcpy(&bitmap[1], &frame->data, frame->can_dlc);
                start = 13;
                end = 32 + 8*frame->can_dlc;
        }
         crc = calc_bitmap_crc(bitmap, start, end);
-        write_crc_to_bitmap(crc, bitmap, frame);
-        end += 15;
+       uint32_t crc_be = htons(crc << 17);
+       memcpy((char*)bitmap + end/8, &crc_be, 2); /* end is guaranteed to be divisible by 8 */
+       end += 15;
 
        while (start < end) {
                mask = basemask >> (start & 0x1f);