]> rtime.felk.cvut.cz Git - lincan.git/blob - lincan/include/mcp2515.h
Spican1 support added
[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
61 typedef struct {
62         struct canchip_t *chip;
63         uint8_t status;
64         uint8_t spi_buf[SPI_BUF_LEN];
65         struct work_struct workqueue_handler;
66         struct tasklet_struct tasklet_handler;
67         MCP2515_ERRCNT errcnt;
68         uint32_t wakeint_cnt;
69 } MCP2515_PRIV;
70
71
72
73 /* PeliCAN mode */
74 enum MCP2515_regs {
75         /// TXBnCTRL - TRANSMIT BUFFER n CONTROL REGISTERS
76         MCP2515_TXB0CTRL = 0x30,
77         MCP2515_TXB1CTRL = 0x40,
78         MCP2515_TXB2CTRL = 0x50,
79
80         /// TXRTSCTRL - TXnRTS PIN CONTROL AND STATUS REGISTER  
81         MCP2515_TXRTSCTRL = 0x0d,
82
83         /// TXBnSIDH - TRANSMIT BUFFER n STANDARD IDENTIFIER HIGH
84         MCP2515_TXB0SIDH = 0x31,
85         MCP2515_TXB1SIDH = 0x41,
86         MCP2515_TXB2SIDH = 0x51,
87
88         /// TXBnSIDL - TRANSMIT BUFFER n STANDARD IDENTIFIER LOW
89         MCP2515_TXB0SIDL = 0x32,
90         MCP2515_TXB1SIDL = 0x42,
91         MCP2515_TXB2SIDL = 0x52,
92
93         /// TXBnEID8 - TRANSMIT BUFFER n EXTENDED IDENTIFIER HIGH
94         MCP2515_TXB0EID8 = 0x33,
95         MCP2515_TXB1EID8 = 0x43,
96         MCP2515_TXB2EID8 = 0x53,
97
98         /// TXBnEID0 - TRANSMIT BUFFER n EXTENDED IDENTIFIER LOW
99         MCP2515_TXB0EID0 = 0x34,
100         MCP2515_TXB1EID0 = 0x44,
101         MCP2515_TXB2EID0 = 0x54,
102
103         /// TXBnDLC - TRANSMIT BUFFER n DATA LENGTH CODE
104         MCP2515_TXB0DLC = 0x35,
105         MCP2515_TXB1DLC = 0x45,
106         MCP2515_TXB2DLC = 0x55,
107
108         /// TXBnDm - TRANSMIT BUFFER n DATA
109         MCP2515_TXB0DATA = 0x36, /* 0x36-0x3d */
110         MCP2515_TXB1DATA = 0x46, /* 0x46-0x4d */
111         MCP2515_TXB2DATA = 0x56, /* 0x56-0x5d */
112
113         /// RXB0CTRL - RECEIVE BUFFER CONTROL
114         MCP2515_RXB0CTRL = 0x60,
115         MCP2515_RXB1CTRL = 0x70,
116
117         /// BFPCTRL - RXnBF PIN CONTROL AND STATUS
118         MCP2515_BFPCTRL = 0x0c,
119
120         /// RXBnSIDH - RECEIVE BUFFER n STANDARD IDENTIFIER HIGH
121         MCP2515_RXB0SIDH = 0x61,
122         MCP2515_RXB1SIDH = 0x71,
123         
124         /// RXBnSIDL - RECEIVE BUFFER n STANDARD IDENTIFIER LOW
125         MCP2515_RXB0SIDL = 0x62,
126         MCP2515_RXB1SIDL = 0x72,
127
128         /// RXBnEID8 - RECEIVE BUFFER n EXTENDED IDENTIFIER HIGH
129         MCP2515_RXB0EID8 = 63,
130         MCP2515_RXB1EID8 = 73,
131
132         /// RXBnEID0 - RECEIVE BUFFER n EXTENDED IDENTIFIER LOW
133         MCP2515_RXB0EID0 = 64,
134         MCP2515_RXB1EID0 = 74,
135
136         /// RXBnDLC - RECEIVE BUFFER n DATA LENGHT CODE
137         MCP2515_RXB0DLC = 65,
138         MCP2515_RXB1DLC = 75,
139
140         /// RXBnDM - RECEIVE BUFFER n DATA
141         MCP2515_RXB0DATA = 0x66, /* 0x66-0x6d */
142         MCP2515_RXB1DATA = 0x76, /* 0x76-0x7d */
143
144         /// RXFnSIDH - FILTER n STANDARD IDENTIFIER HIGH
145         MCP2515_RXF0SIDH = 0x00,
146         MCP2515_RXF1SIDH = 0x04,
147         MCP2515_RXF2SIDH = 0x08,
148         MCP2515_RXF3SIDH = 0x10,
149         MCP2515_RXF4SIDH = 0x14,
150         MCP2515_RXF5SIDH = 0x18,
151
152         /// RXFnSIDL - FILTER n STANDARD IDENTIFIER LOW
153         MCP2515_RXF0SIDL = 0x01,
154         MCP2515_RXF1SIDL = 0x05,
155         MCP2515_RXF2SIDL = 0x09,
156         MCP2515_RXF3SIDL = 0x11,
157         MCP2515_RXF4SIDL = 0x15,
158         MCP2515_RXF5SIDL = 0x19,
159
160         /// RXFnEID8 - FILTER n EXTENDED IDENTIFIER HIGH
161         MCP2515_RXF0EID8 = 0x02,
162         MCP2515_RXF1EID8 = 0x06,
163         MCP2515_RXF2EID8 = 0x0a,
164         MCP2515_RXF3EID8 = 0x12,
165         MCP2515_RXF4EID8 = 0x16,
166         MCP2515_RXF5EID8 = 0x1a,
167
168         /// RXFnEID0 - FILTER n EXTENDED IDENTIFIER LOW
169         MCP2515_RXF0EID0 = 0x03,
170         MCP2515_RXF1EID0 = 0x07,
171         MCP2515_RXF2EID0 = 0x0b,
172         MCP2515_RXF3EID0 = 0x13,
173         MCP2515_RXF4EID0 = 0x17,
174         MCP2515_RXF5EID0 = 0x1b,
175
176         /// RXMnSIDH - MASK n STANDARD IDENTIFIER HIGH
177         MCP2515_RXM0SIDH = 0x20,
178         MCP2515_RXM1SIDH = 0x24,
179
180         /// RXMnSIDL - MASK n STANDARD IDENTIFIER LOW
181         MCP2515_RXM0SIDL = 0x21,
182         MCP2515_RXM1SIDL = 0x25,
183
184         /// RXMnEID8 - MASK n EXTENDED IDENTIFIER HIGH
185         MCP2515_RXM0EID8 = 0x22,
186         MCP2515_RXM1EID8 = 0x26,
187
188         /// RXMnEID0 - MASK n EXTENDED IDENTIFIER LOW
189         MCP2515_RXM0EID0 = 0x23,
190         MCP2515_RXM1EID0 = 0x27,
191
192         /// CNFn - CONFIGURATION REGS
193         MCP2515_CNF1 = 0x2a,
194         MCP2515_CNF2 = 0x29,
195         MCP2515_CNF3 = 0x28,
196
197         /// TEC - TRANSMIT ERROR COUNTER
198         MCP2515_TEC = 0x1c,
199
200         ///  REC - RECEIVER ERROR COUNTER
201         MCP2515_REC = 0x1d,
202
203         /// EFLG - ERROR FLAG
204         MCP2515_EFLG = 0x2d,
205
206         /// CANINTE - INTERRUPT ENABLE
207         MCP2515_CANINTE = 0x2b,
208
209         /// CANINTF - INTERRUPT FLAG
210         MCP2515_CANINTF = 0x2c,
211
212         /// CANCTRL - CAN CONTROL REGISTER
213         MCP2515_CANCTRL = 0x0f,
214
215         /// CANSTAT - CAN STATUS REGISTER
216         MCP2515_CANSTAT = 0x0e
217 };
218
219
220 /** Mode Register Bits */
221 enum mcp2515_MOD {
222         mcpMOD_NORM     = 0<<5,  // Normal Operation Mode
223         mcpMOD_SLEEP    = 1<<5,  // Sleep Mode
224         mcpMOD_LOOPBACK = 2<<5,  // Loopback Mode
225         mcpMOD_LISTEN   = 3<<5,  // Listen-only Mode
226         mcpMOD_CONFIG   = 4<<5,  // Configuration Mode
227         mcpMOD_MASK     = 7<<5 // Mask for mod bits
228 };
229
230 /* BFPCTRL - RXnBF PIN CONTROL AND STATUS */
231 enum mcp2515_RXBF {
232         mcpB0BFE = 1<<2,
233         mcpB1BFE = 1<<3,
234         mcpB0BFS = 1<<4,
235         mcpB1BFS = 1<<5
236 };
237
238 /* RXBnSIDL bits */
239 enum mcp2515_RXBSIDL {
240         mcpIDE = 1 << 3,
241         mcpSRR = 1 << 4
242 };
243
244 /* RXBnDLC bits */
245 enum mcp2515_RXBDLC {
246         mcpDLC_MASK = 0x0f,
247         mcpRTR = 1 << 6
248 };
249
250 /* RXB0CTRL */
251 enum mcp2515_RXB0CTRL {
252         mcpFILHIT0 = 1 << 0,
253         mcpBUKT    = 1 << 2,
254         mcpRXRTR   = 1 << 3,
255         mcpRXM_MASK = 3 << 5
256 };
257
258 enum mcp2515_ICOD {
259         mcpICOD_RXB0 = 7,
260         mcpICOD_RXB1 = 6,
261         mcpICOD_TXB2 = 5,
262         mcpICOD_TXB1 = 4,       
263         mcpICOD_TXB0 = 3,
264         mcpICOD_WAKE = 2,
265         mcpICOD_ERR  = 1
266 };
267
268 enum mcp2515_TXBCTRL {
269         mcpTXREQ = 1 << 3,
270         mcpTXERR = 1 << 4,
271         mcpMLOA  = 1 << 5,
272         mcpABTF  = 1 << 6
273 };
274
275 enum mcp2515_TXBSIDL {
276         mcpEXIDE = 1 << 3,
277         mcpEID_MASK = 0x3
278 };
279
280 enum mcp2515_INT {
281         mcpRX0INT   = 1 << 0,
282         mcpRX1INT   = 1 << 1,
283         mcpTX0INT   = 1 << 2,
284         mcpTX1INT   = 1 << 3,
285         mcpTX2INT   = 1 << 4,
286         mcpERRINT   = 1 << 5,
287         mcpWAKINT   = 1 << 6,
288         mcpMERREINT = 1 << 7
289 };
290
291 /* Error flags EFLG */
292 enum mcp2515_EFLG {
293         mcpEWARN  = 1 << 0,
294         mcpRXWAR  = 1 << 1,
295         mcpTXWAR  = 1 << 2,
296         mcpRXEP   = 1 << 3,
297         mcpTXEP   = 1 << 4,
298         mcpTXBO   = 1 << 5,
299         mcpRX0OVR = 1 << 6,
300         mcpRX1OVR = 1 << 7
301 };
302
303 #endif