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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? ins_eth_ocm.old

?? sopc builder 中網(wǎng)絡(luò)的eth_ocm核
?? OLD
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
#include "ins_eth_ocm.h"
/**
 * Function for obtaining MAC address.
 * @param name Name of this MAC
 * @param net  NET interface (Interniche typedef)
 * @param mac_addr Character array into which MAC address should be written.
 *
 * @return zero on success, nonzero otherwise.
 */ 
extern int get_mac_addr(char name[], NET net, unsigned char mac_addr[6]);

/**
 * Determine whether PHY is full duplex or not.
 * This is fully vendor specific depending on the PHY you are using.
 * For this reason, this function is declared as external (so you can
 * write your own).
 * 
 * @param  pmac MAC register map.
 * @return 0x11 if Gigabit link is established and full duplex,
 *         0x01 if not Gigabit link is established and full duplex, 
 *         0x00 if not Gigabit link is established and half duplex, * If the link speed cannot be determined, it is fall back to 10/100.
 */
extern int getPHYSpeed(eth_ocm_dev *dev);


static void eth_ocm_rx_isr(void *context, alt_u32 id);
static int eth_ocm_read_init(eth_ocm_dev *dev);
static int eth_ocm_rcv(eth_ocm_dev *dev);

/**
 * Prepare ethernet MAC.
 *
 * @param ins_dev   Pointer to associated alt_iniche_dev struct
 * @return
 */
error_t eth_ocm_prep(alt_iniche_dev *ins_dev){
    NET ifp;
    int index;
    eth_ocm_dev *dev;

    index = ins_dev->if_num;
    dev = (eth_ocm_dev *)ins_dev;

    //Status message
    dprintf("eth_ocm_prep\n");

    //create eth_ocm_info struct
    dev->info = (eth_ocm_info *)malloc(sizeof(eth_ocm_info));
    dev->info->sem = 0; //initialize semaphore

    ifp = nets[index];
    ifp->n_mib->ifAdminStatus = ETH_OCM_STATUS_DOWN;    
    ifp->n_mib->ifOperStatus =  ETH_OCM_STATUS_DOWN;
    ifp->n_mib->ifLastChange =  cticks * (100/TPS);     //timestamp
    ifp->n_mib->ifPhysAddress = (u_char*)dev->info->mac_addr;
    ifp->n_mib->ifDescr =       (u_char*)"Opencores 10/100 ethernet MAC";
    ifp->n_lnh =                ETHHDR_SIZE;            /* ethernet header size. */
    ifp->n_hal =                ETH_OCM_MAC_ADDR_LEN;   /* MAC address length */
    ifp->n_mib->ifType =        ETHERNET;               /* device type */
    ifp->n_mtu =                ETH_OCM_MAX_MTU;        /* max frame size */

    /* install our hardware driver routines */
    ifp->n_init =       eth_ocm_init;
    ifp->pkt_send =     NULL;
    ifp->raw_send =     eth_ocm_raw_send;
    ifp->n_close =      eth_ocm_close;
    ifp->n_stats =      eth_ocm_stats;

#ifdef IP_V6
      ifp->n_flags |= (NF_NBPROT | NF_IPV6);
#else
      ifp->n_flags |= NF_NBPROT;
#endif

    /* get the MAC address. */
    get_mac_addr(dev->name, ifp, dev->info->mac_addr);

    /* set cross-pointers between iface and eth_ocm structs */
    dev->info->netp = ifp;
    ifp->n_local = (void*)(dev);

    index++;
    return index;
}
//End of function eth_ocm_prep

/**
 * Initializes the Opencores ethernet MAC. Called by InterNiche stack
 *
 * @param 
 */
