亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? halstack.c

?? ZIGBEE2006協議棧
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
  V0.1 Initial Release   10/July/2006

*/

#include "hal.h"
#include "halStack.h"
#include "console.h"
#include "debug.h"
#include "ieee_lrwpan_defs.h"
#include "memalloc.h"
#include "phy.h"
#include "mac.h"

/*
V0.2.2.
  8/2/2006 Fixed problem with checking of CRC byte.
*/


RADIO_FLAGS local_radio_flags;

#ifdef  LRWPAN_ASYNC_INTIO

static volatile BYTE serio_rxBuff[LRWPAN_ASYNC_RX_BUFSIZE];
static volatile BYTE serio_rxHead, serio_rxTail;

#endif




//halInit contains both processor specific initialization
void halInit(void){
  //Set clock source
  local_radio_flags.val = 0;
  SET_MAIN_CLOCK_SOURCE(CRYSTAL);
  halInitUart();
  halSetBaud(LRWPAN_DEFAULT_BAUDRATE);
  halInitMACTimer();
}


//initialize UART to be used by
void halInitUart(void) {
  // Setup for UART0
   IO_PER_LOC_UART0_AT_PORT0_PIN2345();
   UTX0IF = 1;

#ifdef LRWPAN_ASYNC_INTIO
  serio_rxHead = 0;
  serio_rxTail = 0;
  INT_ENABLE_URX0(INT_ON);
#endif

}

#ifdef  LRWPAN_ASYNC_INTIO

//get a character from serial port, uses interrupt driven IO
char halGetch(void){
    char x;
    do {
      x = serio_rxHead;  //use tmp because of volt decl
    }  while(serio_rxTail == x);
    serio_rxTail++;
   if (serio_rxTail == LRWPAN_ASYNC_RX_BUFSIZE) serio_rxTail = 0;
   return (serio_rxBuff[serio_rxTail]);
}

 BOOL halGetchRdy(void){
   char x;
   x = serio_rxHead;
   return(serio_rxTail != x);
 }

#else
//get a character from serial port
char halGetch(void){
   char c;

   while (!URX0IF);
   c = U0DBUF;
   URX0IF = FALSE;

   return c;
}

BOOL halGetchRdy(void){

  if (URX0IF) return (1);
  else return(0);

}

#endif


void halUtilMemCopy(BYTE *dst, BYTE *src, BYTE len) {
  while (len) {
    *dst = *src;
    dst++;src++;
    len--;
  }
}

// assuming 16us period, have 1/16us = 62500 tics per seocnd
#define T2CMPVAL (62500/SLOWTICKS_PER_SECOND)

//use timer2, will set it up for one tick per symbol
//assuming 2.4GHZ and a 32 MHZ clock.
// this is a 20 bit counter, will overflow in ~16 seconds
//should be long enough for MAC timeout cases
void halInitMACTimer(void) {

  T2CNF = 0x00; //ensure timer is idle

  T2CAPHPH = 0x02;  // setting for 16 u-second periods
  T2CAPLPL = 0x00;  // (0x0200) / 32 = 16 u-seconds
  //set the interrupt compare to its maximum value

#ifdef LRWPAN_ENABLE_SLOW_TIMER
  T2PEROF0 = 0xFF & (T2CMPVAL);
  T2PEROF1 = (BYTE) (T2CMPVAL>>8);
  //enable overflow count compare interrupt
  T2PEROF2 = ((BYTE) (T2CMPVAL>>16)) | 0x20;
#endif

  //turn on timer
  //configure timer
  T2CNF = 0x03; //start timer

  INT_SETFLAG_T2(INT_CLR); //clear processor interrupt flag
  //enable T2 processor interrupt
#ifdef LRWPAN_ENABLE_SLOW_TIMER
  INT_ENABLE_T2(INT_ON);
#endif

}

UINT32 halGetMACTimer(void){
  UINT32 t;
  BOOL gie_status;

  SAVE_AND_DISABLE_GLOBAL_INTERRUPT(gie_status);
  t = 0x0FF & T2OF0;
  t += (((UINT16)T2OF1)<<8);
  t += (((UINT32) T2OF2 & 0x0F)<<16);
  RESTORE_GLOBAL_INTERRUPT(gie_status);
  return (t);
}

