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

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

?? if_cs89x.c

?? 基于UC/OS II操作系統的TCP/IP協議的移植源代碼。
?? C
字號:
/*****************************************************************************
* if_cs89x.c - 
*
* Copyright (c) 2001 by Cognizant Pty Ltd.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice and the following disclaimer are included verbatim in any 
* distributions. No written agreement, license, or royalty fee is required
* for any of the authorized uses.
*
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
* REVISION HISTORY (please don't use tabs!)
*
*(yyyy-mm-dd)
* 2001-06-01 Robert Dickenson <odin@pnc.com.au>, Cognizant Pty Ltd.
*            Original file.
*
******************************************************************************
*/
#include "..\..\netconf.h"
#include "..\..\netbuf.h"
#include "..\..\netos.h"
#include "..\..\netifdev.h"

#include "if_cs89d.h"
#include "if_cs89x.h"
#include "if_cs89r.h"
#include <stdio.h>
#include "..\..\netdebug.h"


u_short ISQSem;     // CS8900 interrupt occured, ISQSem contains ISQ value


/***********************************************************************************
 *
 * Function:    InitCS8900A(void)
 * Description: This function initializes the CS8900 to work in the mode desired
 *              for this application. Also writes the MAC to the chip.
 *      Settings are:
 *          10BaseT
 *          Full Duplex
 *          Enable RxOK interrupt
 *
 **********************************************************************************/
static u_char InitCS8900A(void)
{
    WritePP(ppLineCtl, LINE_CTL_10BASET);   // Set to 10BaseT
    WritePP(ppTestCtl, TEST_CTL_FDX);       // Set to full duplex
    WritePP(ppRxCfg, RX_CFG_RX_OK_IE);      // Enable RX OK interrupt
    WritePP(ppRxCtl, RX_CTL_RX_OK_A | RX_CTL_IND_A | RX_CTL_BCAST_A);
    WritePP(ppTxCfg, TX_CFG_ALL_IE);        // Enable interrupts for all Tx events
    WritePP(ppIntNum, 0);                   // Use interrupt 0 signal
//
// Now we need to write the myMAC to the CS8900
// Since we are wrong endian we need to reverse the word entries
//
//    WritePP(ppIndAddr+0, (u_short)(myMAC.mac2<<8 | myMAC.mac1));
//    WritePP(ppIndAddr+2, (u_short)(myMAC.mac4<<8 | myMAC.mac3));
//    WritePP(ppIndAddr+4, (u_short)(myMAC.mac6<<8 | myMAC.mac5));

    WritePP(ppBusCtl, 0x8000);          // Enable interrupts
    WritePP(ppLineCtl, 0x00c0);         // Enable SerRxOn  and SerTxOn

// TODO     IIMC = 0x04;                // Enable INT0 interrupts from CS8900
// TODO     INTE0AD = 0x04;             // Set interupt priority level to 4
    return 0;
}

////////////////////////////////////////////////////////////////////////////////
// 
//
static u_char StopCS8900A(void)
{
    return 0;
}

////////////////////////////////////////////////////////////////////////////////
// 
//
static u_char DriverTxPacket(NBuf* pNBuf)
{
    u_short packet_len;
    u_short TxLocPtr;
    u_short padding_cnt = 0;

    // send complete frame from NBuf to device and transmit.
    packet_len = nChainLen(pNBuf);
//    TRACE("DriverTxPacket() nChainLen - %u\n", packet_len);
    if (packet_len < 60) {                        // Minimum length is 60 bytes
        padding_cnt = 60 - packet_len;
        packet_len = 60;
    }

    WritePP(ppTxCmd, TX_CMD_START_ALL);             // Start transmitting after all bytes are sent
    WritePP(ppTxLength, packet_len);                // Tell CS8900 how many bytes
    TxLocPtr = ppTxFrame;                           // Set up CS8900 Tx location pointer
    while (!(ReadPP(ppBusSt) & BUS_ST_RDY4TXNOW)) { // Wait for CS8900 to complete previous Tx
    }
    WriteNBufPP(TxLocPtr, pNBuf);
    WritePP(ppTxCmd, TX_CMD_FORCE);              // Force send of packet - WIN32 ONLY ?
    return 0;
}


