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

📄 mftmac.c.bak

📁 motorola jw32 usb 源码
💻 BAK
📖 第 1 页 / 共 5 页
字号:
/*********************************************************************
 *
 *                  MFT MAC layer
 *
 *********************************************************************
 * FileName:        mftMAC.c
 * Dependencies:
 * Processor:       c51
 * Company:         chengdu MFT, Inc.
 *
 * Software License Agreement
 *
 *
 * Author               Date    Comment
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * jiangchao    				5/09/05 Rel 0.1
 ********************************************************************/

// Association State Machine states.
#pragma DATA_SEG  MY_ZEROPAGE
// Number of coordinators found operating in radius.
 BYTE                    PANDescCount=0;

// Current channel of operation.
 BYTE                    macCurrentChannel=0;


// Length of transmit packet that is being current loaded.
 BYTE                    macPacketLen=0;
// Length of transmit packet that is being current loaded.
 BYTE                    macRecLen=0;
// MAC address info.
 NODE_INFO               macInfo;

// Current MAC frame header.
 MAC_HEADER               macCurrentFrame;
//current mac state
//  MAC_STATE               macState;
BYTE                     macKbLedState=0;  //led state of kb
BYTE                 			 macKbPassFlag=0; //pass led state to kb

// Tick value used to calculate timeout conditions.
unsigned int             macStartTick=0;
unsigned int             macMsTick=0;
unsigned int             macKbTick=0;
//unsigned int             macJk1Tick=0;
//unsigned int             macJk2Tick=0;
//unsigned int             macWarnTick=0;
BYTE                     beaconflag=0;
//---------------------------------------------------------
//mac state
 BYTE    bIsAssociated=0        ; // '1' if this node is associated
BYTE  	bIsEnabled=0						;	 // '1' if current tx packet should be put in stage
//BYTE		bIsTest=0							;//'1' if current state is in test mode
BYTE		bmode=0;							 //'1' no beacon 0 becon
BYTE  	bIsScan =0;               //1 now is scan channel
BYTE    bIsGetReady =0;           //mac received data
BYTE    bPhyGetReady=0;         //phy  receive data
BYTE    bIsMap  =0;             //map jk to keyboard
BYTE    bmsIsMap =0;              ;//map mouse key
BYTE    bchanlost=0;             //when save channel should change.1
//BYTE    bledGaptime=1;           //the time period when led light and close
BYTE    bkbounce=0;  //keboard bounce flag
BYTE    macWarncode=0;               //device warn code

//BYTE    macScndtick=0;           //second tick counter

//------------------------------------------------------------
 MAC_BEACON  						 macBeaon  ;
// Tick value used to calculate repeat send timeout conditions.

BYTE                     macNewKeyMode =0;
BYTE                     macNewKey = 0;
BYTE                     macNewKeyLength = 0;
BYTE                     macmsMapKey = 0; //mouse map key
//BYTE                     macDataRate = 0;
unsigned int             macTickDiff=0;

//unsigned int                   macAckTick;
BYTE                     macMsOldKey=0;
 BYTE                    macBeaconTick=0;
BYTE   bBeaconReady;
BYTE   bdevtrans=0;
//Static Rx Frame Buffer
BYTE  FrameRXBuffer[MAC_FRAME_LENGTH];
//-------------------------------------------------

BYTE  JKeyBuffer[MAC_JKTRSLENGTH];//josytick key changed buffer.
BYTE  JkeyMapId=0; //0.no data map.1 joystick data.2,mouse map data.3 keyboard map data
BYTE  JmacroKey=0;

//BYTE JkchannelId=MAC_DEVICE_JOYSTICK0;
//---------------------------------------------------
//Rx Buffer information
volatile RX_BUFFER  RXBuffer[1];

//Current Send Frame

//beacon control
//--------------------------------------------

