#endif /*CAN_WITH_RTL*/
+/* CAN message timestamp source, it is called from interrupt context */
+#define can_gettimeofday do_gettimeofday
+
#endif /*_CAN_SYSDEP_H*/
int can_check_dev_taken(void *anydev);
+#if defined(can_gettimeofday) && defined(CAN_MSG_VERSION_2) && 1
+static inline
+void can_filltimestamp(canmsg_tstamp_t *ptimestamp)
+{
+ can_gettimeofday(ptimestamp);
+}
+#else /* No timestamp support, set field to zero */
+static inline
+void can_filltimestamp(canmsg_tstamp_t *ptimestamp)
+{
+ #ifdef CAN_MSG_VERSION_2
+ ptimestamp->tv_sec = 0;
+ ptimestamp->tv_usec = 0;
+ #else /* CAN_MSG_VERSION_2 */
+ *ptimestamp = 0;
+ #endif /* CAN_MSG_VERSION_2 */
+
+}
+#endif /* End of timestamp source selection */
+
#ifdef CAN_WITH_RTL
extern int can_rtl_priority;
#endif /*CAN_WITH_RTL*/
if(pmsgobj->tx_slot){
/* Do local transmitted message distribution if enabled */
if (processlocal){
+ /* fill CAN message timestamp */
+ can_filltimestamp(&pmsgobj->tx_slot->msg.timestamp);
+
pmsgobj->tx_slot->msg.flags |= MSG_LOCAL;
canque_filter_msg2edges(pmsgobj->qends, &pmsgobj->tx_slot->msg);
}
for ( i=0; i < pmsgobj->rx_msg.length; i++ )
DEBUGMSG(" data[%d] = 0x%.2x\n", i, pmsgobj->rx_msg.data[i]);
+ /* fill CAN message timestamp */
+ can_filltimestamp(&pmsgobj->rx_msg.timestamp);
+
canque_filter_msg2edges(pmsgobj->qends, &pmsgobj->rx_msg);
#ifdef CAN_WITH_STATISTICS
chip=candev->chip[i];
if(!chip || !(chip->flags&CHIP_CONFIGURED))
continue;
- sja1000p_irq_handler(irq, dev_id, regs);
+ sja1000p_irq_handler(irq, chip, regs);
}
icr=readl(candev->dev_base_addr + PITA2_ICR);
} while(icr & PITA2_ICR_INT0);
if(obj->tx_slot){
/* Do local transmitted message distribution if enabled */
if (processlocal){
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->tx_slot->msg.timestamp);
+
obj->tx_slot->msg.flags |= MSG_LOCAL;
canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
}
}
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->rx_msg.timestamp);
+
canque_filter_msg2edges(obj->qends, &obj->rx_msg);
if (msgctl1 & NEWD_SET)
id = can_read_reg(chip, SJARXID0) | (can_read_reg(chip, SJARXID1)<<8);
obj->rx_msg.length = len = id & 0x0f;
obj->rx_msg.flags = id&sjaID0_RTR ? MSG_RTR : 0;
- #ifdef CAN_MSG_VERSION_2
- obj->rx_msg.timestamp.tv_sec = 0;
- obj->rx_msg.timestamp.tv_usec = 0;
- #else /* CAN_MSG_VERSION_2 */
- obj->rx_msg.timestamp = 0;
- #endif /* CAN_MSG_VERSION_2 */
obj->rx_msg.cob = 0;
obj->rx_msg.id = id>>5;
can_write_reg(chip, sjaCMR_RRB, SJACMR);
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->rx_msg.timestamp);
+
canque_filter_msg2edges(obj->qends, &obj->rx_msg);
} while(can_read_reg(chip, SJASR) & sjaSR_RBS);
}
if(obj->tx_slot){
/* Do local transmitted message distribution if enabled */
if (processlocal){
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->tx_slot->msg.timestamp);
+
obj->tx_slot->msg.flags |= MSG_LOCAL;
canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
}
obj->rx_msg.data[i]=can_read_reg(chip,datastart+i);
}
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->rx_msg.timestamp);
+
canque_filter_msg2edges(obj->qends, &obj->rx_msg);
can_write_reg(chip, sjaCMR_RRB, SJACMR);
if(obj->tx_slot){
/* Do local transmitted message distribution if enabled */
if (processlocal){
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->tx_slot->msg.timestamp);
+
obj->tx_slot->msg.flags |= MSG_LOCAL;
canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
}
struct msgobj_t *obj=(struct msgobj_t *)data;
if(obj->tx_slot) {
+ /* fill CAN message timestamp */
+ can_filltimestamp(&obj->tx_slot->msg.timestamp);
+
/* Deliver message to edges */
canque_filter_msg2edges(obj->qends, &obj->tx_slot->msg);
/* Free transmitted slot */
/* Ensure delivery of all ready slots */
while((cmd=canque_test_outslot(obj->qends, &qedge, &slot)) >= 0){
if(cmd==0) {
+ /* fill CAN message timestamp */
+ can_filltimestamp(&slot->msg.timestamp);
+
canque_filter_msg2edges(obj->qends, &slot->msg);
DEBUGMSG("virtual: direct delivery\n");
}