#ifdef LRWPAN_COMPILER_NO_RECURSION
UINT32 halISRGetMACTimer(void){
  UINT32 t;
  BOOL gie_status;

  SAVE_AND_DISABLE_GLOBAL_INTERRUPT(gie_status);
  t = 0x0FF & T2OF0;
  t += (((UINT16)T2OF1)<<8);
  t += (((UINT32) T2OF2 & 0x0F)<<16);
  RESTORE_GLOBAL_INTERRUPT(gie_status);
  return (t);
}

#endif




//only works as long as SYMBOLS_PER_MAC_TICK is not less than 1
UINT32 halMacTicksToUs(UINT32 ticks){

   UINT32 rval;

   rval =  (ticks/SYMBOLS_PER_MAC_TICK())* (1000000/LRWPAN_SYMBOLS_PER_SECOND);
   return(rval);
}

//assumes that Timer2 has been initialized and is running
UINT8 halGetRandomByte(void) {
  return(T2OF0);
}

//write a character to serial port
// Uses UART initialized by halInitUart

void halPutch(char c){
  while (!UTX0IF);
  UTX0IF = 0;
  U0DBUF = c;
}

void halRawPut(char c){
  while (!UTX0IF);
  UTX0IF = 0;
  U0DBUF = c;
}





//set the radio frequency
LRWPAN_STATUS_ENUM halSetRadioIEEEFrequency(PHY_FREQ_ENUM frequency, BYTE channel)
{
   UINT16 afreq;

   if (frequency != PHY_FREQ_2405M) return(LRWPAN_STATUS_PHY_FAILED);
   if ((channel < 11) || (channel > 26)) return(LRWPAN_STATUS_PHY_FAILED);
   afreq = 357 + 5*(channel - 11);
   FSCTRLL = (BYTE) afreq;
   FSCTRLH = ((FSCTRLH & ~0x03) | (BYTE)((afreq >> 8) & 0x03));
   return(LRWPAN_STATUS_SUCCESS);
}

//this assumes 2.4GHz frequency
LRWPAN_STATUS_ENUM halSetChannel(BYTE channel){
 return(halSetRadioIEEEFrequency(PHY_FREQ_2405M, channel));
}


#if defined(IAR8051)
//this uses the IEEE address stored in program memory.
//ensure that the flash programmer is configured to retain
//the IEEE address
void halGetProcessorIEEEAddress(BYTE *buf) {
#if (CC2430_FLASH_SIZE == 128)
  unsigned char bank;
  bank = MEMCTR;
  //switch to bank 3
  MEMCTR |= 0x30;
#endif
  //note that the flash programmer stores these in BIG ENDIAN order for some reason!!!
  buf[7] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+0);
  buf[6] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+1);
  buf[5] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+2);
  buf[4] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+3);
  buf[3] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+4);
  buf[2] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+5);
  buf[1] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+6);
  buf[0] = *(ROMCHAR *)(IEEE_ADDRESS_ARRAY+7);
 #if (CC2430_FLASH_SIZE == 128)
  //resore old bank settings
  MEMCTR = bank;
#endif
}

#endif


#if defined(HI_TECH_C)
//cannot figure out how to get the Hi-Tech C51 compiler to support
//banking, so can't access the IEEE address stored in memory

//use this if you don't want to use the IEEE Address stored in program memory
//by the flash memory
void halGetProcessorIEEEAddress(BYTE *buf) {
	buf[0] = aExtendedAddress_B0;
	buf[1] = aExtendedAddress_B1;
	buf[2] = aExtendedAddress_B2;
	buf[3] = aExtendedAddress_B3;
	buf[4] = aExtendedAddress_B4;
	buf[5] = aExtendedAddress_B5;
	buf[6] = aExtendedAddress_B6;
	buf[7] = aExtendedAddress_B7;
}
#endif



void halSetRadioIEEEAddress(void) {
  BYTE buf[8];
  halGetProcessorIEEEAddress(buf);
  IEEE_ADDR0 = buf[0];
  IEEE_ADDR1 = buf[1];
  IEEE_ADDR2 = buf[2];
  IEEE_ADDR3 = buf[3];
  IEEE_ADDR4 = buf[4];
  IEEE_ADDR5 = buf[5];
  IEEE_ADDR6 = buf[6];
  IEEE_ADDR7 = buf[7];
}

