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

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

?? smscf.c

?? dm642網絡傳輸程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
//--------------------------------------------------------------------------
// IP Stack
//--------------------------------------------------------------------------
// smscf.c
//
// SMSC Sample Packet Driver - Background EMDA Version
//
// Author: Michael A. Denio
//         Andre Schnarrenberger
// Copyright 2002, 2003 by Texas Instruments Inc.
//-------------------------------------------------------------------------
#include <std.h>
#include <sys.h>
#include <sem.h>
#include <hwi.h>
#include <c62.h>
#include <assert.h>
#include <stkmain.h>
#include <csl.h>
#include <csl_edma.h>
#include <csl_cache.h>
#include "llpacket.h"
#include "smsc.h"

extern cregister volatile uint ICR;

//
// Static slots to hold our EDMA handle, event value, and
// TX and RX option register settings.
//
static EDMA_Handle hEDMA;
static int  EdmaEvent;
static UINT32      EdmaOptTx;
static UINT32      EdmaOptRx;

//
// Declare our local functions
//
static void smscReset();
static void smscStart();
static void smscStop();
static void smscIsr();
static void smscSendPacket( UINT8 smscPacketNumber );
static void smscReceivePacket();
static void smscIsrEDMA(int arg);
static void smscSynchEDMA();
static void smscWritePHY( uint reg_addr, uint data );
static uint smscReadPHY( uint reg_addr );
static void mdioWriteBit(uint bit);
static uint mdioReadBit();

// Local instance information pointer for our single device instance
static PDINFO *pPDI = 0;

// Simple Tx and Rx statistics
uint RxGood=0, RxOver=0, TxGood=0, TxBad=0, EdmaSave=0, IntSave=0;
uint FlashActiveLED = 0;

// SMSC Init State
static uint     InitState = 0;

// SMSC Interrupt State
#define ISR_STATE_IDLE      0
#define ISR_STATE_ACTIVE    1
static uint     IsrState = ISR_STATE_IDLE;

//
// Current TX and RX state
//
#define STATE_IDLE          0
#define STATE_ALLOC_PEND    1
#define STATE_DMA           2
#define STATE_SEND          3
static volatile uint   TxState = STATE_IDLE;
static volatile uint   RxState = STATE_IDLE;

// Remember these for TX
static PBM_Handle   tx_hPkt;
static UINT8        *tx_pBuffer;
static uint         tx_Size;
static uint         tx_Offset;
static uint         tx_Words;
static UINT16       tx_Word1;
static UINT16       tx_Word2;

// Remember these for RX
static PBM_Handle   rx_hPkt;
static UINT16       *rx_pBuffer;
static uint         rx_Words;

// Trasnmit Control Setting
static UINT16       TransmitControl;

//--------------------------------------------------------------------
// imanSetExtPolarity()
//
// This function is used to set the interrupt detection
// polarity for the interrupts gernerated by GMAC
//--------------------------------------------------------------------
static void imanSetExtPolarity( int extintno, int polarity )
{
    if( polarity==EXTINT_POLARITY_LOWHIGH )
        *(volatile unsigned int*)0x19c0008 &= ~(1<<(extintno-4));
    else if( polarity==EXTINT_POLARITY_HIGHLOW )
        *(volatile unsigned int*)0x19c0008 |= (1<<(extintno-4));
}

//--------------------------------------------------------------------
// Delay()
//
// Simple delay function
// Here 't' is roughly in units of 420nS
//--------------------------------------------------------------------
static void Delay(unsigned int t)
{
    volatile unsigned int i;
    t = (t * HW_CLOCKRATE) / 32;
    for( i=0; i<t; i++ );
}

//--------------------------------------------------------------------
// HwPktInit()
//
// Initialize Device environment and return instance count
//--------------------------------------------------------------------
uint HwPktInit()
{
    //
    // Note: This code supports only a single instance of the device
    //       Otherwise, we would do device detection here.
    //
    return(1);
}

//--------------------------------------------------------------------
// HwPktShutdown()
//
// Shutdown Device Environment
//--------------------------------------------------------------------
void HwPktShutdown()
{
}

