From: Vojtěch Drbohlav Date: Wed, 30 Oct 2013 13:05:31 +0000 (+0100) Subject: Calculate stuff bits also for CRC; Fix '=' instead of '==' X-Git-Tag: fix-allnoconfig~127 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/commitdiff_plain/85663f7d1d874b065a93fc451bacd43bca9fa73c Calculate stuff bits also for CRC; Fix '=' instead of '==' [Commit message edited by Michal Sojka] --- diff --git a/latester/latester.c b/latester/latester.c index 140811f..a5a7c47 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -197,14 +197,40 @@ crc_t crc_update(crc_t crc, uint32_t data, size_t bit_len) 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; +} + unsigned calc_stuff_bits(struct can_frame *frame) { uint32_t bitmap[4]; unsigned start = 0, end; uint32_t mask, ones = 0, basemask = 0xf8000000; unsigned stuffed = 0; memset(bitmap, 0, sizeof(bitmap)); - crc_t crc = 0; - uint32_t crcx; + uint32_t crc; /* char received[64]; */ /* sprint_canframe(received, frame, true); */ @@ -224,17 +250,6 @@ unsigned calc_stuff_bits(struct can_frame *frame) { bitmap[3] = htonl(((uint32_t*)frame->data)[1]); start = 27; end = 64 + 8*frame->can_dlc; - 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); - crcx = (uint32_t)htons(crc) << 17; - if (frame->can_dlc < 4) - bitmap[2] |= crcx >> (frame->can_dlc*8); - if (frame->can_dlc = 3) - bitmap[3] |= crcx << 8; - if (frame->can_dlc >= 4) - bitmap[3] |= crcx >> (frame->can_dlc*8); } else { bitmap[0] = (frame->can_id << 7) | @@ -246,7 +261,10 @@ unsigned calc_stuff_bits(struct can_frame *frame) { start = 13; end = 32 + 8*frame->can_dlc; } - /* TODO: Calc stuff bits in CRC */ + crc = calc_bitmap_crc(bitmap, start, end); + write_crc_to_bitmap(crc, bitmap, frame); + end += 15; + while (start < end) { mask = basemask >> (start & 0x1f); while (1) {