void halSetRadioPANID(UINT16 panid){
  PANIDL = (BYTE) (panid);
  PANIDH = (BYTE) (panid>>8);
 }

void halSetRadioShortAddr(SADDR saddr){
  SHORTADDRL = (BYTE) (saddr);
  SHORTADDRH = (BYTE) (saddr>>8);
}



//return value of non-zero indicates failure
//Turn on Radio, initialize for RF mode
//assumes that auto-ack is enabled
//this function based on sppInit example from ChipCon
//also sets the IEEE address
//if listen_flag is true, then radio is configured for
//listen only (no auto-ack, no address recognition)

/*
Eventually, change this so that auto-ack can be configured as
on or off. When Coordinator is trying to start a network,
auto-ack, addr decoding will be off as Coordinator will be doing an energy
scan and detecting PAN collisions, and thus will not be doing
any acking of packets. After the network is started, then
will enable auto-acking.
Routers and End devices will always auto-ack

i
*/



LRWPAN_STATUS_ENUM halInitRadio(PHY_FREQ_ENUM frequency, BYTE channel, RADIO_FLAGS radio_flags)
{
  LRWPAN_STATUS_ENUM status;


  // Setting the frequency
  status = halSetRadioIEEEFrequency(frequency, channel);
  if (status != LRWPAN_STATUS_SUCCESS) return(status);

  //turning on power to analog part of radio and waiting for voltage regulator.
  RFPWR = 0x04;
  while((RFPWR & 0x10)){}
  //radio_flags.listen_mode=1; //debug
  if (radio_flags.bits.listen_mode) {
    //corresponds to promiscuous modes
    //radio accepts all packets, the HUSSY!
    MDMCTRL0H &= ~ADR_DECODE;    //no address decode
    MDMCTRL0L &= ~AUTO_ACK;       //no auto ack
  } else {
    // Turning on Address Decoding
    MDMCTRL0H |= ADR_DECODE;
    //enable auto_ack
    MDMCTRL0L |= AUTO_ACK;
  }
  local_radio_flags = radio_flags;  //save this for later
  // Setting for AUTO CRC
  MDMCTRL0L |= AUTO_CRC;

  //pan
  if (radio_flags.bits.pan_coordinator) {
    MDMCTRL0H |= PAN_COORDINATOR;  //accepts frames with only source addressing modes
  } else {
    MDMCTRL0H &= ~PAN_COORDINATOR;  //rejects frames with only source addressing modes
  }

  // Turning on AUTO_TX2RX
  FSMTC1 = ((FSMTC1 & (~AUTO_TX2RX_OFF & ~RX2RX_TIME_OFF))  | ACCEPT_ACKPKT);

  // Turning off abortRxOnSrxon.
  FSMTC1 &= ~0x20;

  //now configure the RX, TX systems.
  // Setting the number of bytes to assert the FIFOP flag
  IOCFG0 = 127;  //set to max value as the FIFOP flag goes high when complete packet received

  // Flushing both Tx and Rx FiFo. The flush-Rx is issued twice to reset the SFD.
  // Calibrating the radio and turning on Rx to evaluate the CCA.
  SRXON;
  SFLUSHTX;
  SFLUSHRX;
  SFLUSHRX;
  STXCALN;
  ISSTART;

//this controls the frame pending bit in ACK frames.
//because of auto-ack, we will not have time to determine if data
//is actually pending or not.
#if defined(LWRPAN_RFD)
  SACK;  //RFDs never have data pending for FFDs
#else
  SACKPEND;  //routers/
#endif

  halSetRadioIEEEAddress();

   //Radio can interrupt when
   //RX configuration
   //clear flags/mask in radio
   RFIF = 0;
   RFIM = 0;   //all interrupts are masked.
   //enable RX interrupt on processor
   INT_SETFLAG_RF(INT_CLR);
   INT_ENABLE_RF(INT_ON);

   //enable RX RFERR interrupt on processor
   INT_SETFLAG_RFERR(INT_CLR);
   INT_ENABLE_RFERR(INT_ON);

   //do not use DMA at this point
   //enable the RX receive interrupt here.
   RFIM |= IRQ_FIFOP;

   return(LRWPAN_STATUS_SUCCESS);
}

