97 uint8_t spi_mode = SPI_MODE_0;
99 uint32_t spi_max_speed_hz = freq / 2;
195 struct can_frame *can_frame;
197 portENTER_CRITICAL();
198 if (txBuf->data_read_pointer(&can_frame))
201 txBuf->signal_condition();
208 struct can_frame *can_frame;
211 int index = (txPending_ & 0x1) ? 1 : 0;
213 portENTER_CRITICAL();
214 if (txBuf->data_read_pointer(&can_frame))
224 bit_modify(index == 0 ? TXB1CTRL : TXB0CTRL, 0x01, 0x03);
227 buffer_write(&buffer, can_frame);
229 txPending_ |= (0x1 << index);
232 bit_modify(index == 0 ? TXB0CTRL : TXB1CTRL, 0x08, 0x0B);
233 bit_modify(CANINTE, TX0I << index, TX0I << index);
234 txBuf->signal_condition();
271 spi_ioc_transfer xfer[2];
272 memset(xfer, 0,
sizeof(xfer));
273 uint8_t wr_data[2] = {READ, 0};
274 xfer[0].tx_buf = (
unsigned long)wr_data;
275 xfer[0].len =
sizeof(wr_data);
276 xfer[1].rx_buf = (
unsigned long)regs_;
277 xfer[1].len =
sizeof(regs_);
278 xfer[1].cs_change = 1;
279 ::ioctl(spiFd_, SPI_IOC_MESSAGE(2), xfer);
289 uint8_t canintf = register_read(CANINTF);
291 if (UNLIKELY((canintf & ERRI)) || UNLIKELY((canintf & MERR)))
294 uint8_t eflg = register_read(EFLG);
297 bit_modify(CANINTF, 0, ERRI | MERR);
299 if (eflg & (RX0OVR | RX1OVR))
305 bit_modify(EFLG, 0, (RX0OVR | RX1OVR));
313 if ((eflg & TXEP) || (eflg & RXEP))
320 register_write(TXB0CTRL, 0x00);
321 register_write(TXB1CTRL, 0x00);
322 bit_modify(CANINTE, 0, TX0I | TX1I);
323 bit_modify(CANINTF, 0, TX0I | TX1I);
325 portENTER_CRITICAL();
328 txBuf->signal_condition();
339 buffer_read(&buffer);
340 struct can_frame *can_frame;
342 portENTER_CRITICAL();
343 if (LIKELY(rxBuf->data_write_pointer(&can_frame)))
347 rxBuf->signal_condition();
348 ++numReceivedPackets_;
361 if (UNLIKELY(canintf & RX1I))
366 buffer_read(&buffer);
367 struct can_frame *can_frame;
369 portENTER_CRITICAL();
370 if (LIKELY(rxBuf->data_write_pointer(&can_frame)))
374 rxBuf->signal_condition();
375 ++numReceivedPackets_;
392 bit_modify(CANINTE, 0, TX0I);
393 bit_modify(CANINTF, 0, TX0I);
394 ++numTransmittedPackets_;
400 bit_modify(CANINTE, 0, TX1I);
401 bit_modify(CANINTF, 0, TX1I);
402 ++numTransmittedPackets_;
405 while (txPending_ < 3)
407 struct can_frame *can_frame;
410 int index = (txPending_ & 0x1) ? 1 : 0;
412 portENTER_CRITICAL();
413 if (txBuf->data_read_pointer(&can_frame))
423 bit_modify(index == 0 ? TXB1CTRL : TXB0CTRL, 0x01, 0x03);
426 buffer_write(&buffer, can_frame);
428 txPending_ |= (0x1 << index);
431 bit_modify(index == 0 ? TXB0CTRL : TXB1CTRL, 0x08, 0x0B);
432 bit_modify(CANINTE, TX0I << index, TX0I << index);
433 txBuf->signal_condition();
443 if (UNLIKELY(ioPending_))
447 register_write(BFPCTRL, 0x0C | (gpoData_ << 4));
450 gpiData_ = (register_read(TXRTSCTRL) >> 3) & 0x7;