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

📄 gset.c

📁 实现vxworks下的1553b通讯功能
💻 C
字号:
/* Set General Information

Description - These routines are called to set various parameters or
              modes on the Excalibur card.
*/

#include <stdio.h>
#include "proto.h"

short broadcast[Max_Channels] = {0};
short pingpong[Max_Channels] = {0};

extern short curchan, milstd1553B;
extern short exists[Max_Channels]; 

int temp;
void zeroMultibufFlag(void);

/*
* Set_PingPong allows the user to choose whether the board should
* enable the ping pong double buffering system.
*/

int borland_dll Set_PingPong(short Pingpong_Flag)
{
   if (Pingpong_Flag)
   {
   	
		wForceWordWrite = exc_summit->control | PPEN;
		exc_summit->control = wForceWordWrite;

      pingpong[curchan] = PPEN;
   }
   else
   {
		wForceWordWrite = exc_summit->control & ~PPEN;
		exc_summit->control = wForceWordWrite;
      pingpong[curchan] = 0;
   }

   return 0;
}

/*
* Set_Broadcast allows the user to choose whether the board should regard
* RT #31 as a regular RT or as the RT Broadcast address.
*/

int borland_dll Set_Broadcast (short Broadcast_Flag)
{
	if (Broadcast_Flag == BROADCAST)
   {
   	
		wForceWordWrite = exc_summit->control | BROADCAST;
		exc_summit->control = wForceWordWrite;
      broadcast[curchan] = BROADCAST;
   }
   else if (Broadcast_Flag == NOBROADCAST)
   {
		wForceWordWrite = exc_summit->control & ~BROADCAST;
		exc_summit->control = wForceWordWrite;
      broadcast[curchan] = 0;
   }
   else return einval;
   return 0;
} /* end Set_Broadcast */


/*
* Get_Broadcast returns 0 if RT 31 is a regular RT and >0 if RT 31
* represents a Broadcast command.
*/

int borland_dll Get_Broadcast (void)
{
   return (exc_summit->control & BROADCAST);
} /* end Get_Broadcast */


/*
* Get_BIT returns information on the current health of the board
*/

int borland_dll Get_BIT (void)
{
   return (exc_summit->bit_word);
} /* end Get_BIT */


/*
* Get_Pending returns all interrupts received since the last call on
* Get_Pending, and reads another register in order to clear the Pending register
*/

int borland_dll Get_Pending (void)
{
   int status;
   status = exc_summit->int_pending;
   temp = exc_summit->bit_word;
   return (status);
} /* end Get_Pending */



/*
* Set Mode routine, e.g., BC MODE
* This routine changes the current mode to any other
* mode. It performs a reset of the card and initializes
* the board to its default values for the desired mode.
*/