#define PIN_CCA   CCA    //CCA is defined in hal.h

//regardless of what happens here, we will try TXONCCA after this returns.
void  doIEEE_backoff(void) {
     BYTE be, nb, tmp, rannum;
    UINT32  delay, start_tick;

   be = aMinBE;
   nb = 0;
  do {
      if (be) {
        //do random delay
        tmp = be;
        //compute new delay
        delay = 1;
        while (tmp) {
          delay = delay << 1;  //delay = 2**be;
           tmp--;
         }
        rannum =  halGetRandomByte() & (delay-1); //rannum will be between 0 and delay-1
        delay = 0;
        while (rannum) {
            delay  += SYMBOLS_TO_MACTICKS(aUnitBackoffPeriod);
            rannum--;
         }//delay = aUnitBackoff * rannum
        //now do backoff
       start_tick = halGetMACTimer();
        while (halMACTimerNowDelta(start_tick) < delay);
      }
      //check CCA
      if (PIN_CCA)  break;
      nb++;
      be++;
      if (be > aMaxBE) be =aMaxBE;
   }while (nb <= macMaxCSMABackoffs);
  return;
}

//transmit packet
//hdrlen - header lenth
//hdr - pointer to header data
//plen - payload length
//pload - pointer to payload

LRWPAN_STATUS_ENUM halSendPacket(BYTE flen, BYTE *frm)
{
  BYTE len;
  LRWPAN_STATUS_ENUM res;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美区自拍先锋| 亚洲欧美电影院| 日韩一区二区三区三四区视频在线观看 | 色婷婷av久久久久久久| 成人激情文学综合网| 99视频在线精品| 欧美一区二区在线免费播放| 欧美综合欧美视频| 欧美视频一区二区三区四区| 精品视频免费看| 69精品人人人人| 精品国产91久久久久久久妲己| 日韩欧美一区二区视频| 久久综合九色综合97婷婷女人 | 91香蕉视频在线| 91美女福利视频| 欧美男生操女生| www国产成人| 国产精品久久久久久久裸模| 亚洲品质自拍视频网站| 日韩国产成人精品| 国内国产精品久久| 99久久99久久久精品齐齐| 在线观看亚洲精品视频| 69av一区二区三区| 国产精品区一区二区三| 亚洲一二三四久久| 青草av.久久免费一区| 精品一二三四区| av电影在线观看完整版一区二区| 在线视频观看一区| 精品成人佐山爱一区二区| 国产精品美女久久久久久久网站| 亚洲成年人网站在线观看| 国产福利精品一区二区| 欧美亚洲国产一卡| 久久先锋影音av鲁色资源网| 亚洲精品欧美综合四区| 美国av一区二区| 91成人免费网站| 2020日本不卡一区二区视频| 亚洲小说欧美激情另类| 国产乱码字幕精品高清av | 91精品国产综合久久久久久漫画| 国产日韩欧美麻豆| 日韩中文字幕91| 波多野结衣视频一区| 精品入口麻豆88视频| 亚洲国产视频直播| 91首页免费视频| 国产精品嫩草影院com| 日本欧美久久久久免费播放网| 97精品超碰一区二区三区| www欧美成人18+| 久久不见久久见免费视频7| 在线观看国产日韩| 综合久久久久综合| 成人免费毛片片v| 久久久久久免费网| 精品在线播放午夜| 日韩女优电影在线观看| 亚洲成人黄色影院| 欧美性淫爽ww久久久久无| √…a在线天堂一区| 不卡免费追剧大全电视剧网站| 精品欧美久久久| 久久精品国产一区二区| 91麻豆精品国产无毒不卡在线观看 | 日韩精品一区二区三区在线| 午夜视频一区二区| 欧美日韩精品专区| 亚洲h在线观看| 欧美剧情电影在线观看完整版免费励志电影| 欧美激情中文字幕| 成人av在线网| 成人欧美一区二区三区| av一区二区三区黑人| 国产精品久久一级| www.久久精品| 一区二区成人在线| 欧美吻胸吃奶大尺度电影| 亚洲一区二区精品3399| 欧美日韩国产免费| 九九精品一区二区| 国产午夜精品理论片a级大结局| 国产成人精品影视| 国产精品激情偷乱一区二区∴| 99久久精品久久久久久清纯| 亚洲男人电影天堂| 欧美猛男超大videosgay| 日韩av电影免费观看高清完整版| 日韩一级欧美一级| 激情文学综合丁香| 中文字幕一区二区在线播放| 色综合久久久网| 日韩激情视频网站| 久久免费国产精品| 91麻豆精东视频| 日本不卡一区二区三区| 亚洲精品一区二区三区在线观看| 国产麻豆精品theporn| 国产精品免费久久久久| 欧美在线观看你懂的| 美女一区二区视频| 亚洲欧洲精品一区二区精品久久久 | 国产在线播放一区二区三区| 国产精品久久久久婷婷| 5858s免费视频成人| 国产福利精品导航| 首页亚洲欧美制服丝腿| 欧美国产1区2区| 4438x成人网最大色成网站| 国产精品亚洲午夜一区二区三区| 亚洲欧洲中文日韩久久av乱码| 7777女厕盗摄久久久| 99久久婷婷国产精品综合| 日韩精品高清不卡| 中文字幕欧美一| 久久综合五月天婷婷伊人| 日本伦理一区二区| 国产成人免费视频| 免费成人你懂的| 亚洲综合一区在线| 国产精品网友自拍| 日韩免费看的电影| 欧美精品乱码久久久久久 | 777精品伊人久久久久大香线蕉| 国产老女人精品毛片久久| 性做久久久久久免费观看欧美| 欧美激情艳妇裸体舞| 亚洲精品一区二区三区影院 | 国产欧美一区二区三区鸳鸯浴| 欧洲精品视频在线观看| 99久久综合精品| 国产福利一区二区三区| 国产一区二区三区免费播放| 喷水一区二区三区| 午夜电影网一区| 亚洲综合色网站| 亚洲自拍偷拍九九九| 亚洲欧美日韩在线播放| 中文字幕中文字幕中文字幕亚洲无线| 久久一区二区三区国产精品| 欧美哺乳videos| 欧美成人国产一区二区| 精品国产一区二区亚洲人成毛片 | 国产精品女人毛片| 欧美激情一区二区三区不卡| 国产视频一区二区在线观看| 久久午夜电影网| 26uuu国产日韩综合| 欧美精品一区二区久久久| 精品久久久影院| 26uuu成人网一区二区三区| 精品国产亚洲一区二区三区在线观看| 91精品国产色综合久久| 欧美tickling挠脚心丨vk| 26uuu国产一区二区三区| 久久天天做天天爱综合色| 久久久欧美精品sm网站| 久久精品一二三| 中文字幕一区二区三区四区| 自拍偷拍欧美精品| 亚洲午夜三级在线| 日本中文字幕一区二区视频| 麻豆成人免费电影| 国产美女精品一区二区三区| 成人亚洲精品久久久久软件| 国产91精品露脸国语对白| yourporn久久国产精品| 91黄色免费网站| 91精品欧美久久久久久动漫| 欧美刺激脚交jootjob| 欧美高清在线一区| 亚洲一级二级在线| 国产一区在线看| 色国产综合视频| 日韩精品在线网站| 亚洲人成在线播放网站岛国| 午夜精品福利一区二区三区av| 激情五月婷婷综合网| 99天天综合性| 69p69国产精品| 中文字幕一区不卡| 日韩影院免费视频| 国产 日韩 欧美大片| 欧美精品粉嫩高潮一区二区| 久久精品一区四区| 亚洲高清在线视频| 国产露脸91国语对白| 欧美日韩1234| 国产精品久久久久久福利一牛影视| 亚洲一区二区3| 成人性色生活片免费看爆迷你毛片| 欧洲亚洲精品在线| 国产精品丝袜一区| 老司机免费视频一区二区三区| 91猫先生在线| 国产精品美日韩| 美腿丝袜在线亚洲一区|