⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 channel.c

📁 PNX系列设备驱动 PNX系列设备驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
channelCreateExit1:
	return StatusCode;

}

TMStatus	channelDestroy ( 
	UInt32 ChannelHandle)
{
	ChannelManagerObject*	ChannelManager;
	ChannelObject*	Channel =
		(ChannelObject*) ChannelHandle;
	UInt32	NameSpaceHandle;
	
	/* DPF(13,("tmman:channelDestroy\n" )); */

	if ( objectValidate ( Channel, ChannelFourCC ) != True )
	{
		DPF(0,("tmman:channelDestroy:objectVaidate:FAIL\n"));
		return statusInvalidHandle;
	}

	ChannelManager = (ChannelManagerObject* )Channel->ChannelManager;
	NameSpaceHandle = Channel->NameSpaceHandle;

	objectlistDelete ( 
		&ChannelManager->List, 
		Channel,
		Channel->ChannelNumber );

	objectFree ( Channel );

	namespaceDestroy ( NameSpaceHandle );

	return	statusSuccess;
}


TMStatus	channelSend(
	UInt32 ChannelHandle, 
	Pointer Packet )
{
	ChannelPacket*	MailslotPointer;
	UInt32			WriteIndex, ReadIndex;
	TMStatus		StatusCode;
	ChannelObject*	Channel =
		(ChannelObject*) ChannelHandle;
	ChannelManagerObject*	ChannelManager;

	UInt32	NestedContext;
	UInt32	TempValue1, TempValue2;


	if ( objectValidate ( Channel, ChannelFourCC ) != True )
	{
		DPF(0,("tmman:channelSend:objectVaidate:FAIL\n"));
		return statusInvalidHandle;
	}
	
	ChannelManager = Channel->ChannelManager;


	/* ENTER CRITICAL SECITON */

	critsectEnter ( ChannelManager->CriticalSectionHandle, &NestedContext );

	/* sequence number inseration has to be atomic */
/*
	DPF(13,("channel:Send:ToPeer:MBOX&[%x]:WR&[%x]:RD&[%x]:\n",
		halAccess32( ChannelManager->HalHandle, (UInt32)ChannelManager->ToPeerMailbox ),
		halAccess32( ChannelManager->HalHandle, (UInt32)&ChannelManager->ToPeerMailboxControl->WriteIndex) ,
		halAccess32( ChannelManager->HalHandle, (UInt32)&ChannelManager->ToPeerMailboxControl->ReadIndex ) ));
*/
	halAccessEnable( ChannelManager->HalHandle );

	WriteIndex =  halAccess32 ( ChannelManager->HalHandle,
		ChannelManager->ToPeerMailboxControl->WriteIndex );
	ReadIndex = halAccess32( ChannelManager->HalHandle, 
		ChannelManager->ToPeerMailboxControl->ReadIndex );

	halAccessDisable( ChannelManager->HalHandle );

	WriteIndex = 
		( WriteIndex + 1 ) % ( ChannelManager->MailboxCount );

	if ( WriteIndex == ReadIndex )
	{
		UInt32 Idx;
		/* no point processing the other channels if mailbox has no room */

		DPF(0,("tmman:channelSend:FAIL\n"));

		/*
		DPF(13,("channel:Queue:Dump:"));
		
		for ( Idx = 0 ; Idx < ChannelManager->MailboxCount ; Idx ++ )
		{
			MailslotPointer = ( ((UInt8*)ChannelManager->ToPeerMailbox) + 
				( Idx * ChannelManager->MailslotSize )  );

			DPF(13,("[%x]", *(UInt32*)(MailslotPointer+1) ));
		}

		DPF(13,("\n"));
		*/

		StatusCode = statusChannelMailboxFullError;
		/* LEAVE CRITICAL SECITON */
		critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
		goto chnlSendExit1;
	}

	halAccessEnable( ChannelManager->HalHandle );

	MailslotPointer = 
		(ChannelPacket*)( ((UInt8*)ChannelManager->ToPeerMailbox) + 
		( halAccess32 ( ChannelManager->HalHandle,
		ChannelManager->ToPeerMailboxControl->WriteIndex ) * 
		ChannelManager->MailslotSize) );

	MailslotPointer->ChannelID	= halAccess32 ( ChannelManager->HalHandle, 
		Channel->ChannelNumber );
	MailslotPointer->Sequence =	halAccess32 ( ChannelManager->HalHandle,
		TempValue1 = ChannelManager->PacketSendSeq );

	halAccessDisable( ChannelManager->HalHandle );

	ChannelManager->PacketSendSeq++;

	/* the user should take care of endianness of packet data */
	halAccessEnable(ChannelManager->HalHandle);
	memCopy ( 
		(Pointer)(MailslotPointer + 1), /* point to the packet struct in the mailslot */
		(Pointer)Packet, 
		ChannelManager->PacketSize );
	TempValue2 = *(UInt32*)(MailslotPointer+1);
	halAccessDisable(ChannelManager->HalHandle);



	DPF(13,("channel:Send:Packet:ID[%x]:SQ[%x]:DT[%x]:WR[%x]:RD[%x]\n",
		Channel->ChannelNumber,
		TempValue1,
		TempValue2,
		WriteIndex,
		ReadIndex ));

	halAccessEnable( ChannelManager->HalHandle );

	ChannelManager->ToPeerMailboxControl->WriteIndex = 
		halAccess32 ( ChannelManager->HalHandle, WriteIndex );

	ChannelManager->ToPeerMailboxControl->Command = 
		halAccess32( ChannelManager->HalHandle, constChannelMailboxReady );

	halAccessDisable( ChannelManager->HalHandle );

	vintrGenerateInterrupt ( ChannelManager->VIntrHandle );

	/* LEAVE CRITICAL SECTION */
	critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );

	return	statusSuccess;

