diff options
author | Stephane Grosjean <s.grosjean@peak-system.com> | 2017-03-27 08:36:10 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2017-04-25 04:50:11 -0400 |
commit | ea8b65b596d78969629562f9728f76cbf565fbec (patch) | |
tree | 1b6e0f4ae8193ec533fd2decc8acf28d52cf10d9 | |
parent | 38a98bceaf5f786b931d16826fbb46e73280849b (diff) |
can: usb: Add support of PCAN-Chip USB stamp module
This patch adds the support of the PCAN-Chip USB, a stamp module for
customer hardware designs, which communicates via USB 2.0 with the
hardware. The integrated CAN controller supports the protocols CAN 2.0 A/B
as well as CAN FD. The physical CAN connection is determined by external
wiring. The Stamp module with its single-sided mounting and plated
half-holes is suitable for automatic assembly.
Note that the chip is equipped with the same logic than the PCAN-USB FD.
Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r-- | drivers/net/can/usb/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_core.c | 2 | ||||
-rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_core.h | 2 | ||||
-rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 72 |
4 files changed, 77 insertions, 0 deletions
diff --git a/drivers/net/can/usb/Kconfig b/drivers/net/can/usb/Kconfig index 8483a40e7e9e..3f8adc366af4 100644 --- a/drivers/net/can/usb/Kconfig +++ b/drivers/net/can/usb/Kconfig | |||
@@ -72,6 +72,7 @@ config CAN_PEAK_USB | |||
72 | PCAN-USB Pro dual CAN 2.0b channels USB adapter | 72 | PCAN-USB Pro dual CAN 2.0b channels USB adapter |
73 | PCAN-USB FD single CAN-FD channel USB adapter | 73 | PCAN-USB FD single CAN-FD channel USB adapter |
74 | PCAN-USB Pro FD dual CAN-FD channels USB adapter | 74 | PCAN-USB Pro FD dual CAN-FD channels USB adapter |
75 | PCAN-Chip USB CAN-FD to USB stamp module | ||
75 | 76 | ||
76 | (see also http://www.peak-system.com). | 77 | (see also http://www.peak-system.com). |
77 | 78 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c index 0b0302af3bd2..57913dbbae0a 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c | |||
@@ -39,6 +39,7 @@ static struct usb_device_id peak_usb_table[] = { | |||
39 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)}, | 39 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)}, |
40 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)}, | 40 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)}, |
41 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)}, | 41 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)}, |
42 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBCHIP_PRODUCT_ID)}, | ||
42 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBX6_PRODUCT_ID)}, | 43 | {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBX6_PRODUCT_ID)}, |
43 | {} /* Terminating entry */ | 44 | {} /* Terminating entry */ |
44 | }; | 45 | }; |
@@ -51,6 +52,7 @@ static const struct peak_usb_adapter *const peak_usb_adapters_list[] = { | |||
51 | &pcan_usb_pro, | 52 | &pcan_usb_pro, |
52 | &pcan_usb_fd, | 53 | &pcan_usb_fd, |
53 | &pcan_usb_pro_fd, | 54 | &pcan_usb_pro_fd, |
55 | &pcan_usb_chip, | ||
54 | &pcan_usb_x6, | 56 | &pcan_usb_x6, |
55 | }; | 57 | }; |
56 | 58 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.h b/drivers/net/can/usb/peak_usb/pcan_usb_core.h index 3cbfb069893d..c01316cac354 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.h +++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.h | |||
@@ -27,6 +27,7 @@ | |||
27 | #define PCAN_USBPRO_PRODUCT_ID 0x000d | 27 | #define PCAN_USBPRO_PRODUCT_ID 0x000d |
28 | #define PCAN_USBPROFD_PRODUCT_ID 0x0011 | 28 | #define PCAN_USBPROFD_PRODUCT_ID 0x0011 |
29 | #define PCAN_USBFD_PRODUCT_ID 0x0012 | 29 | #define PCAN_USBFD_PRODUCT_ID 0x0012 |
30 | #define PCAN_USBCHIP_PRODUCT_ID 0x0013 | ||
30 | #define PCAN_USBX6_PRODUCT_ID 0x0014 | 31 | #define PCAN_USBX6_PRODUCT_ID 0x0014 |
31 | 32 | ||
32 | #define PCAN_USB_DRIVER_NAME "peak_usb" | 33 | #define PCAN_USB_DRIVER_NAME "peak_usb" |
@@ -90,6 +91,7 @@ struct peak_usb_adapter { | |||
90 | extern const struct peak_usb_adapter pcan_usb; | 91 | extern const struct peak_usb_adapter pcan_usb; |
91 | extern const struct peak_usb_adapter pcan_usb_pro; | 92 | extern const struct peak_usb_adapter pcan_usb_pro; |
92 | extern const struct peak_usb_adapter pcan_usb_fd; | 93 | extern const struct peak_usb_adapter pcan_usb_fd; |
94 | extern const struct peak_usb_adapter pcan_usb_chip; | ||
93 | extern const struct peak_usb_adapter pcan_usb_pro_fd; | 95 | extern const struct peak_usb_adapter pcan_usb_pro_fd; |
94 | extern const struct peak_usb_adapter pcan_usb_x6; | 96 | extern const struct peak_usb_adapter pcan_usb_x6; |
95 | 97 | ||
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c index 304732550f0a..528d3bb4917f 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c | |||
@@ -1061,6 +1061,78 @@ const struct peak_usb_adapter pcan_usb_fd = { | |||
1061 | .do_get_berr_counter = pcan_usb_fd_get_berr_counter, | 1061 | .do_get_berr_counter = pcan_usb_fd_get_berr_counter, |
1062 | }; | 1062 | }; |
1063 | 1063 | ||
1064 | /* describes the PCAN-CHIP USB */ | ||
1065 | static const struct can_bittiming_const pcan_usb_chip_const = { | ||
1066 | .name = "pcan_chip_usb", | ||
1067 | .tseg1_min = 1, | ||
1068 | .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS), | ||
1069 | .tseg2_min = 1, | ||
1070 | .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS), | ||
1071 | .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS), | ||
1072 | .brp_min = 1, | ||
1073 | .brp_max = (1 << PUCAN_TSLOW_BRP_BITS), | ||
1074 | .brp_inc = 1, | ||
1075 | }; | ||
1076 | |||
1077 | static const struct can_bittiming_const pcan_usb_chip_data_const = { | ||
1078 | .name = "pcan_chip_usb", | ||
1079 | .tseg1_min = 1, | ||
1080 | .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS), | ||
1081 | .tseg2_min = 1, | ||
1082 | .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS), | ||
1083 | .sjw_max = (1 << PUCAN_TFAST_SJW_BITS), | ||
1084 | .brp_min = 1, | ||
1085 | .brp_max = (1 << PUCAN_TFAST_BRP_BITS), | ||
1086 | .brp_inc = 1, | ||
1087 | }; | ||
1088 | |||
1089 | const struct peak_usb_adapter pcan_usb_chip = { | ||
1090 | .name = "PCAN-Chip USB", | ||
1091 | .device_id = PCAN_USBCHIP_PRODUCT_ID, | ||
1092 | .ctrl_count = PCAN_USBFD_CHANNEL_COUNT, | ||
1093 | .ctrlmode_supported = CAN_CTRLMODE_FD | | ||
1094 | CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY, | ||
1095 | .clock = { | ||
1096 | .freq = PCAN_UFD_CRYSTAL_HZ, | ||
1097 | }, | ||
1098 | .bittiming_const = &pcan_usb_chip_const, | ||
1099 | .data_bittiming_const = &pcan_usb_chip_data_const, | ||
1100 | |||
1101 | /* size of device private data */ | ||
1102 | .sizeof_dev_private = sizeof(struct pcan_usb_fd_device), | ||
1103 | |||
1104 | /* timestamps usage */ | ||
1105 | .ts_used_bits = 32, | ||
1106 | .ts_period = 1000000, /* calibration period in ts. */ | ||
1107 | .us_per_ts_scale = 1, /* us = (ts * scale) >> shift */ | ||
1108 | .us_per_ts_shift = 0, | ||
1109 | |||
1110 | /* give here messages in/out endpoints */ | ||
1111 | .ep_msg_in = PCAN_USBPRO_EP_MSGIN, | ||
1112 | .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0}, | ||
1113 | |||
1114 | /* size of rx/tx usb buffers */ | ||
1115 | .rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE, | ||
1116 | .tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE, | ||
1117 | |||
1118 | /* device callbacks */ | ||
1119 | .intf_probe = pcan_usb_pro_probe, /* same as PCAN-USB Pro */ | ||
1120 | .dev_init = pcan_usb_fd_init, | ||
1121 | |||
1122 | .dev_exit = pcan_usb_fd_exit, | ||
1123 | .dev_free = pcan_usb_fd_free, | ||
1124 | .dev_set_bus = pcan_usb_fd_set_bus, | ||
1125 | .dev_set_bittiming = pcan_usb_fd_set_bittiming_slow, | ||
1126 | .dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast, | ||
1127 | .dev_decode_buf = pcan_usb_fd_decode_buf, | ||
1128 | .dev_start = pcan_usb_fd_start, | ||
1129 | .dev_stop = pcan_usb_fd_stop, | ||
1130 | .dev_restart_async = pcan_usb_fd_restart_async, | ||
1131 | .dev_encode_msg = pcan_usb_fd_encode_msg, | ||
1132 | |||
1133 | .do_get_berr_counter = pcan_usb_fd_get_berr_counter, | ||
1134 | }; | ||
1135 | |||
1064 | /* describes the PCAN-USB Pro FD adapter */ | 1136 | /* describes the PCAN-USB Pro FD adapter */ |
1065 | static const struct can_bittiming_const pcan_usb_pro_fd_const = { | 1137 | static const struct can_bittiming_const pcan_usb_pro_fd_const = { |
1066 | .name = "pcan_usb_pro_fd", | 1138 | .name = "pcan_usb_pro_fd", |