//--------------------------------------------------------------------
// HwPktOpen()
//
// Open Device Instance
//--------------------------------------------------------------------
uint HwPktOpen( PDINFO *pi )
{
    HWI_Attrs   hwiattr;
    uint        i;

    // We only have one device, so store off the PDINFO pointer as
    // global to this module. Otherwise; we'd pick an unclaimed device
    // and associate it with the PDINFO.

    // Make sure our int is disabled
    gmDisableIER( HW_IFLAG );

    // Setup ISR state
    IsrState = ISR_STATE_IDLE;

    // Use the new PDINFO
    pPDI = pi;

    // Setup loopback mode (for testing)
    if( !pi->hEther )
        TransmitControl = TXENA|FDUPLX|EPHLOOP;
    else
        TransmitControl = TXENA|FDUPLX;

    if( InitState )
    {
        // Clear any pending CPU int
        ICR = HW_IFLAG;

        // Reset
        smscReset();
    }
    else
    {
        InitState = 1;

        //
        // In order to remain compatible with CSL, we will allocate
        // our DMA channels and completion events.
        //

        //
        // First, we must be able to get EDMA channel
        //
        hEDMA = EDMA_open( SMSC_EDMA_CHANNEL_NUMBER, EDMA_OPEN_RESET );
        if( hEDMA == EDMA_HINV )
            return(0);

        // We don't use hardware initiated EDMA
        EDMA_disableChannel( hEDMA );

        //
        // Next, allocate the completion events. We'll try for the same
        // event as the EDMA channel we selected.
        //
        if( (EdmaEvent = EDMA_intAlloc(SMSC_EDMA_CHANNEL_NUMBER)) < 0 )
            EdmaEvent = EDMA_intAlloc(-1);
        if( EdmaEvent<0 )
            return(0);

#if (!C64_SUPPORT)
        EdmaOptTx = EDMA_OPT_RMK( EDMA_OPT_PRI_HIGH,
                                  EDMA_OPT_ESIZE_32BIT,
                                  EDMA_OPT_2DS_NO,
                                  EDMA_OPT_SUM_INC,
                                  EDMA_OPT_2DD_NO,
                                  EDMA_OPT_DUM_NONE,
                                  EDMA_OPT_TCINT_YES,
                                  EdmaEvent,
                                  EDMA_OPT_LINK_NO,
                                  EDMA_OPT_FS_YES );

        EdmaOptRx = EDMA_OPT_RMK( EDMA_OPT_PRI_HIGH,
                                  EDMA_OPT_ESIZE_32BIT,
                                  EDMA_OPT_2DS_NO,
                                  EDMA_OPT_SUM_NONE,
                                  EDMA_OPT_2DD_NO,
                                  EDMA_OPT_DUM_INC,
                                  EDMA_OPT_TCINT_YES,
                                  EdmaEvent,
                                  EDMA_OPT_LINK_NO,
                                  EDMA_OPT_FS_YES );
#endif

#if (C64_SUPPORT)
        EdmaOptTx = EDMA_OPT_RMK( EDMA_OPT_PRI_HIGH,
                                  EDMA_OPT_ESIZE_32BIT,
                                  EDMA_OPT_2DS_NO,
                                  EDMA_OPT_SUM_INC,
                                  EDMA_OPT_2DD_NO,
                                  EDMA_OPT_DUM_NONE,
                                  EDMA_OPT_TCINT_YES,
                                  (EdmaEvent&0xf),
                                  (EdmaEvent>>4),
                                  EDMA_OPT_ATCINT_NO,
                                  0,
                                  EDMA_OPT_PDTS_DISABLE,
                                  EDMA_OPT_PDTD_DISABLE,
                                  EDMA_OPT_LINK_NO,
                                  EDMA_OPT_FS_YES );

        EdmaOptRx = EDMA_OPT_RMK( EDMA_OPT_PRI_HIGH,
                                  EDMA_OPT_ESIZE_32BIT,
                                  EDMA_OPT_2DS_NO,
                                  EDMA_OPT_SUM_NONE,
                                  EDMA_OPT_2DD_NO,
                                  EDMA_OPT_DUM_INC,
                                  EDMA_OPT_TCINT_YES,
                                  (EdmaEvent&0xf),
                                  (EdmaEvent>>4),
                                  EDMA_OPT_ATCINT_NO,
                                  0,
                                  EDMA_OPT_PDTS_DISABLE,
                                  EDMA_OPT_PDTD_DISABLE,
                                  EDMA_OPT_LINK_NO,
                                  EDMA_OPT_FS_YES );
#endif

        // Setup some EDMA fields that don't change
        EDMA_RSETH(hEDMA,IDX,0);
        EDMA_RSETH(hEDMA,RLD,0);

        // Clear our interrupt
        EDMA_intClear( EdmaEvent );

        // Hook our event interrupt
        EDMA_intHook( EdmaEvent, smscIsrEDMA );

        // Enable our interrupt
        EDMA_intEnable( EdmaEvent );

        // Init the CE space
        *HW_CE_REG = HW_CE_VALUE;

        // Hook device interrupt
        hwiattr.intrMask = HW_IFLAG | HW_IEDMAFLAG;
        hwiattr.ccMask   = 1;
        hwiattr.arg      = 0;
        HWI_dispatchPlug( HW_IVAL, (Fxn)smscIsr, -1, &hwiattr );
        CACHE_invalidate( CACHE_L1PALL, 0, 0 );

        // Enable interrupt and configure interrupt
        imanSetExtPolarity( HW_IVAL, SMSC_EXTINT_POLARITY );

        // Clear any pending CPU int
        ICR = HW_IFLAG;

        // Reset
        smscReset();

#if !SMSC_EEPROM_INSTALLED
        // Write our MAC address (no EEPROM on this board!)
        SMSC_WRITE16(SBA,SMSC_BANK_SELECT,1);
        for(i=0; i<6; i++ )
            SMSC_WRITE8(SBA,SMSC_IAR0+i,pPDI->bMacAddr[i]);
#endif
    }

    // Read our MAC address
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,1);
    for(i=0; i<6; i++ )
        pPDI->bMacAddr[i] = SMSC_READ8(SBA,SMSC_IAR0+i);

    // Start
    smscStart();

    // Enable our interrupt
    C62_enableIER( HW_IFLAG );

    return(1);
}

