Commit fe5b4064 authored by Stephane Grosjean's avatar Stephane Grosjean Committed by Marc Kleine-Budde

can: peak: Fix bittiming fields size in bits

This fixes the bitimings fields ranges supported by all the CAN-FD USB
interfaces of the PEAK-System CAN-FD adapters.

Very first development versions of the IP core API defined smaller TSGEx
and SJW fields for both nominal and data bittimings records than the
production versions. This patch fixes them by enlarging their sizes to
the actual values:

field:           old size:    fixed size:
nominal TSGEG1   6            8
nominal TSGEG2   4            7
nominal SJW      4            7
data TSGEG1      4            5
data TSGEG2      3            4
data SJW         2            4

Note that this has no other consequences than offering larger choice to
bitrate encoding.
Signed-off-by: default avatarStephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent aa196eed
...@@ -43,11 +43,22 @@ struct __packed pucan_command { ...@@ -43,11 +43,22 @@ struct __packed pucan_command {
u16 args[3]; u16 args[3];
}; };
#define PUCAN_TSLOW_BRP_BITS 10
#define PUCAN_TSLOW_TSGEG1_BITS 8
#define PUCAN_TSLOW_TSGEG2_BITS 7
#define PUCAN_TSLOW_SJW_BITS 7
#define PUCAN_TSLOW_BRP_MASK ((1 << PUCAN_TSLOW_BRP_BITS) - 1)
#define PUCAN_TSLOW_TSEG1_MASK ((1 << PUCAN_TSLOW_TSGEG1_BITS) - 1)
#define PUCAN_TSLOW_TSEG2_MASK ((1 << PUCAN_TSLOW_TSGEG2_BITS) - 1)
#define PUCAN_TSLOW_SJW_MASK ((1 << PUCAN_TSLOW_SJW_BITS) - 1)
/* uCAN TIMING_SLOW command fields */ /* uCAN TIMING_SLOW command fields */
#define PUCAN_TSLOW_SJW_T(s, t) (((s) & 0xf) | ((!!(t)) << 7)) #define PUCAN_TSLOW_SJW_T(s, t) (((s) & PUCAN_TSLOW_SJW_MASK) | \
#define PUCAN_TSLOW_TSEG2(t) ((t) & 0xf) ((!!(t)) << 7))
#define PUCAN_TSLOW_TSEG1(t) ((t) & 0x3f) #define PUCAN_TSLOW_TSEG2(t) ((t) & PUCAN_TSLOW_TSEG2_MASK)
#define PUCAN_TSLOW_BRP(b) ((b) & 0x3ff) #define PUCAN_TSLOW_TSEG1(t) ((t) & PUCAN_TSLOW_TSEG1_MASK)
#define PUCAN_TSLOW_BRP(b) ((b) & PUCAN_TSLOW_BRP_MASK)
struct __packed pucan_timing_slow { struct __packed pucan_timing_slow {
__le16 opcode_channel; __le16 opcode_channel;
...@@ -60,11 +71,21 @@ struct __packed pucan_timing_slow { ...@@ -60,11 +71,21 @@ struct __packed pucan_timing_slow {
__le16 brp; /* BaudRate Prescaler */ __le16 brp; /* BaudRate Prescaler */
}; };
#define PUCAN_TFAST_BRP_BITS 10
#define PUCAN_TFAST_TSGEG1_BITS 5
#define PUCAN_TFAST_TSGEG2_BITS 4
#define PUCAN_TFAST_SJW_BITS 4
#define PUCAN_TFAST_BRP_MASK ((1 << PUCAN_TFAST_BRP_BITS) - 1)
#define PUCAN_TFAST_TSEG1_MASK ((1 << PUCAN_TFAST_TSGEG1_BITS) - 1)
#define PUCAN_TFAST_TSEG2_MASK ((1 << PUCAN_TFAST_TSGEG2_BITS) - 1)
#define PUCAN_TFAST_SJW_MASK ((1 << PUCAN_TFAST_SJW_BITS) - 1)
/* uCAN TIMING_FAST command fields */ /* uCAN TIMING_FAST command fields */
#define PUCAN_TFAST_SJW(s) ((s) & 0x3) #define PUCAN_TFAST_SJW(s) ((s) & PUCAN_TFAST_SJW_MASK)
#define PUCAN_TFAST_TSEG2(t) ((t) & 0x7) #define PUCAN_TFAST_TSEG2(t) ((t) & PUCAN_TFAST_TSEG2_MASK)
#define PUCAN_TFAST_TSEG1(t) ((t) & 0xf) #define PUCAN_TFAST_TSEG1(t) ((t) & PUCAN_TFAST_TSEG1_MASK)
#define PUCAN_TFAST_BRP(b) ((b) & 0x3ff) #define PUCAN_TFAST_BRP(b) ((b) & PUCAN_TFAST_BRP_MASK)
struct __packed pucan_timing_fast { struct __packed pucan_timing_fast {
__le16 opcode_channel; __le16 opcode_channel;
......
...@@ -993,24 +993,24 @@ static void pcan_usb_fd_free(struct peak_usb_device *dev) ...@@ -993,24 +993,24 @@ static void pcan_usb_fd_free(struct peak_usb_device *dev)
static const struct can_bittiming_const pcan_usb_fd_const = { static const struct can_bittiming_const pcan_usb_fd_const = {
.name = "pcan_usb_fd", .name = "pcan_usb_fd",
.tseg1_min = 1, .tseg1_min = 1,
.tseg1_max = 64, .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
.tseg2_min = 1, .tseg2_min = 1,
.tseg2_max = 16, .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
.sjw_max = 16, .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
.brp_min = 1, .brp_min = 1,
.brp_max = 1024, .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
.brp_inc = 1, .brp_inc = 1,
}; };
static const struct can_bittiming_const pcan_usb_fd_data_const = { static const struct can_bittiming_const pcan_usb_fd_data_const = {
.name = "pcan_usb_fd", .name = "pcan_usb_fd",
.tseg1_min = 1, .tseg1_min = 1,
.tseg1_max = 16, .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
.tseg2_min = 1, .tseg2_min = 1,
.tseg2_max = 8, .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
.sjw_max = 4, .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
.brp_min = 1, .brp_min = 1,
.brp_max = 1024, .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
.brp_inc = 1, .brp_inc = 1,
}; };
...@@ -1065,24 +1065,24 @@ const struct peak_usb_adapter pcan_usb_fd = { ...@@ -1065,24 +1065,24 @@ const struct peak_usb_adapter pcan_usb_fd = {
static const struct can_bittiming_const pcan_usb_pro_fd_const = { static const struct can_bittiming_const pcan_usb_pro_fd_const = {
.name = "pcan_usb_pro_fd", .name = "pcan_usb_pro_fd",
.tseg1_min = 1, .tseg1_min = 1,
.tseg1_max = 64, .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
.tseg2_min = 1, .tseg2_min = 1,
.tseg2_max = 16, .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
.sjw_max = 16, .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
.brp_min = 1, .brp_min = 1,
.brp_max = 1024, .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
.brp_inc = 1, .brp_inc = 1,
}; };
static const struct can_bittiming_const pcan_usb_pro_fd_data_const = { static const struct can_bittiming_const pcan_usb_pro_fd_data_const = {
.name = "pcan_usb_pro_fd", .name = "pcan_usb_pro_fd",
.tseg1_min = 1, .tseg1_min = 1,
.tseg1_max = 16, .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
.tseg2_min = 1, .tseg2_min = 1,
.tseg2_max = 8, .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
.sjw_max = 4, .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
.brp_min = 1, .brp_min = 1,
.brp_max = 1024, .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
.brp_inc = 1, .brp_inc = 1,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment