1 #include "can/lpc17xx_can.h"
3 static void CAN_configPin();
4 static void CAN_setBusTiming(struct canchip_t *chip);
6 #define MAX_TRANSMIT_WAIT_LOOPS 20
9 * CAN harware-dependent bit-timing constant
11 * Used for calculating and checking bit-timing parameters
14 struct can_bittiming_const {
15 char name[16]; /* Name of the CAN controller hardware */
16 uint32_t tseg1_min; /* Time segement 1 = prop_seg + phase_seg1 */
18 uint32_t tseg2_min; /* Time segement 2 = phase_seg2 */
20 uint32_t sjw_max; /* Synchronisation jump width */
21 uint32_t brp_min; /* Bit-rate prescaler */
26 static struct can_bittiming_const lpc17xx_can_bittiming_const = {
27 .name = "lpc17xx_can",
38 //---------------------------------------------------------------------------------
39 //---------------------------------------------------------------------------------
42 // board can-lmc1 specific functions:
44 int can_lmc1_register(struct hwspecops_t *hwspecops){
46 hwspecops->request_io = can_lmc1_request_io;
47 hwspecops->reset = can_lmc1_reset;
48 hwspecops->init_hw_data = can_lmc1_init_hw_data;
49 hwspecops->init_chip_data = can_lmc1_init_chip_data;
50 hwspecops->init_obj_data = can_lmc1_init_obj_data;
51 hwspecops->write_register = can_lmc1_write_register;
52 hwspecops->read_register = can_lmc1_read_register;
53 hwspecops->program_irq = can_lmc1_program_irq;
58 int can_lmc1_init_hw_data(struct candevice_t *candev){
61 candev->nr_82527_chips=0;
62 candev->nr_sja1000_chips=0;
63 candev->nr_all_chips=1;
69 int can_lmc1_init_chip_data(struct candevice_t *candev, int chipnr){
71 // used CAN1 peripherial -> CAN1 registers base
72 candev->chip[chipnr]->chip_base_addr = CAN1_REGS_BASE;
73 candev->chip[chipnr]->clock = system_frequency / 4;
75 lpc17xx_fill_chipspecops(candev->chip[chipnr]);
77 candev->chip[chipnr]->chip_data=(void *)malloc(sizeof(struct can_lmc1_chip_data));
78 if (candev->chip[chipnr]->chip_data==NULL)
84 int can_lmc1_init_obj_data(struct canchip_t *chip, int objnr){
89 void can_lmc1_write_register(unsigned data, unsigned long address){
90 (*(volatile uint32_t*)(address)) = data;
93 unsigned can_lmc1_read_register(unsigned long address){
94 return (*(volatile uint32_t*)(address));
97 int can_lmc1_request_io(struct candevice_t *candev)
102 int can_lmc1_reset(struct candevice_t *candev)
107 int can_lmc1_program_irq(struct candevice_t *candev)
112 //---------------------------------------------------------------------------------
113 //---------------------------------------------------------------------------------
116 // lpc17xx can chip specific functions:
119 * lpc17xx_baud_rate: - set communication parameters.
120 * @chip: pointer to chip state structure
121 * @rate: baud rate in Hz
122 * @clock: frequency of CAN clock in Hz
123 * @sjw: synchronization jump width (0-3) prescaled clock cycles
124 * @sampl_pt: sample point in % (0-100) sets (TSEG1+1)/(TSEG1+TSEG2+2) ratio
126 int lpc17xx_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw,
127 int sampl_pt, int flags)
129 int best_error = 1000000000, error;
130 int best_tseg=0, best_brp=0, best_rate=0, brp=0;
131 int tseg=0, tseg1=0, tseg2=0;
133 struct can_bittiming_const *btc = &lpc17xx_can_bittiming_const;
138 /* tseg even = round down, odd = round up */
139 for (tseg=(0+0+2)*2; tseg<=(btc->tseg2_max+btc->tseg1_max+2)*2+1; tseg++) {
140 brp = clock/((1+tseg/2)*rate)+tseg%2;
141 if (brp == 0 || brp > 64)
143 error = rate - clock/(brp*(1+tseg/2));
146 if (error <= best_error) {
150 best_rate = clock/(brp*(1+tseg/2));
153 if (best_error && (rate/best_error < 10)) {
154 CANMSG("baud rate %d is not possible with %d Hz clock\n",
156 CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
157 best_rate, best_brp, best_tseg, tseg1, tseg2);
160 tseg2 = best_tseg-(sampl_pt*(best_tseg+1))/100;
163 if (tseg2 > btc->tseg2_max)
164 tseg2 = btc->tseg2_max;
165 tseg1 = best_tseg-tseg2-2;
166 if (tseg1>btc->tseg1_max) {
167 tseg1 = btc->tseg1_max;
168 tseg2 = best_tseg-tseg1-2;
171 DEBUGMSG("Setting %d bps.\n", best_rate);
172 DEBUGMSG("brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
173 best_brp, best_tseg, tseg1, tseg2,
174 (100*(best_tseg-tseg2)/(best_tseg+1)));
177 CAN_set_bittiming(chip, best_brp, sjw, tseg1, tseg2);
185 int lpc17xx_chip_config(struct canchip_t *chip){
190 chip->baudrate=1000000;
192 printf("CAN CHIP INIT, baudrate: %d\n", (int) chip->baudrate);
194 if (lpc17xx_baud_rate(chip,chip->baudrate,chip->clock,0,75,0))
200 int lpc17xx_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj,
201 struct canmsg_t *msg)
209 int lpc17xx_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
210 struct canmsg_t *msg)
214 // write transmission request
215 can_write_reg(chip, (CAN_CMR_TR | CAN_CMR_STB1), CAN_CMR_o);
217 // check transmission complete status
218 while (!(can_read_reg(chip, CAN_SR_o) & CAN_SR_TCS1)){
219 if(i++<MAX_TRANSMIT_WAIT_LOOPS)
222 // request command to abort transmission request
223 can_write_reg(chip, CAN_CMR_AT, CAN_CMR_o);
230 int lpc17xx_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
233 can_preempt_disable();
235 can_msgobj_set_fl(obj,TX_PENDING);
236 can_msgobj_set_fl(obj,TX_REQUEST);
238 while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
239 can_msgobj_clear_fl(obj,TX_REQUEST);
241 if (can_read_reg(chip, CAN_SR_o) & CAN_SR_TBS1){
243 lpc17xx_irq_write_handler(chip, obj);
246 can_msgobj_clear_fl(obj,TX_LOCK);
247 if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
251 can_preempt_enable();
256 int lpc17xx_irq_handler(int irq, struct canchip_t *chip)
260 struct msgobj_t *obj;
261 obj = chip->msgobj[0];
264 i = can_read_reg(chip, CAN_ICR_o);
266 if(i & (CAN_ICR_TI1 | CAN_ICR_RI)){
268 if(can_read_reg(chip, CAN_SR_o) & CAN_SR_RBS) {
269 lpc17xx_read(chip,obj);
274 if ((can_msgobj_test_fl(obj,TX_PENDING)) || (can_msgobj_test_fl(obj,TX_REQUEST))) {
276 can_msgobj_set_fl(obj,TX_REQUEST);
278 while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)){
281 can_msgobj_clear_fl(obj,TX_REQUEST);
283 if (can_read_reg(chip, CAN_SR_o) & CAN_SR_TBS1){
285 lpc17xx_irq_write_handler(chip, obj);
288 can_msgobj_clear_fl(obj,TX_LOCK);
289 if(!can_msgobj_test_fl(obj,TX_REQUEST)) break;
296 can_write_reg(chip, CAN_CMR_CDO, CAN_CMR_o); // clear data overrun
299 return CANCHIP_IRQ_HANDLED;
303 void lpc17xx_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj)
309 /* Do local transmitted message distribution if enabled */
311 /* fill CAN message timestamp */
312 can_filltimestamp(&obj->tx_slot->msg.timestamp);
314 obj->tx_slot->msg.flags |= MSG_LOCAL;
315 canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
317 /* Free transmitted slot */
318 canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
322 can_msgobj_clear_fl(obj,TX_PENDING);
323 cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot);
326 can_msgobj_set_fl(obj,TX_PENDING);
328 if (chip->chipspecops->pre_write_config(chip, obj, &obj->tx_slot->msg)) {
330 canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_PREP);
331 canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
335 if (chip->chipspecops->send_msg(chip, obj, &obj->tx_slot->msg)) {
337 canque_notify_inends(obj->tx_qedge, CANQUEUE_NOTIFY_ERRTX_SEND);
338 canque_free_outslot(obj->qends, obj->tx_qedge, obj->tx_slot);
345 void lpc17xx_read(struct canchip_t *chip, struct msgobj_t *obj) {
348 CAN_recv(chip, &obj->rx_msg);
350 // fill CAN message timestamp
351 can_filltimestamp(&obj->rx_msg.timestamp);
353 canque_filter_msg2edges(obj->qends, &obj->rx_msg);
355 // release Receive buffer
356 can_write_reg(chip, CAN_CMR_RRB, CAN_CMR_o);
360 int lpc17xx_fill_chipspecops(struct canchip_t *chip){
363 chip->chip_irq = CAN_IRQn;
365 lpc17xx_register(chip->chipspecops);
370 int lpc17xx_register(struct chipspecops_t *chipspecops){
372 CANMSG("initializing lpc17xx can chip operations\n");
374 chipspecops->attach_to_chip = lpc17xx_attach_to_chip;
375 chipspecops->pre_read_config = lpc17xx_pre_read_config;
376 chipspecops->chip_config = lpc17xx_chip_config;
377 chipspecops->pre_write_config = lpc17xx_pre_write_config;
378 chipspecops->send_msg = lpc17xx_send_msg;
379 chipspecops->wakeup_tx = lpc17xx_wakeup_tx;
380 chipspecops->irq_handler = lpc17xx_irq_handler;
387 int lpc17xx_attach_to_chip(struct canchip_t *chip){
392 int lpc17xx_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj){
399 //---------------------------------------------------------------------------------
400 //---------------------------------------------------------------------------------
403 static void CAN_configPin(){
405 // CAN1 - select P0.0 as RD1. P0.1 as TD1
409 uint32_t pinmode_od0;
410 uint8_t pinsel0_val = 1;
411 uint8_t pinmode0_val = 0;
412 uint8_t pinmode_od0_val = 0;
415 pinsel0 = PINCON->PINSEL0;
416 pinsel0 &= ~CAN1_RX_MASK;
417 pinsel0 &= ~CAN1_TX_MASK;
418 pinsel0 |= __val2mfld(CAN1_RX_MASK, pinsel0_val);
419 pinsel0 |= __val2mfld(CAN1_TX_MASK, pinsel0_val);
420 PINCON->PINSEL0 = pinsel0;
422 pinmode0 = PINCON->PINMODE0;
423 pinmode0 &= ~CAN1_RX_MASK;
424 pinmode0 &= ~CAN1_TX_MASK;
425 pinmode0 |= __val2mfld(CAN1_RX_MASK, pinmode0_val);
426 pinmode0 |= __val2mfld(CAN1_TX_MASK, pinmode0_val);
427 PINCON->PINMODE0 = pinmode0;
429 pinmode_od0 = PINCON->PINMODE_OD0;
430 if (pinmode_od0_val){
431 pinmode_od0 |= CAN1_RX_BIT;
432 pinmode_od0 |= CAN1_TX_BIT;
435 pinmode_od0 &= ~CAN1_RX_BIT;
436 pinmode_od0 &= ~CAN1_TX_BIT;
438 PINCON->PINMODE_OD0 = pinmode_od0;
443 void CAN_recv(struct canchip_t *chip, canmsg_t* msg){
445 volatile uint32_t data;
449 msg->length = (can_read_reg(chip, CAN_RFS_o)>>16) & 0xF;
452 msg->id = can_read_reg(chip, CAN_RID_o);
455 if(can_read_reg(chip, CAN_RFS_o) & CAN_RFS_EXT)
456 msg->flags |= MSG_EXT;
458 msg->flags &= ~MSG_EXT;
462 if(can_read_reg(chip, CAN_RFS_o) & CAN_RFS_RTR)
463 msg->flags |= MSG_RTR;
465 msg->flags &= ~MSG_RTR;
469 data = can_read_reg(chip, CAN_RDA_o);
471 msg->data[i] = (data>>(i*8)) & 0xFF;
473 data = can_read_reg(chip, CAN_RDB_o);
475 msg->data[i] = (data>>((i-4)*8)) & 0xFF;
480 void CAN_send(struct canchip_t *chip, canmsg_t* msg){
482 volatile uint32_t data;
483 volatile uint32_t can_tfi1;
486 // check status of TB1
487 while (!(can_read_reg(chip, CAN_SR_o) & CAN_SR_TBS1)){
488 if(i++<MAX_TRANSMIT_WAIT_LOOPS)
491 // request command to abort transmission request
492 can_write_reg(chip, CAN_CMR_AT, CAN_CMR_o);
496 can_tfi1 = can_read_reg(chip, CAN_TFI1_o);
498 can_tfi1 &= ~0x000F0000;
499 can_tfi1 |= (msg->length)<<16;
502 if(msg->flags & MSG_EXT)
503 can_tfi1 |= CAN_TFI1_EXT;
505 can_tfi1 &= ~CAN_TFI1_EXT;
508 if(msg->flags & MSG_RTR)
509 can_tfi1 |= CAN_TFI1_RTR;
511 can_tfi1 &= ~CAN_TFI1_RTR;
513 can_write_reg(chip, can_tfi1, CAN_TFI1_o);
517 can_write_reg(chip, msg->id, CAN_TID1_o);
520 // write first 4 data bytes
523 data |= (msg->data[i])<<(i*8);
525 can_write_reg(chip, data, CAN_TDA1_o);
527 // write second 4 data bytes
530 data |= (msg->data[i])<<((i-4)*8);
532 can_write_reg(chip, data, CAN_TDB1_o);
536 void CAN_set_bittiming(struct canchip_t *chip, uint32_t brp, uint32_t sjw, uint32_t tseg1, uint32_t tseg2){
538 uint8_t SAM = 0; // 0 = the bus is sampled once
541 printf("BRP: %d, SJW: %d, TSEG1: %d, TSEG2: %d \n", brp+1, sjw+1, tseg1+1, tseg2+1);
543 can_disable_irq(chip->chip_irq);
545 can_write_reg(chip, 1, CAN_MOD_o);
548 can_write_reg(chip, ((SAM<<23)|(tseg2<<20)|(tseg1<<16)|(sjw<<14)|(brp<<0)), CAN_BTR_o);
551 // return to normal operating
552 can_write_reg(chip, 0, CAN_MOD_o);
554 can_enable_irq(chip->chip_irq);
558 void CAN_init(struct canchip_t *chip){
565 // configure CAN1 pins
568 // turn on power and clock for CAN1
571 // set clock divide for CAN1
573 val = 0x00; // 00 PCLK_peripheral = CCLK/4
574 pclksel0 = SC->PCLKSEL0;
575 pclksel0 &= ~PCLK_CAN1_MASK;
576 pclksel0 &= ~PCLK_CAN2_MASK;
577 pclksel0 &= ~PCLK_ACF_MASK;
578 pclksel0 |= __val2mfld(PCLK_CAN1_MASK, val);
579 pclksel0 |= __val2mfld(PCLK_CAN2_MASK, val);
580 pclksel0 |= __val2mfld(PCLK_ACF_MASK, val);
581 SC->PCLKSEL0 = pclksel0;
584 can_write_reg(chip, 1, CAN_MOD_o);
586 // disable all CAN interrupts
587 can_write_reg(chip, 0, CAN_IER_o);
589 // reset value of Global Status Register (global controller status and error counters)
590 can_write_reg(chip, 0x3C, CAN_GSR_o);
592 // request command to release Rx, Tx buffer and clear data overrun
593 can_write_reg(chip, (CAN_CMR_AT | CAN_CMR_RRB | CAN_CMR_CDO), CAN_CMR_o);
595 // read to clear interrupt pending in Interrupt Capture Register
596 tmp = can_read_reg(chip, CAN_ICR_o);
598 // return to normal operating
599 can_write_reg(chip, 0, CAN_MOD_o);
602 //--------------------------
604 // Acceptance Filter Off Mode
608 for (i = 0; i < 512; i++) {
609 CANAF_RAM->mask[i] = 0x00;
613 CANAF_SFF_GRP_sa = 0x00;
615 CANAF_EFF_GRP_sa = 0x00;
616 CANAF_ENDofTable = 0x00;
618 // Acceptance Filter Bypass Mode - all messages accepted
621 //--------------------------
624 // enable interrupt after transmit
625 // enable receive interrupt
626 // enable data overrun interrupt
627 can_write_reg(chip, (CAN_IER_TIE1 | CAN_IER_RIE | CAN_IER_DOIE), CAN_IER_o);