static BYTE  sendFlag=0;
static BYTE  ledDataFlag=0;
static BYTE  downFlash=0;
static BYTE  downLength=0;
BYTE  TXBUFFER[MAXDEVLENGTH];
BYTE  DeviceBuffer[KbPassLength];
#define RANDOM_LSB                      (T1CNTL)
#define NODATA                            0xff
#pragma DATA_SEG DEFAULT
BYTE 											Joystick=0;
BYTE 			phyTransmitPower=0;
//BYTE 			phyChannelMaxSupport=0;
BYTE      MACSndDataLength=0;
BYTE      MsMode=0;
BYTE      jk1mode=0;
BYTE      jk2mode=0;
/*MAC_JKDev macJkDev[2]=
{
	0xFF,MAC_DEVICE_JOYSTICK0,
	0xFF,MAC_DEVICE_JOYSTICK1,
};*/
BYTE  DeviceDataLength;
 BYTE     macRandom=0;
//mouse data format:0:(key,01 left.right 01). 1~4:x,y. 5:scroll
extern  unsigned  char  mose_buffer[KbLength];	//他们分别是放:鼠标数据,遥感(4/8)键时的x,y值,键盘数据
//keyboard data format: 0:id=0x01,1:modify...
extern unsigned char kb_buffer[KbLength];
extern unsigned char joystick_buffer[KbLength];//send data id is seted by mac
#define RomBitNumber       5
//BYTE    Groupbit[RomBitNumber]={0x01,0x02,0x04,0x08,0x10,0x20};
//-------------------------------------------------------------------------------------------------------------
void MACPutHeader(BYTE flength,BYTE desAddr);
BYTE MACSaveAppData(unsigned char *buffer,unsigned char length);
static BYTE     MACGetHeader(void);
static void     MACSendAck(BYTE *Buffer,BYTE length);
//static void     TransmitIt(void);
static void 		MACReqNetState();
static void 		MACSendNetState(void);
//static BYTE 		PerformCCA(void);
static BYTE     MACProcessBeacon(void);

static void     MACSendBeacon(void);
static void 		MACPreBeacon(void);
static		void 			MACSendAssociateResponse(void);
//static		void 			MACProcessGTS(void);
static		void 			MACBufferPacket(void);
//static      void            MACTestSendAck();
static void MACDiscardRx(void)	 ;
static BYTE MACProcessNetState(void) ;
void MACPassDeviceData(BYTE deviceid,BYTE *buffer,BYTE length);
//void MACUpdateLedState(BYTE type,BYTE ledflag);
void MACKeyBufferInit()
{
	BYTE i;
	for(i=0;i<MAC_MSKEY_NUMBER;i++)
	{

		msRamMapIndex[i].length =0;
		msRamMapIndex[i].address = NULL;
	 // msRamMapIndex[i].keyNumber = i;
	}
}
/*void MACJKdevBufferInit()
{
		macJkDev[0].devAddress =0xff;
		macJkDev[0].devID = MAC_DEVICE_JOYSTICK0;
		macJkDev[1].devAddress =0xff;
		macJkDev[1].devID = MAC_DEVICE_JOYSTICK1;
}*/
BYTE MACGetBitNumber1(BYTE cmd)
{
	BYTE i;
	for(i=0;i<8;i++)
			{
				 if(cmd&Groupbit[i])
				 {
					 	return i;
				 }
			}
			return NODATA;
}
//return channelID of joystick device.
BYTE  MACGetJkChannelId(void)
{
		if(macCurrentFrame.sndAddress==MAC_DEVICE_JOYSTICK0)//channel 0
		{
					Joystick=1;
					return	MAC_DEVICE_JOYSTICK0;
		}
		Joystick=2;
		return	MAC_DEVICE_JOYSTICK1;
}

/*********************************************************************
 * Function:        void MACInit(void)
 *
 * PreCondition:    macInfo.longAddr must be initialized with
 *                  desired MAC address.
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Initializes data variables used by MAC module.
 *
 * Note:            None
 ********************************************************************/