//--------------------------------------------------------------------
// HwPktClose()
//
// Close Device Instance
//--------------------------------------------------------------------
void HwPktClose( PDINFO *pi )
{
    uint  mask;
    (void)pi;

    // Make sure our int is disabled
    mask = gmDisableIER( HW_IFLAG | HW_IEDMAFLAG ) & ~HW_IFLAG;

    // If in the middle of a EDMA, wait
    if( TxState == STATE_DMA || RxState == STATE_DMA )
        smscSynchEDMA();

    // Normally we'd shut off the part, but here we'll only
    // stop it. This is because it can't handle a soft reset.
    smscStop();

    gmEnableIER( mask );
}

//--------------------------------------------------------------------
// smscHashIndex()
//
// Calculate the Hash table index for one 6 byte address
//--------------------------------------------------------------------
#define POLY32 0x04c11db7
static unsigned int smscHashIndex( UINT8 *Address )
{
    unsigned int    Crc = 0xffffffff;
    unsigned int    Msb;
    unsigned char   Byte;
    int             ByteLen, Bit;

    for( ByteLen=0; ByteLen<6; ByteLen++ )
    {
        Byte = *Address++;
        for (Bit=0; Bit<8 ; Bit++)
        {
            Msb = Crc >> 31;
            Crc <<= 1;
            if( (Msb ^ (Byte>>Bit)) & 1 )
                Crc ^= POLY32;
        }
    }
    return( Crc>>26 );
}