int eth_ocm_init(int iface){
    int status = SUCCESS;
    int duplex;
    int temp;
    NET ifp;
    eth_ocm_dev *dev;
    eth_ocm_info *info;

    dprintf("[eth_ocm_init]\n");
    //get the ifp first
    ifp = nets[iface];
    //now get the info pointer
    dev = (eth_ocm_dev *)ifp->n_local;
    info = dev->info;

    // reset the mac (this is self clearing)
    IOWR_ETH_OCM_SW_RESET(dev->base);

    //Reset Descriptors (supposedly this can be done while in reset)
    for(temp=ETH_OCM_DESC_START;temp<ETH_OCM_DESC_END;temp++)
        IOWR(dev->base, temp, 0);

    //Let's disable the MAC until everything else is set up
    IOWR_ETH_OCM_MODER(dev->base,0);     
    //Set number of TX descriptors (RX descriptors is 128 minus this number)
    IOWR_ETH_OCM_TX_BD_NUM(dev->base, 64);

    /* perform any necessary PHY setup */
    //Let's set the MDIO interface up to run at 4MHz.
    temp = (ALT_CPU_FREQ / 1000000);
    temp += 2;
    temp &= 0xFFFFFFFE;   //only even numbers allowed)
    IOWR_ETH_OCM_MIIMODER(dev->base, temp);
    IOWR_ETH_OCM_MIICOMMAND(dev->base, 0);
    //Find out if we should run in duplex or not
    duplex = getPHYSpeed(dev);

    if(duplex)
        duplex = ETH_OCM_MODER_FULLD_MSK;

    // Configure MAC options
    // Interrupt sources
    IOWR_ETH_OCM_INT_MASK(dev->base, 
            ETH_OCM_DEFAULT_INTERRUPT_MASK);//Interrupt on receive
    // Clear any existing interrupts
    IOWR_ETH_OCM_INT_SOURCE(dev->base, 0xFFFFFFFF);

    // Inter-packet gap 
    if(duplex)
        IOWR_ETH_OCM_IPGT(dev->base, ETH_OCM_FULL_DUPLEX_IPGT); 
    else
        IOWR_ETH_OCM_IPGT(dev->base, ETH_OCM_HALF_DUPLEX_IPGT);

    //Let's set the defaults just because they've bitten us before
    IOWR_ETH_OCM_IPGR1(dev->base, 0x0000000C);
    IOWR_ETH_OCM_IPGR2(dev->base, 0x00000012);
    IOWR_ETH_OCM_PACKETLEN(dev->base, 0x00400600);  //Min and Max frame sizes
    IOWR_ETH_OCM_COLLCONF(dev->base, 0x000F003F);
    IOWR_ETH_OCM_CTRLMODER(dev->base, 0x00000000);

    dprintf("[eth_ocm_init] Configuring MAC address "
            "%02x:%02x:%02x:%02x:%02x:%02x\n",
            info->mac_addr[0],info->mac_addr[1],info->mac_addr[2],
            info->mac_addr[3],info->mac_addr[4],info->mac_addr[5]);
    //Configure the MAC address
    IOWR_ETH_OCM_MAC_ADDR0(dev->base,
            ( ((int)info->mac_addr[5])         |
             (((int)info->mac_addr[4]) << 8)   |
             (((int)info->mac_addr[3]) << 16)  |
             (((int)info->mac_addr[2]) << 24)  )
            );

    IOWR_ETH_OCM_MAC_ADDR1(dev->base,
            ( ((int)((unsigned char)info->mac_addr[1]))         |
             (((int)((unsigned char)info->mac_addr[0])) << 8)   )
            );


    //Enable MAC
    IOWR_ETH_OCM_MODER(dev->base,
           ETH_OCM_MODER_PAD_MSK    |   //Enable padding of small packets
           ETH_OCM_MODER_CRCEN_MSK  |   //Append CRC to TX packets
           ETH_OCM_MODER_RXEN_MSK   |   //Enable receive
           ETH_OCM_MODER_TXEN_MSK   |   //Enable transmit
           duplex                       //Discovered duplex
           );

    dprintf("\nOpencores MAC post-init: MODER = 0x%08x\n",
            IORD_ETH_OCM_MODER(dev->base));


   /* status = UP */
   nets[iface]->n_mib->ifAdminStatus = ETH_OCM_STATUS_UP;
   nets[iface]->n_mib->ifOperStatus = ETH_OCM_STATUS_UP;

   //register ISR interrupt handler
   temp = alt_irq_register(dev->irq, dev, eth_ocm_rx_isr);
   if(temp)
       dprintf("[eth_ocm_init] Failed to register RX ISR\n");
   //Setup the first read transfer
   eth_ocm_read_init(dev);

   return status;   //MAC is ready to rock and roll
}
//End of eth_ocm_init function


/**
 *  Raw send function to initiate a transfer to the mac 
 *
 * @param  net  - NET structure associated with the Opencores MAC instance
 * @param  data - pointer to the data payload
 G
 * @return SUCCESS if success, else a negative value
 */
