SJA1000 clockout divisors listed explicitly.
[lincan.git] / lincan / include / sja1000p.h
1 /* sja1000p.h
2  * Header file for the Linux CAN-bus driver.
3  * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
4  * Added by T.Motylewski@bfad.de
5  * See app. note an97076.pdf from Philips Semiconductors 
6  * and SJA1000 data sheet
7  * PELICAN mode
8  * This software is released under the GPL-License.
9  * Version lincan-0.3  17 Jun 2004
10  */
11
12 int sja1000p_chip_config(struct canchip_t *chip);
13 int sja1000p_extended_mask(struct canchip_t *chip, unsigned long code, unsigned long mask);
14 int sja1000p_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
15                 int sampl_pt, int flags);
16 int sja1000p_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj);
17 int sja1000p_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
18                 struct canmsg_t *msg);
19 int sja1000p_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
20                 struct canmsg_t *msg);
21 int sja1000p_fill_chipspecops(struct canchip_t *chip);
22 int sja1000p_irq_handler(int irq, struct canchip_t *chip);
23
24
25 /* PeliCAN mode */
26 enum SJA1000_PeliCAN_regs {
27         SJAMOD  = 0x00,
28 /// Command register
29         SJACMR  = 0x01,
30 /// Status register
31         SJASR   = 0x02,
32 /// Interrupt register
33         SJAIR   = 0x03,
34 /// Interrupt Enable
35         SJAIER  = 0x04,
36 /// Bus Timing register 0
37         SJABTR0 = 0x06,
38 /// Bus Timing register 1
39         SJABTR1 = 0x07,
40 /// Output Control register
41         SJAOCR  = 0x08,
42 /// Arbitration Lost Capture
43         SJAALC  = 0x0b,
44 /// Error Code Capture
45         SJAECC  = 0x0c,
46 /// Error Warning Limit
47         SJAEWLR = 0x0d,
48 /// RX Error Counter
49         SJARXERR = 0x0e,
50 /// TX Error Counter
51         SJATXERR0 = 0x0e,
52         SJATXERR1 = 0x0f,
53 /// Rx Message Counter (number of msgs. in RX FIFO
54         SJARMC  = 0x1d,
55 /// Rx Buffer Start Addr. (address of current MSG)
56         SJARBSA = 0x1e,
57 /// Transmit Buffer (write) Receive Buffer (read) Frame Information
58         SJAFRM = 0x10,
59 /// ID bytes (11 bits in 0 and 1 or 16 bits in 0,1 and 13 bits in 2,3 (extended))
60         SJAID0 = 0x11, SJAID1 = 0x12, 
61 /// ID cont. for extended frames
62         SJAID2 = 0x13, SJAID3 = 0x14,
63 /// Data start standard frame
64         SJADATS = 0x13,
65 /// Data start extended frame
66         SJADATE = 0x15,
67 /// Acceptance Code (4 bytes) in RESET mode
68         SJAACR0 = 0x10,
69 /// Acceptance Mask (4 bytes) in RESET mode
70         SJAAMR0 = 0x14,
71 /// 4 bytes
72         SJA_PeliCAN_AC_LEN = 4, 
73 /// Clock Divider
74         SJACDR = 0x1f
75 };
76
77 /** Mode Register 0x00 */
78 enum sja1000_PeliCAN_MOD {
79         sjaMOD_SM = 1<<4,  // Sleep Mode (writable only in OPERATING mode)
80         sjaMOD_AFM= 1<<3,  // Acceptance Filter Mode (writable only in RESET)
81         sjaMOD_STM= 1<<2,  // Self Test Mode (writable only in RESET)
82         sjaMOD_LOM= 1<<1,  // Listen Only Mode (writable only in RESET)
83         sjaMOD_RM = 1      // Reset Mode
84 };
85
86 /** Command Register 0x01 */
87 enum sja1000_PeliCAN_CMR { 
88         sjaCMR_SRR= 1<<4,  // Self Reception Request (GoToSleep in BASIC mode)
89         sjaCMR_CDO= 1<<3,  // Clear Data Overrun
90         sjaCMR_RRB= 1<<2,  // Release Receive Buffer
91         sjaCMR_AT = 1<<1,  // Abort Transmission
92         sjaCMR_TR = 1 };   // Transmission Request
93
94 /** Status Register 0x02 */
95 enum sja1000_SR {
96         sjaSR_BS  = 1<<7,  // Bus Status
97         sjaSR_ES  = 1<<6,  // Error Status
98         sjaSR_TS  = 1<<5,  // Transmit Status
99         sjaSR_RS  = 1<<4,  // Receive Status
100         sjaSR_TCS = 1<<3,  // Transmission Complete Status
101         sjaSR_TBS = 1<<2,  // Transmit Buffer Status
102         sjaSR_DOS = 1<<1,  // Data Overrun Status
103         sjaSR_RBS = 1 };   // Receive Buffer Status
104
105 /** Interrupt Enable Register 0x04 */
106 enum sja1000_PeliCAN_IER {
107         sjaIER_BEIE= 1<<7, // Bus Error Interrupt Enable
108         sjaIER_ALIE= 1<<6, // Arbitration Lost Interrupt Enable
109         sjaIER_EPIE= 1<<5, // Error Passive Interrupt Enable
110         sjaIER_WUIE= 1<<4, // Wake-Up Interrupt Enable
111         sjaIER_DOIE= 1<<3, // Data Overrun Interrupt Enable
112         sjaIER_EIE = 1<<2, // Error Warning Interrupt Enable
113         sjaIER_TIE = 1<<1, // Transmit Interrupt Enable
114         sjaIER_RIE = 1,    // Receive Interrupt Enable
115         sjaENABLE_INTERRUPTS = sjaIER_BEIE|sjaIER_EPIE|sjaIER_DOIE|sjaIER_EIE|sjaIER_TIE|sjaIER_RIE,
116         sjaDISABLE_INTERRUPTS = 0
117 // WARNING: the chip automatically enters RESET (bus off) mode when 
118         // error counter > 255
119 };
120
121 /** Arbitration Lost Capture Register 0x0b.
122  * Counting starts from 0 (bit1 of ID). Bits 5-7 reserved*/
123 enum sja1000_PeliCAN_ALC {
124         sjaALC_SRTR = 0x0b,// Arbitration lost in bit SRTR
125         sjaALC_IDE  = 0x1c, // Arbitration lost in bit IDE
126         sjaALC_RTR  = 0x1f, // Arbitration lost in RTR
127 };
128
129 /** Error Code Capture Register 0x0c*/
130 enum sja1000_PeliCAN_ECC {
131         sjaECC_ERCC1 = 1<<7,
132         sjaECC_ERCC0 = 1<<6,
133         sjaECC_BIT   = 0,
134         sjaECC_FORM  = sjaECC_ERCC0,
135         sjaECC_STUFF = sjaECC_ERCC1,
136         sjaECC_OTHER = sjaECC_ERCC0 | sjaECC_ERCC1,
137         sjaECC_DIR   = 1<<5,    // 1 == RX, 0 == TX
138         sjaECC_SEG_M = (1<<5) -1 // Segment mask, see page 37 of SJA1000 Data Sheet
139 };
140
141 /** Frame format information 0x10 */
142 enum sja1000_PeliCAN_FRM {
143         sjaFRM_FF = 1<<7, // Frame Format 1 == extended, 0 == standard
144         sjaFRM_RTR = 1<<6, // Remote request
145         sjaFRM_DLC_M = (1<<4)-1 // Length Mask
146 };
147
148
149 /** Interrupt (status) Register 0x03 */
150 enum sja1000_PeliCAN_IR {
151         sjaIR_BEI = 1<<7,  // Bus Error Interrupt
152         sjaIR_ALI = 1<<6,  // Arbitration Lost Interrupt
153         sjaIR_EPI = 1<<5,  // Error Passive Interrupt (entered error passive state or error active state)
154         sjaIR_WUI = 1<<4,  // Wake-Up Interrupt
155         sjaIR_DOI = 1<<3,  // Data Overrun Interrupt
156         sjaIR_EI  = 1<<2,  // Error Interrupt
157         sjaIR_TI  = 1<<1,  // Transmit Interrupt
158         sjaIR_RI  = 1      // Receive Interrupt
159 };
160
161 /** Bus Timing 1 Register 0x07 */
162 enum sja1000_BTR1 {
163         sjaMAX_TSEG1 = 15,
164         sjaMAX_TSEG2 = 7
165 };
166
167 /** Output Control Register 0x08 */
168 enum sja1000_OCR {
169         sjaOCR_MODE_BIPHASE = 0,
170         sjaOCR_MODE_TEST = 1,
171         sjaOCR_MODE_NORMAL = 2,
172         sjaOCR_MODE_CLOCK = 3,
173 /// TX0 push-pull not inverted
174         sjaOCR_TX0_LH = 0x18,
175 /// TX1 floating (off)
176         sjaOCR_TX1_ZZ = 0
177 };
178
179 /** Clock Divider register 0x1f */
180 enum sja1000_CDR {
181         sjaCDR_PELICAN = 1<<7,
182 /// bypass input comparator
183         sjaCDR_CBP = 1<<6,
184 /// switch TX1 to generate RX INT
185         sjaCDR_RXINPEN = 1<<5,
186         sjaCDR_CLK_OFF = 1<<3,
187 /// f_out = f_osc/(2*(CDR[2:0]+1)) or f_osc if CDR[2:0]==7
188         sjaCDR_CLKOUT_DIV1 = 7,
189         sjaCDR_CLKOUT_DIV2 = 0,
190         sjaCDR_CLKOUT_DIV4 = 1,
191         sjaCDR_CLKOUT_DIV6 = 2,
192         sjaCDR_CLKOUT_DIV8 = 3,
193         sjaCDR_CLKOUT_DIV10 = 4,
194         sjaCDR_CLKOUT_DIV12 = 5,
195         sjaCDR_CLKOUT_DIV14 = 6,
196         sjaCDR_CLKOUT_MASK = 7
197 };
198
199 /** flags for sja1000_baud_rate */
200 #define BTR1_SAM (1<<1)