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

📄 rtset.c

📁 实现vxworks下的1553b通讯功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "proto.h"
#include <stdio.h>
#include <stddef.h>

extern    short curchan;
extern    short broadcast[ Max_Channels ] ;
extern 	 short pingpong[Max_Channels];
extern	 int intnum;
int gMultiBuf = 0; 

#define IMMEDIATE_BIT	0x8000
#define MAXBUFFERS 271

/* set the RT number in single RT mode */
int borland_dll Set_RT_Num (short rtid)
{
    unsigned short parity, i;

    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE) )
         return (emode);
    if ((rtid < 0) || (rtid > 31))
         return (einval);

    parity = 0;
    for (i=0; i<5; i++)
         parity += (unsigned short)((rtid >> i) & 1);
    parity &= 1;  /* parity indicates odd or even number of bytes */
    parity ^= 1;  /* force parity odd */

        wForceWordWrite = (usint) ((parity << 10) + (rtid << 11)) | (exc_summit->status & 0x03ff) ;
	exc_summit->status = wForceWordWrite;

    return(0);
} /* end Set_RT_Num */


int borland_dll Load_Datablk (unsigned short subaddress, unsigned short modecode, unsigned short *data)
{
    unsigned short dataind;
    unsigned short cardindex;
    unsigned short maxdata;
    unsigned short offset;  /* for pingpong */
	int ctrl_word_offset;

    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
         return (emode);
    if (subaddress > MODECODE)
         return (einval);
    if (modecode > 31)
         return (einval);

    /* support ping pong double buffering. check ping pong bit in control word
       and get current buffer from the appropriate descriptor table entry
    */
    if (subaddress == MODECODE)
    {
         offset = (unsigned short) 64; /* pingpong */
	 		offset += (unsigned short) 32; /* pingpong,  for transmit */
         maxdata = 1;
         offset += modecode;
    }
    else
    {
         offset = (unsigned short) 32; /* pingpong, for transmit */
         maxdata = 32;
         offset += subaddress;
    }

	ctrl_word_offset = INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE);

	 if (gMultiBuf == 1)
		cardindex = exc_summit_int[ ctrl_word_offset + 3];
	 else
    	if (pingpong[curchan])
    	{
    	    printf("pingpong[curchan] : %d",pingpong[curchan]);
    		if (exc_summit_int[ ctrl_word_offset & PINGPONG])
      		cardindex = exc_summit_int[ctrl_word_offset + 1];
    		else
      		cardindex = exc_summit_int[ctrl_word_offset + 2];
    	}
    	else
     		cardindex = exc_summit_int[(ctrl_word_offset + 1)];

  /* pingpong to here */

    for (dataind=0; dataind < maxdata; dataind++)

         exc_summit_int[cardindex+dataind+2] = data[dataind];
    return(0);
} /* end Load_Datablk */


int borland_dll Read_Datablk (unsigned short subaddress, unsigned short modecode, unsigned short *data, short msgtype, short txorrx)
{
   unsigned  short dataind;
   unsigned  short cardindex;
   unsigned  short maxdata;
   unsigned  short offset=0;  /* pingpong */

    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
         return (emode);
    if (subaddress > MODECODE)
         return (einval);
    if (modecode > 31)
         return (einval);
    if ((msgtype != STANDARD) && (msgtype != BRDCAST) && (msgtype != MODE)
       && (msgtype != BROADCAST_MODE))
         return (einval);
    if ((txorrx != TRANSMIT) && (txorrx != RECEIVE))
         return (einval);
    if ((subaddress == MODECODE) ^ ((msgtype == MODE) || (msgtype == BROADCAST_MODE)))
         return (incompatible_parameters);

    /* support ping pong double buffering. check ping pong bit in control word
       and get current buffer from the appropriate descriptor table entry.
    */


    if ((msgtype == MODE) || (msgtype == BROADCAST_MODE))
	 {
	 	offset = (unsigned short) 64;
      offset += modecode;    /* 13/03/03 */
	 	maxdata = 1;
	 }
    else
	{
	  	maxdata = 32;
		offset += subaddress;
	}

    if (txorrx == TRANSMIT)
	 	offset += 32;

    if ((msgtype == BRDCAST) || (msgtype == BROADCAST_MODE))
      cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 3];
    else
    {
	if (gMultiBuf == 1)
		cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 3];
	else
      if (pingpong[curchan])
      {
      	if (exc_summit_int[ INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) ] & PINGPONG)
				cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 1];
      	else
				cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 2];
      }
      else
      	{
      	cardindex = exc_summit_int[INIT_RT_DSCRPT + (offset * DESCRIPTORSIZE) + 1];
      	}

    }


    for (dataind=0; dataind < maxdata+2; dataind++)
         data[dataind] = exc_summit_int[cardindex+dataind];

    return(0);
} /* end Read_Datablk */


