X-Git-Url: http://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/blobdiff_plain/cdab1762e9579c00c17880d68f450c4462ff3800..c214d1a46a37635c06c68756baa383b3ac5996ca:/kernel/2.6/include/socketcan/can/gw.h diff --git a/kernel/2.6/include/socketcan/can/gw.h b/kernel/2.6/include/socketcan/can/gw.h index 2cf3fb7..e1dfac0 100644 --- a/kernel/2.6/include/socketcan/can/gw.h +++ b/kernel/2.6/include/socketcan/can/gw.h @@ -1,12 +1,12 @@ /* * socketcan/can/gw.h * - * Definitions for CAN frame Gateway/Router/Bridge + * Definitions for CAN frame Gateway/Router/Bridge * * $Id$ * * Author: Oliver Hartkopp - * Copyright (c) 2002-2010 Volkswagen Group Electronic Research + * Copyright (c) 2011 Volkswagen Group Electronic Research * All rights reserved. * * Send feedback to @@ -16,6 +16,7 @@ #ifndef CAN_GW_H #define CAN_GW_H +#include #include struct rtcanmsg { @@ -78,7 +79,7 @@ struct cgw_csum_xor { __s8 to_idx; __s8 result_idx; __u8 init_xor_val; -} __attribute__ ((packed)); +} __attribute__((packed)); struct cgw_csum_crc8 { __s8 from_idx; @@ -87,12 +88,25 @@ struct cgw_csum_crc8 { __u8 init_crc_val; __u8 final_xor_val; __u8 crctab[256]; -} __attribute__ ((packed)); + __u8 profile; + __u8 profile_data[20]; +} __attribute__((packed)); /* length of checksum operation parameters. idx = index in CAN frame data[] */ #define CGW_CS_XOR_LEN sizeof(struct cgw_csum_xor) #define CGW_CS_CRC8_LEN sizeof(struct cgw_csum_crc8) +/* CRC8 profiles (compute CRC for additional data elements - see below) */ +enum { + CGW_CRC8PRF_UNSPEC, + CGW_CRC8PRF_1U8, /* compute one additional u8 value */ + CGW_CRC8PRF_16U8, /* u8 value table indexed by data[1] & 0xF */ + CGW_CRC8PRF_SFFID_XOR, /* (can_id & 0xFF) ^ (can_id >> 8 & 0xFF) */ + __CGW_CRC8PRF_MAX +}; + +#define CGW_CRC8PRF_MAX (__CGW_CRC8PRF_MAX - 1) + /* * CAN rtnetlink attribute contents in detail * @@ -118,13 +132,13 @@ struct cgw_csum_crc8 { * The XOR checksum is calculated like this: * * xor = init_xor_val - * + * * for (i = from_idx .. to_idx) * xor ^= can_frame.data[i] * * can_frame.data[ result_idx ] = xor * - * CGW_CS_CRC8 (length 261 bytes): + * CGW_CS_CRC8 (length 282 bytes): * Set a CRC8 value into data[result-idx] using a given 256 byte CRC8 table, * a given initial value and a defined input data[start-idx] .. data[end-idx]. * Finally the result value is XOR'ed with the final_xor_val. @@ -132,12 +146,19 @@ struct cgw_csum_crc8 { * The CRC8 checksum is calculated like this: * * crc = init_crc_val - * + * * for (i = from_idx .. to_idx) * crc = crctab[ crc ^ can_frame.data[i] ] * * can_frame.data[ result_idx ] = crc ^ final_xor_val * + * The calculated CRC may contain additional source data elements that can be + * defined in the handling of 'checksum profiles' e.g. shown in AUTOSAR specs + * like http://www.autosar.org/download/R4.0/AUTOSAR_SWS_E2ELibrary.pdf + * E.g. the profile_data[] may contain additional u8 values (called DATA_IDs) + * that are used depending on counter values inside the CAN frame data[]. + * So far only three profiles have been implemented for illustration. + * * Remark: In general the attribute data is a linear buffer. * Beware of sending unpacked or aligned structs! */