2 * Linux CAN-bus device driver.
3 * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
4 * This software is released under the GPL-License.
5 * Version 0.6 18 Sept 2000
6 * Changed for PeliCan mode SJA1000 by Tomasz Motylewski (BFAD GmbH)
10 #include <linux/autoconf.h>
11 #if defined (CONFIG_MODVERSIONS) && !defined (MODVERSIONS)
15 #if defined (MODVERSIONS)
16 #include <linux/modversions.h>
19 #include <linux/sched.h>
20 #include <linux/delay.h>
23 #include "../include/main.h"
24 #include "../include/sja1000p.h"
26 struct chip_t *chip_irq=NULL;
27 struct candevice_t *device_irq=NULL;
28 struct canfifo_t *fifo_irq=NULL;
29 void (*put_reg)(unsigned char data, unsigned long address);
30 unsigned (*get_reg)(unsigned long address);
34 int sja1000p_enable_configuration(struct chip_t *chip)
37 enum sja1000_PeliCAN_MOD flags;
39 disable_irq(chip->chip_irq);
41 flags=can_read_reg(chip,SJAMOD);
43 while ((!(flags & MOD_RM)) && (i<=10)) {
44 can_write_reg(chip, MOD_RM, SJAMOD);
45 // TODO: chinfigurable MOD_AFM (32/16 bit acceptance filter)
46 // config MOD_LOM (listen only)
49 flags=can_read_reg(chip, SJAMOD);
52 CANMSG("Reset error\n");
53 enable_irq(chip->chip_irq);
60 int sja1000p_disable_configuration(struct chip_t *chip)
63 enum sja1000_PeliCAN_MOD flags;
65 flags=can_read_reg(chip,SJAMOD);
67 while ( (flags & MOD_RM) && (i<=10) ) {
68 can_write_reg(chip, 0, SJAMOD);
69 // TODO: chinfigurable MOD_AFM (32/16 bit acceptance filter)
70 // config MOD_LOM (listen only)
73 flags=can_read_reg(chip, SJAMOD);
76 CANMSG("Error leaving reset status\n");
80 enable_irq(chip->chip_irq);
85 int sja1000p_chip_config(struct chip_t *chip)
87 if (sja1000p_enable_configuration(chip))
90 /* Set mode, clock out, comparator */
91 can_write_reg(chip,CDR_PELICAN|chip->sja_cdr_reg,SJACDR);
92 /* Set driver output configuration */
93 can_write_reg(chip,chip->sja_ocr_reg,SJAOCR);
95 if (sja1000p_extended_mask(chip,0x00000000, 0xffffffff))
100 if (sja1000p_baud_rate(chip,1000*baudrate,chip->clock,0,75,0))
103 /* Enable hardware interrupts */
104 can_write_reg(chip, ENABLE_INTERRUPTS, SJAIER);
106 sja1000p_disable_configuration(chip);
111 int sja1000p_extended_mask(struct chip_t *chip, unsigned long code, unsigned long mask)
115 if (sja1000p_enable_configuration(chip))
118 // LSB to +3, MSB to +0
119 for(i=SJA_PeliCAN_AC_LEN; --i>=0;) {
120 can_write_reg(chip,code&0xff,SJAACR0+i);
121 can_write_reg(chip,mask&0xff,SJAAMR0+i);
126 DEBUGMSG("Setting acceptance code to 0x%lx\n",(unsigned long)code);
127 DEBUGMSG("Setting acceptance mask to 0x%lx\n",(unsigned long)mask);
129 sja1000p_disable_configuration(chip);
134 /* Set communication parameters.
135 * param rate baud rate in Hz
136 * param clock frequency of sja1000 clock in Hz (ISA osc is 14318000)
137 * param sjw synchronization jump width (0-3) prescaled clock cycles
138 * param sampl_pt sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
139 * param flags fields BTR1_SAM, OCMODE, OCPOL, OCTP, OCTN, CLK_OFF, CBP
141 int sja1000p_baud_rate(struct chip_t *chip, int rate, int clock, int sjw,
142 int sampl_pt, int flags)
144 int best_error = 1000000000, error;
145 int best_tseg=0, best_brp=0, best_rate=0, brp=0;
146 int tseg=0, tseg1=0, tseg2=0;
148 if (sja1000p_enable_configuration(chip))
153 /* tseg even = round down, odd = round up */
154 for (tseg=(0+0+2)*2; tseg<=(MAX_TSEG2+MAX_TSEG1+2)*2+1; tseg++) {
155 brp = clock/((1+tseg/2)*rate)+tseg%2;
156 if (brp == 0 || brp > 64)
158 error = rate - clock/(brp*(1+tseg/2));
161 if (error <= best_error) {
165 best_rate = clock/(brp*(1+tseg/2));
168 if (best_error && (rate/best_error < 10)) {
169 CANMSG("baud rate %d is not possible with %d Hz clock\n",
171 CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
172 best_rate, best_brp, best_tseg, tseg1, tseg2);
175 tseg2 = best_tseg-(sampl_pt*(best_tseg+1))/100;
178 if (tseg2 > MAX_TSEG2)
180 tseg1 = best_tseg-tseg2-2;
181 if (tseg1>MAX_TSEG1) {
183 tseg2 = best_tseg-tseg1-2;
186 DEBUGMSG("Setting %d bps.\n", best_rate);
187 DEBUGMSG("brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
188 best_brp, best_tseg, tseg1, tseg2,
189 (100*(best_tseg-tseg2)/(best_tseg+1)));
192 can_write_reg(chip, sjw<<6 | best_brp, SJABTR0);
193 can_write_reg(chip, ((flags & BTR1_SAM) != 0)<<7 | (tseg2<<4)
196 sja1000p_disable_configuration(chip);
201 void sja1000p_read(struct chip_t *chip, struct canfifo_t *fifo) {
202 int i, flags, len, datastart;
204 flags = can_read_reg(chip,SJAFRM);
206 fifo->buf_rx_entry[fifo->head].id =
207 (can_read_reg(chip,SJAID0)<<21) +
208 (can_read_reg(chip,SJAID1)<<13) +
209 (can_read_reg(chip,SJAID2)<<5) +
210 (can_read_reg(chip,SJAID3)>>3);
213 fifo->buf_rx_entry[fifo->head].id =
214 (can_read_reg(chip,SJAID0)<<3) +
215 (can_read_reg(chip,SJAID1)>>5);
218 fifo->buf_rx_entry[fifo->head].flags =
219 ((flags & FRM_RTR) ? MSG_RTR : 0) |
220 ((flags & FRM_FF) ? MSG_EXT : 0);
221 len = flags & FRM_DLC_M;
222 for(i=0; i< len; i++) {
223 fifo->buf_rx_entry[fifo->head].data[i]=
224 can_read_reg(chip,datastart+i);
226 fifo->buf_rx_entry[fifo->head].length = len;
227 fifo->head++; fifo->head %= MAX_BUF_LENGTH;
228 // FIXME: what if fifo->head == fifo->tail again ?
229 can_write_reg(chip, CMR_RRB, SJACMR);
230 } while (can_read_reg(chip, SJASR) & SR_RBS);
233 int sja1000p_pre_read_config(struct chip_t *chip, struct msgobj_t *obj)
236 i=can_read_reg(chip,SJASR);
242 can_write_reg(chip, DISABLE_INTERRUPTS, SJAIER); //disable interrupts for a moment
243 sja1000p_read(chip, obj->fifo);
244 can_write_reg(chip, ENABLE_INTERRUPTS, SJAIER); //enable interrupts
248 #define MAX_TRANSMIT_WAIT_LOOPS 200
249 int sja1000p_pre_write_config(struct chip_t *chip, struct msgobj_t *obj,
250 struct canmsg_t *msg)
255 /* Wait until Transmit Buffer Status is released */
256 while ( !(can_read_reg(chip, SJASR) & SR_TBS) &&
257 i++<MAX_TRANSMIT_WAIT_LOOPS) {
261 if (!(can_read_reg(chip, SJASR) & SR_TBS)) {
262 CANMSG("Transmit timed out, cancelling\n");
263 // here we should check if there is no write/select waiting for this
264 // transmit. If so, set error ret and wake up.
265 // CHECKME: if we do not disable IER_TIE (TX IRQ) here we get interrupt
267 can_write_reg(chip, CMR_AT, SJACMR);
269 while ( !(can_read_reg(chip, SJASR) & SR_TBS) &&
270 i++<MAX_TRANSMIT_WAIT_LOOPS) {
273 if (!(can_read_reg(chip, SJASR) & SR_TBS)) {
274 CANMSG("Could not cancel, please reset\n");
278 msg->length &= FRM_DLC_M;
279 can_write_reg(chip, ((msg->flags&MSG_EXT)?FRM_FF:0) |
280 ((msg->flags & MSG_RTR) ? FRM_RTR : 0) |
281 msg->length, SJAFRM);
282 if(msg->flags&MSG_EXT) {
284 can_write_reg(chip, id & 0xff, SJAID3);
286 can_write_reg(chip, id & 0xff, SJAID2);
288 can_write_reg(chip, id & 0xff, SJAID1);
290 can_write_reg(chip, id, SJAID0);
291 for(i=0; i < msg->length; i++) {
292 can_write_reg(chip, msg->data[i], SJADATE+i);
296 can_write_reg(chip, id & 0xff, SJAID0);
298 can_write_reg(chip, id & 0xff, SJAID1);
299 for(i=0; i < msg->length; i++) {
300 can_write_reg(chip, msg->data[i], SJADATS+i);
306 int sja1000p_send_msg(struct chip_t *chip, struct msgobj_t *obj,
307 struct canmsg_t *msg)
309 can_write_reg(chip, CMR_TR, SJACMR);
314 int sja1000p_check_tx_stat(struct chip_t *chip)
316 if (can_read_reg(chip,SJASR) & SR_TCS)
322 int sja1000p_set_btregs(struct chip_t *chip, unsigned short btr0,
325 if (sja1000p_enable_configuration(chip))
328 can_write_reg(chip, btr0, SJABTR0);
329 can_write_reg(chip, btr1, SJABTR1);
331 sja1000p_disable_configuration(chip);
336 int sja1000p_start_chip(struct chip_t *chip)
338 enum sja1000_PeliCAN_MOD flags;
340 flags = can_read_reg(chip, SJAMOD) & (MOD_LOM|MOD_STM|MOD_AFM|MOD_SM);
341 can_write_reg(chip, flags, SJAMOD);
346 int sja1000p_stop_chip(struct chip_t *chip)
348 enum sja1000_PeliCAN_MOD flags;
350 flags = can_read_reg(chip, SJAMOD) & (MOD_LOM|MOD_STM|MOD_AFM|MOD_SM);
351 can_write_reg(chip, flags|MOD_RM, SJAMOD);
357 int sja1000p_remote_request(struct chip_t *chip, struct msgobj_t *obj)
359 CANMSG("sja1000p_remote_request not implemented\n");
363 int sja1000p_standard_mask(struct chip_t *chip, unsigned short code,
366 CANMSG("sja1000p_standard_mask not implemented\n");
370 int sja1000p_clear_objects(struct chip_t *chip)
372 CANMSG("sja1000p_clear_objects not implemented\n");
376 int sja1000p_config_irqs(struct chip_t *chip, short irqs)
378 CANMSG("sja1000p_config_irqs not implemented\n");
382 void sja1000p_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
385 chip_irq=(struct chip_t *)dev_id;
386 device_irq=(struct candevice_t *)chip_irq->hostdevice;
388 put_reg=device_irq->hwspecops->write_register;
389 get_reg=device_irq->hwspecops->read_register;
391 irq_register=get_reg(chip_irq->chip_base_addr+SJAIR);
392 // DEBUGMSG("sja1000_irq_handler: SJAIR:%02x\n",irq_register);
393 // DEBUGMSG("sja1000_irq_handler: SJASR:%02x\n",
394 // get_reg(chip_irq->chip_base_addr+SJASR));
396 if ((irq_register & (IR_BEI|IR_EPI|IR_DOI|IR_EI|IR_TI|IR_RI)) == 0)
399 fifo_irq=chip_irq->msgobj[0]->fifo;
401 if ((irq_register & IR_RI) != 0) {
402 sja1000p_read(chip_irq,fifo_irq);
403 chip_irq->msgobj[0]->ret = 0;
404 if (waitqueue_active(&fifo_irq->readq))
405 wake_up_interruptible(&fifo_irq->readq);
407 if ((irq_register & IR_TI) != 0) {
408 chip_irq->msgobj[0]->ret = 0;
409 if (waitqueue_active(&fifo_irq->writeq))
410 wake_up_interruptible(&fifo_irq->writeq);
412 if ((irq_register & (IR_EI|IR_BEI|IR_EPI|IR_DOI)) != 0) {
413 // Some error happened
414 CANMSG("Error: status register: 0x%x irq_register: 0x%02x\n",
415 get_reg(chip_irq->chip_base_addr+SJASR), irq_register);
416 // FIXME: chip should be brought to usable state. Transmission cancelled if in progress.
417 // Reset flag set to 0 if chip is already off the bus. Full state report
418 chip_irq->msgobj[0]->ret=-1;
419 if (waitqueue_active(&fifo_irq->writeq))
420 wake_up_interruptible(&fifo_irq->writeq);
421 if (waitqueue_active(&fifo_irq->readq))
422 wake_up_interruptible(&fifo_irq->readq);
428 int sja1000p_register(struct chipspecops_t *chipspecops)
430 CANMSG("initializing sja1000p chip operations\n");
431 chipspecops->chip_config=sja1000p_chip_config;
432 chipspecops->baud_rate=sja1000p_baud_rate;
433 chipspecops->standard_mask=sja1000p_standard_mask;
434 chipspecops->extended_mask=sja1000p_extended_mask;
435 chipspecops->message15_mask=sja1000p_extended_mask;
436 chipspecops->clear_objects=sja1000p_clear_objects;
437 chipspecops->config_irqs=sja1000p_config_irqs;
438 chipspecops->pre_read_config=sja1000p_pre_read_config;
439 chipspecops->pre_write_config=sja1000p_pre_write_config;
440 chipspecops->send_msg=sja1000p_send_msg;
441 chipspecops->check_tx_stat=sja1000p_check_tx_stat;
442 chipspecops->remote_request=sja1000p_remote_request;
443 chipspecops->enable_configuration=sja1000p_enable_configuration;
444 chipspecops->disable_configuration=sja1000p_disable_configuration;
445 chipspecops->set_btregs=sja1000p_set_btregs;
446 chipspecops->start_chip=sja1000p_start_chip;
447 chipspecops->stop_chip=sja1000p_stop_chip;
448 chipspecops->irq_handler=sja1000p_irq_handler;