int borland_dll Set_RT_Status (short status)
{
    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
         return (emode);

    /* don't touch Immediate Clear bit */
     wForceWordWrite = ((usint) status & ~IMMEDIATE_BIT);
     exc_summit->status1553 = wForceWordWrite;

    return(0);
} /* end Set_RT_Status */


int borland_dll Set_Status_Clear (short flag)
{
    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
         return (emode);
    if ((flag != IMMEDIATE) && (flag != STATIC))
         return (einval);
    /* touch only Immediate Clear bit */
    if (flag == IMMEDIATE)
    {
	   wForceWordWrite =  exc_summit->status1553 |  IMMEDIATE_BIT;
	   exc_summit->status1553 = wForceWordWrite;
    }
    else
    {

       wForceWordWrite = exc_summit->status1553 &  ~IMMEDIATE_BIT;
	   exc_summit->status1553  = wForceWordWrite;
    }
    return(0);
} /* end Set_Status_Clear */


int borland_dll Set_Interrupt_Mask (unsigned short intr)
{
   exc_summit->int_mask = intr; /* Merlin uses mask without a real interrupt */
   if (intnum == 0)
		 return (noirqset);
    return(0);
} /* end Set_Interrupt_Mask */

int borland_dll Run_RT (void)
{
	#define BUFFERMODE2 0x180
	unsigned short controlval;

    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
         return (emode);

    if (curmode == BM_RT_MODE)
      {
       exc_summit->cmd_blk_ptr = INIT_MON_BLK;
       exc_summit->data_ptr = INIT_DATA_BLK;
       exc_summit->blk_counter = MAXMESSAGES;
       nextmsg = 0;
      }
    controlval = (unsigned short)( START_EXECUTION | BUAEN | BUBEN | broadcast[curchan] | pingpong[curchan]);
    if (gMultiBuf == 1)
	controlval |= (unsigned short)BUFFERMODE2; /* hopefully pingpong and broadcast not set */

    exc_summit->control = controlval;
    return(0);
} /* end Run_RT */

#define TRANSMIT_OFFSET	2
#define BROAD_OFFSET	4
#define MODE_OFFSET	8
int borland_dll Set_Legal_Command (unsigned short subaddress, short brdcst, short txorrx, short ismode, short legal)
{
    unsigned short index=0, bit_position;
    if ((curmode != RT_MODE) && (curmode != BM_RT_MODE))
         return (emode);
    if (subaddress > 31)
         return (einval);
    if ((brdcst != BROADCAST) && (brdcst != NOBROADCAST))
         return (einval);
    if ((txorrx != TRANSMIT) && (txorrx != RECEIVE))
         return (einval);
    if ((ismode != MODECODE) && (ismode != NOMODECODE))
         return (einval);
    if ((legal != LEGAL) && (legal != ILLEGAL))
         return (einval);

	if (brdcst == BROADCAST)
		index += BROAD_OFFSET;
	if (txorrx == TRANSMIT)
		index += TRANSMIT_OFFSET;
	if (ismode == MODECODE)
		index += MODE_OFFSET;

	if (subaddress > 15)
	{
		index++;
		bit_position = subaddress  - (usint)16;
	}
	else
		bit_position = subaddress;

    if (legal)
    {
/*
 // Use wForceWordWrite to prevent compiler from optimizing this as a byte operation
	     // Summit control structure of PCMCIA *must* be written to only as words
*/
         wForceWordWrite = exc_summit->illegal[index] & (usint)~(1 << bit_position);

⌨️ 快捷键说明

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