int borland_dll Set_Mode (short mode)
{
	int i, idx;
  	unsigned short bufstart;
  	if ((mode != BC_MODE) && (mode != RT_MODE) && (mode != BM_RT_MODE) && (mode != BM_MODE))
   	return einval;
  	curmode = mode;

	zeroMultibufFlag();

  	Reset_Channel(curchan); 
/*   exc_summit->control = RESET; */

   for(i=0;i<500;i++)
	{
   	Sleep(10L);
 		if (exc_summit->control == 0) break;
  }

   if (i==500)
   	return(etimeout);   

  /* Clear memory (lower half) */
  	for (i=Start_DPRAM; i<BANKSIZE; i++)
   	exc_summit_int[i] = Clear_Pattern;

	if (mode == RT_MODE)
	{
   	exc_summit->control = broadcast[curchan];
   	exc_summit->status  = RT_MODE;
	   exc_summit->current_cmd_block = 0;
	   exc_summit->int_mask          = 0;
	   exc_summit->int_pending       = 0;
	   exc_summit->intr_log_list     = INIT_RT_DSCRPT - 32; /* last 32 words of data area */
	   exc_summit->bit_word          = 0;
	   exc_summit->timetag_minor     = 0;
	   exc_summit->pointer           = INIT_RT_DSCRPT; /* descriptor blocks */
	   exc_summit->status1553        = 0;

		for (i=0; i<16; i++)
    		exc_summit->illegal[i] = 0;

	   bufstart = INIT_RT_BUFFER;
   	idx = INIT_RT_DSCRPT;

	   /* Add buffers for ping pong double buffering. reduce mode code
   	    buffer size to make room for the new buffers
	   */
   	for (i=0; i < 32; i++) /* receive descriptors */
	   {
   		exc_summit_int[ idx ] = 0x1;   /* separate Broadcast  */
	      exc_summit_int[ idx + 1] = bufstart;
   	   exc_summit_int[ idx + 2] = (unsigned short)(bufstart + MCH_BUFSIZE); /* added in: pingpong */
	      exc_summit_int[ idx + 3] = (unsigned short)(bufstart + (MCH_BUFSIZE * 2));
	      idx += DESCRIPTORSIZE;
   	   bufstart += (unsigned short)(MCH_BUFSIZE*3); /* pingpong */
		}
		for (i=0; i < 32; i++) /* transmit descriptors */
		{
			exc_summit_int[ idx ] = 0;
      	exc_summit_int[ idx + 1] = bufstart;
   	   exc_summit_int[ idx + 2] = bufstart + MCH_BUFSIZE; /* Pingpong */
	      exc_summit_int[ idx + 3] = 0;
	      idx += DESCRIPTORSIZE;
   		bufstart +=(unsigned short) (MCH_BUFSIZE*2); /* Pingpong */
	   }
   	for (i=0; i < 32; i++) /* receive mode descriptors */
	   {
   	   exc_summit_int[ idx ] = 0x1;   /* separate Broadcast */
      	exc_summit_int[ idx + 1] = bufstart;
   	   exc_summit_int[ idx + 2] = bufstart + MODEBUFSIZE; /* Pingpong */
			exc_summit_int[ idx + 3] = (unsigned short)(bufstart + (MODEBUFSIZE * 2));  /* Pingpong */
	      idx += DESCRIPTORSIZE;
   	   bufstart +=(unsigned short) (MODEBUFSIZE*3); /* Pingpong*/
	   }
		for (i=0; i < 32; i++) /* transmit mode descriptors */
		{
   		exc_summit_int[ idx ] = 0;
      	exc_summit_int[ idx + 1] = bufstart;
   	   exc_summit_int[ idx + 2] = bufstart + MODEBUFSIZE; /* Pingpong */
	      exc_summit_int[ idx + 3] = 0;
   	   idx += DESCRIPTORSIZE;
   	   bufstart += (unsigned short) (MODEBUFSIZE*2); /* Pingpong */
		}
	}  /* end if mode == RT_MODE */
	else  if (mode == BC_MODE)
	{
		exc_summit->control = broadcast[curchan];
	   exc_summit->status  = BC_MODE;
   	exc_summit->current_cmd_block = 0;
	   exc_summit->int_mask          = 0;
   	exc_summit->int_pending       = 0;
	   exc_summit->intr_log_list     = CMDOFFSET - 32;      /* last 32 words of data area */
	   exc_summit->bit_word          = 0;
	   exc_summit->timetag_minor     = 0;
	   exc_summit->pointer           = CMDOFFSET; /* Command blocks */
	   exc_summit->BC_initcount      = 0;
	}
	else if (mode == BM_MODE)
	{
   	exc_summit->control = broadcast[curchan];
	   exc_summit->status  = BM_MODE;
	   exc_summit->current_cmd_block = 0;
	   exc_summit->int_mask          = 0;
	   exc_summit->int_pending       = 0;
	   exc_summit->intr_log_list     = INIT_MON_BLK - 32;  /* last 32 words of data area */
	   exc_summit->bit_word          = 0;
	   exc_summit->timetag_minor     = 0;
	   exc_summit->cmd_blk_ptr       = INIT_MON_BLK;
	   exc_summit->data_ptr          = INIT_DATA_BLK;
	   exc_summit->blk_counter       = MAXMESSAGES;
      exc_summit->filter1           = 0;
      exc_summit->filter2           = 0;
	}
	else  if (mode == BM_RT_MODE)
	{
   	exc_summit->control = broadcast[curchan];
	   exc_summit->status  = BM_RT_MODE;
	   exc_summit->current_cmd_block = 0;
	   exc_summit->int_mask          = 0;
	   exc_summit->int_pending       = 0;
	   exc_summit->intr_log_list     = INIT_RT_DSCRPT - 32; /* last 32 words of data area */
	   exc_summit->bit_word          = 0;
	   exc_summit->timetag_minor     = 0;
	   exc_summit->cmd_blk_ptr       = INIT_MON_BLK;
	   exc_summit->data_ptr          = INIT_DATA_BLK;
	   exc_summit->blk_counter       = MAXMESSAGES;
	   exc_summit->pointer           = INIT_RT_DSCRPT; /* descriptor blocks */
	   exc_summit->status1553        = 0;
      exc_summit->filter1           = 0;
      exc_summit->filter2           = 0;


   	for (i=0; i<16; i++)
      	exc_summit->illegal[i] = 0;

	   bufstart = INIT_RT_BUFFER;
   	idx = INIT_RT_DSCRPT;
		for (i=0; i < 32; i++) /* receive descriptors */
   	{
    		exc_summit_int[ idx ] = 0x1;   /* separate Broadcast  */
			exc_summit_int[ idx + 1] = bufstart;
			exc_summit_int[ idx + 2] = 0;
      	exc_summit_int[ idx + 3] =(unsigned short)(bufstart + MCH_BUFSIZE);
	      idx += DESCRIPTORSIZE;
   	   bufstart += (unsigned short)(MCH_BUFSIZE*2);
	   }
		for (i=0; i < 32; i++) /* transmit descriptors */
	   {
   		exc_summit_int[ idx ] = 0;
	      exc_summit_int[ idx + 1] = bufstart;
			exc_summit_int[ idx + 2] = 0;
	      exc_summit_int[ idx + 3] = 0;
	      idx += DESCRIPTORSIZE;
	      bufstart +=(unsigned short) MCH_BUFSIZE;
		}
		for (i=0; i < 32; i++) /* receive mode descriptors */
	   {
			exc_summit_int[ idx ] = 0x1;   /* separate Broadcast */
			exc_summit_int[ idx + 1] = bufstart;
	      exc_summit_int[ idx + 2] = 0;
   	   exc_summit_int[ idx + 3] = (unsigned short)(bufstart + MCH_BUFSIZE);
	      idx += DESCRIPTORSIZE;
   	   bufstart += (unsigned short)(MCH_BUFSIZE*2);
		}
		for (i=0; i < 32; i++) /* transmit mode descriptors */
		{
      	exc_summit_int[ idx ] = 0;
	      exc_summit_int[ idx + 1] = bufstart;
   	   exc_summit_int[ idx + 2] = 0;
	      exc_summit_int[ idx + 3] = 0;
   	   idx += DESCRIPTORSIZE;
	      bufstart += (unsigned short)MCH_BUFSIZE;
   	}
	}
  	return 0;
} /* end Set_Mode */