////////////////////////////////////////////////////////////////////////////////
// Ethernet device interrupt support for frame reception.
//
NBuf* RxEthEvent(void)
{
	NBuf* headNB = NULL;
    u_short rx_status = ReadPP(ppRxStat);
    u_short packet_len = ReadPP(ppRxLength);

    OS_ENTER_CRITICAL();
	nGET(headNB);           // Grab an input buffer.
    OS_EXIT_CRITICAL();

//    TRACE("RxEthEvent() packet_len: %u\n", packet_len);

    if (headNB != NULL) {
        u_short data;
        u_short i;
        NBuf* tailNB = headNB;
        u_short wordcnt = packet_len >> 1;
        headNB->len = 0;
        for (i = 0; i < wordcnt; i++) {        // Get all data
            data = ReadPP((u_short)(ppRxFrame+(i*2))); // Get the data
//            TRACE(" %04X, ", data & 0xffff);
            tailNB = NBufPutW(data, tailNB);
            if (tailNB == NULL) {
                TRACE("RxEthEvent() error building nBuf chain ! - nFreeChain(%p)\n", headNB);
                nFreeChain(headNB);
                return (headNB = NULL);
            }
        }
/*
    {
        short i;
        char* data = nBUFTOPTR(headNB, char*);
        for (i = 0; i < packet_len; i++) {
            TRACE(" %02X : %c \n", data[i] & 0x00ff, isprint(data[i]) ? data[i] : ' ');
        }
    }
 */
//        TRACE("RxEthEvent() - posting new NBuf %p\n", headNB);
//        OSQPost(pEthRxQ, headNB);
    } else {
        TRACE("RxEthEvent() - failed to nGET()\n");
    }
    return headNB;
}


/***********************************************************************************
 *
 * Function:    __regbank(1) Intcs8900a(void)
 * Description: This is the entry point for interrupts from the CS8900
 *
 **********************************************************************************/
static void Intcs8900a(void)
{
    ISQSem = *(u_short*)portISQ;         // Interrupt occured so read first value in que
}

/***********************************************************************************
 *
 * Function:    ProcessISQ(void)
 * Description: Here we process all the interrupts held on the que ISQ.
 *              ISQSem contains the first que entry, it was read in the interrupt
 *              routine in order to reset the interrupt pin.
 *
 **********************************************************************************/
#ifdef QUEUE_TASKS
void ProcessISQ(Interface* pInterface)
{
	NBuf* headNB = NULL;
    ISQSem = 0x04; // TODO: debugging

//    do {
        switch (ISQSem & REGMASK) {
        case 0x04:          // Detected an Rx Event
            headNB = RxEthEvent();      // Go handle it
            if (headNB != NULL)
                OSQPost(pInterface->pRxQ, headNB);
            break;
        case 0x08:          // Detected a Tx Event
            break;
        case 0x0c:          // Detected a Buff event
            break;
        case 0x10:          // Detected a RxMISS event
            break;
        case 0x12:          // Detected a TXCOL event
            break;
        }                   // Those are all events generated by the CS8900
//    } while ((ISQSem = *(u_short*)portISQ) != 0x0000);
}

#else
void ProcessISQ(Interface* pInterface)
{
    ISQSem = 0x04; // TODO: debugging
//    do {
        switch (ISQSem & REGMASK) {
        case 0x04:          // Detected an Rx Event
            pInterface->rxEventCnt++;
            OSSemPost(pInterface->pSemIF);
            break;
        case 0x08:          // Detected a Tx Event
            pInterface->txEventCnt++;
            OSSemPost(pInterface->pSemIF);
            break;
        case 0x0c:          // Detected a Buff event
            break;
        case 0x10:          // Detected a RxMISS event
            break;
        case 0x12:          // Detected a TXCOL event
            break;
        }                   // Those are all events generated by the CS8900
//    } while ((ISQSem = *(u_short*)portISQ) != 0x0000);
}
#endif

