]> rtime.felk.cvut.cz Git - lincan.git/blob - lincan/include/mcp2515.h
Support for asynchronous SPI messages and callbacks
[lincan.git] / lincan / include / mcp2515.h
1 #ifndef MCP2515_H
2 #define MCP2515_H
3 /* mcp2515.h
4  * Header file for the Linux CAN-bus driver.
5  * Written by Sergei Sharonov sharonov@halliburton.com
6  * sja1000p was used as a prototype
7  * This software is released under the GPL-License.
8  * Version lincan-0.3   Feb 2006
9  */
10
11 // Fixup for old kernels - always defined for 2.6
12 #ifndef container_of
13 #define container_of(ptr, type, member) ({                      \
14         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
15         (type *)( (char *)__mptr - offsetof(type,member) );})
16 #endif
17
18
19 int mcp2515_chip_config(struct canchip_t *chip);
20 int mcp2515_extended_mask(struct canchip_t *chip, unsigned long code, unsigned long mask);
21 int mcp2515_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
22                 int sampl_pt, int flags);
23 int mcp2515_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
24 int mcp2515_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
25                 struct canmsg_t *msg);
26 int mcp2515_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
27                 struct canmsg_t *msg);
28 int mcp2515_fill_chipspecops(struct canchip_t *chip);
29 int mcp2515_irq_handler(int irq, struct canchip_t *chip);
30
31 int mcp2515_disp(char *buf, char **start, off_t offset, 
32                  int count, int *eof, void *data);
33
34
35
36 typedef struct {
37         uint8_t sidh;
38         uint8_t sidl;
39         uint8_t eid8;
40         uint8_t eid0;
41         uint8_t dlc;
42         uint8_t data[8];
43 } __attribute__((packed)) MCP2515_FRAME;
44
45 #define SPI_BUF_LEN 16          /* 13+2 bytes max transfer len, 1 spare */
46
47 typedef struct {
48         uint32_t rx1ovr;
49         uint32_t rx0ovr;
50         uint32_t txbo;
51         uint32_t txep;
52         uint32_t rxep;
53         uint32_t txwar;
54         uint32_t rxwar;
55         uint32_t ewarn;
56         uint32_t merre;
57 } MCP2515_ERRCNT;       
58
59 #define MCP2515_STATUS_SHUTDOWN (1)
60 #define MCP2515_TXBUF_NUM (3)
61
62 typedef struct {
63         struct canchip_t *chip;
64         uint8_t status;
65         uint8_t spi_buf[SPI_BUF_LEN];
66         struct work_struct workqueue_handler;
67         struct tasklet_struct tasklet_handler;
68
69         struct work_struct txwq_handler;
70         DECLARE_BITMAP(txfree, MCP2515_TXBUF_NUM);
71
72         MCP2515_ERRCNT errcnt;
73         uint32_t wakeint_cnt;
74 } MCP2515_PRIV;
75
76
77
78 /* PeliCAN mode */
79 enum MCP2515_regs {
80         /// TXBnCTRL - TRANSMIT BUFFER n CONTROL REGISTERS
81         MCP2515_TXB0CTRL = 0x30,
82         MCP2515_TXB1CTRL = 0x40,
83         MCP2515_TXB2CTRL = 0x50,
84
85         /// TXRTSCTRL - TXnRTS PIN CONTROL AND STATUS REGISTER  
86         MCP2515_TXRTSCTRL = 0x0d,
87
88         /// TXBnSIDH - TRANSMIT BUFFER n STANDARD IDENTIFIER HIGH
89         MCP2515_TXB0SIDH = 0x31,
90         MCP2515_TXB1SIDH = 0x41,
91         MCP2515_TXB2SIDH = 0x51,
92
93         /// TXBnSIDL - TRANSMIT BUFFER n STANDARD IDENTIFIER LOW
94         MCP2515_TXB0SIDL = 0x32,
95         MCP2515_TXB1SIDL = 0x42,
96         MCP2515_TXB2SIDL = 0x52,
97
98         /// TXBnEID8 - TRANSMIT BUFFER n EXTENDED IDENTIFIER HIGH
99         MCP2515_TXB0EID8 = 0x33,
100         MCP2515_TXB1EID8 = 0x43,
101         MCP2515_TXB2EID8 = 0x53,
102
103         /// TXBnEID0 - TRANSMIT BUFFER n EXTENDED IDENTIFIER LOW
104         MCP2515_TXB0EID0 = 0x34,
105         MCP2515_TXB1EID0 = 0x44,
106         MCP2515_TXB2EID0 = 0x54,
107
108         /// TXBnDLC - TRANSMIT BUFFER n DATA LENGTH CODE
109         MCP2515_TXB0DLC = 0x35,
110         MCP2515_TXB1DLC = 0x45,
111         MCP2515_TXB2DLC = 0x55,
112
113         /// TXBnDm - TRANSMIT BUFFER n DATA
114         MCP2515_TXB0DATA = 0x36, /* 0x36-0x3d */
115         MCP2515_TXB1DATA = 0x46, /* 0x46-0x4d */
116         MCP2515_TXB2DATA = 0x56, /* 0x56-0x5d */
117
118         /// RXB0CTRL - RECEIVE BUFFER CONTROL
119         MCP2515_RXB0CTRL = 0x60,
120         MCP2515_RXB1CTRL = 0x70,
121
122         /// BFPCTRL - RXnBF PIN CONTROL AND STATUS
123         MCP2515_BFPCTRL = 0x0c,
124
125         /// RXBnSIDH - RECEIVE BUFFER n STANDARD IDENTIFIER HIGH
126         MCP2515_RXB0SIDH = 0x61,
127         MCP2515_RXB1SIDH = 0x71,
128         
129         /// RXBnSIDL - RECEIVE BUFFER n STANDARD IDENTIFIER LOW
130         MCP2515_RXB0SIDL = 0x62,
131         MCP2515_RXB1SIDL = 0x72,
132
133         /// RXBnEID8 - RECEIVE BUFFER n EXTENDED IDENTIFIER HIGH
134         MCP2515_RXB0EID8 = 63,
135         MCP2515_RXB1EID8 = 73,
136
137         /// RXBnEID0 - RECEIVE BUFFER n EXTENDED IDENTIFIER LOW
138         MCP2515_RXB0EID0 = 64,
139         MCP2515_RXB1EID0 = 74,
140
141         /// RXBnDLC - RECEIVE BUFFER n DATA LENGHT CODE
142         MCP2515_RXB0DLC = 65,
143         MCP2515_RXB1DLC = 75,
144
145         /// RXBnDM - RECEIVE BUFFER n DATA
146         MCP2515_RXB0DATA = 0x66, /* 0x66-0x6d */
147         MCP2515_RXB1DATA = 0x76, /* 0x76-0x7d */
148
149         /// RXFnSIDH - FILTER n STANDARD IDENTIFIER HIGH
150         MCP2515_RXF0SIDH = 0x00,
151         MCP2515_RXF1SIDH = 0x04,
152         MCP2515_RXF2SIDH = 0x08,
153         MCP2515_RXF3SIDH = 0x10,
154         MCP2515_RXF4SIDH = 0x14,
155         MCP2515_RXF5SIDH = 0x18,
156
157         /// RXFnSIDL - FILTER n STANDARD IDENTIFIER LOW
158         MCP2515_RXF0SIDL = 0x01,
159         MCP2515_RXF1SIDL = 0x05,
160         MCP2515_RXF2SIDL = 0x09,
161         MCP2515_RXF3SIDL = 0x11,
162         MCP2515_RXF4SIDL = 0x15,
163         MCP2515_RXF5SIDL = 0x19,
164
165         /// RXFnEID8 - FILTER n EXTENDED IDENTIFIER HIGH
166         MCP2515_RXF0EID8 = 0x02,
167         MCP2515_RXF1EID8 = 0x06,
168         MCP2515_RXF2EID8 = 0x0a,
169         MCP2515_RXF3EID8 = 0x12,
170         MCP2515_RXF4EID8 = 0x16,
171         MCP2515_RXF5EID8 = 0x1a,
172
173         /// RXFnEID0 - FILTER n EXTENDED IDENTIFIER LOW
174         MCP2515_RXF0EID0 = 0x03,
175         MCP2515_RXF1EID0 = 0x07,
176         MCP2515_RXF2EID0 = 0x0b,
177         MCP2515_RXF3EID0 = 0x13,
178         MCP2515_RXF4EID0 = 0x17,
179         MCP2515_RXF5EID0 = 0x1b,
180
181         /// RXMnSIDH - MASK n STANDARD IDENTIFIER HIGH
182         MCP2515_RXM0SIDH = 0x20,
183         MCP2515_RXM1SIDH = 0x24,
184
185         /// RXMnSIDL - MASK n STANDARD IDENTIFIER LOW
186         MCP2515_RXM0SIDL = 0x21,
187         MCP2515_RXM1SIDL = 0x25,
188
189         /// RXMnEID8 - MASK n EXTENDED IDENTIFIER HIGH
190         MCP2515_RXM0EID8 = 0x22,
191         MCP2515_RXM1EID8 = 0x26,
192
193         /// RXMnEID0 - MASK n EXTENDED IDENTIFIER LOW
194         MCP2515_RXM0EID0 = 0x23,
195         MCP2515_RXM1EID0 = 0x27,
196
197         /// CNFn - CONFIGURATION REGS
198         MCP2515_CNF1 = 0x2a,
199         MCP2515_CNF2 = 0x29,
200         MCP2515_CNF3 = 0x28,
201
202         /// TEC - TRANSMIT ERROR COUNTER
203         MCP2515_TEC = 0x1c,
204
205         ///  REC - RECEIVER ERROR COUNTER
206         MCP2515_REC = 0x1d,
207
208         /// EFLG - ERROR FLAG
209         MCP2515_EFLG = 0x2d,
210
211         /// CANINTE - INTERRUPT ENABLE
212         MCP2515_CANINTE = 0x2b,
213
214         /// CANINTF - INTERRUPT FLAG
215         MCP2515_CANINTF = 0x2c,
216
217         /// CANCTRL - CAN CONTROL REGISTER
218         MCP2515_CANCTRL = 0x0f,
219
220         /// CANSTAT - CAN STATUS REGISTER
221         MCP2515_CANSTAT = 0x0e
222 };
223
224
225 /** Mode Register Bits */
226 enum mcp2515_MOD {
227         mcpMOD_NORM     = 0<<5,  // Normal Operation Mode
228         mcpMOD_SLEEP    = 1<<5,  // Sleep Mode
229         mcpMOD_LOOPBACK = 2<<5,  // Loopback Mode
230         mcpMOD_LISTEN   = 3<<5,  // Listen-only Mode
231         mcpMOD_CONFIG   = 4<<5,  // Configuration Mode
232         mcpMOD_MASK     = 7<<5 // Mask for mod bits
233 };
234
235 /* BFPCTRL - RXnBF PIN CONTROL AND STATUS */
236 enum mcp2515_RXBF {
237         mcpB0BFE = 1<<2,
238         mcpB1BFE = 1<<3,
239         mcpB0BFS = 1<<4,
240         mcpB1BFS = 1<<5
241 };
242
243 /* RXBnSIDL bits */
244 enum mcp2515_RXBSIDL {
245         mcpIDE = 1 << 3,
246         mcpSRR = 1 << 4
247 };
248
249 /* RXBnDLC bits */
250 enum mcp2515_RXBDLC {
251         mcpDLC_MASK = 0x0f,
252         mcpRTR = 1 << 6
253 };
254
255 /* RXB0CTRL */
256 enum mcp2515_RXB0CTRL {
257         mcpFILHIT0 = 1 << 0,
258         mcpBUKT    = 1 << 2,
259         mcpRXRTR   = 1 << 3,
260         mcpRXM_MASK = 3 << 5
261 };
262
263 enum mcp2515_ICOD {
264         mcpICOD_RXB0 = 7,
265         mcpICOD_RXB1 = 6,
266         mcpICOD_TXB2 = 5,
267         mcpICOD_TXB1 = 4,       
268         mcpICOD_TXB0 = 3,
269         mcpICOD_WAKE = 2,
270         mcpICOD_ERR  = 1
271 };
272
273 enum mcp2515_TXBCTRL {
274         mcpTXREQ = 1 << 3,
275         mcpTXERR = 1 << 4,
276         mcpMLOA  = 1 << 5,
277         mcpABTF  = 1 << 6
278 };
279
280 enum mcp2515_TXBSIDL {
281         mcpEXIDE = 1 << 3,
282         mcpEID_MASK = 0x3
283 };
284
285 enum mcp2515_INT {
286         mcpRX0INT   = 1 << 0,
287         mcpRX1INT   = 1 << 1,
288         mcpTX0INT   = 1 << 2,
289         mcpTX1INT   = 1 << 3,
290         mcpTX2INT   = 1 << 4,
291         mcpERRINT   = 1 << 5,
292         mcpWAKINT   = 1 << 6,
293         mcpMERREINT = 1 << 7
294 };
295
296 /* Error flags EFLG */
297 enum mcp2515_EFLG {
298         mcpEWARN  = 1 << 0,
299         mcpRXWAR  = 1 << 1,
300         mcpTXWAR  = 1 << 2,
301         mcpRXEP   = 1 << 3,
302         mcpTXEP   = 1 << 4,
303         mcpTXBO   = 1 << 5,
304         mcpRX0OVR = 1 << 6,
305         mcpRX1OVR = 1 << 7
306 };
307
308 #endif