1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * CAN driver for PEAK System PCAN-USB Pro adapter
4 * Derived from the PCAN project file driver/src/pcan_usbpro_fw.h
5 *
6 * Copyright (C) 2003-2011 PEAK System-Technik GmbH
7 * Copyright (C) 2011-2012 Stephane Grosjean <s.grosjean@peak-system.com>
8 */
9#ifndef PCAN_USB_PRO_H
10#define PCAN_USB_PRO_H
11
12/*
13 * USB Vendor request data types
14 */
15#define PCAN_USBPRO_REQ_INFO		0
16#define PCAN_USBPRO_REQ_FCT		2
17
18/* Vendor Request value for XXX_INFO */
19#define PCAN_USBPRO_INFO_BL		0
20#define PCAN_USBPRO_INFO_FW		1
21
22/* PCAN-USB Pro (FD) Endpoints */
23#define PCAN_USBPRO_EP_CMDOUT		1
24#define PCAN_USBPRO_EP_CMDIN		(PCAN_USBPRO_EP_CMDOUT | USB_DIR_IN)
25#define PCAN_USBPRO_EP_MSGOUT_0		2
26#define PCAN_USBPRO_EP_MSGIN		(PCAN_USBPRO_EP_MSGOUT_0 | USB_DIR_IN)
27#define PCAN_USBPRO_EP_MSGOUT_1		3
28#define PCAN_USBPRO_EP_UNUSED		(PCAN_USBPRO_EP_MSGOUT_1 | USB_DIR_IN)
29
30/* Vendor Request value for XXX_FCT */
31#define PCAN_USBPRO_FCT_DRVLD		5 /* tell device driver is loaded */
32#define PCAN_USBPRO_FCT_DRVLD_REQ_LEN	16
33
34/* PCAN_USBPRO_INFO_BL vendor request record type */
35struct __packed pcan_usb_pro_blinfo {
36	__le32 ctrl_type;
37	u8 version[4];
38	u8 day;
39	u8 month;
40	u8 year;
41	u8 dummy;
42	__le32 serial_num_hi;
43	__le32 serial_num_lo;
44	__le32 hw_type;
45	__le32 hw_rev;
46};
47
48/* PCAN_USBPRO_INFO_FW vendor request record type */
49struct __packed pcan_usb_pro_fwinfo {
50	__le32 ctrl_type;
51	u8 version[4];
52	u8 day;
53	u8 month;
54	u8 year;
55	u8 dummy;
56	__le32 fw_type;
57};
58
59/*
60 * USB Command record types
61 */
62#define PCAN_USBPRO_SETBTR	0x02
63#define PCAN_USBPRO_SETBUSACT	0x04
64#define PCAN_USBPRO_SETSILENT	0x05
65#define PCAN_USBPRO_SETDEVID	0x06
66#define PCAN_USBPRO_SETFILTR	0x0a
67#define PCAN_USBPRO_SETTS	0x10
68#define PCAN_USBPRO_GETDEVID	0x12
69#define PCAN_USBPRO_SETLED	0x1C
70#define PCAN_USBPRO_RXMSG8	0x80
71#define PCAN_USBPRO_RXMSG4	0x81
72#define PCAN_USBPRO_RXMSG0	0x82
73#define PCAN_USBPRO_RXRTR	0x83
74#define PCAN_USBPRO_RXSTATUS	0x84
75#define PCAN_USBPRO_RXTS	0x85
76#define PCAN_USBPRO_TXMSG8	0x41
77#define PCAN_USBPRO_TXMSG4	0x42
78#define PCAN_USBPRO_TXMSG0	0x43
79
80/* record structures */
81struct __packed pcan_usb_pro_btr {
82	u8 data_type;
83	u8 channel;
84	__le16 dummy;
85	__le32 CCBT;
86};
87
88struct __packed pcan_usb_pro_busact {
89	u8 data_type;
90	u8 channel;
91	__le16 onoff;
92};
93
94struct __packed pcan_usb_pro_silent {
95	u8 data_type;
96	u8 channel;
97	__le16 onoff;
98};
99
100struct __packed pcan_usb_pro_filter {
101	u8 data_type;
102	u8 dummy;
103	__le16 filter_mode;
104};
105
106struct __packed pcan_usb_pro_setts {
107	u8 data_type;
108	u8 dummy;
109	__le16 mode;
110};
111
112struct __packed pcan_usb_pro_devid {
113	u8 data_type;
114	u8 channel;
115	__le16 dummy;
116	__le32 dev_num;
117};
118
119#define PCAN_USBPRO_LED_DEVICE		0x00
120#define PCAN_USBPRO_LED_BLINK_FAST	0x01
121#define PCAN_USBPRO_LED_BLINK_SLOW	0x02
122#define PCAN_USBPRO_LED_ON		0x03
123#define PCAN_USBPRO_LED_OFF		0x04
124
125struct __packed pcan_usb_pro_setled {
126	u8 data_type;
127	u8 channel;
128	__le16 mode;
129	__le32 timeout;
130};
131
132struct __packed pcan_usb_pro_rxmsg {
133	u8 data_type;
134	u8 client;
135	u8 flags;
136	u8 len;
137	__le32 ts32;
138	__le32 id;
139
140	u8 data[8];
141};
142
143#define PCAN_USBPRO_STATUS_ERROR	0x0001
144#define PCAN_USBPRO_STATUS_BUS		0x0002
145#define PCAN_USBPRO_STATUS_OVERRUN	0x0004
146#define PCAN_USBPRO_STATUS_QOVERRUN	0x0008
147
148struct __packed pcan_usb_pro_rxstatus {
149	u8 data_type;
150	u8 channel;
151	__le16 status;
152	__le32 ts32;
153	__le32 err_frm;
154};
155
156struct __packed pcan_usb_pro_rxts {
157	u8 data_type;
158	u8 dummy[3];
159	__le32 ts64[2];
160};
161
162struct __packed pcan_usb_pro_txmsg {
163	u8 data_type;
164	u8 client;
165	u8 flags;
166	u8 len;
167	__le32 id;
168	u8 data[8];
169};
170
171union pcan_usb_pro_rec {
172	u8				data_type;
173	struct pcan_usb_pro_btr		btr;
174	struct pcan_usb_pro_busact	bus_act;
175	struct pcan_usb_pro_silent	silent_mode;
176	struct pcan_usb_pro_filter	filter_mode;
177	struct pcan_usb_pro_setts	ts;
178	struct pcan_usb_pro_devid	dev_id;
179	struct pcan_usb_pro_setled	set_led;
180	struct pcan_usb_pro_rxmsg	rx_msg;
181	struct pcan_usb_pro_rxstatus	rx_status;
182	struct pcan_usb_pro_rxts	rx_ts;
183	struct pcan_usb_pro_txmsg	tx_msg;
184};
185
186int pcan_usb_pro_probe(struct usb_interface *intf);
187int pcan_usb_pro_send_req(struct peak_usb_device *dev, int req_id,
188			  int req_value, void *req_addr, int req_size);
189void pcan_usb_pro_restart_complete(struct urb *urb);
190
191#endif
192