//--------------------------------------------------------------------
// HwPktSetRx()
//
// Update Rx Mode (Rx filter and multicast hash table)
//--------------------------------------------------------------------
void HwPktSetRx( PDINFO *pi )
{
    UINT8  multicast[8];
    UINT16 control;
    uint   i,idx;
    uint   mask;

    // Make sure our int is disabled
    mask = gmDisableIER( HW_IFLAG | HW_IEDMAFLAG );

    // If in the middle of a EDMA, wait
    if( TxState == STATE_DMA || RxState == STATE_DMA )
        smscSynchEDMA();

    //
    // Setup Multicast Table
    //

    // Clear all multicast bits to zero
    for(i=0; i<8; i++)
        multicast[i]=0;

    // For all multicast addresses, set one corresponding bit
    for( i=0; i<pi->MCastCnt; i++ )
    {
        // Get hash bit (0 to 63)
        idx = smscHashIndex( &(pi->bMCast[6*i]) );

        // Set hash bit in hash talble
        // regOffset = idx/8, and regBit = idx%8
        // Bank3, offset "regOffset" |= 1<<regBit
        multicast[idx/8] |= 1 << (idx%8);
    }

    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,3);
    for( i=0; i<8; i++ )
        SMSC_WRITE8(SBA,SMSC_MULTICAST_TABLE+i,multicast[i]);

    //
    // Setup the Rx Filter
    //
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,0);
    control = SMSC_READ16(SBA,SMSC_RECEIVE_CONTROL) & ~(ALMUL|PRMS);
    switch( pi->Filter )
    {
    case ETH_PKTFLT_NOTHING:
    case ETH_PKTFLT_DIRECT:
    case ETH_PKTFLT_BROADCAST:
    case ETH_PKTFLT_MULTICAST:
        break;

    case ETH_PKTFLT_ALLMULTICAST:
        control |= ALMUL;
        break;

    case ETH_PKTFLT_ALL:
        control |= PRMS;
        break;
    }
    control = SMSC_WRITE16( SBA, SMSC_RECEIVE_CONTROL, control );

    // Reenable our isr (if it was enabled)
    gmEnableIER( mask );
}


