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
8 * This software is released under the GPL-License.
9 * Version lincan-0.3 17 Jun 2004
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);
26 enum SJA1000_PeliCAN_regs {
32 /// Interrupt register
36 /// Bus Timing register 0
38 /// Bus Timing register 1
40 /// Output Control register
42 /// Arbitration Lost Capture
44 /// Error Code Capture
46 /// Error Warning Limit
53 /// Rx Message Counter (number of msgs. in RX FIFO
55 /// Rx Buffer Start Addr. (address of current MSG)
57 /// Transmit Buffer (write) Receive Buffer (read) Frame Information
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
65 /// Data start extended frame
67 /// Acceptance Code (4 bytes) in RESET mode
69 /// Acceptance Mask (4 bytes) in RESET mode
72 SJA_PeliCAN_AC_LEN = 4,
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
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
94 /** Status Register 0x02 */
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
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
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
129 /** Error Code Capture Register 0x0c*/
130 enum sja1000_PeliCAN_ECC {
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
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
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
161 /** Bus Timing 1 Register 0x07 */
167 /** Output Control Register 0x08 */
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)
179 /** Clock Divider register 0x1f */
181 sjaCDR_PELICAN = 1<<7,
182 /// bypass input comparator
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_MASK = 7
191 /** flags for sja1000_baud_rate */
192 #define BTR1_SAM (1<<1)