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

📄 ge_maincommand.c

📁 程序是一个vxworks下对PMC公司3386千兆MAC芯片的驱动和配置
💻 C
📖 第 1 页 / 共 2 页
字号:
/**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-**-
*	GE_MainCommand.c - Ethernet 1000M code. . 
*
*	Copyright 2001-12 by GDT, Inc
*
*	modification history
*	--------------------
*       2001-12-14,yxy created.
*
*	command include:                        
*                                        
*       MONITOR_MSG                             
*       SYS_INITCOMMAND                         
*       SYS_SHUTDOWN			        
*       RESET_COMMAND     	  		
*       SYS_MGMT_REQ                            
*       SYS_EVENT_REPORT                        
*       CONFIG_IPADDR                                            
*       BDCOM_LINK_DOWN                         
*
*/

#include <msgQLib.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <taskLib.h>
#include "GE_Global.h"
#include "GE_GlobalP.h"
#include "GE_MainCommand.h"
#include "SBSL_MemManage.h"
#include "SBSL_Monitor.h"
#include "bdcom_860.h"
#include "GE_Utility.h"
unsigned int 	GE_CMD_DEBUG=0;

MSG_Q_ID        GE_MainCommandMsgQId;
ULONG   	IPAddr[32];
extern		SEM_ID	  semLink;
extern		unsigned int BDCOM_FLAG;

/********************************************************************************************
 * MainCommandInit: initlize the MainCommand 
 */
STATUS  GE_MainCommandInit(void)
{
	if(SBSL_TaskFlagGet(GE_MAINCMD_TASK_CODE)!= SBSL_TASK_UNREGISTER)
	{
		if(GE_CMD_DEBUG)
			GE_printf(GE_ALARM,"The MainCommandTask has register!\n");
		return ERROR;
	}
        GE_MainCommandMsgQId = msgQCreate(MAX_MSG_NUM,sizeof(TASK_MSG),MSG_Q_FIFO);
	if(GE_MainCommandMsgQId==NULL)
	{
		if(GE_CMD_DEBUG)
			GE_printf(GE_ALARM," GE_MainCommandInit:creating MainCommandMsgQ failed!\n");
	        return  ERROR;
	}
	
        if(SBSL_TaskRegister(	GE_MAINCMD_TASK_CODE,
        			GE_MainCommandMsgQId,
        			GE_MainCommandReInit,
				GE_MainCommandDel)==ERROR)
        {
        	 if(GE_CMD_DEBUG)
        	 	GE_printf(GE_ALARM," GE_MainCommandInit:register failed!\n");
        	 return ERROR;
	}
	if( taskSpawn(	TASK_NAME[GE_MAINCMD_TASK_CODE],
			GE_MAINCOMMAND_TASK_PRI,
			0,
			2048,
			(FUNCPTR)GE_MainCommand,
			0,0,0,0,0,0,0,0,0,0)== ERROR)
        {
        	if(GE_CMD_DEBUG)
        		GE_printf(GE_ALARM," GE_MainCommandInit:creaating  Task failed!\n");
        	return ERROR;
        }
        return OK;
}
/********************************************************************************************
 * MainCommand_DEL: DEL the MainCommandTask 
 */
STATUS  GE_MainCommandDel(void)
{
      	if (SBSL_TaskFlagGet(GE_MAINCMD_TASK_CODE)!= SBSL_TASK_STARTED)
    	{
        	if(GE_CMD_DEBUG)
        		GE_printf(GE_ALARM,"GE_MainCommandDel:task not start!\n");
       	 	return ERROR;
    	}
        if(taskDelete (SBSL_TaskIdGet(GE_MAINCMD_TASK_CODE))==ERROR )
    	{
      		if(GE_CMD_DEBUG)
      			GE_printf(GE_ALARM,"GE_MainCommandDel:Delete GE_MainCommandTask failed!\n");
       	     	return ERROR; 
        }
        if (SBSL_TaskMemClear(GE_MAINCMD_TASK_CODE) == ERROR)
        {
        	if(GE_CMD_DEBUG)
        		GE_printf(GE_ALARM,"GE_EventStatisticDel:mem clear failed!\n");        	
        }/*continue run and may cause mem block lost*/

        if (SBSL_TaskStop(GE_MAINCMD_TASK_CODE) == ERROR)
	{
	    	if(GE_CMD_DEBUG)
	    		GE_printf(GE_ALARM,"GE_EventStatisticDel:stop task failed!\n!");
	}
	return OK;	    	 
}


/********************************************************************************************
 * MainCommand_reinit: reinit the MainCommandTask 
 */
 