//--------------------------------------------------------------------
// HwPktTxNext()
//
// Transmit Next Packet on Tx Queue
//--------------------------------------------------------------------
void HwPktTxNext( PDINFO *pi )
{
    uint   mask;
    UINT8  tempbyte;

    // Make sure our int is disabled
    mask = gmDisableIER( HW_IFLAG | HW_IEDMAFLAG );

    // If in the middle of a EDMA, abort
    if( TxState != STATE_IDLE || RxState == STATE_DMA )
    {
        gmEnableIER( mask );
        return;
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
洋洋av久久久久久久一区| 亚洲精品美国一| 91精彩视频在线| 狠狠色丁香婷综合久久| 曰韩精品一区二区| 国产精品传媒视频| 91精品国产综合久久香蕉麻豆| 大陆成人av片| 狠狠色狠狠色综合系列| 偷拍与自拍一区| 亚洲欧美日韩电影| 久久精品在线观看| 日韩精品一区二区在线观看| 风流少妇一区二区| 国产在线国偷精品免费看| 日韩中文字幕亚洲一区二区va在线 | 国产亚洲综合在线| 日韩免费电影一区| 欧美一级片免费看| 欧美精品久久一区| 欧美日韩综合不卡| 欧美三级电影网| 在线观看av不卡| 色婷婷亚洲综合| 99国产精品国产精品久久| 国产精品中文字幕欧美| 精品影院一区二区久久久| 蜜桃视频第一区免费观看| 丝袜诱惑亚洲看片| 午夜精品福利一区二区三区蜜桃| 亚洲美女精品一区| 亚洲制服丝袜在线| 亚洲一区二区三区视频在线播放| 亚洲人成电影网站色mp4| 亚洲精品视频观看| 亚洲精品一二三| 亚洲夂夂婷婷色拍ww47 | 国产福利91精品一区二区三区| 另类小说色综合网站| 麻豆国产精品官网| 国产麻豆视频精品| 国产成人啪午夜精品网站男同| 高清shemale亚洲人妖| 大尺度一区二区| 99这里只有久久精品视频| fc2成人免费人成在线观看播放| 成人在线视频一区二区| 91一区二区在线| 色悠悠久久综合| 欧美人xxxx| 精品国产乱码久久久久久久久| 久久亚洲影视婷婷| 成人欧美一区二区三区| 亚洲一区二区黄色| 青青草精品视频| 国产精品自拍网站| jizzjizzjizz欧美| 精品少妇一区二区| 国产亚洲福利社区一区| 亚洲欧美日韩久久精品| 午夜a成v人精品| 国产乱国产乱300精品| 99久久国产综合精品女不卡| 欧美在线制服丝袜| 精品1区2区在线观看| 国产精品久99| 日本vs亚洲vs韩国一区三区 | 欧美激情在线一区二区三区| 久久综合九色综合欧美就去吻| 久久精品人人做人人爽人人| 亚洲欧美在线视频| 亚洲成在线观看| 国产在线麻豆精品观看| www.久久精品| 91精品国模一区二区三区| 中文字幕 久热精品 视频在线| 一区二区免费在线| 国内不卡的二区三区中文字幕 | 色999日韩国产欧美一区二区| 欧美丰满美乳xxx高潮www| 国产欧美一区二区精品性色超碰| 亚洲三级久久久| 蜜桃av一区二区| 99re这里都是精品| 日韩一区二区免费视频| 亚洲视频1区2区| 国产一区二区三区久久久 | 国产精品18久久久久久久久 | 欧美mv和日韩mv的网站| 亚洲欧洲日韩在线| 日本不卡不码高清免费观看| 成人综合在线观看| 在线成人小视频| 自拍偷自拍亚洲精品播放| 美日韩一区二区| 欧洲一区在线电影| 欧美国产精品劲爆| 一区二区三区自拍| 国产伦理精品不卡| 欧美日韩一级黄| 亚洲欧洲日本在线| 国产精品亚洲午夜一区二区三区 | 91在线播放网址| 久久久久久久久久久99999| 五月婷婷综合在线| 国产女同性恋一区二区| 国产欧美日韩三级| 亚洲va国产天堂va久久en| 国产成人综合网| 欧美精品一二三区| 一区二区高清免费观看影视大全 | 日韩欧美电影在线| 亚洲精品欧美激情| 成人av先锋影音| 中文字幕免费观看一区| 国内精品视频666| 欧美丰满美乳xxx高潮www| 亚洲图片欧美综合| 在线国产亚洲欧美| 夜夜嗨av一区二区三区中文字幕 | 国产精品家庭影院| 色域天天综合网| 欧美国产精品专区| 国产大片一区二区| 在线观看一区日韩| 欧美日韩高清在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 日韩高清国产一区在线| 欧美揉bbbbb揉bbbbb| 亚洲动漫第一页| 欧美系列一区二区| 婷婷开心激情综合| 日韩午夜三级在线| 久久成人免费电影| 精品国产91乱码一区二区三区| 成人一区二区三区中文字幕| 国产亚洲一区二区在线观看| 国产精品一区二区视频| 久久免费的精品国产v∧| 国模少妇一区二区三区| 久久久国产精品午夜一区ai换脸| 国产高清视频一区| 久久夜色精品一区| 成人中文字幕在线| 蜜臀av性久久久久蜜臀av麻豆| 色婷婷精品久久二区二区蜜臂av | 91一区二区在线观看| 中文字幕免费一区| 成人av电影免费在线播放| 亚洲视频一区在线观看| 欧美亚一区二区| 青青草国产精品亚洲专区无| 久久嫩草精品久久久精品| 欧美顶级少妇做爰| 久久久久亚洲蜜桃| 老汉av免费一区二区三区| 欧美日韩一区二区在线观看| 男人的j进女人的j一区| 精品国产1区2区3区| av福利精品导航| 亚洲一区二区三区三| 精品少妇一区二区| 91在线观看污| 日韩制服丝袜先锋影音| 日韩欧美国产不卡| 99精品黄色片免费大全| 午夜精品一区二区三区电影天堂 | 国产乱码精品一区二区三| 国产精品每日更新在线播放网址 | 久久激情五月婷婷| 日韩一区二区在线观看视频| 国产99精品在线观看| 一区二区三区日本| 精品国产免费一区二区三区四区| 国产高清在线精品| 一卡二卡三卡日韩欧美| 久久欧美中文字幕| 欧美在线一二三| 国产在线视视频有精品| 亚洲综合在线五月| 久久久国产一区二区三区四区小说 | 精品国产91乱码一区二区三区| 99精品国产一区二区三区不卡| 肉丝袜脚交视频一区二区| 中文字幕欧美国产| 欧美一区二区黄| 91传媒视频在线播放| 国产一区二区三区高清播放| 日本亚洲三级在线| 国产女人18毛片水真多成人如厕| 欧美性感一类影片在线播放| 成人综合婷婷国产精品久久蜜臀| 丝袜美腿亚洲综合| 日韩毛片精品高清免费| 久久这里都是精品| 91麻豆精品国产91久久久| 成人精品免费看| 黄色资源网久久资源365| 性做久久久久久免费观看欧美| 国产精品乱人伦|