uc_kinetis_flexcan.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014, 2018 Pavel Kirienko <pavel.kirienko@gmail.com>
3  * Kinetis Port Author David Sidrane <david_s5@nscdg.com>
4  */
5 
6 #include <cassert>
7 #include <cstring>
8 #include <uavcan_kinetis/can.hpp>
10 #include "internal.hpp"
11 
12 #if UAVCAN_KINETIS_NUTTX
13 # include <nuttx/arch.h>
14 # include <nuttx/irq.h>
15 # include <arch/board/board.h>
16 #else
17 # error "Unknown OS"
18 #endif
19 
20 
21 namespace uavcan_kinetis
22 {
23 extern "C"
24 {
25 static int can0_irq(const int irq, void*, void* args);
26  #if UAVCAN_KINETIS_NUM_IFACES > 1
27 static int can1_irq(const int irq, void*, void* args);
28  #endif
29 }
30 namespace flexcan
31 {
32 const uavcan::uint32_t OSCERCLK = BOARD_EXTAL_FREQ;
33 const uavcan::uint32_t busclck = BOARD_BUS_FREQ;
34 const uavcan::uint8_t CLOCKSEL = 0; // Select OSCERCLK
36 const uavcan::uint8_t useFIFO = 1; // Fifo is enabled
38 }
39 namespace
40 {
41 
42 CanIface* ifaces[UAVCAN_KINETIS_NUM_IFACES] =
43 {
45 #if UAVCAN_KINETIS_NUM_IFACES > 1
47 #endif
48 };
49 
50 inline void handleTxInterrupt(CanIface* can, uavcan::uint32_t iflags1)
51 {
52  UAVCAN_ASSERT(iface_index < UAVCAN_KINETIS_NUM_IFACES);
54  if (utc_usec > 0)
55  {
56  utc_usec--;
57  }
58  can->handleTxInterrupt(iflags1, utc_usec);
59 }
60 
61 inline void handleRxInterrupt(CanIface* can, uavcan::uint32_t iflags1)
62 {
64  if (utc_usec > 0)
65  {
66  utc_usec--;
67  }
68  can->handleRxInterrupt(iflags1, utc_usec);
69 }
70 
71 } // namespace
72 
73 /*
74  * CanIface::RxQueue
75  */
77 {
78  if (overflow_cnt_ < 0xFFFFFFFF)
79  {
80  overflow_cnt_++;
81  }
82 }
83 
85 {
86  buf_[in_].frame = frame;
87  buf_[in_].utc_usec = utc_usec;
88  buf_[in_].flags = flags;
89  in_++;
90  if (in_ >= capacity_)
91  {
92  in_ = 0;
93  }
94  len_++;
95  if (len_ > capacity_)
96  {
97  len_ = capacity_;
98  registerOverflow();
99  out_++;
100  if (out_ >= capacity_)
101  {
102  out_ = 0;
103  }
104  }
105 }
106 
108 {
109  if (len_ > 0)
110  {
111  out_frame = buf_[out_].frame;
112  out_utc_usec = buf_[out_].utc_usec;
113  out_flags = buf_[out_].flags;
114  out_++;
115  if (out_ >= capacity_)
116  {
117  out_ = 0;
118  }
119  len_--;
120  }
121  else
122  {
123  UAVCAN_ASSERT(0);
124  }
125 }
126 
128 {
129  in_ = 0;
130  out_ = 0;
131  len_ = 0;
132  overflow_cnt_ = 0;
133 }
134 
135 /*
136  * CanIface
137  */
138 
139 int CanIface::computeTimings(const uavcan::uint32_t target_bitrate, Timings& out_timings)
140 {
141  if (target_bitrate < 1)
142  {
143  return -ErrInvalidBitRate;
144  }
145 
146  /*
147  * From FlexCAN Bit Timing Calculation by: Petr Stancik TIC
148  * buadrate = 1 / tNBT -The tNBT represents a period of the Nominal Bit Time (NBT).
149  * The NBT is separated into four non-overlaping segments,
150  * SYNC_SEG, PROP_SEG,PHASE_SEG1 and PHASE_SEG2. Each of
151  * these segments is an integer multiple of Time Quantum tQ
152  * tNBT= tQ+PROP_SEG* tQ + PHASE_SEG1* tQ + PHASE_SEG2* tQ = NBT * tQ
153  * tQ = 1/bitrate = 1/[canclk /(PRESDIV+1)].
154  * NBT is 8..25
155  * SYNC_SEG = 1 tQ
156  * PROP_SEG = 1..8 tQ
157  * PHASE1_SEG = 1,2..8 tQ 1..8 for 1 Sample per bit (Spb), 2..8 for 3 Spb
158  * PHASE2_SEG = 1..8
159  *
160  */
161  /*
162  * Hardware configuration
163  */
164 
165  /* Maximize NBT
166  * NBT * Prescaler = canclk / baud rate.
167  *
168  */
169 
170  const uavcan::uint32_t nbt_prescaler = flexcan::canclk / target_bitrate;
171  const int max_quanta_per_bit = 17;
172 
173  /*
174  * Searching for such prescaler value so that the number of quanta per bit is highest.
175  */
176 
177  /* tNBT - tQ = PROP_SEG* tQ + PHASE_SEG1* tQ + PHASE_SEG2* tQ = NBT * tQ - tQ */
178 
179  for (uavcan::uint32_t prescaler = 1; prescaler < 256; prescaler++)
180  {
181  if (prescaler > nbt_prescaler)
182  {
183  return -ErrInvalidBitRate; // No solution
184  }
185 
186  if ((0 == nbt_prescaler % prescaler) && (nbt_prescaler / prescaler) < max_quanta_per_bit)
187  {
188  out_timings.prescaler = prescaler;
189  break;
190  }
191  }
192  const uavcan::uint32_t NBT = nbt_prescaler / out_timings.prescaler;
193 
194  /* Choose a reasonable and some what arbitrary value for Propseg */
195 
196  out_timings.propseg = 5;
197 
198 
199  /* Ideal sampling point = 87.5% given by (SYNC_SEG + PROP_SEG + PHASE_SEG1) / (PHASE_SEG2) */
200 
201  uavcan::uint32_t sp = (7 * NBT) / 8;
202 
203  out_timings.pseg1 = sp - 1 - out_timings.propseg;
204  out_timings.pseg2 = NBT - (1 + out_timings.pseg1 + out_timings.propseg);
205  out_timings.rjw = uavcan::min((uavcan::uint8_t) 4, out_timings.pseg2);
206 
207  return ((out_timings.pseg1 <= 8) && (out_timings.pseg2 <= 8) && (out_timings.propseg <= 8)) ? 0 :
209 }
210 
212  uavcan::CanIOFlags flags)
213 {
214  if (frame.isErrorFrame() || frame.dlc > 8)
215  {
216  return -ErrUnsupportedFrame;
217  }
218 
219  /*
220  * Normally we should perform the same check as in @ref canAcceptNewTxFrame(), because
221  * it is possible that the highest-priority frame between select() and send() could have been
222  * replaced with a lower priority one due to TX timeout. But we don't do this check because:
223  *
224  * - It is a highly unlikely scenario.
225  *
226  * - Frames do not timeout on a properly functioning bus. Since frames do not timeout, the new
227  * frame can only have higher priority, which doesn't break the logic.
228  *
229  * - If high-priority frames are timing out in the TX queue, there's probably a lot of other
230  * issues to take care of before this one becomes relevant.
231  *
232  * - It takes CPU time. Not just CPU time, but critical section time, which is expensive.
233  */
234  CriticalSectionLocker lock;
235 
236  /*
237  * Seeking for an empty slot
238  */
239 
240  uavcan::uint32_t mbi = 0;
242  {
245  }
246 
247  uavcan::uint32_t mb_bit = 1 << (flexcan::NumMBinFiFoAndFilters + mbi);
248 
249  while (mbi < NumTxMesgBuffers)
250  {
252  {
253  can_->IFLAG1 = mb_bit;
254  break;
255  }
256  mb_bit <<= 1;
257  mbi++;
258  }
259 
260  if (mbi == NumTxMesgBuffers)
261  {
262  return 0; // No transmission for you!
263  }
264 
266 
271  if (frame.isExtended())
272  {
273  cs.ide = 1;
275  }
276  else
277  {
279  }
280 
282 
283  cs.dlc = frame.dlc;
284  mb.data.b0 = frame.data[0];
285  mb.data.b1 = frame.data[1];
286  mb.data.b2 = frame.data[2];
287  mb.data.b3 = frame.data[3];
288  mb.data.b4 = frame.data[4];
289  mb.data.b5 = frame.data[5];
290  mb.data.b6 = frame.data[6];
291  mb.data.b7 = frame.data[7];
292 
293  /*
294  * Registering the pending transmission so we can track its deadline and loopback it as needed
295  */
296  TxItem& txi = pending_tx_[mbi];
297  txi.deadline = tx_deadline;
298  txi.frame = frame;
299  txi.loopback = (flags & uavcan::CanIOFlagLoopback) != 0;
300  txi.abort_on_error = (flags & uavcan::CanIOFlagAbortOnError) != 0;
301  txi.pending = TxItem::busy;
302 
303  mb.CS = cs; // Go.
304  can_->IMASK1 |= mb_bit;
305  return 1;
306 }
307 
309  uavcan::UtcTime& out_ts_utc, uavcan::CanIOFlags& out_flags)
310 {
311  out_ts_monotonic = clock::getMonotonic(); // High precision is not required for monotonic timestamps
313  {
314  CriticalSectionLocker lock;
315  if (rx_queue_.getLength() == 0)
316  {
317  return 0;
318  }
319  rx_queue_.pop(out_frame, utc_usec, out_flags);
320  }
321  out_ts_utc = uavcan::UtcTime::fromUSec(utc_usec);
322  return 1;
323 }
324 
326  uavcan::uint16_t num_configs)
327 {
328  if (num_configs <= NumFilters)
329  {
330  CriticalSectionLocker lock;
331  setFreeze(true);
332  if (!waitFreezeAckChange(true))
333  {
334  return -ErrMcrFRZACKAckNotSet;
335  }
336 
337  volatile flexcan::FilterType* filterBase = reinterpret_cast<volatile
339  FirstFilter].mb);
340 
341  if (num_configs == 0)
342  {
343  // No filters except all
344  for (uint8_t i = 0; i < NumFilters; i++)
345  {
346  volatile flexcan::FilterType& filter = filterBase[i];
347  filter.w = 0; // All Do not care
348  can_->RXIMR[i].w = 0;// All Do not care
349  }
350  can_->RXFGMASK = 0; // All Do not care
351  }
352  else
353  {
354  for (uint8_t i = 0; i < NumFilters; i++)
355  {
356  volatile flexcan::FilterType& filter = filterBase[i];
357  volatile flexcan::FilterType& mask = can_->RXIMR[i];
358 
359  if (i < num_configs)
360  {
361 
362  const uavcan::CanFilterConfig* const cfg = filter_configs + i;
363 
365  {
366  filter.ide = 1;
367  filter.ext = cfg->id & uavcan::CanFrame::MaskExtID;
368  mask.ext = cfg->mask & uavcan::CanFrame::MaskExtID;
369  }
370  else
371  {
372  filter.ide = 0;
373  filter.std = cfg->id & uavcan::CanFrame::MaskStdID;
374  mask.std = cfg->mask & uavcan::CanFrame::MaskStdID;
375  }
376 
377  filter.rtr = cfg->id & uavcan::CanFrame::FlagRTR ? 1 : 0;
378 
379  mask.rtr = cfg->mask & uavcan::CanFrame::FlagRTR ? 1 : 0;
380  mask.ide = cfg->mask & uavcan::CanFrame::FlagEFF ? 1 : 0;
381  }
382  else
383  {
384  /* We can not really disable, with out effecting the memory map
385  * of the mail boxes, so set all bits to 1's and all to care
386  */
387  filter.w = 0xffffffff;
388  mask.w = 0xffffffff;
389  }
390  }
391  }
392  setFreeze(false);
393  return waitFreezeAckChange(false) ? 0 : -ErrMcrFRZACKAckNotCleared;
394  }
395 
396  return -ErrFilterNumConfigs;
397 }
398 
399 bool CanIface::waitMCRChange(uavcan::uint32_t mask, bool target_state)
400 {
401  const unsigned Timeout = 1000;
402  for (unsigned wait_ack = 0; wait_ack < Timeout; wait_ack++)
403  {
404  const bool state = (can_->MCR & mask) != 0;
405  if (state == target_state)
406  {
407  return true;
408  }
409  ::up_udelay(10);
410  }
411  return false;
412 }
413 
414 void CanIface::setMCR(uavcan::uint32_t mask, bool target_state)
415 {
416  if (target_state)
417  {
418  can_->MCR |= mask;
419  }
420  else
421  {
422  can_->MCR &= ~mask;
423  }
424 
425 }
426 
427 bool CanIface::waitFreezeAckChange(bool target_state)
428 {
429  return waitMCRChange(flexcan::MCR_FRZACK, target_state);
430 }
431 
432 void CanIface::setFreeze(bool freeze_true)
433 {
434  {
435  CriticalSectionLocker lock;
436  if(freeze_true)
437  {
440  }
441  else
442  {
443  can_->MCR &= ~flexcan::MCR_HALT;
444  can_->MCR &= ~flexcan::MCR_FRZ;
445 
446  }
447  }
448 }
449 
450 
451 bool CanIface::setEnable(bool enable_true)
452 {
453  setMCR(flexcan::MCR_MDIS, !enable_true);
454  return waitMCRChange(flexcan::MCR_LPMACK, true);
455 }
457 
458 {
460  if (!waitMCRChange(flexcan::MCR_SOFTRST, false))
461  {
462  return -ErrMcrSOFTRSTNotCleared;
463  }
464 
465  uavcan::uint8_t tasd = 25 - (flexcan::canclk * (flexcan::HWMaxMB + 3 -
468  (flexcan::busclck * (1 + timings.pseg1 + timings.pseg2 + timings.propseg)
469  * timings.prescaler);
470 
471  setMCR(flexcan::MCR_SUPV, false);
472 
473  for (int i = 0; i < flexcan::HWMaxMB; i++)
474  {
475  can_->MB[i].mb.CS.w = 0x0;
476  can_->MB[i].mb.ID.w = 0x0;
477  can_->MB[i].mb.data.l = 0x0;
478  can_->MB[i].mb.data.h = 0x0;
479  }
480 
488 
489  for (int i = 0; i < flexcan::HWMaxMB; i++)
490  {
491  can_->RXIMR[i].w = 0x0;
492  }
493  can_->RX14MASK = 0x3FFFFFFF;
494  can_->RX15MASK = 0x3FFFFFFF;
495  can_->RXMGMASK = 0x3FFFFFFF;
496  can_->RXFGMASK = 0x0;
497  return 0;
498 }
499 
500 int CanIface::init(const uavcan::uint32_t bitrate, const OperatingMode mode)
501 {
502 
503  /* Set the module disabled */
504 
505  if (!setEnable(false))
506  {
507  UAVCAN_KINETIS_LOG("MCR MCR_LPMACK not set");
508  return -ErrMcrLPMAckNotSet;
509  }
510 
511  /* Set the Clock to OSCERCLK or ) */
512 
513  can_->CTRL1 &= ~flexcan::CTRL1_CLKSRC;
515 
516  /* Set the module enabled */
517 
518  if (!setEnable(true))
519  {
520  UAVCAN_KINETIS_LOG("MCR MCR_LPMACK not cleared");
521  return -ErrMcrLPMAckNotCleared;
522  }
523 
524  /*
525  * Object state - interrupts are disabled, so it's safe to modify it now
526  */
527 
528  rx_queue_.reset();
529  error_cnt_ = 0;
530  served_aborts_cnt_ = 0;
533  had_activity_ = false;
534 
535  /*
536  * CAN timings for this bitrate
537  */
538  Timings timings;
539  const int timings_res = computeTimings(bitrate, timings);
540  if (timings_res < 0)
541  {
542  setEnable(false);
543  return timings_res;
544  }
545  UAVCAN_KINETIS_LOG("Timings: prescaler=%u rjw=%u propseg=%u pseg1=%u pseg2=%u",
546  unsigned(timings.prescaler), unsigned(timings.rjw),
547  unsigned(timings.propseg), unsigned(timings.pseg1),
548  unsigned(timings.pseg2));
549  /*
550  * Hardware initialization from reset state
551  */
552 
553 
554  uavcan::int16_t rv = doReset(timings);
555  if (rv != 0)
556  {
557  UAVCAN_KINETIS_LOG("doReset returned %d", rv);
558  return -rv;
559  }
560 
561  uavcan::uint32_t ctl1 = can_->CTRL1;
562  ctl1 |= (timings.prescaler - 1) << flexcan::CTRL1_PRESDIV_SHIFT;
563  ctl1 |= (timings.rjw - 1) << flexcan::CTRL1_RJW_SHIFT;
564  ctl1 |= (timings.pseg1 - 1) << flexcan::CTRL1_PSEG1_SHIFT;
565  ctl1 |= (timings.pseg2 - 1) << flexcan::CTRL1_PSEG2_SHIFT;
566  ctl1 |= flexcan::CTRL1_ERRMSK;
567  ctl1 |= flexcan::CTRL1_TWRNMSK;
568  ctl1 |= flexcan::CTRL1_RWRNMSK;
569  ctl1 |= ((mode == SilentMode) ? flexcan::CTRL1_LOM : 0);
570  ctl1 |= ((timings.propseg - 1) << flexcan::CTRL1_ROPSEG_SHIFT);
571  can_->CTRL1 = ctl1;
572 
573  /*
574  * Default filter configuration
575  */
576  volatile flexcan::FilterType* filterBase = reinterpret_cast<volatile
578  mb);
579  for (uavcan::uint32_t i = 0; i < flexcan::NumHWFilters; i++)
580  {
581  volatile flexcan::FilterType& filter = filterBase[i];
582  filter.w = 0; // All bits do not care
583  }
584  can_->RXFGMASK = 0; // All bits do not care
585 
586  for (uavcan::uint32_t mb = 0; mb < flexcan::HWMaxMB; mb++)
587  {
588  can_->RXIMR[mb].w = 0; // All bits do not care
589  }
590 
593 
594  setFreeze(false);
595  return waitFreezeAckChange(false) ? 0 : -ErrMcrFRZACKAckNotCleared;
596 }
597 
599 {
600  UAVCAN_ASSERT(mailbox_index < NumTxMesgBuffers);
601 
602  had_activity_ = had_activity_ || txok;
603 
604  TxItem& txi = pending_tx_[mailbox_index];
605 
606  if (txi.loopback && txok && txi.pending == TxItem::busy)
607  {
609  }
610 
611  txi.pending = TxItem::free;
612 }
613 
615 {
616 
617  /* First Process aborts */
618 
619  uavcan::uint32_t aborts = pending_aborts_ & tx_iflags;
620  if (aborts)
621  {
622  uavcan::uint32_t moreAborts = aborts;
624  for (uavcan::uint32_t mb = 0; moreAborts && mb < NumTxMesgBuffers; mb++ )
625  {
626  if (moreAborts & bit)
627  {
628  moreAborts &= ~bit;
629  can_->IFLAG1 = bit;
632  }
633  bit <<= 1;
634  }
635  tx_iflags &= ~aborts;
636  pending_aborts_ &= ~aborts;
637 
638  }
639 
640  /* Now Process TX completions */
641 
643  for (uavcan::uint32_t mbi = 0; tx_iflags && mbi < NumTxMesgBuffers; mbi++ )
644  {
645  if (tx_iflags & mbBit)
646  {
647  can_->IFLAG1 = mbBit;
648  tx_iflags &= ~mbBit;
649  const bool txok = can_->MB[flexcan::NumMBinFiFoAndFilters + mbi].mb.CS.code != flexcan::TxMbAbort;
651  }
652  mbBit <<= 1;
653  }
654 
656 
658 
659 }
660 
662 {
663  UAVCAN_ASSERT(fifo_index < 2);
664 
666 
667  if ((rx_iflags & FIFO_IFLAG1) == 0)
668  {
669  UAVCAN_ASSERT(0); // Weird, IRQ is here but no data to read
670  return;
671  }
672 
673  if (rx_iflags & flexcan::CAN_FIFO_OV)
674  {
675  error_cnt_++;
677  }
678 
679  if (rx_iflags & flexcan::CAN_FIFO_WARN)
680  {
681  fifo_warn_cnt_++;
683  }
684 
685  if (rx_iflags & flexcan::CAN_FIFO_NE)
686  {
688 
689  /*
690  * Read the frame contents
691  */
692 
693  if (rf.CS.ide)
694  {
697  }
698  else
699  {
701  }
702 
703  if (rf.CS.rtr)
704  {
706  }
707 
708  frame.dlc = rf.CS.dlc;
709 
710  frame.data[0] = rf.data.b0;
711  frame.data[1] = rf.data.b1;
712  frame.data[2] = rf.data.b2;
713  frame.data[3] = rf.data.b3;
714  frame.data[4] = rf.data.b4;
715  frame.data[5] = rf.data.b5;
716  frame.data[6] = rf.data.b6;
717  frame.data[7] = rf.data.b7;
718 
719  volatile uavcan::uint32_t idhit = can_->RXFIR;
720  UNUSED(idhit);
721  (void)can_->TIMER;
723 
724  /*
725  * Store with timeout into the FIFO buffer and signal update event
726  */
728  had_activity_ = true;
730 
731  }
732 
734 }
735 
737 {
741  if (esr1 != 0)
742  {
743  can_->ESR1 = esr1;
744  error_cnt_++;
745  uavcan::uint32_t pending_aborts = 0;
746 
747  // Begin abort requests
748 
749  for (int i = 0; i < NumTxMesgBuffers; i++)
750  {
751  TxItem& txi = pending_tx_[i];
753  uavcan::uint32_t iflag1 = 1 << mbi;
754  if (txi.pending == TxItem::busy && txi.abort_on_error)
755  {
756  txi.pending = TxItem::abort;
757  can_->IFLAG1 = iflag1;
758  pending_aborts |= iflag1;;
760  }
761  }
762  pending_aborts_ = pending_aborts;
763  }
764 
765 }
766 
768 {
769  CriticalSectionLocker lock;
770  for (int mbi = 0; mbi < NumTxMesgBuffers; mbi++)
771  {
772  TxItem& txi = pending_tx_[mbi];
773  if (txi.pending == TxItem::busy && txi.deadline < current_time)
774  {
776  txi.pending = TxItem::abort;
777  error_cnt_++;
778  }
779  }
780 }
781 
783 {
784  /*
785  * We can accept more frames only if the following conditions are satisfied:
786  * - There is at least one TX mailbox free (obvious enough);
787  * - The priority of the new frame is higher than priority of all TX mailboxes.
788  */
789  {
791  {
792  // No Free
793  return false;
794  }
795 
796  }
797 
798  /*
799  * The second condition requires a critical section.
800  */
801  CriticalSectionLocker lock;
802 
803  for (int mbi = 0; mbi < NumTxMesgBuffers; mbi++)
804  {
805  if (pending_tx_[mbi].pending == TxItem::busy && !frame.priorityHigherThan(pending_tx_[mbi].frame))
806  {
807  return false; // There's a mailbox whose priority is higher or equal the priority of the new frame.
808  }
809  }
810 
811  return true; // This new frame will be added to a free TX mailbox in the next @ref send().
812 }
813 
815 {
816  CriticalSectionLocker lock;
817  return rx_queue_.getLength() == 0;
818 }
819 
821 {
822  CriticalSectionLocker lock;
824 }
825 
827 {
828  CriticalSectionLocker lock;
829  return rx_queue_.getLength();
830 }
831 
833 {
834  CriticalSectionLocker lock;
835  const bool ret = had_activity_;
836  had_activity_ = false;
837  return ret;
838 }
839 
840 /*
841  * CanDriver
842  */
844 {
846 
847  // Iface 0
848  msk.read = if0_.isRxBufferEmpty() ? 0 : 1;
849 
850  if (pending_tx[0] != UAVCAN_NULLPTR)
851  {
852  msk.write = if0_.canAcceptNewTxFrame(*pending_tx[0]) ? 1 : 0;
853  }
854 
855  // Iface 1
856 #if UAVCAN_KINETIS_NUM_IFACES > 1
857  if (!if1_.isRxBufferEmpty())
858  {
859  msk.read |= 1 << 1;
860  }
861 
862  if (pending_tx[1] != UAVCAN_NULLPTR)
863  {
864  if (if1_.canAcceptNewTxFrame(*pending_tx[1]))
865  {
866  msk.write |= 1 << 1;
867  }
868  }
869 #endif
870  return msk;
871 }
872 
874 {
875 #if UAVCAN_KINETIS_NUM_IFACES == 1
876  return !if0_.isRxBufferEmpty();
877 #elif UAVCAN_KINETIS_NUM_IFACES == 2
878  return !if0_.isRxBufferEmpty() || !if1_.isRxBufferEmpty();
879 #else
880 # error UAVCAN_KINETIS_NUM_IFACES
881 #endif
882 }
883 
885  const uavcan::CanFrame* (&pending_tx)[uavcan::MaxCanIfaces],
886  const uavcan::MonotonicTime blocking_deadline)
887 {
888  const uavcan::CanSelectMasks in_masks = inout_masks;
890 
891  if0_.discardTimedOutTxMailboxes(time); // Check TX timeouts - this may release some TX slots
892  {
893  CriticalSectionLocker cs_locker;
894  if0_.pollErrorFlagsFromISR();
895  }
896 
897 #if UAVCAN_KINETIS_NUM_IFACES > 1
898  if1_.discardTimedOutTxMailboxes(time);
899  {
900  CriticalSectionLocker cs_locker;
901  if1_.pollErrorFlagsFromISR();
902  }
903 #endif
904 
905  inout_masks = makeSelectMasks(pending_tx); // Check if we already have some of the requested events
906  if ((inout_masks.read & in_masks.read) != 0 ||
907  (inout_masks.write & in_masks.write) != 0)
908  {
909  return 1;
910  }
911 
912  (void)update_event_.wait(blocking_deadline - time); // Block until timeout expires or any iface updates
913  inout_masks = makeSelectMasks(pending_tx); // Return what we got even if none of the requested events are set
914  return 1; // Return value doesn't matter as long as it is non-negative
915 }
916 
917 
919 {
920  /*
921  * CAN1, CAN2
922  */
923  {
924  CriticalSectionLocker lock;
925  modifyreg32(KINETIS_SIM_SCGC6, 0, SIM_SCGC6_FLEXCAN0);
926 #if UAVCAN_KINETIS_NUM_IFACES > 1
927  modifyreg32(KINETIS_SIM_SCGC3, 0, SIM_SCGC3_FLEXCAN1);
928 #endif
929  }
930 
931  /*
932  * IRQ
933  */
934 #define IRQ_ATTACH(irq, handler) \
935  { \
936  const int res = irq_attach(irq, handler, NULL); \
937  (void)res; \
938  assert(res >= 0); \
939  up_enable_irq(irq); \
940  }
941  IRQ_ATTACH(KINETIS_IRQ_CAN0MB, can0_irq);
942 #if UAVCAN_KINETIS_NUM_IFACES > 1
943  IRQ_ATTACH(KINETIS_IRQ_CAN1MB, can1_irq);
944 #endif
945 #undef IRQ_ATTACH
946 }
947 
949 {
950  int res = 0;
951 
952  UAVCAN_KINETIS_LOG("Bitrate %lu mode %d", static_cast<unsigned long>(bitrate), static_cast<int>(mode));
953 
954  static bool initialized_once = false;
955  if (!initialized_once)
956  {
957  initialized_once = true;
958  UAVCAN_KINETIS_LOG("First initialization");
959  initOnce();
960  }
961 
962  /*
963  * CAN1
964  */
965  UAVCAN_KINETIS_LOG("Initing iface 0...");
966  ifaces[0] = &if0_; // This link must be initialized first,
967  res = if0_.init(bitrate, mode); // otherwise an IRQ may fire while the interface is not linked yet;
968  if (res < 0) // a typical race condition.
969  {
970  UAVCAN_KINETIS_LOG("Iface 0 init failed %i", res);
971  ifaces[0] = UAVCAN_NULLPTR;
972  goto fail;
973  }
974 
975  /*
976  * CAN2
977  */
978 #if UAVCAN_KINETIS_NUM_IFACES > 1
979  UAVCAN_KINETIS_LOG("Initing iface 1...");
980  ifaces[1] = &if1_; // Same thing here.
981  res = if1_.init(bitrate, mode);
982  if (res < 0)
983  {
984  UAVCAN_KINETIS_LOG("Iface 1 init failed %i", res);
985  ifaces[1] = UAVCAN_NULLPTR;
986  goto fail;
987  }
988 #endif
989 
990  UAVCAN_KINETIS_LOG("CAN drv init OK");
991  UAVCAN_ASSERT(res >= 0);
992  return res;
993 
994 fail:
995  UAVCAN_KINETIS_LOG("CAN drv init failed %i", res);
996  UAVCAN_ASSERT(res < 0);
997  return res;
998 }
999 
1001 {
1002  if (iface_index < UAVCAN_KINETIS_NUM_IFACES)
1003  {
1004  return ifaces[iface_index];
1005  }
1006  return UAVCAN_NULLPTR;
1007 }
1008 
1010 {
1011  bool ret = if0_.hadActivity();
1012 #if UAVCAN_KINETIS_NUM_IFACES > 1
1013  ret |= if1_.hadActivity();
1014 #endif
1015  return ret;
1016 }
1017 
1018 
1019 /*
1020  * Interrupt handlers
1021  */
1022 extern "C"
1023 {
1024 
1025 static int can0_irq(const int irq, void*, void* args)
1026 {
1027 
1028  CanIface * cif = ifaces[0];
1029  flexcan::CanType* flex = flexcan::Can[0];
1030 
1031  if (cif != UAVCAN_NULLPTR)
1032  {
1034  uavcan::uint32_t flags = flex->IFLAG1 & FIFO_IFLAG1;
1035  if (flags)
1036  {
1037  handleRxInterrupt(cif, flags);
1038  }
1039  const uavcan::uint32_t MB_IFLAG1 = flexcan::TXMBMask;
1040  flags = flex->IFLAG1 & MB_IFLAG1;
1041  if (flags)
1042  {
1043  handleTxInterrupt(cif, flags);
1044  }
1045  }
1046  return 0;
1047 }
1048 
1049 #if UAVCAN_KINETIS_NUM_IFACES > 1
1050 
1051 static int can1_irq(const int irq, void*, void*)
1052 {
1053  CanIface * cif = ifaces[1];
1054  flexcan::CanType* flex = flexcan::Can[1];
1055 
1056  if (cif != UAVCAN_NULLPTR)
1057  {
1059  uavcan::uint32_t flags = flex->IFLAG1 & FIFO_IFLAG1;
1060  if (flags)
1061  {
1062  handleRxInterrupt(cif, flags);
1063  }
1064  const uavcan::uint32_t MB_IFLAG1 = flexcan::TXMBMask;
1065  flags = flex->IFLAG1 & MB_IFLAG1;
1066  if (flags)
1067  {
1068  handleTxInterrupt(cif, flags);
1069  }
1070  }
1071  return 0;
1072 }
1073 
1074 #endif
1075 } // extern "C"
1076 } // namespace uavcan_kinetis
uavcan::CanFrame::MaskStdID
static const uint32_t MaskStdID
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:26
uavcan_kinetis::flexcan::CanType::RXIMR
volatile FilterType RXIMR[HWMaxMB]
Definition: flexcan.hpp:181
uavcan_kinetis::flexcan::busclck
const uavcan::uint32_t busclck
Definition: uc_kinetis_flexcan.cpp:33
uavcan_kinetis::CanIface::hadActivity
bool hadActivity()
Definition: uc_kinetis_flexcan.cpp:832
internal.hpp
uavcan_kinetis::flexcan::FilterType::w
volatile uint32_t w
Definition: flexcan.hpp:77
uavcan::CanFrame::FlagEFF
static const uint32_t FlagEFF
Extended frame format.
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:28
uavcan_kinetis::CanIface::TxItem::busy
@ busy
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:112
uavcan_kinetis::flexcan::CTRL1_RJW_SHIFT
constexpr unsigned long CTRL1_RJW_SHIFT
Definition: flexcan.hpp:278
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan_kinetis::CanIface::rx_queue_
RxQueue rx_queue_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:129
uavcan_kinetis::flexcan::DataType::l
volatile uint32_t l
Definition: flexcan.hpp:98
uavcan_kinetis::flexcan::MessageBufferType
Definition: flexcan.hpp:114
uavcan_kinetis::flexcan::Can
CanType *const Can[UAVCAN_KINETIS_NUM_IFACES]
Definition: flexcan.hpp:217
overflow_cnt_
std::uint32_t overflow_cnt_
Definition: can.cpp:82
uavcan_kinetis::flexcan::MCR_MDIS
constexpr unsigned long MCR_MDIS
Definition: flexcan.hpp:256
uavcan_kinetis::CanIface::discardTimedOutTxMailboxes
void discardTimedOutTxMailboxes(uavcan::MonotonicTime current_time)
Definition: uc_kinetis_flexcan.cpp:767
uavcan_kinetis::CanIface::Timings::prescaler
uavcan::uint8_t prescaler
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:92
uavcan_kinetis::flexcan::MBcsType::code
volatile uint32_t code
Definition: flexcan.hpp:40
uavcan_kinetis::flexcan::MCR_AEN
constexpr unsigned long MCR_AEN
Definition: flexcan.hpp:238
uavcan_kinetis::flexcan::TxMbInactive
@ TxMbInactive
Definition: flexcan.hpp:123
uavcan_kinetis::flexcan::IDType::std
volatile uint32_t std
Definition: flexcan.hpp:70
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
uavcan_kinetis::CanIface::pollErrorFlagsFromISR
void pollErrorFlagsFromISR()
Definition: uc_kinetis_flexcan.cpp:736
uavcan_kinetis::CanIface::NumTxMesgBuffers
@ NumTxMesgBuffers
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:124
uavcan_kinetis::CanIface::fifo_warn_cnt_
uavcan::uint64_t fifo_warn_cnt_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:132
uavcan_kinetis::flexcan::CanType::RX14MASK
volatile uint32_t RX14MASK
Definition: flexcan.hpp:159
uavcan_kinetis::CanIface::TxItem::abort_on_error
bool abort_on_error
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:114
in_
std::uint8_t in_
Definition: can.cpp:83
uavcan_kinetis::flexcan::CAN_FIFO_WARN
constexpr unsigned long CAN_FIFO_WARN
Definition: flexcan.hpp:541
uavcan_kinetis::flexcan::CTRL2_RFFN_16MB
constexpr unsigned long CTRL2_RFFN_16MB(1U<< CTRL2_RFFN_SHIFT)
uavcan_kinetis::flexcan::HWMaxMB
@ HWMaxMB
Definition: flexcan.hpp:27
uavcan_kinetis::flexcan::MBcsType::dlc
volatile uint32_t dlc
Definition: flexcan.hpp:35
uavcan_kinetis::CanDriver::getIface
virtual CanIface * getIface(uavcan::uint8_t iface_index)
Definition: uc_kinetis_flexcan.cpp:1000
uavcan_kinetis::CanIface::Timings::pseg2
uavcan::uint8_t pseg2
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:95
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan_kinetis::flexcan::CTRL1_TWRNMSK
constexpr unsigned long CTRL1_TWRNMSK
Definition: flexcan.hpp:269
uavcan_kinetis::CanIface
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:51
uavcan_kinetis::flexcan::ESR1_BIT0ERR
constexpr unsigned long ESR1_BIT0ERR
Definition: flexcan.hpp:420
uavcan::UtcTime
Implicitly convertible to/from uavcan.Timestamp.
Definition: time.hpp:191
can.hpp
uavcan_kinetis::flexcan::MCR_SOFTRST
constexpr unsigned long MCR_SOFTRST
Definition: flexcan.hpp:250
uavcan_kinetis::flexcan::CanType::fifo
RxFiFoType fifo
Definition: flexcan.hpp:177
uavcan_kinetis::flexcan::CTRL1_PSEG2_SHIFT
constexpr unsigned long CTRL1_PSEG2_SHIFT
Definition: flexcan.hpp:274
uavcan_kinetis::flexcan::FIFOcsType::dlc
volatile uint32_t dlc
Definition: flexcan.hpp:51
uavcan_kinetis::CanIface::setMCR
void setMCR(uavcan::uint32_t mask, bool target_state)
Definition: uc_kinetis_flexcan.cpp:414
uavcan_kinetis::flexcan::MessageBufferType::CS
MBcsType CS
Definition: flexcan.hpp:116
uavcan_kinetis::flexcan::MCR_WAKSRC
constexpr unsigned long MCR_WAKSRC
Definition: flexcan.hpp:244
uavcan_kinetis::CanIface::pending_aborts_
uavcan::uint32_t pending_aborts_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:133
uavcan_kinetis::flexcan::ESR1_BIT1ERR
constexpr unsigned long ESR1_BIT1ERR
Definition: flexcan.hpp:421
uavcan_kinetis::flexcan::TxMbDataOrRemote
@ TxMbDataOrRemote
Definition: flexcan.hpp:125
uavcan_kinetis::CanIface::Timings::rjw
uavcan::uint8_t rjw
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:93
uavcan_kinetis::CanIface::waitMCRChange
bool waitMCRChange(uavcan::uint32_t mask, bool target_state)
Definition: uc_kinetis_flexcan.cpp:399
uavcan_kinetis::ErrMcrSOFTRSTNotCleared
static const uavcan::int16_t ErrMcrSOFTRSTNotCleared
MCR_SOFTRST bit of the MCR register is not 0.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:30
uavcan_kinetis::flexcan::MCR_LPMACK
constexpr unsigned long MCR_LPMACK
Definition: flexcan.hpp:245
uavcan_kinetis::flexcan::CanType::ESR2
volatile uint32_t ESR2
Definition: flexcan.hpp:168
uavcan_kinetis::flexcan::TxMbAbort
@ TxMbAbort
Definition: flexcan.hpp:124
uavcan_kinetis::flexcan::MBcsType::w
volatile uint32_t w
Definition: flexcan.hpp:31
uavcan_kinetis::CanDriver::hadActivity
bool hadActivity()
Definition: uc_kinetis_flexcan.cpp:1009
uavcan_kinetis::flexcan::CanType::RXMGMASK
volatile uint32_t RXMGMASK
Definition: flexcan.hpp:158
uavcan_kinetis::flexcan::CAN_FIFO_OV
constexpr unsigned long CAN_FIFO_OV
Definition: flexcan.hpp:543
uavcan_kinetis::flexcan::CAN_FIFO_NE
constexpr unsigned long CAN_FIFO_NE
Definition: flexcan.hpp:539
uavcan_kinetis::CanIface::waitFreezeAckChange
bool waitFreezeAckChange(bool target_state)
Definition: uc_kinetis_flexcan.cpp:427
uavcan_kinetis::flexcan::CTRL2_RRS
constexpr unsigned long CTRL2_RRS
Definition: flexcan.hpp:573
uavcan_kinetis::flexcan::CanType::RXFIR
volatile uint32_t RXFIR
Definition: flexcan.hpp:173
uavcan_kinetis::CanIface::OperatingMode
OperatingMode
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:169
uavcan_kinetis::flexcan::CanType::CTRL2
volatile uint32_t CTRL2
Definition: flexcan.hpp:167
uavcan_kinetis::flexcan::DataType::b7
volatile uint32_t b7
Definition: flexcan.hpp:106
uavcan_kinetis::flexcan::MBcsType::rtr
volatile uint32_t rtr
Definition: flexcan.hpp:36
uavcan_kinetis::CanIface::init
int init(const uavcan::uint32_t bitrate, const OperatingMode mode)
Definition: uc_kinetis_flexcan.cpp:500
uavcan::CanFilterConfig
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:99
uavcan_kinetis::flexcan::FilterType::ide
volatile uint32_t ide
Definition: flexcan.hpp:91
IRQ_ATTACH
#define IRQ_ATTACH(irq, handler)
uavcan::CanFrame
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:24
uavcan_kinetis::ErrFilterNumConfigs
static const uavcan::int16_t ErrFilterNumConfigs
Number of filters is more than supported.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:29
uavcan_kinetis::CanIface::update_event_
BusEvent & update_event_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:135
uavcan::CanFrame::dlc
uint8_t dlc
Data Length Code.
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:36
uavcan::CanIOFlagLoopback
static const CanIOFlags CanIOFlagLoopback
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:141
uavcan_kinetis::can0_irq
static int can0_irq(const int irq, void *, void *args)
Definition: uc_kinetis_flexcan.cpp:1025
uavcan_kinetis::flexcan::CanType::mb
MessageBufferType mb
Definition: flexcan.hpp:178
uavcan_kinetis::flexcan::numberFIFOFilters
const uavcan::uint32_t numberFIFOFilters
Definition: uc_kinetis_flexcan.cpp:37
uavcan_kinetis::flexcan::CanType::MCR
volatile uint32_t MCR
Definition: flexcan.hpp:154
uavcan_kinetis::ErrMcrLPMAckNotCleared
static const uavcan::int16_t ErrMcrLPMAckNotCleared
MCR_LPMACK bit of the MCR register is not 0.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:25
uavcan_kinetis::CanIface::TxItem::free
@ free
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:112
uavcan_kinetis::flexcan::FilterType::std
volatile uint32_t std
Definition: flexcan.hpp:86
uavcan_kinetis::flexcan::MCR_SUPV
constexpr unsigned long MCR_SUPV
Definition: flexcan.hpp:248
uavcan::CanFrame::id
uint32_t id
CAN ID with flags (above)
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:34
uavcan_kinetis::CanIface::RxQueue::reset
void reset()
Definition: uc_kinetis_flexcan.cpp:127
uavcan_kinetis::flexcan::RxFiFoType::data
DataType data
Definition: flexcan.hpp:136
uavcan_kinetis::flexcan::IDType::w
volatile uint32_t w
Definition: flexcan.hpp:61
uavcan::fill_n
UAVCAN_EXPORT void fill_n(OutputIt first, std::size_t n, const T &value)
Definition: templates.hpp:268
uavcan_kinetis::flexcan::DataType::b6
volatile uint32_t b6
Definition: flexcan.hpp:107
uavcan::MaxCanIfaces
@ MaxCanIfaces
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:19
uavcan_kinetis::ErrUnsupportedFrame
static const uavcan::int16_t ErrUnsupportedFrame
Frame not supported (e.g. RTR, CAN FD, etc)
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:23
uavcan_kinetis::flexcan::DataType::b1
volatile uint32_t b1
Definition: flexcan.hpp:104
uavcan_kinetis::flexcan::MessageBufferType::ID
IDType ID
Definition: flexcan.hpp:117
uavcan_kinetis::CanDriver::hasReadableInterfaces
bool hasReadableInterfaces() const
Definition: uc_kinetis_flexcan.cpp:873
uavcan_kinetis::flexcan::ESR1_FRMERR
constexpr unsigned long ESR1_FRMERR
Definition: flexcan.hpp:417
uavcan_kinetis::flexcan::MCR_FRZACK
constexpr unsigned long MCR_FRZACK
Definition: flexcan.hpp:249
uavcan_kinetis::flexcan::canclk
const uavcan::uint32_t canclk
Definition: uc_kinetis_flexcan.cpp:35
uavcan_kinetis::flexcan::DataType::b2
volatile uint32_t b2
Definition: flexcan.hpp:103
uavcan_kinetis::CanIface::handleTxInterrupt
void handleTxInterrupt(uavcan::uint32_t tx_iflags, uavcan::uint64_t utc_usec)
Definition: uc_kinetis_flexcan.cpp:614
uavcan_kinetis::flexcan::MBcsType::ide
volatile uint32_t ide
Definition: flexcan.hpp:37
uavcan_kinetis::CanIface::handleTxMailboxInterrupt
void handleTxMailboxInterrupt(uavcan::uint8_t mailbox_index, bool txok, uavcan::uint64_t utc_usec)
Definition: uc_kinetis_flexcan.cpp:598
uavcan::CanFrame::isErrorFrame
bool isErrorFrame() const
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:72
uavcan_kinetis::flexcan::CTRL2_TASD_MASK
constexpr unsigned long CTRL2_TASD_MASK
Definition: flexcan.hpp:576
uavcan_kinetis::flexcan::CanType::MB
union uavcan_kinetis::flexcan::CanType::@167 MB[HWMaxMB]
uavcan_kinetis::CanIface::FIFO_IFLAG1
const uavcan::uint32_t FIFO_IFLAG1
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:54
uavcan::uint16_t
std::uint16_t uint16_t
Definition: std.hpp:25
uavcan_kinetis::flexcan::FilterType::ext
volatile uint32_t ext
Definition: flexcan.hpp:81
uavcan_kinetis::flexcan::ESR1_ACKERR
constexpr unsigned long ESR1_ACKERR
Definition: flexcan.hpp:419
uavcan_kinetis
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:13
uavcan::int16_t
std::int16_t int16_t
Definition: std.hpp:30
uavcan_kinetis::CanDriver::makeSelectMasks
uavcan::CanSelectMasks makeSelectMasks(const uavcan::CanFrame *(&pending_tx)[uavcan::MaxCanIfaces]) const
Definition: uc_kinetis_flexcan.cpp:843
uavcan_kinetis::flexcan::ESR1_STFERR
constexpr unsigned long ESR1_STFERR
Definition: flexcan.hpp:416
uavcan_kinetis::flexcan::CanType::CTRL1
volatile uint32_t CTRL1
Definition: flexcan.hpp:155
uavcan_kinetis::flexcan::FilterType::rtr
volatile uint32_t rtr
Definition: flexcan.hpp:92
uavcan::TimeBase< UtcTime, UtcDuration >::fromUSec
static UtcTime fromUSec(uint64_t us)
Definition: time.hpp:112
uavcan_kinetis::flexcan::RxFiFoType::ID
IDType ID
Definition: flexcan.hpp:135
uavcan::CanSelectMasks::read
uint8_t read
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:121
uavcan_kinetis::CanIface::RxQueue::registerOverflow
void registerOverflow()
Definition: uc_kinetis_flexcan.cpp:76
uavcan_kinetis::CanIface::TxItem::deadline
uavcan::MonotonicTime deadline
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:110
uavcan_kinetis::flexcan::MCR_FRZ
constexpr unsigned long MCR_FRZ
Definition: flexcan.hpp:255
uavcan_kinetis::ErrInvalidBitRate
static const uavcan::int16_t ErrInvalidBitRate
Bit rate not supported.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:21
uavcan_kinetis::CanIface::getErrorCount
virtual uavcan::uint64_t getErrorCount() const
Definition: uc_kinetis_flexcan.cpp:820
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan_kinetis::flexcan::MessageBufferType::data
DataType data
Definition: flexcan.hpp:118
uavcan_kinetis::CanIface::RxQueue::getLength
unsigned getLength() const
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:81
uavcan_kinetis::flexcan::ESR2_LPTM_MASK
constexpr unsigned long ESR2_LPTM_MASK
Definition: flexcan.hpp:604
uavcan_kinetis::flexcan::CTRL1_ERRMSK
constexpr unsigned long CTRL1_ERRMSK
Definition: flexcan.hpp:272
uavcan_kinetis::flexcan::MCR_MAXMB_MASK
constexpr unsigned long MCR_MAXMB_MASK
Definition: flexcan.hpp:229
uavcan_kinetis::CanIface::setFreeze
void setFreeze(bool freeze_true)
Definition: uc_kinetis_flexcan.cpp:432
uavcan_kinetis::flexcan::CTRL1_ROPSEG_SHIFT
constexpr unsigned long CTRL1_ROPSEG_SHIFT
Definition: flexcan.hpp:260
uavcan_kinetis::flexcan::DataType::b3
volatile uint32_t b3
Definition: flexcan.hpp:102
setup.args
args
Definition: pyuavcan/setup.py:22
uavcan::CanFilterConfig::mask
uint32_t mask
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:102
uavcan::max
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Definition: templates.hpp:291
uavcan_kinetis::flexcan::FIFOcsType::rtr
volatile uint32_t rtr
Definition: flexcan.hpp:52
uavcan_lpc11c24::clock::fail
static void fail()
Definition: clock.cpp:38
uavcan_kinetis::flexcan::ESR2_IMB
constexpr unsigned long ESR2_IMB
Definition: flexcan.hpp:600
uavcan_kinetis::flexcan::ESR2_VPS
constexpr unsigned long ESR2_VPS
Definition: flexcan.hpp:601
uavcan_kinetis::CanIface::handleRxInterrupt
void handleRxInterrupt(uavcan::uint32_t rx_iflags, uavcan::uint64_t utc_usec)
Definition: uc_kinetis_flexcan.cpp:661
uavcan_kinetis::CanIface::had_activity_
bool had_activity_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:139
uavcan_kinetis::flexcan::MCR_MAXMB_SHIFT
constexpr unsigned long MCR_MAXMB_SHIFT
Definition: flexcan.hpp:228
uavcan_kinetis::CanIface::SilentMode
@ SilentMode
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:172
uavcan_kinetis::flexcan::NumHWFilters
@ NumHWFilters
Definition: flexcan.hpp:199
uavcan::CanFrame::MaskExtID
static const uint32_t MaskExtID
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:27
uavcan::CanSelectMasks
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:119
uavcan_kinetis::BusEvent::wait
bool wait(uavcan::MonotonicDuration duration)
Definition: uc_kinetis_thread.cpp:123
uavcan_kinetis::flexcan::CTRL1_PSEG1_SHIFT
constexpr unsigned long CTRL1_PSEG1_SHIFT
Definition: flexcan.hpp:276
uavcan_kinetis::CanIface::computeTimings
int computeTimings(uavcan::uint32_t target_bitrate, Timings &out_timings)
Definition: uc_kinetis_flexcan.cpp:139
uavcan_kinetis::flexcan::DataType::h
volatile uint32_t h
Definition: flexcan.hpp:99
uavcan_kinetis::CanIface::RxQueue::getOverflowCount
uavcan::uint32_t getOverflowCount() const
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:85
uavcan::CanSelectMasks::write
uint8_t write
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:122
uavcan_kinetis::flexcan::CTRL2_EACEN
constexpr unsigned long CTRL2_EACEN
Definition: flexcan.hpp:571
uavcan_kinetis::flexcan::MBcsType
Definition: flexcan.hpp:29
uavcan::CanFrame::isRemoteTransmissionRequest
bool isRemoteTransmissionRequest() const
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:71
uavcan_kinetis::flexcan::MCR_WRNEN
constexpr unsigned long MCR_WRNEN
Definition: flexcan.hpp:246
uavcan_kinetis::CanIface::doReset
uavcan::int16_t doReset(Timings timings)
Definition: uc_kinetis_flexcan.cpp:456
uavcan_kinetis::flexcan::useFIFO
const uavcan::uint8_t useFIFO
Definition: uc_kinetis_flexcan.cpp:36
uavcan_kinetis::flexcan::FiFo
@ FiFo
Definition: flexcan.hpp:187
uavcan_kinetis::CanIface::TxItem
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:108
uavcan::min
const UAVCAN_EXPORT T & min(const T &a, const T &b)
Definition: templates.hpp:281
uavcan_kinetis::flexcan::CTRL1_LOM
constexpr unsigned long CTRL1_LOM
Definition: flexcan.hpp:262
uavcan_kinetis::CanDriver::select
virtual uavcan::int16_t select(uavcan::CanSelectMasks &inout_masks, const uavcan::CanFrame *(&pending_tx)[uavcan::MaxCanIfaces], uavcan::MonotonicTime blocking_deadline)
Definition: uc_kinetis_flexcan.cpp:884
uavcan_kinetis::flexcan::IDType::ext
volatile uint32_t ext
Definition: flexcan.hpp:64
uavcan_kinetis::CanIface::RxQueue::overflow_cnt_
uavcan::uint32_t overflow_cnt_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:62
uavcan_kinetis::flexcan::MCR_RFEN
constexpr unsigned long MCR_RFEN
Definition: flexcan.hpp:254
len_
std::uint8_t len_
Definition: can.cpp:85
uavcan_kinetis::flexcan::MCR_HALT
constexpr unsigned long MCR_HALT
Definition: flexcan.hpp:253
uavcan::CanFrame::data
uint8_t data[MaxDataLen]
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:35
uavcan_kinetis::clock::getMonotonic
uavcan::MonotonicTime getMonotonic()
Definition: clock.cpp:83
uavcan_kinetis::CanIface::configureFilters
virtual uavcan::int16_t configureFilters(const uavcan::CanFilterConfig *filter_configs, uavcan::uint16_t num_configs)
Definition: uc_kinetis_flexcan.cpp:325
uavcan_kinetis::flexcan::CTRL1_PRESDIV_SHIFT
constexpr unsigned long CTRL1_PRESDIV_SHIFT
Definition: flexcan.hpp:280
uavcan_kinetis::CanIface::Timings::propseg
uavcan::uint8_t propseg
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:96
uavcan_kinetis::CanIface::receive
virtual uavcan::int16_t receive(uavcan::CanFrame &out_frame, uavcan::MonotonicTime &out_ts_monotonic, uavcan::UtcTime &out_ts_utc, uavcan::CanIOFlags &out_flags)
Definition: uc_kinetis_flexcan.cpp:308
out_
std::uint8_t out_
Definition: can.cpp:84
uavcan_kinetis::CanIface::Timings::pseg1
uavcan::uint8_t pseg1
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:94
uavcan_kinetis::CanIface::canAcceptNewTxFrame
bool canAcceptNewTxFrame(const uavcan::CanFrame &frame) const
Definition: uc_kinetis_flexcan.cpp:782
uavcan_kinetis::flexcan::FirstFilter
@ FirstFilter
Definition: flexcan.hpp:194
uavcan_kinetis::flexcan::DataType::b5
volatile uint32_t b5
Definition: flexcan.hpp:108
uavcan_kinetis::CanIface::NumFilters
@ NumFilters
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:125
uavcan_kinetis::CanIface::TxItem::abort
@ abort
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:112
frame
uavcan::CanFrame frame
Definition: can.cpp:78
uavcan_kinetis::flexcan::TXMBMask
@ TXMBMask
Definition: flexcan.hpp:209
uavcan_kinetis::flexcan::CTRL1_RWRNMSK
constexpr unsigned long CTRL1_RWRNMSK
Definition: flexcan.hpp:268
uavcan_kinetis::CanIface::peak_tx_mailbox_index_
uavcan::uint8_t peak_tx_mailbox_index_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:137
uavcan::CanFrame::isExtended
bool isExtended() const
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:70
uavcan_kinetis::CanIface::TxItem::pending
enum uavcan_kinetis::CanIface::TxItem::@143 pending
uavcan_kinetis::flexcan::CanType
Definition: flexcan.hpp:152
uavcan_kinetis::CanIface::Timings
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:90
uavcan_kinetis::flexcan::CTRL1_CLKSRC
constexpr unsigned long CTRL1_CLKSRC
Definition: flexcan.hpp:271
uavcan_kinetis::flexcan::CanType::IMASK1
volatile uint32_t IMASK1
Definition: flexcan.hpp:164
uavcan_kinetis::flexcan::FilterType
Definition: flexcan.hpp:75
uavcan_kinetis::flexcan::RxFiFoType::CS
FIFOcsType CS
Definition: flexcan.hpp:134
uavcan_kinetis::ErrMcrFRZACKAckNotCleared
static const uavcan::int16_t ErrMcrFRZACKAckNotCleared
MCR_FRZACK bit of the MCR register is not 0.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:27
uavcan_kinetis::flexcan::CanType::ESR1
volatile uint32_t ESR1
Definition: flexcan.hpp:162
uavcan_kinetis::CanIface::TxItem::frame
uavcan::CanFrame frame
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:111
uavcan_kinetis::CanIface::send
virtual uavcan::int16_t send(const uavcan::CanFrame &frame, uavcan::MonotonicTime tx_deadline, uavcan::CanIOFlags flags)
Definition: uc_kinetis_flexcan.cpp:211
uavcan_kinetis::clock::getUtcUSecFromCanInterrupt
uavcan::uint64_t getUtcUSecFromCanInterrupt()
Definition: clock.cpp:78
uavcan_kinetis::CanIface::getRxQueueLength
unsigned getRxQueueLength() const
Definition: uc_kinetis_flexcan.cpp:826
uavcan_kinetis::flexcan::DataType::b0
volatile uint32_t b0
Definition: flexcan.hpp:105
buf_
Item buf_[UAVCAN_LPC11C24_RX_QUEUE_LEN]
Definition: can.cpp:81
uavcan_kinetis::CanIface::RxQueue::push
void push(const uavcan::CanFrame &frame, const uint64_t &utc_usec, uavcan::CanIOFlags flags)
Definition: uc_kinetis_flexcan.cpp:84
uavcan_kinetis::CanIface::CanIface
CanIface(flexcan::CanType *can, BusEvent &update_event, uavcan::uint8_t self_index, CanRxItem *rx_queue_buffer, uavcan::uint8_t rx_queue_capacity)
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:175
uavcan_kinetis::flexcan::MCR_IRMQ
constexpr unsigned long MCR_IRMQ
Definition: flexcan.hpp:241
uavcan_kinetis::flexcan::CLOCKSEL
const uavcan::uint8_t CLOCKSEL
Definition: uc_kinetis_flexcan.cpp:34
uavcan_kinetis::CanIface::setEnable
bool setEnable(bool enable_true)
Definition: uc_kinetis_flexcan.cpp:451
uavcan_kinetis::flexcan::MCR_SLFWAK
constexpr unsigned long MCR_SLFWAK
Definition: flexcan.hpp:247
uavcan::CanIOFlags
uint16_t CanIOFlags
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:140
uavcan_kinetis::flexcan::RxFiFoType
Definition: flexcan.hpp:132
uavcan_kinetis::CanIface::can_
flexcan::CanType *const can_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:130
uavcan_kinetis::CanIface::TxItem::loopback
bool loopback
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:113
uavcan_kinetis::CanDriver::init
int init(const uavcan::uint32_t bitrate, const CanIface::OperatingMode mode)
Definition: uc_kinetis_flexcan.cpp:948
uavcan_kinetis::CanIface::RxQueue::pop
void pop(uavcan::CanFrame &out_frame, uavcan::uint64_t &out_utc_usec, uavcan::CanIOFlags &out_flags)
Definition: uc_kinetis_flexcan.cpp:107
uavcan_kinetis::flexcan::NumMBinFiFoAndFilters
@ NumMBinFiFoAndFilters
Definition: flexcan.hpp:200
uavcan::MonotonicTime
Definition: time.hpp:184
uavcan_kinetis::flexcan::CanType::IFLAG1
volatile uint32_t IFLAG1
Definition: flexcan.hpp:166
uavcan_kinetis::flexcan::ESR2_LPTM_SHIFT
constexpr unsigned long ESR2_LPTM_SHIFT
Definition: flexcan.hpp:603
uavcan_kinetis::flexcan::DataType::b4
volatile uint32_t b4
Definition: flexcan.hpp:109
uavcan::CanFrame::priorityHigherThan
bool priorityHigherThan(const CanFrame &rhs) const
Definition: uc_can.cpp:19
uavcan_kinetis::flexcan::OSCERCLK
const uavcan::uint32_t OSCERCLK
Definition: uc_kinetis_flexcan.cpp:32
uavcan_kinetis::ErrMcrLPMAckNotSet
static const uavcan::int16_t ErrMcrLPMAckNotSet
MCR_LPMACK bit of the MCR register is not 1.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:24
uavcan_kinetis::CanDriver::initOnce
static void initOnce()
Definition: uc_kinetis_flexcan.cpp:918
UNUSED
#define UNUSED(expr)
uavcan_kinetis::flexcan::CanType::RXFGMASK
volatile uint32_t RXFGMASK
Definition: flexcan.hpp:172
uavcan_kinetis::flexcan::CanType::RX15MASK
volatile uint32_t RX15MASK
Definition: flexcan.hpp:160
uavcan::CanFilterConfig::id
uint32_t id
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:101
uavcan_kinetis::CanIface::isRxBufferEmpty
bool isRxBufferEmpty() const
Definition: uc_kinetis_flexcan.cpp:814
utc_usec
std::uint64_t utc_usec
Definition: can.cpp:77
uavcan::CanIOFlagAbortOnError
static const CanIOFlags CanIOFlagAbortOnError
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:142
clock.hpp
uavcan_kinetis::flexcan::FIFOcsType::ide
volatile uint32_t ide
Definition: flexcan.hpp:53
uavcan_kinetis::CanIface::served_aborts_cnt_
uavcan::uint32_t served_aborts_cnt_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:134
uavcan_kinetis::ErrMcrFRZACKAckNotSet
static const uavcan::int16_t ErrMcrFRZACKAckNotSet
MCR_FRZACK bit of the MCR register is not 1.
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:26
uavcan_kinetis::flexcan::MCR_SRXDIS
constexpr unsigned long MCR_SRXDIS
Definition: flexcan.hpp:242
uavcan_kinetis::flexcan::CanType::TIMER
volatile uint32_t TIMER
Definition: flexcan.hpp:156
uavcan_kinetis::CanIface::pending_tx_
TxItem pending_tx_[NumTxMesgBuffers]
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:136
uavcan_kinetis::BusEvent::signalFromInterrupt
void signalFromInterrupt()
Definition: uc_kinetis_thread.cpp:142
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
uavcan::CanFrame::FlagRTR
static const uint32_t FlagRTR
Remote transmission request.
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:29
UAVCAN_KINETIS_LOG
#define UAVCAN_KINETIS_LOG(fmt,...)
Definition: kinetis/libuavcan/driver/src/internal.hpp:26
uavcan_kinetis::flexcan::ESR1_CRCERR
constexpr unsigned long ESR1_CRCERR
Definition: flexcan.hpp:418
uavcan_kinetis::CanIface::error_cnt_
uavcan::uint64_t error_cnt_
Definition: platform_specific_components/kinetis/libuavcan/driver/include/uavcan_kinetis/can.hpp:131
uavcan_kinetis::flexcan::CTRL2_TASD_SHIFT
constexpr unsigned long CTRL2_TASD_SHIFT
Definition: flexcan.hpp:575


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03