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

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

?? smsce.c

?? dm642網絡傳輸程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
    TxState = STATE_ALLOC_PEND;

    // Allocate a transmit buffer
    // Assume ALLOC_INT is already masked
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);

    // Make sure busy bit is low
    while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

    // Send the allocate command
    SMSC_WRITE16(SBA,SMSC_MMU_COMMAND,CMD_ALLOCATE_MEMORY);

    // Make sure busy bit is low
    while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

    // Check results. If packet has been allocated, we can fill
    // the TX FIFO and send now.
    tempbyte = SMSC_READ8(SBA,SMSC_ALLOC_RESULT);
    if( !(tempbyte & FAILED) )
    {
        // Send the packet (this function will free hFrag and set the
        // TxState back to IDLE). The value of "tempbyte" is the SMSC
        // packet number.
        smscSendPacket( tempbyte );
        goto tx_exit;
    }

    // If we get here, the allocation is pending and we remain in the
    // TX_STATE_ALLOC_PEND state. If called from an ISR, we just return
    // since the ISR will handle the INT mask stuff. If not in an ISR,
    // we need to enable the ALLOC_INT interrupt.
    if( IsrState == ISR_STATE_IDLE )
    {
        tempbyte = SMSC_READ8(SBA,SMSC_INT_MASK) | ALLOC_INT;
        SMSC_WRITE8(SBA,SMSC_INT_MASK,tempbyte);
    }

tx_exit:
    // (Potentially) re-enable SMSC device interrupts on the DSP
    gmEnableIER( mask );
}

//--------------------------------------------------------------------
// _HwPktPoll()
//
// Poll routine - CALLED OUTSIDE OF KERNEL MODE
//
// This function is called at least every 100ms, faster in a
// polling environment. The fTimerTick flag is set only when
// called on a 100ms event.
//--------------------------------------------------------------------
void _HwPktPoll( PDINFO *pi, uint fTimerTick )
{
    uint   mask;

    (void)pi;

    if( fTimerTick )
    {
        LED_TOGGLE( USER_LED2 );
        if( FlashActiveLED )
        {
            FlashActiveLED = 0;
            LED_TOGGLE( USER_LED3 );
        }
    }

    // Get into kernel mode to be safe
    llEnter();

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

    // Check for missed interrupt
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);
    if( SMSC_READ8(SBA,SMSC_INT_MASK) & SMSC_READ8(SBA,SMSC_INT_STATUS) )
    {
        IntSave++;
        ICR = HW_IFLAG;
        smscIsr(0);
    }

    // (Potentially) re-enable SMSC device interrupts on the DSP
    gmEnableIER( mask );

    // Leave kernel mode
    llExit();
}

//--------------------------------------------------------------------
// smscReset()
//
// Reset MAC, initialize, and prepare to start
//--------------------------------------------------------------------
static void smscReset()
{
    UINT16 tmpword;
    UINT8  tmpbyte;

    // Set the default configuration
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,1);
    SMSC_WRITE16(SBA,SMSC_CONFIGURATION,CONFIGURATION_DEFAULT);

    // Soft reset
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,0);
    SMSC_WRITE16(SBA,SMSC_RECEIVE_CONTROL,SOFT_RST);
    Delay(10000);
    SMSC_WRITE16(SBA,SMSC_RECEIVE_CONTROL,0);
    Delay(10000);

    // Setup Auto-negotiation on the PHY and program the LEDs to
    // be tx/rx indicator on 2 and 10/100 link indicator on 1
    SMSC_WRITE16(SBA,SMSC_PHY_CONTROL,ANEG|LS1A|LS0A);

    // Setup auto-release on the conrol reg
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,1);
    tmpword = SMSC_READ16(SBA,SMSC_CONTROL) | AUTO_RELEASE;
    SMSC_WRITE16(SBA,SMSC_CONTROL,tmpword);

    // Reset the MMU
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);

    // Make sure busy bit is low
    while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

    SMSC_WRITE16(SBA,SMSC_MMU_COMMAND,CMD_RESET_MMU);

    // Make sure busy bit is low
    while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

    // Setup interrupt mask
    SMSC_WRITE8(SBA,SMSC_INT_MASK,0);

    // Ack any pending interrupts
    tmpbyte = SMSC_READ8(SBA,SMSC_INT_STATUS);
    SMSC_WRITE8(SBA,SMSC_INT_STATUS,tmpbyte);

    // Setup interrupt mask
    SMSC_WRITE8(SBA,SMSC_INT_MASK,TX_INT|RCV_INT);

    // Enable Transmitter
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,0);
    SMSC_WRITE16(SBA,SMSC_TRANSMIT_CONTROL,TransmitControl);

    // Reset the PHY negotiation
    smscWritePHY( 0, 0x3200 );

    // Tansmitter is not free until we start
    pPDI->TxFree = 0;

    // Delay for a bit
    Delay(3000000);
}