STATUS  GE_MainCommandReInit(void)
{

	if(SBSL_TaskFlagGet(GE_MAINCMD_TASK_CODE)==SBSL_TASK_STARTED)
	{
		if(GE_CMD_DEBUG)
			GE_printf(GE_ALARM,"GE_MainCommandReInit:task has started!\n");
		return ERROR;
	}
	if(taskSpawn(TASK_NAME[GE_MAINCMD_TASK_CODE],
		     GE_MAINCOMMAND_TASK_PRI,
		     0,
		     2048,
		     (FUNCPTR)GE_MainCommand,
		     0,0,0,0,0,0,0,0,0,0)==ERROR)
	{
		if(GE_CMD_DEBUG)
			GE_printf(GE_ALARM,"GE_MainCommandReInit:Creating task failed!\n");
		return ERROR;
	}
       	if(GE_CMD_DEBUG)
       		GE_printf(GE_EVENT,"GE_MainCommandReInit:Creating task succeed!\n");
	return OK;
}
	  
/*******************************************************************************************
 * MainCommand: Implement  MainCommandTask 
 */   
STATUS GE_MainCommand()
{
	TASK_MSG  	CommandMsg;
	unsigned char   config_ip_result,result;
	unsigned short  state;
	char		exPort,interface;
	char           	index,n;
	unsigned char   port,subType,unit;
	MSG_STRUCTURE   *ackMsg;

    	while(BOARD_STATE != BOARD_STATE_NORMAL)
   	{
		taskDelay(30);
   	} 
        if(SBSL_TaskStart(GE_MAINCMD_TASK_CODE,taskIdSelf())==ERROR)
	{
		if(GE_CMD_DEBUG)
			GE_printf(GE_ALARM,"GE_MainCommand: task start FAILED!\n");
		return  ERROR;
	}
       	if(GE_CMD_DEBUG)
       		GE_printf(GE_EVENT,"GE_Maincommand task is running.....\n");
   	for(;;)
   	{
       		if(SBSL_TaskMsgIdGet(GE_MAINCMD_TASK_CODE)==NULL)
       		{
       			return  ERROR;
       		}
   		if(msgQReceive(  GE_MainCommandMsgQId,
   	                	(char*)&CommandMsg,
   	                	 sizeof(TASK_MSG),
   	                 	 WAIT_FOREVER)==ERROR)
   	 	{
   	 		if(GE_CMD_DEBUG)
   	 			GE_printf(GE_ALARM,"GE_MainCommand:can not receive any message !\n");
                        return  ERROR;
   	 	}
   		switch(CommandMsg.type)
   	 	{  	
         		case  MONITOR_MSG:
				if(GE_CMD_DEBUG)
					GE_printf(GE_EVENT,"GE_MainCommand:Receive MONITOR_MSG!\n");
   	 			CommandMsg.taskCode=GE_MAINCMD_TASK_CODE;
   	 			CommandMsg.type=MONITOR_MSG_ACK;
   	 			CommandMsg.length=0;
   	 			memset(CommandMsg.msgBuf,0,128);
    
                		if(msgQSend( SBSL_TaskMsgIdGet(MONITOR_TASK_CODE),
                             					(char*)&CommandMsg,
                             					MSG_LENGTH,
                            					NO_WAIT,
                            					MSG_PRI_NORMAL)==ERROR)
                 		{
                 			if(GE_CMD_DEBUG)
                 				GE_printf(GE_ALARM,"GE_MainCommand:send MONITOR_MSG_ACK failed!\n");
                 			break;
                 		}
                	        else   
                 		{
                 			if(GE_CMD_DEBUG)
                 				GE_printf(GE_EVENT,"GE_MainCommand:send MONITOR_MSG_ACK succeed!\n"); 
				}
		        break;	
	
	      		case  CONFIG_THISIP_MSG:

	       			if(GE_CMD_DEBUG)
	       				GE_printf(GE_EVENT,"GE_MainCommand:tMainCommand received FWD_CONFIG_IPADDR!\n");
				n=CommandMsg.msgBuf[0];
				exPort=CommandMsg.msgBuf[1];
				interface=CommandMsg.msgBuf[2];
				index=CommandMsg.msgBuf[3];
				if(n==32)
				{
					if(FWD_Get_Ipaddr(&IPAddr[0],32,0,0)!=OK)
					{
						config_ip_result=1;
						if(GE_CMD_DEBUG)
							GE_printf(GE_ALARM,"GE_MainCommand:config 32 ip failed!\n");
						break;	
					}
					else
					{
						config_ip_result=0;
						write_infpga_ip(32,0);
					};			
				}
				if(n==1)
				{
					if(FWD_Get_Ipaddr(&IPAddr[index],n,exPort,interface)!=OK)
					{
						config_ip_result=1;
						if(GE_CMD_DEBUG)
							GE_printf(GE_ALARM,"GE_MainCommand:update ip failed!\n");
					}
					else
					{
						config_ip_result=0;
						write_infpga_ip(1,index);
					}	
				}
			
				CommandMsg.taskCode = GE_MAINCMD_TASK_CODE;
				CommandMsg.type = CONFIG_IPADDRESS_MSG_ACK ;
				CommandMsg.length = 4;				
				memset(&CommandMsg.msgBuf[4], 0, 124);
				CommandMsg.msgBuf[0]=n;
				CommandMsg.msgBuf[1]=config_ip_result;
				CommandMsg.msgBuf[2]=exPort;
				CommandMsg.msgBuf[3]=interface;
						

				if (msgQSend(	SBSL_TaskMsgIdGet(MANAGE_TASK_CODE),
						(char *)&CommandMsg, 
						140, 
						NO_WAIT, 
						MSG_PRI_URGENT) == ERROR)
				{
					if(GE_CMD_DEBUG)
						GE_printf(GE_ALARM,"GE_MainCommand:MainCommand send  to  failed!\n");
					break;
				}
				else
		 			if(GE_CMD_DEBUG)
		 				GE_printf(GE_EVENT,"GE_MainCommand: send _MSG_ACK to  sucess!\n");
					
			break;
                            	
	     		case SYS_SHUTDOWN:

				if(GE_CMD_DEBUG)
					GE_printf(GE_EVENT,"GE_MainCommand: received SYS_SHUTDOWN from BDCOM!\n");				
				if(GE_SuspendAll()!=OK)
				{
					if(GE_CMD_DEBUG)
						GE_printf(GE_ALARM,"GE_MainCommand:suspend all task failed!\n");
					break;
				}
				break;

            	 	case SYS_INITCOMMAND:
  		
		 		port = GE_swiport;
		     		if(GE_CMD_DEBUG)
		     			GE_printf(GE_EVENT,"GE_MainCommand:receive SYS_INITCOMMAND from BDCOM!\n");
	        		result=SYS_OK;
	        		if(FWD_ResumeAll()==ERROR)
	        		{
	        			result=SYS_FAIL;
	        		}
				if(GE_ResumeAll()==ERROR)
				{
					result=SYS_FAIL;
					break;
				}				
		     		ackMsg = (MSG_STRUCTURE*)malloc(SYS_BDCOM_HEAD_SIZE+10);
				if(ackMsg== NULL)
		     		{
					if(GE_CMD_DEBUG)
						GE_printf(GE_ALARM,"GE_MainCommand:memory allocation failed!\n");
					break;
	             		}
	            		else
	            		{
   					memset(ackMsg->blank, 0,SYS_BDCOM_HEAD_SIZE);
					ackMsg->type = SYS_INITCOMMAND_R;
					ackMsg->length = 2;
					ackMsg->data[0] = port;
					ackMsg->data[1] = result;
					if (BDCOM_UpReceive ( 	BDCOM_STREAM,
                        					NO_WAIT,
                        					MSG_PRI_NORMAL,
                        					SYS_BDCOM_HEAD_SIZE + 10,
                        					(UCHAR *) ackMsg,
                        					SYS_BDCOM_HEAD_SIZE,
                        					10 ) == ERROR)
					{
						if(GE_CMD_DEBUG)
							GE_printf(GE_ALARM,"GE_MainCommand: send SYS_INITCOMMAND_R to BDCOM failed!\n");
						free((void*)ackMsg);
						break;
					}
					else
					{
						if(GE_CMD_DEBUG)
							GE_printf(GE_EVENT,"GE_MainCommand: send SYS_INITCOMMAND_R to BDCOM succeed!\n");
					}
		       		}
			break;
			
			case 	RESET_COMMAND:
				if(GE_CMD_DEBUG)
					GE_printf(GE_EVENT,"GE_MainCommand:Receive RESET_COMMAND!\n");
				resetHardware();
			break;
			
			case 	SYS_EVENT_REPORT:
/*
				if(GenMsg->data[1]==MAIN)
				{
					if(GE_CMD_DEBUG)
						GE_printf(GE_EVENT,"GE_MainCommand: sys work mode changed:MAIN!\n");
				}
				if(GenMsg->data[1]==BACKUP)
				{
					if(GE_CMD_DEBUG)
						GE_printf(GE_EVENT,"GE_MainCommand: sys work mode changed:BACKUP!\n");
				}
*/
				if(GE_CMD_DEBUG)
					GE_printf(GE_EVENT,"GE_MainCommand: MAIN--BACKUP changed!\n");
			break;
			case	BDCOM_LINK_DOWN:

				if(GE_CMD_DEBUG)
					GE_printf(GE_EVENT,"GE_MainCommand:tMainCommand received BDCOM_LINK_DOWN!\n");
				if(GE_SuspendAll()==ERROR)
				{	
					if(GE_CMD_DEBUG)
						GE_printf(GE_ALARM,"GE_MainCommand:SuspendAllTask failed!\n");
					break;
				}
     				if (semTake(semLink, WAIT_FOREVER) == ERROR)
        			{
					taskLock();  
					BDCOM_FLAG=0;
					taskUnlock();
					if(GE_CMD_DEBUG)
						GE_printf(GE_ALARM,"GE_MainCommand:Taking semLink failed, EXIT!\n");
        			 	break;
        			} 
        			else
        			{
        				taskLock();  
        				BDCOM_FLAG=1;
        				taskUnlock();       
        				if(GE_CMD_DEBUG)
        					GE_printf(GE_EVENT,"GE_MainCommand:Link BDCOM succeed ,BDCOM_LINK_UP!\n");

⌨️ 快捷键说明

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