/* Driver for ETAS GmbH ES58X USB CAN(-FD) Bus Interfaces. * * File es581_4.c: Adds support to ETAS ES581.4. * * Copyright (c) 2019 Robert Bosch Engineering and Business Solutions. All rights reserved. * Copyright (c) 2020 ETAS K.K.. All rights reserved. * Copyright (c) 2020-2022 Vincent Mailhol <mailhol.vincent@wanadoo.fr>
*/
/** * es581_4_sizeof_rx_tx_msg() - Calculate the actual length of the * structure of a rx or tx message. * @msg: message of variable length, must have a dlc field. * * Even if RTR frames have actually no payload, the ES58X devices * still expect it. Must be a macro in order to accept several types * (struct es581_4_tx_can_msg and struct es581_4_rx_can_msg) as an * input. * * Return: length of the message.
*/ #define es581_4_sizeof_rx_tx_msg(msg) \
offsetof(typeof(msg), data[can_cc_dlc2len((msg).dlc)])
if (es581_4_urb_cmd->cmd_type != ES581_4_CAN_COMMAND_TYPE) {
dev_err(dev, "%s: Unknown command type (0x%02X)\n",
__func__, es581_4_urb_cmd->cmd_type); return -EBADRQC;
}
switch ((enum es581_4_cmd_id)es581_4_urb_cmd->cmd_id) { case ES581_4_CMD_ID_SET_BITTIMING: return es581_4_rx_cmd_ret_u32(es58x_dev, es581_4_urb_cmd,
ES58X_RET_TYPE_SET_BITTIMING);
case ES581_4_CMD_ID_ENABLE_CHANNEL: return es581_4_rx_cmd_ret_u32(es58x_dev, es581_4_urb_cmd,
ES58X_RET_TYPE_ENABLE_CHANNEL);
case ES581_4_CMD_ID_TX_MSG: return es581_4_tx_ack_msg(es58x_dev, es581_4_urb_cmd);
case ES581_4_CMD_ID_RX_MSG: return es581_4_dispatch_rx_cmd(es58x_dev, es581_4_urb_cmd);
case ES581_4_CMD_ID_RESET_RX:
ret = es581_4_rx_cmd_ret_u32(es58x_dev, es581_4_urb_cmd,
ES58X_RET_TYPE_RESET_RX); return ret;
case ES581_4_CMD_ID_RESET_TX:
ret = es581_4_rx_cmd_ret_u32(es58x_dev, es581_4_urb_cmd,
ES58X_RET_TYPE_RESET_TX); return ret;
case ES581_4_CMD_ID_DISABLE_CHANNEL: return es581_4_rx_cmd_ret_u32(es58x_dev, es581_4_urb_cmd,
ES58X_RET_TYPE_DISABLE_CHANNEL);
case ES581_4_CMD_ID_TIMESTAMP:
ret = es58x_check_msg_len(dev, es581_4_urb_cmd->timestamp,
msg_len); if (ret < 0) return ret;
es58x_rx_timestamp(es58x_dev,
get_unaligned_le64(&es581_4_urb_cmd->timestamp)); return 0;
case ES581_4_CMD_ID_ECHO: return es581_4_echo_msg(es58x_dev, es581_4_urb_cmd);
case ES581_4_CMD_ID_DEVICE_ERR:
ret = es58x_check_msg_len(dev, es581_4_urb_cmd->rx_cmd_ret_u8,
msg_len); if (ret) return ret; return es58x_rx_cmd_ret_u8(dev, ES58X_RET_TYPE_DEVICE_ERR,
es581_4_urb_cmd->rx_cmd_ret_u8);
conststruct es58x_parameters es581_4_param = {
.bittiming_const = &es581_4_bittiming_const,
.data_bittiming_const = NULL,
.tdc_const = NULL,
.bitrate_max = 1 * MEGA /* BPS */,
.clock = {.freq = 50 * MEGA /* Hz */},
.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC,
.tx_start_of_frame = 0xAFAF,
.rx_start_of_frame = 0xFAFA,
.tx_urb_cmd_max_len = ES581_4_TX_URB_CMD_MAX_LEN,
.rx_urb_cmd_max_len = ES581_4_RX_URB_CMD_MAX_LEN, /* Size of internal device TX queue is 330. * * However, we witnessed some ES58X_ERR_PROT_CRC errors from * the device and thus, echo_skb_max was lowered to the * empirical value of 75 which seems stable and then rounded * down to become a power of two. * * Root cause of those ES58X_ERR_PROT_CRC errors is still * unclear.
*/
.fifo_mask = 63, /* echo_skb_max = 64 */
.dql_min_limit = CAN_FRAME_LEN_MAX * 50, /* Empirical value. */
.tx_bulk_max = ES581_4_TX_BULK_MAX,
.urb_cmd_header_len = ES581_4_URB_CMD_HEADER_LEN,
.rx_urb_max = ES58X_RX_URBS_MAX,
.tx_urb_max = ES58X_TX_URBS_MAX
};
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.2Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.