//--------------------------------------------------------------------
// smscStart()
//
// Start MAC Rx and Tx state machines
//--------------------------------------------------------------------
static void smscStart()
{
    // Initialize states
    TxState = STATE_IDLE;
    pPDI->TxFree = 1;

    // Setup Rx Filter Mode
    HwPktSetRx( pPDI );

    // Start receive
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,0);
    SMSC_WRITE16(SBA,SMSC_RECEIVE_CONTROL,RXEN);
}

//--------------------------------------------------------------------
// smscStop()
//
// Stop GMAC, abort current Rx and Tx
//--------------------------------------------------------------------
static void smscStop()
{
    uint mask;

    // Disable interrupts from device
    mask = gmDisableIER( HW_IFLAG );

    // Stop anyone from entering HwPktTxNext()
    pPDI->TxFree = 0;

    // Reset the part
    smscReset();

    // Clean up any waiting TX frag
    if( TxState != STATE_IDLE && TxState != STATE_SEND )
        PBM_free( tx_hPkt );
    TxState = STATE_IDLE;

    // Re-enable the part
    gmEnableIER( mask );

    // Flush the Tx Queue
    while( PBMQ_count(&pPDI->PBMQ_tx) )
        PBM_free( PBMQ_deq(&pPDI->PBMQ_tx) );
}

//--------------------------------------------------------------------
// smscIsr()
//
// General purpose ISR function.
//
// The calling arg "fTrueInt" is set to "1" if called at
// interrupt time, "0" otherwise.
//--------------------------------------------------------------------
static void smscIsr( UINT32 fTrueInt )
{
    UINT8   pktnum;
    uint    IsrFlags;
    uint    IsrMask;
    uint    needevent = 0;

    IsrState = ISR_STATE_ACTIVE;

    // Mask all interrupts while in the ISR. This will also drive
    // the SMSC interrupt low, allowing the DSP to catch the rising
    // edge of the line if interrupts are still pending when we try
    // to exit the ISR.
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);
    SMSC_WRITE8(SBA,SMSC_INT_MASK,0);

    do
    {
        // Now process all pending interrupts
        IsrFlags = SMSC_READ8(SBA,SMSC_INT_STATUS);

        if( RxState == STATE_IDLE )
            IsrMask = TX_INT|RCV_INT;
        else
            IsrMask = TX_INT;

        if( TxState == STATE_ALLOC_PEND )
            IsrMask |= ALLOC_INT;
        else if( TxState == STATE_SEND )
            IsrMask |= TX_EMPTY_INT;

        IsrFlags &= ( IsrMask | RX_OVRN_INT );

        // Count overruns for debug
        if( IsrFlags & RX_OVRN_INT )
            RxOver++;

        if( IsrFlags & TX_INT )
        {
            TxBad++;

            // Get the packet number of the failed packet
            pktnum = SMSC_READ8(SBA,SMSC_TX_FIFO_PACKET);

            // Make sure busy bit is low
            while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

            // Free this packet
            SMSC_WRITE8(SBA,SMSC_PACKET_NUMBER,pktnum);
            SMSC_WRITE16(SBA,SMSC_MMU_COMMAND,CMD_RELEASE_PACKET);

            // Make sure busy bit is low
            while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

            // Start the transmitter
            SMSC_WRITE16(SBA,SMSC_BANK_SELECT,0);
            SMSC_WRITE16(SBA,SMSC_TRANSMIT_CONTROL,TransmitControl);
        }

        if( IsrFlags & RCV_INT )
        {
            // Handle packet receive
            needevent |= smscReceivePacket();
        }

        if( IsrFlags & TX_EMPTY_INT )
        {
            TxState = STATE_IDLE;

            // See if there is another packet pending
            HwPktTxNext( pPDI );
        }

        if( IsrFlags & ALLOC_INT )
        {
            // Make sure we're on bank 2
            SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);

            // Get packet number (we now know the alloc is OK)
            // We can fill the TX FIFO and send now.
            pktnum = SMSC_READ8(SBA,SMSC_ALLOC_RESULT);

            // Send the packet (this function will free hPkt and set the
            // TxState back to IDLE). The value of "pktnum" is the SMSC
            // packet number.
            smscSendPacket( pktnum );
        }

        // Make sure we're on bank 2
        SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);

        // Ack the interrupt
        SMSC_WRITE8(SBA,SMSC_INT_STATUS,IsrFlags);

    } while( IsrFlags );

    // Reset the ISR state
    IsrState = ISR_STATE_IDLE;

    // Renable SMSC interrupts.
    SMSC_WRITE8(SBA,SMSC_INT_MASK,IsrMask);

    // Post the NETCTRL event semaphore when needed
    if( needevent )
    {
        FlashActiveLED = 1;
        STKEVENT_signal( pPDI->hEvent, STKEVENT_ETHERNET, fTrueInt );
    }
}