chnlSendExit1:
	return	StatusCode;
}



void	chnlVIntrHandler ( 
	Pointer Context )
{
	/* MailSlot is in Switched Endian Format */
	ChannelPacket	Mailslot;
	UInt8			Packet[constTMManPacketSize];
	ChannelPacket*	MailslotPointer;
	UInt32			IdxPacket;
	UInt32			ReadIndex, WriteIndex, Command;
	ChannelManagerObject* ChannelManager = 
		(ChannelManagerObject*)Context;
	ChannelObject*	Channel;
	UInt32			NestedContext;

	/*DPF(13,( "CH{")); 
	DPF(13,("tmman:chnlVIntrHandler:List1[%x]\n",
		ChannelManager->List.Objects[1] ));
	*/

	for ( IdxPacket = 0 ; ; IdxPacket++  )
	{
		/* ENTER CRITICAL SECTION */

		critsectEnter ( ChannelManager->CriticalSectionHandle, &NestedContext );

		halAccessEnable(ChannelManager->HalHandle);

		ReadIndex = halAccess32( ChannelManager->HalHandle, 
			ChannelManager->ToSelfMailboxControl->ReadIndex );

		WriteIndex = halAccess32( ChannelManager->HalHandle,
			ChannelManager->ToSelfMailboxControl->WriteIndex );

		halAccessDisable(ChannelManager->HalHandle);

		if ( ReadIndex == WriteIndex )
		{
			critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );
			break;
		}


		/* get the pointer to the mailslot data structure from the shared mailbox */
		MailslotPointer = (ChannelPacket*)( ((UInt8*)ChannelManager->ToSelfMailbox) + 
			(ReadIndex * ChannelManager->MailslotSize) );


		halAccessEnable(ChannelManager->HalHandle);
		
		Mailslot.ChannelID = 
			halAccess32( ChannelManager->HalHandle, MailslotPointer->ChannelID );

		Mailslot.Sequence = 
			halAccess32( ChannelManager->HalHandle, MailslotPointer->Sequence );

		halAccessDisable(ChannelManager->HalHandle);

		/* the user should take care of endianness of packet data */
		halAccessEnable(ChannelManager->HalHandle);
		memCopy ( 
			(Pointer)&Packet, 
			(Pointer)(MailslotPointer + 1), 
			ChannelManager->PacketSize );
		halAccessDisable(ChannelManager->HalHandle);

		DPF(13,("channel:Recv:Packet:ID[%x]:SQ[%x]:DT[%x]:WR[%x]:RD[%x]\n",
			Mailslot.ChannelID,		
			Mailslot.Sequence,
			*(UInt32*)(Packet),
			WriteIndex,
			ReadIndex ));


		ReadIndex = ( ReadIndex + 1 ) % ( ChannelManager->MailboxCount );

		halAccessEnable(ChannelManager->HalHandle);

		ChannelManager->ToSelfMailboxControl->ReadIndex = 
			halAccess32( ChannelManager->HalHandle, ReadIndex );

		halAccessDisable(ChannelManager->HalHandle);

		/* LEAVE CRITICAL SECTION */
		critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );

		Channel = (ChannelObject* )objectlistGetObject ( 
			&ChannelManager->List, 
			Mailslot.ChannelID );
		if ( ! Channel )
		{
			DPF(0,("tmman:chnlVIntrHandler:Invalid Channel[%x]:FAIL\n",
				Mailslot.ChannelID ));
			/*
			for ( Idx = 0 ; Idx < ChannelManager->List.Count ; Idx ++ )
			{
				DPF(0,("tmman:chnlVIntrHandler:ChannelList#[%x]:[%x]:FAIL\n",
					Idx, ChannelManager->List.Objects[Idx] ));
			} 

			while(1);

			*/

			/* 
			we have received a packet for a channel that has not 
			yet been opened 
			*/
			continue;
		}

		Channel->Handler (
			Mailslot.ChannelID,
			(Pointer)&Packet,
			Channel->Context );
	}


	/* ENTER CRITICAL SECION */

	critsectEnter ( ChannelManager->CriticalSectionHandle, &NestedContext );

	halAccessEnable(ChannelManager->HalHandle);

	Command = halAccess32( ChannelManager->HalHandle, 
		ChannelManager->ToSelfMailboxControl->Command );
	
	halAccessDisable(ChannelManager->HalHandle);


	switch ( Command )
	{
		case constChannelHandlerReady :
		
		halAccessEnable(ChannelManager->HalHandle);

		ReadIndex = halAccess32 ( ChannelManager->HalHandle,
			ChannelManager->ToPeerMailboxControl->ReadIndex );

		WriteIndex = halAccess32 ( ChannelManager->HalHandle,
			ChannelManager->ToPeerMailboxControl->WriteIndex  );

		halAccessDisable(ChannelManager->HalHandle);

		if ( ReadIndex != WriteIndex )
		{
			halAccessEnable(ChannelManager->HalHandle);
			ChannelManager->ToPeerMailboxControl->Command =
				halAccess32 ( ChannelManager->HalHandle,
				constChannelMailboxReady );
			halAccessDisable(ChannelManager->HalHandle);
			vintrGenerateInterrupt ( ChannelManager->VIntrHandle );
		}
		break;

		case constChannelMailboxReady :
		halAccessEnable(ChannelManager->HalHandle);

		if ( ReadIndex == WriteIndex )
		{
			ChannelManager->ToPeerMailboxControl->Command =
				halAccess32 ( ChannelManager->HalHandle,
				constChannelHandlerReady );
		}
		else
		{
			ChannelManager->ToPeerMailboxControl->Command =
				halAccess32 ( ChannelManager->HalHandle, 
				constChannelMailboxReady );
		}
		halAccessDisable(ChannelManager->HalHandle);

		vintrGenerateInterrupt ( ChannelManager->VIntrHandle );
		break;

		default :
		break;
	}

	/* LEAVE CRITICAL SECITON */
	critsectLeave ( ChannelManager->CriticalSectionHandle, &NestedContext );

/*	DPF(13,("}CH")); */
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -