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

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

?? smscf.c

?? dm642網絡傳輸程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
    // Make sure we have a packet to send
    if( !(tx_hPkt = PBMQ_deq(&pi->PBMQ_tx)) )
    {
        pi->TxFree = 1;
        gmEnableIER( mask );
        return;
    }

    // Fill in the pending record
    tx_pBuffer = PBM_getDataBuffer(tx_hPkt);
    tx_Size    = PBM_getValidLen(tx_hPkt);
    tx_Offset  = PBM_getDataOffset(tx_hPkt);

    // Mark as "not free" and set TX state
    pi->TxFree = 0;

    // Clean the cache for external addesses
    if( (UINT32)tx_pBuffer & 0x80000000 )
        OEMCacheClean( (void *)(tx_pBuffer+tx_Offset), tx_Size );

    // Go into allocation phase
    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 | HW_IEDMAFLAG );

    // If not in the middle of a EDMA, check ints
    if( TxState != STATE_DMA && RxState != STATE_DMA )
    {
        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();
        }
    }

    // Check for DMA complete
    if( EDMA_intTest( EdmaEvent ) )
    {
        EdmaSave++;
        ICR = HW_IEDMAFLAG;
        EDMA_intClear( EdmaEvent );
        smscIsrEDMA(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 | HW_IEDMAFLAG );

    // 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;

    if( RxState == STATE_DMA )
        PBM_free( rx_hPkt );
    RxState = 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.
//--------------------------------------------------------------------
static void smscIsr()
{
    UINT8   pktnum;
    uint    IsrFlags;
    uint    IsrMask;

    IsrState = ISR_STATE_ACTIVE;

    if( TxState == STATE_DMA || RxState == STATE_DMA )
        goto IsrExit;

    // 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 )
        {
            smscReceivePacket();

            // If in the middle of a EDMA, exit
            if( RxState == STATE_DMA )
                goto IsrExit;
        }

        if( IsrFlags & TX_EMPTY_INT )
        {
            TxState = STATE_IDLE;

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

            // If in the middle of a EDMA, exit
            if( TxState == STATE_DMA )
                goto IsrExit;
        }

        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 );

            // If in the middle of a EDMA, exit
            if( TxState == STATE_DMA )
                goto IsrExit;
        }

        // 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 );

IsrExit:
    // Reset the ISR state
    IsrState = ISR_STATE_IDLE;

    // Renable SMSC interrupts.
    if( TxState != STATE_DMA && RxState != STATE_DMA )
        SMSC_WRITE8(SBA,SMSC_INT_MASK,IsrMask);
}

//--------------------------------------------------------------------
// smscSendPacket
//
// Send the packet (this function will free hFrag 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;

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

    // Set the current TX state, lock out other SMSC activity
    TxState = STATE_DMA;
    SMSC_WRITE8(SBA,SMSC_INT_MASK,0);
    ICR = HW_IFLAG;

    // 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);

    // Send any last byte(s) and the control word
    if( tx_Size < 2 )
        tx_Words = 1;
    else
    {
        tx_Words = 2;
        tx_Word1 = *buffer16++;
        tx_Size -= 2;
    }

    if( tx_Size )
        tx_Word2 = (*buffer16 & 0xFF) | (CONTROLBYTE_ODD<<8);
    else
        tx_Word2 = 0;
}

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

    SMSC_WRITE16(SBA,SMSC_BANK_SELECT,2);

    // Setup pointer to read, rcv, and auto_inc
    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一区二区三区免费野_久草精品视频
欧美日韩国产美| 亚洲精品乱码久久久久| 欧美日韩久久久一区| 9i在线看片成人免费| 国产精品一线二线三线| 久久国产精品99久久久久久老狼| 激情综合色综合久久| 久久精品国产澳门| 精品中文av资源站在线观看| 日日嗨av一区二区三区四区| 午夜影院久久久| 国产精品的网站| 国产精品美女久久久久久久久久久| 久久嫩草精品久久久精品| 欧美大片在线观看一区| 91精品国产一区二区人妖| 日韩欧美中文字幕公布| 国产午夜一区二区三区| 最新热久久免费视频| 亚洲一区视频在线| 男人的j进女人的j一区| 国产一区二区在线免费观看| 国产a级毛片一区| 色成人在线视频| 91精品一区二区三区在线观看| 日韩视频一区二区三区| 国产午夜精品一区二区三区四区| 国产精品久久毛片a| 亚洲国产精品一区二区尤物区| 蜜桃久久久久久久| 波多野结衣在线一区| 欧美网站一区二区| 亚洲精品一区二区三区99| 国产精品麻豆99久久久久久| 亚洲mv大片欧洲mv大片精品| 国精品**一区二区三区在线蜜桃| 91在线观看地址| 欧美zozo另类异族| 亚洲免费资源在线播放| 精品写真视频在线观看| 不卡一区二区在线| 欧美一区二区在线不卡| 1024亚洲合集| 久久机这里只有精品| 色婷婷久久久亚洲一区二区三区| 日韩限制级电影在线观看| 国产精品沙发午睡系列990531| 首页国产欧美久久| 成人精品鲁一区一区二区| 欧美一区二区视频在线观看2020| 国产精品免费视频网站| 免费的成人av| 欧美色精品在线视频| 中文字幕国产一区| 久久99热这里只有精品| 欧美男生操女生| 国产精品乱码妇女bbbb| 亚洲国产精品影院| 色婷婷亚洲一区二区三区| 久久久久久亚洲综合| 1024成人网| 国产精品一二三在| 欧美一区在线视频| 亚洲午夜久久久久久久久电影网| 丁香啪啪综合成人亚洲小说| 日韩免费观看高清完整版在线观看| 一区二区三区美女视频| 99这里只有精品| 国产精品久久看| gogogo免费视频观看亚洲一| 久久久亚洲精华液精华液精华液| 青娱乐精品视频在线| 欧美在线视频不卡| 亚洲图片欧美一区| 欧美性videosxxxxx| 亚洲一区在线视频观看| 在线免费观看日韩欧美| 国产精品第13页| 99精品1区2区| 日韩一区在线播放| 色悠悠久久综合| va亚洲va日韩不卡在线观看| 国产精品久久久久一区二区三区| 丁香婷婷综合激情五月色| 中文字幕国产一区| 91香蕉视频mp4| 亚洲天堂2016| 欧美亚洲国产一区二区三区| 亚洲国产精品久久久久秋霞影院| 91福利精品第一导航| 婷婷国产在线综合| 日韩片之四级片| 国产一本一道久久香蕉| 国产精品乱码人人做人人爱| 久久午夜色播影院免费高清| 国产日韩欧美不卡在线| 午夜精品123| 国产精品久久久99| 国产黄色91视频| 精品国产乱码久久久久久牛牛| 日韩国产在线观看一区| 日韩午夜激情电影| 色婷婷亚洲综合| 日韩成人av影视| 国产欧美日韩综合精品一区二区| 99riav一区二区三区| 偷拍自拍另类欧美| 欧美精品一区二区三区蜜臀| 成人国产亚洲欧美成人综合网 | 在线观看91视频| 蜜桃视频在线观看一区二区| 中文字幕第一区综合| 在线观看一区日韩| 精品制服美女丁香| 亚洲黄色小说网站| 26uuu欧美| 欧洲一区在线观看| 国产一区高清在线| 亚洲大片免费看| 国产亚洲欧洲一区高清在线观看| 色婷婷综合久久久久中文 | 亚洲激情校园春色| 日韩欧美资源站| 在线观看欧美黄色| 国产美女视频一区| 亚洲精品国产精品乱码不99| 精品福利一区二区三区 | 蜜臀va亚洲va欧美va天堂| 国产精品色眯眯| 日韩精品一区二区三区在线播放| 91麻豆精品在线观看| 国产一区二区成人久久免费影院| 亚洲高清视频中文字幕| 国产精品久久久99| 久久久精品日韩欧美| 91精品国产综合久久福利软件| 99免费精品视频| 国产成人av一区二区| 麻豆精品一区二区| 日日夜夜免费精品| 亚洲精品国产视频| 亚洲三级免费观看| 国产精品亲子乱子伦xxxx裸| 久久婷婷国产综合精品青草| 欧美一区二区视频观看视频| 欧美日韩视频在线观看一区二区三区| 国产综合色产在线精品| 视频一区在线播放| 亚洲高清在线精品| 亚洲国产va精品久久久不卡综合| 亚洲日本丝袜连裤袜办公室| 亚洲国产精品精华液ab| 国产亚洲一二三区| 久久婷婷国产综合精品青草| 久久久久国产成人精品亚洲午夜| 精品少妇一区二区三区在线视频| 欧美绝品在线观看成人午夜影视| 欧美性xxxxxxxx| 欧美日韩国产乱码电影| 色综合久久88色综合天天| 99久久夜色精品国产网站| 国产激情偷乱视频一区二区三区| 国产一区中文字幕| 国产精品66部| 成人黄色大片在线观看| 99精品偷自拍| 国产高清精品久久久久| 精品一区二区三区久久| 欧美精品一区二区久久婷婷 | 国产91精品精华液一区二区三区| 中文字幕字幕中文在线中不卡视频| 欧美高清www午色夜在线视频| 成人免费高清视频| 理论电影国产精品| 亚洲午夜激情网页| 亚洲精选在线视频| 中文字幕第一页久久| 日韩欧美123| 欧美一区二区三区在线电影| 欧洲av在线精品| 成人激情免费网站| 欧美国产精品一区二区| 亚洲一区二区三区四区在线观看| 国产精品色呦呦| 国产丝袜在线精品| 92国产精品观看| 国产.欧美.日韩| 国产.精品.日韩.另类.中文.在线.播放| 激情国产一区二区| 激情都市一区二区| 国产乱国产乱300精品| 一区二区三区四区中文字幕| 美女一区二区在线观看| 麻豆国产91在线播放| 日本不卡一区二区三区高清视频| 日韩vs国产vs欧美| 麻豆精品久久精品色综合| 久久精品国产亚洲一区二区三区| 精品国产a毛片| 亚洲一本大道在线|