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 */
35 struct __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 */
49 struct __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 */
81 struct __packed pcan_usb_pro_btr {
82 	u8 data_type;
83 	u8 channel;
84 	__le16 dummy;
85 	__le32 CCBT;
86 };
87 
88 struct __packed pcan_usb_pro_busact {
89 	u8 data_type;
90 	u8 channel;
91 	__le16 onoff;
92 };
93 
94 struct __packed pcan_usb_pro_silent {
95 	u8 data_type;
96 	u8 channel;
97 	__le16 onoff;
98 };
99 
100 struct __packed pcan_usb_pro_filter {
101 	u8 data_type;
102 	u8 dummy;
103 	__le16 filter_mode;
104 };
105 
106 struct __packed pcan_usb_pro_setts {
107 	u8 data_type;
108 	u8 dummy;
109 	__le16 mode;
110 };
111 
112 struct __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 
125 struct __packed pcan_usb_pro_setled {
126 	u8 data_type;
127 	u8 channel;
128 	__le16 mode;
129 	__le32 timeout;
130 };
131 
132 struct __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 
148 struct __packed pcan_usb_pro_rxstatus {
149 	u8 data_type;
150 	u8 channel;
151 	__le16 status;
152 	__le32 ts32;
153 	__le32 err_frm;
154 };
155 
156 struct __packed pcan_usb_pro_rxts {
157 	u8 data_type;
158 	u8 dummy[3];
159 	__le32 ts64[2];
160 };
161 
162 struct __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 
171 union 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 
186 int pcan_usb_pro_probe(struct usb_interface *intf);
187 int pcan_usb_pro_send_req(struct peak_usb_device *dev, int req_id,
188 			  int req_value, void *req_addr, int req_size);
189 void pcan_usb_pro_restart_complete(struct urb *urb);
190 
191 #endif
192