int  borland_dll Stop_Card (void)   /*  Stop board execution */
 {
  
    wForceWordWrite = exc_summit->control & (usint)~START_EXECUTION;
    exc_summit->control = wForceWordWrite;

  return 0;
 } /* end Stop_Card */

int  borland_dll Set_Protocol (short mode)  /*  Setup response time parameters */
{
	if ((mode != MIL_STD_1553A) && (mode != MIL_STD_1553B))
   	return einval;

	if (mode == MIL_STD_1553A)
   {
      wForceWordWrite = exc_summit->status | 0x80;
	  exc_summit->status = wForceWordWrite;

		milstd1553B = 0;
	}
	else
   {
     wForceWordWrite = exc_summit->status & 0xff7f;
	 exc_summit->status = wForceWordWrite;
		milstd1553B = 1;
	}
	return 0;
} /* end Set_Protocol */


int borland_dll Report_Channel (void)
{
	return curchan;
}  /* end Report_Channel */

int borland_dll Get_Channel_Status (unsigned short channel)
{
	short j;
	usint pattern;

	if(channel >= Max_Channels) return 0;
	if (exists[channel] == 0) return 0;

	if (  (channel*2) < 0) return 0 ;

	pattern = 0xaaaa;
	for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
   	exc_summit_int[j] = pattern;
	for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
	if ((exc_summit_int[j]) != pattern)
   	return 0;

	pattern =  Clear_Pattern;
	for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
   	exc_summit_int[j] = pattern;
	for (j=Start_DPRAM; j<Start_DPRAM+10; j++)
	if ((exc_summit_int[j]) != pattern)
   	return 0;

	return 1;
} /* end Get_Channel_Status */



/*
* Get_Curr_Command_Word returns the most recently processed command word
*/
int  borland_dll Get_Curr_Command_Word (void)
{
	return (exc_summit->current_cmd_block);
} /* end Get_Curr_Command_Word */

/* obsolete */
int  borland_dll Get_Curr_Command (void)
{
	return (Get_Curr_Command_Word());
} /* end Get_Curr_Command */

int borland_dll Get_Op_Status(void)
{
	return (exc_summit->status);
}
borland_dll usint* Get_Memory_Pointer(unsigned int offset)
{
   return(exc_summit_int + offset);
}
borland_dll usint* Get_Register_Pointer(unsigned int offset)
{
	return((usint*)(exc_summit) + offset);
}
int borland_dll Peek_Memory(unsigned int offset, usint *value)
{
	usint *mempointer;

/*	if (offset >= 0x10000)*/
	if (offset >= BANKSIZE)
		return einval;
	mempointer = Get_Memory_Pointer(offset);
	*value = *mempointer;
	return 0;
}
int borland_dll Poke_Memory(unsigned int offset, usint value)
{
	usint *mempointer;

/*	if (offset >= 0x10000)*/
	if (offset >= BANKSIZE)
		return einval;
	mempointer = Get_Memory_Pointer(offset);
	*mempointer = value;
	return 0;
}
int borland_dll Peek_Register(usint offset, usint *value)
{
	usint *regpointer;

	if (offset >= 32)
		return einval;
	regpointer = Get_Register_Pointer(offset);
	*value = *regpointer;
	return 0;
}
int borland_dll Poke_Register(usint offset, usint value)
{
	usint *regpointer;

	if (offset >= 32)
		return einval;
	regpointer = Get_Register_Pointer(offset);
	*regpointer = value;
	return 0;
}

⌨️ 快捷键说明

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