////////////////////////////////////////////////////////////////////////////////
/*
1.  Declare/create new device structure
2.  Call DriverEntry(&device) to initialise func pointers
3.  
 */

static u_char statistics(if_statistics* pStats)
{
    return FALSE;
}

static u_char dummy_func(void)
{
    return TRUE;
}


u_char CS89X_DriverEntry(Interface* pInterface)
{
/*
  OS_EVENT* pEthTxQ;
  OS_EVENT* pEthRxQ;
 */
    pInterface->start = InitCS8900A;
    pInterface->stop = StopCS8900A;
    pInterface->receive = RxEthEvent;
    pInterface->receive_ready = dummy_func;
    pInterface->transmit = DriverTxPacket;
    pInterface->transmit_ready = dummy_func;
    pInterface->statistics = statistics;
    pInterface->interrupt = ProcessISQ;

    return 0;
}

////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产激情视频一区二区在线观看 | 久久亚洲综合色一区二区三区| 精品成人一区二区| 亚洲色图在线播放| 国产激情一区二区三区| 91精品午夜视频| 亚洲精品日产精品乱码不卡| 久久99精品久久久久久动态图| 欧美亚洲图片小说| 国产精品免费aⅴ片在线观看| 麻豆精品蜜桃视频网站| 欧美亚洲高清一区二区三区不卡| 国产精品伦一区二区三级视频| 美女被吸乳得到大胸91| 欧美私人免费视频| 亚洲欧美另类图片小说| 国产高清成人在线| 欧美哺乳videos| 免费在线观看精品| 4438成人网| 日韩成人精品在线观看| 欧美色图第一页| 一区二区三区.www| 欧美三级乱人伦电影| 亚洲一区二区三区中文字幕| 一本久久精品一区二区| 亚洲视频一区二区在线观看| 99精品在线免费| 亚洲精选视频在线| 在线免费亚洲电影| 视频在线观看一区二区三区| 欧美日韩久久久一区| 亚洲大型综合色站| 制服.丝袜.亚洲.另类.中文| 亚洲电影在线播放| 日韩免费高清视频| 国产精品一区二区在线观看网站| 久久一夜天堂av一区二区三区 | 一本色道久久综合亚洲aⅴ蜜桃 | 日韩三级伦理片妻子的秘密按摩| 日本成人在线电影网| 日韩欧美中文一区二区| 国内精品久久久久影院薰衣草 | 国产不卡视频在线观看| 国产精品无遮挡| 在线观看国产91| 视频一区二区三区入口| 日韩免费视频线观看| 成人综合激情网| 一级女性全黄久久生活片免费| 欧美日韩精品一区二区三区| 免费观看30秒视频久久| 国产婷婷色一区二区三区四区| 成人久久视频在线观看| 一区二区三区在线影院| 日韩一区二区免费在线观看| 岛国一区二区在线观看| 有坂深雪av一区二区精品| 制服丝袜日韩国产| 成人久久18免费网站麻豆 | 偷拍日韩校园综合在线| 欧美电视剧在线看免费| 成人aa视频在线观看| 日韩电影在线观看电影| 国产午夜精品理论片a级大结局| 91浏览器打开| 看片网站欧美日韩| 亚洲综合区在线| 久久久久九九视频| 欧美日韩精品综合在线| 国产精品白丝av| 同产精品九九九| 国产精品入口麻豆九色| 日韩三级.com| 欧美私模裸体表演在线观看| 成人小视频免费观看| 日韩在线一二三区| 亚洲欧美另类图片小说| 国产日韩欧美精品电影三级在线| 88在线观看91蜜桃国自产| 成人久久久精品乱码一区二区三区| 日韩精品电影一区亚洲| 亚洲影视资源网| 国产欧美日韩视频在线观看| 91精品国产综合久久精品app| 99久久精品费精品国产一区二区| 久久99精品国产.久久久久久| 亚洲电影在线免费观看| 亚洲精品中文在线影院| 国产欧美精品一区二区三区四区| 91精品欧美一区二区三区综合在| 91视视频在线观看入口直接观看www | 国产日韩成人精品| 日韩精品一区二| 日韩一区二区麻豆国产| 欧美日韩三级在线| 在线观看一区二区视频| 91一区在线观看| 99久久久久久| 不卡的av中国片| 国产成人免费视频一区| 国产成人一区在线| 国模冰冰炮一区二区| 蜜桃av噜噜一区| 久久精品99久久久| 久久国产精品第一页| 免费视频最近日韩| 美女一区二区三区| 美国毛片一区二区三区| 日本成人在线网站| 精品亚洲成a人在线观看| 精品亚洲免费视频| 国产一区二区三区久久悠悠色av| 久久精品国产亚洲一区二区三区| 青青草精品视频| 精品在线观看免费| 丁香桃色午夜亚洲一区二区三区| 国产精品66部| 99久久精品国产一区二区三区 | 国产麻豆精品一区二区| 精品一区二区综合| 国产精品一区二区不卡| 成人综合在线观看| 色婷婷综合久久久久中文| 欧美亚日韩国产aⅴ精品中极品| 欧美精品一二三四| 欧美不卡在线视频| 国产精品无圣光一区二区| 亚洲人成精品久久久久| 午夜精品免费在线观看| 蜜臀精品久久久久久蜜臀| 精品一区二区在线观看| 成人免费精品视频| 欧美日韩国产首页在线观看| 日韩欧美电影在线| 国产女同互慰高潮91漫画| 1000部国产精品成人观看| 亚洲二区视频在线| 国产麻豆精品一区二区| 色婷婷av一区| 精品久久久久久久一区二区蜜臀| 国产日产欧美精品一区二区三区| 亚洲精品美腿丝袜| 蜜桃视频一区二区| 91丨porny丨国产入口| 91精品国产欧美一区二区18| 国产亚洲成aⅴ人片在线观看 | 色成年激情久久综合| 91精品国产综合久久久蜜臀图片| 国产午夜精品久久久久久久| 一个色综合av| 国产一区不卡在线| 欧美探花视频资源| 欧美国产日韩在线观看| 爽爽淫人综合网网站| av色综合久久天堂av综合| 欧美高清视频不卡网| 亚洲欧洲av一区二区三区久久| 日韩在线一区二区三区| 99国产精品久久久久久久久久 | 欧美国产日韩亚洲一区| 亚洲成av人在线观看| 高清国产一区二区三区| 日韩一本二本av| 亚洲精品videosex极品| 国产91丝袜在线播放九色| 欧美日韩午夜精品| 亚洲免费看黄网站| 国产超碰在线一区| 日韩久久久精品| 午夜在线成人av| 91天堂素人约啪| 日本一区二区三区四区| 另类调教123区 | 欧美婷婷六月丁香综合色| 国产精品久久国产精麻豆99网站| 麻豆国产一区二区| 欧美日韩视频不卡| 亚洲午夜影视影院在线观看| av电影天堂一区二区在线| 久久精品无码一区二区三区| 久久国产麻豆精品| 日韩欧美精品三级| 日韩电影在线观看网站| 欧美日韩大陆一区二区| 亚洲精品国产精品乱码不99| 不卡一卡二卡三乱码免费网站| 久久老女人爱爱| 国产在线不卡视频| 精品福利在线导航| 另类小说色综合网站| 欧美videossexotv100| 日本中文字幕一区| 日韩一级欧美一级| 美国十次了思思久久精品导航| 欧美一区二区私人影院日本| 免费在线观看不卡| 精品国产亚洲在线| 国产盗摄视频一区二区三区| 久久综合一区二区|