int eth_ocm_raw_send(NET net, char * data, unsigned data_bytes){
    int result;
    int i;
    unsigned len;
    eth_ocm_dev *dev;
    eth_ocm_info *info;
    alt_u8 *buf;

    OS_ENTER_CRITICAL(); //disable interrupts

    dev = (eth_ocm_dev *)net->n_local;
    info = dev->info;
    len = data_bytes;
    result = 0;

    //Check to see if someone is nesting send calls (BAD!)
    if(info->sem){
       dprintf("Nested eth_ocm_raw_send\n");
       OS_EXIT_CRITICAL();
       return ENP_RESOURCE;
    }

    //Grab the semaphore
    info->sem = 1;
    // clear bit-31 before passing it to SGDMA Driver
    buf = (alt_u8 *)alt_remap_cached( (volatile void *)data, 4);
    //advance the pointer beyond the header bias
    buf = (alt_u8 *)((unsigned int)buf + ETHHDR_BIAS);

    //Some error checks first
    if(len < ETH_OCM_MIN_MTU)
        result = -1;        //packet too small
    if(len > ETH_OCM_MAX_MTU)
        result = -EFBIG;    //packet too big
    if((IORD_ETH_OCM_DESC_CTRL(dev->base, ETH_OCM_FIRST_TX_DESC) & ETH_OCM_TXDESC_READY_MSK))
        result = -EBUSY;    //DMA not available

    if(!result){
        //Write pointer to descriptor
        IOWR_ETH_OCM_DESC_PTR(dev->base, ETH_OCM_FIRST_TX_DESC, (unsigned int)buf);
        //Write length and setup transfer
        IOWR_ETH_OCM_DESC_CTRL(dev->base, ETH_OCM_FIRST_TX_DESC,
                ((len << ETH_OCM_TXDESC_LEN_OFST)    |
                 ETH_OCM_TXDESC_READY_MSK            |
                 ETH_OCM_TXDESC_WRAP_MSK             |
                 ETH_OCM_TXDESC_PAD_MSK              |
                 ETH_OCM_TXDESC_CRC_MSK)

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级二级三级蜜桃| 国产精品狼人久久影院观看方式| 色综合久久久久网| 国产盗摄视频一区二区三区| 午夜视频在线观看一区二区| 成人免费在线观看入口| 国产视频一区在线播放| 欧美r级电影在线观看| 在线成人av网站| 欧洲一区二区三区免费视频| 色欧美片视频在线观看| 欧美在线一区二区三区| 欧美色视频一区| 777a∨成人精品桃花网| 欧美一级一区二区| www成人在线观看| 国产日韩欧美综合在线| 国产精品久久夜| 一区二区三区欧美亚洲| 亚洲成人一区二区| 人妖欧美一区二区| 国产在线不卡视频| www.日韩av| 欧美亚洲综合在线| 欧美一级午夜免费电影| 久久嫩草精品久久久精品一| 中文字幕一区免费在线观看| 一区二区三区精品在线观看| 日韩国产高清影视| 精品一区二区三区av| 国产一区二区精品在线观看| 99国产一区二区三精品乱码| 在线影院国内精品| 欧美一区二区三区播放老司机| 久久综合一区二区| 亚洲免费在线视频| 日韩主播视频在线| 国产精品123区| 在线观看亚洲专区| 欧美mv日韩mv亚洲| 亚洲欧美韩国综合色| 日本大胆欧美人术艺术动态| 99热在这里有精品免费| 在线电影欧美成精品| 中文字幕免费不卡| 天天操天天干天天综合网| 国产精品资源网| 欧美视频一区二区三区在线观看| 精品黑人一区二区三区久久| 亚洲视频精选在线| 免费av成人在线| 一本久久精品一区二区| 日韩一级片在线观看| 国产精品久久久久一区 | 国产精品国产三级国产a| 一区二区三区欧美| 精品一区在线看| 在线观看三级视频欧美| 久久久午夜精品| 亚洲成人av一区| 懂色av一区二区在线播放| 制服丝袜中文字幕一区| 国产精品久久久久久亚洲伦| 蜜臀av国产精品久久久久| 99re亚洲国产精品| 久久一夜天堂av一区二区三区| 午夜精品久久久久久久99樱桃| av中文字幕亚洲| 久久日韩粉嫩一区二区三区| 午夜精品久久久久影视| av在线这里只有精品| 久久这里只精品最新地址| 亚洲国产精品影院| 97se亚洲国产综合在线| 国产拍揄自揄精品视频麻豆 | 欧美在线视频你懂得| 久久精品欧美一区二区三区不卡| 天堂在线一区二区| 色综合色狠狠综合色| 国产日本一区二区| 久久99精品国产.久久久久久 | 亚洲资源在线观看| 成人av在线影院| 久久久久久一级片| 另类的小说在线视频另类成人小视频在线| 色婷婷国产精品| 中文字幕一区视频| 高清shemale亚洲人妖| 日韩精品中文字幕一区二区三区| 亚洲午夜私人影院| av不卡在线观看| 国产日韩欧美激情| 久久99国产精品免费网站| 日韩限制级电影在线观看| 午夜精品免费在线| 欧美性一二三区| 亚洲综合另类小说| 色爱区综合激月婷婷| 亚洲精品一二三| 在线一区二区三区四区五区| 亚洲精品成人a在线观看| 99re热这里只有精品免费视频| 中文无字幕一区二区三区 | 91欧美一区二区| 亚洲三级在线免费观看| 成人毛片视频在线观看| 亚洲国产精品精华液2区45| 国产精品12区| 国产精品久久久久永久免费观看| 不卡区在线中文字幕| 国产精品国产三级国产aⅴ原创 | 精品国产一区二区三区av性色 | 成人av在线资源网| 国产精品久久久久久福利一牛影视 | 精品国产自在久精品国产| 久久99久久99精品免视看婷婷| 欧美白人最猛性xxxxx69交| 狠狠色伊人亚洲综合成人| 国产片一区二区三区| 91免费在线视频观看| 亚洲一区二区欧美激情| 欧美一级日韩免费不卡| 国产呦精品一区二区三区网站| 国产欧美一区二区精品久导航| 成人18视频在线播放| 一区二区三区色| 在线电影国产精品| 国内国产精品久久| 国产精品久久久久久久岛一牛影视 | 亚洲日本va在线观看| 欧美在线免费观看亚洲| 天天影视色香欲综合网老头| 精品福利一区二区三区免费视频| 国产成人免费视频网站| 亚洲男人的天堂在线aⅴ视频| 欧美日韩www| 黑人巨大精品欧美一区| 国产精品福利在线播放| 欧美日韩国产成人在线91| 国产在线精品不卡| 中文字幕视频一区| 欧美一区二区啪啪| 国产成人精品一区二区三区四区 | 欧美一区二区三区四区在线观看 | 欧美曰成人黄网| 蜜桃免费网站一区二区三区| 国产日韩欧美一区二区三区综合| 色偷偷88欧美精品久久久| 日韩在线播放一区二区| 欧美国产日本视频| 欧美日韩国产一级二级| 国产精品一区二区视频| 亚洲综合色区另类av| 夜色激情一区二区| 日韩免费成人网| 99久久国产综合精品麻豆 | 欧美日韩的一区二区| 国产91富婆露脸刺激对白| 午夜影院在线观看欧美| 国产色综合久久| 欧美日韩不卡一区二区| www.亚洲国产| 激情av综合网| 亚洲丰满少妇videoshd| 国产精品视频在线看| 日韩一级片在线播放| 91福利视频久久久久| 国产91精品免费| 美女网站在线免费欧美精品| 亚洲人成网站色在线观看| 2023国产精华国产精品| 欧美午夜精品久久久| 成人妖精视频yjsp地址| 激情五月婷婷综合| 日韩高清电影一区| 亚洲乱码国产乱码精品精98午夜| 国产日本欧美一区二区| 精品理论电影在线| 欧美日本一区二区在线观看| 99久久99久久免费精品蜜臀| 国产99久久久国产精品| 久久精品噜噜噜成人88aⅴ| 亚洲国产精品一区二区久久| 中文一区二区完整视频在线观看| 日韩精品最新网址| 在线电影院国产精品| 欧美性感一区二区三区| 99久久婷婷国产综合精品电影 | 国内久久婷婷综合| 蜜臀av国产精品久久久久| 日日摸夜夜添夜夜添亚洲女人| 一区二区三区四区蜜桃| 亚洲精品中文在线观看| 最近日韩中文字幕| 中文字幕精品综合| 亚洲国产成人私人影院tom| 国产欧美一二三区| 久久精品视频在线看| 精品国产亚洲在线| 日韩美女一区二区三区|