void MACInit(void)
{
 //   BYTE i;
bIsEnabled		=FALSE;
	bIsScan =FALSE;
		bBeaconReady = FALSE;
	//bIsTest = FALSE;
   bIsGetReady = FALSE;
   bIsMap= FALSE;
   bmsIsMap = FALSE;
    // Also initialize frame DSN queue buffer.
    bIsAssociated = FALSE;

   macStartTick =  TickGet();//synchrounous system tick
    // Clear all mac state flags.
    macCurrentFrame.frameLength = 0x00;
    macCurrentFrame.frameCtrl.Control.Val = 0x00;
//		JkchannelId=MAC_DEVICE_JOYSTICK0;
    // On start, set device id.    
    RXBuffer[0].head = NULL;
    RXBuffer[0].databuffer = NULL;
    RXBuffer[0].length = 0;
    RXBuffer[0].lqi	 	= 0;
    Joystick = 0;
    macPacketLen =0;
    macRecLen    =0;
     beaconflag=0;
    macBeaconTick = 0;
    macKbLedState = 0;
    macKbPassFlag = 0;
  //  macJk1Tick = 0;
 //   macJk2Tick = 0;
    macTickDiff = 0;
    JkeyMapId = 0;
    macMsOldKey = 0;
    JmacroKey = 0;  //record macro key number
    bchanlost=0;
  //  bledGaptime =2; //2.5s
 //   macScndtick=0;
    bkbounce=1;
    macWarncode =0;
 //   bwarnflag=0;
    macMsTick = 0;
     macKbTick=0;
   //   macWaitTick=0;
  //  pmacDownBuffer  = &Ram_Key[DATA_HEAD];
  //------------------------------------------

  Joystick_KeyInit();
  Joystick_DevInit();
 // MACJKdevBufferInit();
  //----------------------------------------

}
//search jk key map index,then put flash address index into ram
//input : flashAddress:flash map area of jk.
//flashDataLength:Flash map length.keyMap:ram index of flash key.
//KeyMapLength: ram index buffer length
//output: if search jk flash map success.return 1.else return 0
BYTE Modify_KeyMapIndex(BYTE const * flashAddress,unsigned int flashDataLength,RamMapIndex * keyMap,BYTE KeyMapLength)
{
    unsigned char i,flashDataL;
   	unsigned int length_check=0;
    flashDataL=*flashAddress;           //Key1…Keyn映射数据的总长度
    if(flashDataLength<flashDataL)
        return FALSE;

    flashAddress+=2;                    //指向Key1映射数据的数据长度
    for(i=0;i<KeyMapLength;i++)
    {
  //      keyMap[i].keyNumber=i;

        keyMap[i].length=*flashAddress;
        flashAddress++;                 //指向数据首地址
        keyMap[i].address=(byte*)flashAddress;
        flashAddress+=keyMap[i].length; //数据长度
        if(*flashAddress!=KBDATAEND)  //结束符
        		return FALSE;
        flashAddress++;                 //JUMP结束符
        length_check=2+keyMap[i].length+length_check;
        if(length_check>=flashDataLength)
            return TRUE;
    }

    return TRUE;
}
/*********************************************************************
 * Function:        void MACEnable(void)
 *
 * PreCondition:    macInfo.longAddr must be initialized with
 *                  desired MAC address.
 *
 * Input:           None
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Enables PHY regulator and registers.
 *
 * Note:            None
 ********************************************************************/
