lib.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * lib.h - library include for command line tools
  3. *
  4. * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. Neither the name of Volkswagen nor the names of its contributors
  16. * may be used to endorse or promote products derived from this software
  17. * without specific prior written permission.
  18. *
  19. * Alternatively, provided that this notice is retained in full, this
  20. * software may be distributed under the terms of the GNU General
  21. * Public License ("GPL") version 2, in which case the provisions of the
  22. * GPL apply INSTEAD OF those given above.
  23. *
  24. * The provided data structures and external interfaces from this code
  25. * are not restricted to be used by modules with a GPL compatible license.
  26. *
  27. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  28. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  29. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  30. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  31. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  32. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  33. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  34. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  35. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  36. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  37. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  38. * DAMAGE.
  39. *
  40. * Send feedback to <linux-can@vger.kernel.org>
  41. *
  42. */
  43. #ifndef CAN_UTILS_LIB_H
  44. #define CAN_UTILS_LIB_H
  45. #include <stdio.h>
  46. /* buffer sizes for CAN frame string representations */
  47. #define CL_ID (sizeof("12345678##1"))
  48. #define CL_DATA sizeof(".AA")
  49. #define CL_BINDATA sizeof(".10101010")
  50. /* CAN FD ASCII hex short representation with DATA_SEPERATORs */
  51. #define CL_CFSZ (2*CL_ID + 64*CL_DATA)
  52. /* CAN FD ASCII hex long representation with binary output */
  53. #define CL_LONGCFSZ (2*CL_ID + sizeof(" [255] ") + (64*CL_BINDATA))
  54. /* CAN DLC to real data length conversion helpers especially for CAN FD */
  55. /* get data length from can_dlc with sanitized can_dlc */
  56. unsigned char can_dlc2len(unsigned char can_dlc);
  57. /* map the sanitized data length to an appropriate data length code */
  58. unsigned char can_len2dlc(unsigned char len);
  59. unsigned char asc2nibble(char c);
  60. /*
  61. * Returns the decimal value of a given ASCII hex character.
  62. *
  63. * While 0..9, a..f, A..F are valid ASCII hex characters.
  64. * On invalid characters the value 16 is returned for error handling.
  65. */
  66. int hexstring2data(char *arg, unsigned char *data, int maxdlen);
  67. /*
  68. * Converts a given ASCII hex string to a (binary) byte string.
  69. *
  70. * A valid ASCII hex string consists of an even number of up to 16 chars.
  71. * Leading zeros '00' in the ASCII hex string are interpreted.
  72. *
  73. * Examples:
  74. *
  75. * "1234" => data[0] = 0x12, data[1] = 0x34
  76. * "001234" => data[0] = 0x00, data[1] = 0x12, data[2] = 0x34
  77. *
  78. * Return values:
  79. * 0 = success
  80. * 1 = error (in length or the given characters are no ASCII hex characters)
  81. *
  82. * Remark: The not written data[] elements are initialized with zero.
  83. *
  84. */
  85. int parse_canframe(char *cs, struct canfd_frame *cf);
  86. /*
  87. * Transfers a valid ASCII string decribing a CAN frame into struct canfd_frame.
  88. *
  89. * CAN 2.0 frames
  90. * - string layout <can_id>#{R{len}|data}
  91. * - {data} has 0 to 8 hex-values that can (optionally) be separated by '.'
  92. * - {len} can take values from 0 to 8 and can be omitted if zero
  93. * - return value on successful parsing: CAN_MTU
  94. *
  95. * CAN FD frames
  96. * - string layout <can_id>##<flags>{data}
  97. * - <flags> a single ASCII Hex value (0 .. F) which defines canfd_frame.flags
  98. * - {data} has 0 to 64 hex-values that can (optionally) be separated by '.'
  99. * - return value on successful parsing: CANFD_MTU
  100. *
  101. * Return value on detected problems: 0
  102. *
  103. * <can_id> can have 3 (standard frame format) or 8 (extended frame format)
  104. * hexadecimal chars
  105. *
  106. *
  107. * Examples:
  108. *
  109. * 123# -> standard CAN-Id = 0x123, len = 0
  110. * 12345678# -> extended CAN-Id = 0x12345678, len = 0
  111. * 123#R -> standard CAN-Id = 0x123, len = 0, RTR-frame
  112. * 123#R0 -> standard CAN-Id = 0x123, len = 0, RTR-frame
  113. * 123#R7 -> standard CAN-Id = 0x123, len = 7, RTR-frame
  114. * 7A1#r -> standard CAN-Id = 0x7A1, len = 0, RTR-frame
  115. *
  116. * 123#00 -> standard CAN-Id = 0x123, len = 1, data[0] = 0x00
  117. * 123#1122334455667788 -> standard CAN-Id = 0x123, len = 8
  118. * 123#11.22.33.44.55.66.77.88 -> standard CAN-Id = 0x123, len = 8
  119. * 123#11.2233.44556677.88 -> standard CAN-Id = 0x123, len = 8
  120. * 32345678#112233 -> error frame with CAN_ERR_FLAG (0x2000000) set
  121. *
  122. * 123##0112233 -> CAN FD frame standard CAN-Id = 0x123, flags = 0, len = 3
  123. * 123##1112233 -> CAN FD frame, flags = CANFD_BRS, len = 3
  124. * 123##2112233 -> CAN FD frame, flags = CANFD_ESI, len = 3
  125. * 123##3 -> CAN FD frame, flags = (CANFD_ESI | CANFD_BRS), len = 0
  126. * ^^
  127. * CAN FD extension to handle the canfd_frame.flags content
  128. *
  129. * Simple facts on this compact ASCII CAN frame representation:
  130. *
  131. * - 3 digits: standard frame format
  132. * - 8 digits: extendend frame format OR error frame
  133. * - 8 digits with CAN_ERR_FLAG (0x2000000) set: error frame
  134. * - an error frame is never a RTR frame
  135. * - CAN FD frames do not have a RTR bit
  136. */
  137. void fprint_canframe(FILE *stream , struct canfd_frame *cf, char *eol, int sep, int maxdlen);
  138. void sprint_canframe(char *buf , struct canfd_frame *cf, int sep, int maxdlen);
  139. /*
  140. * Creates a CAN frame hexadecimal output in compact format.
  141. * The CAN data[] is separated by '.' when sep != 0.
  142. *
  143. * The type of the CAN frame (CAN 2.0 / CAN FD) is specified by maxdlen:
  144. * maxdlen = 8 -> CAN2.0 frame
  145. * maxdlen = 64 -> CAN FD frame
  146. *
  147. * 12345678#112233 -> extended CAN-Id = 0x12345678, len = 3, data, sep = 0
  148. * 12345678#R -> extended CAN-Id = 0x12345678, RTR, len = 0
  149. * 12345678#R5 -> extended CAN-Id = 0x12345678, RTR, len = 5
  150. * 123#11.22.33.44.55.66.77.88 -> standard CAN-Id = 0x123, dlc = 8, sep = 1
  151. * 32345678#112233 -> error frame with CAN_ERR_FLAG (0x2000000) set
  152. * 123##0112233 -> CAN FD frame standard CAN-Id = 0x123, flags = 0, len = 3
  153. * 123##2112233 -> CAN FD frame, flags = CANFD_ESI, len = 3
  154. *
  155. * Examples:
  156. *
  157. * fprint_canframe(stdout, &frame, "\n", 0); // with eol to STDOUT
  158. * fprint_canframe(stderr, &frame, NULL, 0); // no eol to STDERR
  159. *
  160. */
  161. #define CANLIB_VIEW_ASCII 0x1
  162. #define CANLIB_VIEW_BINARY 0x2
  163. #define CANLIB_VIEW_SWAP 0x4
  164. #define CANLIB_VIEW_ERROR 0x8
  165. #define CANLIB_VIEW_INDENT_SFF 0x10
  166. #define SWAP_DELIMITER '`'
  167. void fprint_long_canframe(FILE *stream , struct canfd_frame *cf, char *eol, int view, int maxdlen);
  168. void sprint_long_canframe(char *buf , struct canfd_frame *cf, int view, int maxdlen);
  169. /*
  170. * Creates a CAN frame hexadecimal output in user readable format.
  171. *
  172. * The type of the CAN frame (CAN 2.0 / CAN FD) is specified by maxdlen:
  173. * maxdlen = 8 -> CAN2.0 frame
  174. * maxdlen = 64 -> CAN FD frame
  175. *
  176. * 12345678 [3] 11 22 33 -> extended CAN-Id = 0x12345678, dlc = 3, data
  177. * 12345678 [0] remote request -> extended CAN-Id = 0x12345678, RTR
  178. * 14B0DC51 [8] 4A 94 E8 2A EC 58 55 62 'J..*.XUb' -> (with ASCII output)
  179. * 20001111 [7] C6 23 7B 32 69 98 3C ERRORFRAME -> (CAN_ERR_FLAG set)
  180. * 12345678 [03] 11 22 33 -> CAN FD with extended CAN-Id = 0x12345678, dlc = 3
  181. *
  182. * 123 [3] 11 22 33 -> CANLIB_VIEW_INDENT_SFF == 0
  183. * 123 [3] 11 22 33 -> CANLIB_VIEW_INDENT_SFF == set
  184. *
  185. * Examples:
  186. *
  187. * // CAN FD frame with eol to STDOUT
  188. * fprint_long_canframe(stdout, &frame, "\n", 0, CANFD_MAX_DLEN);
  189. *
  190. * // CAN 2.0 frame without eol to STDERR
  191. * fprint_long_canframe(stderr, &frame, NULL, 0, CAN_MAX_DLEN);
  192. *
  193. */
  194. void snprintf_can_error_frame(char *buf, size_t len, const struct canfd_frame *cf,
  195. const char *sep);
  196. /*
  197. * Creates a CAN error frame output in user readable format.
  198. */
  199. #endif