//--------------------------------------------------------------------
// smscSendPacket
//
// Send the packet (this function will free hPkt and set the
// TxState back to IDLE). The SMSC packet number is passed as
// the calling parameter
//
// If the packet is not properly aligned, it will align it
//--------------------------------------------------------------------
static void smscSendPacket( UINT8 smscPacketNumber )
{
    UINT16 *buffer16;
    UINT16 tempword;
    UINT8  tempbyte;

    // First, set the current TX state
    TxState = STATE_DMA;

    // Load the transmit data
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);
    SMSC_WRITE8(SBA,SMSC_PACKET_NUMBER,smscPacketNumber);

    // Setup pointer (write and TX are default)
    while( NOT_EMPTY & SMSC_READ16( SBA, SMSC_POINTER ) ) {
        ; // wait for write FIFO to become empty
    }
    SMSC_WRITE16(SBA,SMSC_POINTER,AUTO_INCR);

    // Write the status word
    SMSC_WRITE16(SBA,SMSC_DATA,0);

    // Write the packet size (byte count)
    SMSC_WRITE16(SBA,SMSC_DATA,(tx_Size & ~1)+6 );

    tempword = tx_Size>>2;

    // Setup EDMA
    EDMA_RSETH(hEDMA,OPT,EdmaOptTx);
    EDMA_RSETH(hEDMA,SRC,(UINT32)(tx_pBuffer + tx_Offset));
    EDMA_RSETH(hEDMA,CNT,tempword);
    EDMA_RSETH(hEDMA,DST,(SBA+SMSC_DATA));

    // Synch the cache
    if( (UINT32)tx_pBuffer & 0x80000000 )
        OEMCacheCleanSynch();

    // Make sure the status word and packet size writes got to the
    // SMSC. We do this by reading the SMSC device.
    SMSC_READ16(SBA,SMSC_BANK_SELECT);

    // Start the DMA
    EDMA_setChannel(hEDMA);

    // Setup for final transfer
    tempword <<= 2;
    tx_Size -= tempword;
    buffer16 = (UINT16 *)(tx_pBuffer + tx_Offset + tempword);

    // Wait for DMA to complete
    while( !EDMA_intTest( EdmaEvent ) );
    EDMA_intClear( EdmaEvent );

    // Send 2 bytes at a time for one go
    if( tx_Size >= 2 )
    {
        SMSC_WRITE16(SBA,SMSC_DATA,*buffer16++);
        tx_Size -= 2;
    }

    // Send any last byte and the control word
    if( tx_Size )
        tempword = (*buffer16 & 0xFF) | (CONTROLBYTE_ODD<<8);
    else
        tempword = 0;

    SMSC_WRITE16(SBA,SMSC_DATA,tempword);

    // Make sure busy bit is low
    while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

    // Enqueue the packet
    SMSC_WRITE16(SBA,SMSC_MMU_COMMAND,CMD_ENQUEUE_PACKET);

    // Make sure busy bit is low
    while( SMSC_READ16(SBA,SMSC_MMU_COMMAND) & BUSY_BIT );

    // Assume its a good transmit
    TxGood++;

    // Now we can free the packet
    PBM_free( tx_hPkt );

    // Set the transmitter state to SEND
    TxState = STATE_SEND;

    // We need an interrupt when this packet has been sent
    if( IsrState == ISR_STATE_IDLE )
    {
        tempbyte = SMSC_READ8(SBA,SMSC_INT_MASK) | TX_EMPTY_INT;
        SMSC_WRITE8(SBA,SMSC_INT_MASK,tempbyte);
    }
}

