コード例 #1
0
ファイル: can.cpp プロジェクト: jack23912/86Duino
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);
		}
コード例 #2
0
ファイル: can.cpp プロジェクト: brucetsao/Print3D
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);
			}
コード例 #3
0
ファイル: queue.cpp プロジェクト: aquashift/86Duino_DuinOS
DMPAPI(bool) PushQueue(Queue *queue, unsigned char ch)
{
	return PushBufQueue(queue, (void *)&ch);
}