#define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */
/* Bit-timing calculation derived from: * * Code based on LinCAN sources and H8S2638 project * Copyright 2004-2006 Pavel Pisa - DCE FELK CVUT cz * Copyright 2005 Stanislav Marek * email: pisa@cmp.felk.cvut.cz * * Calculates proper bit-timing parameters for a specified bit-rate * and sample-point, which can then be used to set the bit-timing * registers of the CAN controller. You can find more information * in the header file linux/can/netlink.h.
*/ staticint
can_update_sample_point(conststruct can_bittiming_const *btc, constunsignedint sample_point_nominal, constunsignedint tseg, unsignedint *tseg1_ptr, unsignedint *tseg2_ptr, unsignedint *sample_point_error_ptr)
{ unsignedint sample_point_error, best_sample_point_error = UINT_MAX; unsignedint sample_point, best_sample_point = 0; unsignedint tseg1, tseg2; int i;
if (sample_point_error_ptr)
*sample_point_error_ptr = best_sample_point_error;
return best_sample_point;
}
int can_calc_bittiming(conststruct net_device *dev, struct can_bittiming *bt, conststruct can_bittiming_const *btc, struct netlink_ext_ack *extack)
{ struct can_priv *priv = netdev_priv(dev); unsignedint bitrate; /* current bitrate */ unsignedint bitrate_error; /* difference between current and nominal value */ unsignedint best_bitrate_error = UINT_MAX; unsignedint sample_point_error; /* difference between current and nominal value */ unsignedint best_sample_point_error = UINT_MAX; unsignedint sample_point_nominal; /* nominal sample point */ unsignedint best_tseg = 0; /* current best value for tseg */ unsignedint best_brp = 0; /* current best value for brp */ unsignedint brp, tsegall, tseg, tseg1 = 0, tseg2 = 0;
u64 v64; int err;
/* Use CiA recommended sample points */ if (bt->sample_point) {
sample_point_nominal = bt->sample_point;
} else { if (bt->bitrate > 800 * KILO /* BPS */)
sample_point_nominal = 750; elseif (bt->bitrate > 500 * KILO /* BPS */)
sample_point_nominal = 800; else
sample_point_nominal = 875;
}
{ if (!tdc_const || !(ctrlmode_supported & CAN_CTRLMODE_TDC_AUTO)) return;
*ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK;
/* As specified in ISO 11898-1 section 11.3.3 "Transmitter * delay compensation" (TDC) is only applicable if data BRP is * one or two.
*/ if (dbt->brp == 1 || dbt->brp == 2) { /* Sample point in clock periods */
u32 sample_point_in_tc = (CAN_SYNC_SEG + dbt->prop_seg +
dbt->phase_seg1) * dbt->brp;
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.