//--------------------------------------------------------------------
// smscReceivePacket()
//
// This function hanldes all RCV interrupt conditions
//
// Returns 1 if one or more packets received, or 0 on
// error condition.
//--------------------------------------------------------------------
static uint smscReceivePacket()
{
    UINT16      tempword,size;
    UINT16      *buffer16;
    PBM_Handle  hPkt;
    uint        retval = 0;
    UINT8       *pData;

    // First, set the current RX state
    RxState = STATE_DMA;

    // Setup pointer to read, rcv, and auto_inc
    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);
    while( NOT_EMPTY & SMSC_READ16( SBA, SMSC_POINTER ) ) {
        ; // wait for write FIFO to become empty
    }
    SMSC_WRITE16(SBA,SMSC_POINTER,RCV|READ|AUTO_INCR);

    // wait 370 ns 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久久99精品| 精品一区二区免费在线观看| 日本vs亚洲vs韩国一区三区二区| 国产毛片精品视频| 69堂精品视频| 亚洲精品成人精品456| 国产精品18久久久久久久久 | 国产精品自拍毛片| 欧美在线制服丝袜| 国产精品网站一区| 久久精品国产成人一区二区三区 | 国产一区欧美二区| 欧美午夜电影网| 中文字幕一区二区不卡| 国产乱人伦偷精品视频免下载| 欧美天堂亚洲电影院在线播放 | 欧美一区二区视频在线观看2020 | 欧美少妇bbb| 日韩美女久久久| 丰满岳乱妇一区二区三区| 精品国产伦一区二区三区观看体验| 一区二区三区在线高清| av一区二区三区在线| 国产网红主播福利一区二区| 久久99精品久久久| 欧美成人乱码一区二区三区| 日本成人在线电影网| 欧美日韩在线播| 一区二区三区国产精华| 色一情一伦一子一伦一区| 国产精品白丝在线| av在线一区二区| 亚洲欧洲制服丝袜| 91国产精品成人| 亚洲va欧美va人人爽| 欧美影院午夜播放| 亚洲一区二区三区激情| 欧美精品 国产精品| 日本视频在线一区| 欧美精品一区二区精品网| 国产综合久久久久久鬼色| 久久精品男人天堂av| 成人av资源下载| 1区2区3区精品视频| 欧美在线免费视屏| 日韩精品1区2区3区| 日韩欧美的一区| 国产成人免费视| 亚洲毛片av在线| 欧美日韩国产免费一区二区 | 亚洲免费色视频| 日本韩国一区二区三区| 亚洲444eee在线观看| 日韩一区二区麻豆国产| 国产剧情一区二区三区| 亚洲女同女同女同女同女同69| 色婷婷香蕉在线一区二区| 丝袜美腿成人在线| 久久综合狠狠综合久久综合88| 国产成人免费在线观看不卡| 一区二区三区在线视频播放| 欧美一区二区私人影院日本| 高清国产一区二区三区| 亚洲色图20p| 91精品综合久久久久久| 成人午夜碰碰视频| 亚洲va韩国va欧美va| 精品999久久久| 色呦呦国产精品| 韩国v欧美v日本v亚洲v| 亚洲欧美日韩久久| 日韩欧美高清dvd碟片| 91在线视频网址| 精品一区二区影视| 亚洲国产视频a| 国产偷国产偷精品高清尤物| 欧美色网站导航| 国产风韵犹存在线视精品| 性做久久久久久免费观看| 亚洲国产激情av| 欧美卡1卡2卡| 99久久精品国产精品久久| 久草中文综合在线| 亚洲va天堂va国产va久| 最好看的中文字幕久久| 精品国产乱码久久久久久老虎| 99久久精品国产观看| 国产精品一区二区在线看| 亚洲h精品动漫在线观看| 国产精品久久久久精k8| 精品国产免费人成在线观看| 在线一区二区三区做爰视频网站| 国产成人在线色| 六月丁香综合在线视频| 亚洲成人高清在线| 亚洲精品视频免费观看| 国产亚洲福利社区一区| 日韩一级免费观看| 欧美日韩国产成人在线91| 91视频一区二区三区| 国产精品影视天天线| 奇米精品一区二区三区在线观看| 亚洲精品日产精品乱码不卡| 久久网站最新地址| 精品久久久久av影院| 欧美成人女星排名| 欧美一级在线免费| 在线成人午夜影院| 欧美体内she精视频| 在线影视一区二区三区| 欧美亚洲另类激情小说| 在线看国产一区二区| 欧美午夜一区二区| 欧美日韩一区不卡| 欧美视频中文字幕| 欧美日韩亚州综合| 在线电影院国产精品| 91精品欧美久久久久久动漫| 欧美探花视频资源| 欧美人与性动xxxx| 欧美一区二区三区四区在线观看| 欧美日本视频在线| 日韩一区二区影院| 精品噜噜噜噜久久久久久久久试看| 91精品国产一区二区三区蜜臀| 欧美乱妇20p| 日韩你懂的电影在线观看| 精品欧美久久久| 国产精品女同一区二区三区| 亚洲视频一区二区在线观看| 亚洲综合一区二区精品导航| 亚洲国产精品久久艾草纯爱| 丝袜亚洲另类欧美综合| 久久成人免费网| 成人性视频网站| 97se亚洲国产综合自在线不卡| 日本高清不卡在线观看| 欧美日本乱大交xxxxx| 欧美成人一区二区三区片免费| 亚洲精品在线网站| 亚洲欧洲一区二区三区| 亚洲午夜一二三区视频| 久久精品国产亚洲a| 成人黄色av电影| 91精品欧美久久久久久动漫 | 亚洲精品欧美在线| 青青草一区二区三区| 国产成人av一区二区三区在线观看| av高清不卡在线| 日韩欧美国产电影| 亚洲日本一区二区| 精品一二三四在线| 91一区二区在线| 日韩久久精品一区| 亚洲色图欧美激情| 久草热8精品视频在线观看| 91麻豆国产在线观看| 欧美一级xxx| 一区二区三区欧美日| 国产尤物一区二区在线| 欧日韩精品视频| 国产日韩欧美一区二区三区乱码| 亚洲成人午夜电影| 成人免费视频免费观看| 日韩欧美专区在线| 夜夜精品浪潮av一区二区三区| 国产一区二区精品久久91| 欧美影院午夜播放| 亚洲欧洲av色图| 久久97超碰国产精品超碰| 欧美日韩一本到| 日韩理论片网站| 国内成人精品2018免费看| 在线观看日韩av先锋影音电影院| 国产欧美日韩在线| 久久精品国产77777蜜臀| 欧美视频中文字幕| 亚洲免费观看在线视频| 国产91高潮流白浆在线麻豆| 欧美电影免费观看完整版| 亚洲成av人片观看| 欧美亚洲高清一区二区三区不卡| 国产精品视频yy9299一区| 国产河南妇女毛片精品久久久| 91麻豆精品国产自产在线观看一区| 亚洲麻豆国产自偷在线| 91蜜桃传媒精品久久久一区二区| 国产女人18毛片水真多成人如厕 | 国产亚洲综合av| 精油按摩中文字幕久久| 欧美一区二区久久| 五月婷婷激情综合| 欧美美女激情18p| 五月激情综合网| 欧美午夜不卡在线观看免费| 亚洲成人在线网站| 欧美精品三级在线观看| 亚州成人在线电影| 欧美精品tushy高清| 日韩专区一卡二卡|