static int CAN_ISR(int irq, void *data) { unsigned long isr; CAN_Bus *can = (CAN_Bus *)data; if (((isr = io_In32(can->handle, can->ISR)) & 0x07FFL) != 0x00L) { if (isr & CAN_RXI) { io_DisableINT(); { can->rx_temp.type = (unsigned char)io_In32(can->handle, can->RX.TYPE); can->rx_temp.id = io_In32(can->handle, can->RX.IDR); can->rx_temp.hdata = io_In32(can->handle, can->RX.DATAH); can->rx_temp.ldata = io_In32(can->handle, can->RX.DATAL); PushBufQueue(can->rcvd, (void*)&can->rx_temp); } io_RestoreINT(); io_Out32(can->handle, can->REQ, 0x0100L); // release the received message io_Out32(can->handle, can->ISR, CAN_RXI); } if (isr & CAN_TX0I) { unsigned long stat; stat = io_In32(can->handle, can->TX[0].STAT); if (stat & 0x20L) { can->TX[0].Err_CNT++; can->error = CAN_ERROR_TX0 + (unsigned char)((stat & 0x00070000L) >> 16); if (can->ErrStoreEnable == true) PushQueue(can->err, can->error); if (can->error_handler != NULL) can->error_handler(can); } if ((stat & 0x07L) == 0x05L) can_RoundRobin(can); io_Out32(can->handle, can->ISR, CAN_TX0I); }
static int CAN_ISR(int irq, void *data) { unsigned long isr; CAN_Bus *can = (CAN_Bus *)data; if (((isr = io_In32(can->ioHandle, can->ISR)) & 0x07FFL) != 0x00L) { if (isr & CAN_RXI) { unsigned long temp; CANFrame rx_temp; io_DisableINT(); { temp = io_In32(can->ioHandle, can->RX.TYPE); rx_temp.type = (int)(temp & 0x03UL); rx_temp.length = (int)((temp >> 4) & 0x0FUL); rx_temp.identifier = io_In32(can->ioHandle, can->RX.IDR); rx_temp.Data.dword[0] = io_In32(can->ioHandle, can->RX.DATAL); rx_temp.Data.dword[1] = io_In32(can->ioHandle, can->RX.DATAH); PushBufQueue(can->rcvd, (void*)&rx_temp); } io_RestoreINT(); io_Out32(can->ioHandle, can->REQ, 0x0100UL); // release the received message io_Out32(can->ioHandle, can->ISR, CAN_RXI); } if (isr & CAN_TX0I) { unsigned long stat; stat = io_In32(can->ioHandle, can->TX[0].STAT); if (stat & 0x20UL) { can->LastError = CAN_ERROR_TX0 + (unsigned char)((stat & 0x00070000UL) >> 16); if (can->StoreError) PushQueue(can->Error, can->LastError); }
DMPAPI(bool) PushQueue(Queue *queue, unsigned char ch) { return PushBufQueue(queue, (void *)&ch); }