void MACEnable(void)
{
   	BYTE  phyParameter=0;
    // Initialize the PHY's registers/wait for it's oscillator to
    // become stable.  In the event the PHY malfunctions for too long
    // the watchdog timer will cause a reset to occur here.
    macCurrentChannel=FIRSTCHAN;
    MsMode=0;
   	bPhyGetReady=FALSE;

	//-------------------------------------------------------------------
   	if( !PHYInit(macCurrentChannel,0))
   	{
   			//printf("init PHY error!\n");
   			return;
   	}

   if(PHYGetPIB(PhyCurrentPower,&phyParameter))
    {
    	phyTransmitPower=phyParameter;
    }
    /*if(PHYGetPIB(PhyChannelMaxSupport,&phyParameter))
    {
    	if(phyParameter<MAC_SCAN_MAX_CHANNEL)
    			phyChannelMaxSupport = phyParameter;
    	else
    			phyChannelMaxSupport = MAC_SCAN_MAX_CHANNEL;
    }*/


    //-------------------------------------------------------
    ReadFlash((byte const *)FLASH_ADDRESS[0],KEYMAPMAXSIZE,Ram_Key); //read pan id address from rom and mouse key map
	if(	Modify_KeyMapIndex((BYTE const *)FLASH_ADDRESS[0],KEYMAPMAXSIZE,msRamMapIndex,MAC_MSKEY_NUMBER)) ;
		{
			phyParameter = msRamMapIndex[0].address[MAC_PAN_ID];
			macCurrentChannel = msRamMapIndex[0].address[MAC_CHNL_ID];
		}
	if(	Modify_KeyMapIndex((BYTE const *)FLASH_ADDRESS_JK1[0],PAGESIZE,jk1RamMapIndex,MAC_JKKEY_NUMBER)) ;
	if(	Modify_KeyMapIndex((BYTE const *)FLASH_ADDRESS_JK2[0],PAGESIZE,jk2RamMapIndex,MAC_JKKEY_NUMBER)) ;
	//-------------------------------------------------------------
   MACSetDeviceID(MY_DEVICEID);
    // By default, PAN is assumed to be not assigned.
    macInfo.devAddress=phyParameter;
    macInfo.panId=phyParameter;
		if( !PHYInit(macCurrentChannel,phyParameter))
   	{
   			return;
   	}  
    bIsEnabled = TRUE;
    macBeaon.Control.Val    = 0x00;
    //bmode       = MAC_MODE_NORMAL;
     bmode       =MAC_MODE_BEACON;
    macBeaon.Control.bits.bmode 					=  bmode;
   // PHYSetTRXState(PHY_TRX_RX_ON);
}

//transfer jk combin key to map key
BYTE GetKeyMapNumber(byte bkey)
{
	byte tkey = bkey>>1;
	tkey+=JK_MSTART;
	if(tkey>MAC_JKKEY_NUMBER)
	 return 0;
	return tkey;


}
//according bkey number,judge whether key is pressed or loose.and output key class
BYTE GetJkeyMode(BYTE *bkey,BYTE *bmode,BYTE *bflag)
{
	byte tkey = *bkey>>1;
	byte tlength;
		byte tmode;
		byte tdata;
		byte tkflag;
	*bflag  = *bkey%2;

	if(tkey>MAC_JKKEY_NUMBER)
	 return 0;
	tkflag = 0;
	*bkey =	tkey;
	if(tkey>=LJK_NUMBER&&tkey<LJK_NUMBER+8)//ljoystick key
	{
			 if(bdevtrans==MAC_DEVICE_JOYSTICK0)
			 {
					tmode = jk1RamMapIndex[LJK_INDEX].address[0];
				}
			else if(bdevtrans==MAC_DEVICE_JOYSTICK1)
			{
					tmode = jk2RamMapIndex[LJK_INDEX].address[0];

			}
		 if(tmode!=Key_mode)
		 {
		 		*bkey=LJK;
		 }
		 else
		 {
		 	tkflag=1;

		}

	}
	else if(tkey>=RJK_NUMBER&&tkey<RJK_NUMBER+8)//rjoystick key
	{
			 if(bdevtrans==MAC_DEVICE_JOYSTICK0)
					tmode = jk1RamMapIndex[RJK_INDEX].address[0];
			else if(bdevtrans==MAC_DEVICE_JOYSTICK1)
					tmode = jk2RamMapIndex[RJK_INDEX].address[0];
		 if(tmode!=Key_mode)
		 {
		 		*bkey=RJK;
		 }
		 else
		 {
		 		tkflag=1;
		}
		}

	else if(tkey>=HAT_NUMBER&&tkey<HAT_NUMBER+4)//hat key
	{
			 if(bdevtrans==MAC_DEVICE_JOYSTICK0)
					tmode = jk1RamMapIndex[CAPJK_INDEX].address[0];
			else if(bdevtrans==MAC_DEVICE_JOYSTICK1)
					tmode = jk2RamMapIndex[CAPJK_INDEX].address[0];
			if(tmode!=Key_mode)
					tmode+=Hat_mode;
			else
			{
					tkflag=1;
		  }
	}
	else
	{
			tkflag=1;
	}
	if(	tkflag==1)//KEY MAP
	{

⌨️ 快捷键说明

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