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

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

?? dev_net_s3c4510b.c

?? 這是Skyeye 0.9 版本的源代碼
?? C
字號:
//zzc: 2005-2-6 currently not support network simulation on Cygwin
#ifndef __CYGWIN__
/*
	dev_net_s3c4510b.c - skyeye S3C4510B ethernet controllor simulation
	Copyright (C) 2003 - 2005 Skyeye Develop Group
	for help please send mail to <skyeye-developer@lists.gro.clinux.org>
	
	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 
*/
/*
 * 06/17/2005   initial verion for s3c4510b
 *                      walimis <wlm@student.dlut.edu.cn>
 */

#include <signal.h>
#include <sys/time.h>
#include <armdefs.h>
#include "skyeye_device.h"
#include "dev_net_s3c4510b.h"

static struct device_default_value s3c4510b_net_def[] = {
  /* name         base        size   interrupt array */
  {"s3c4510b", 0x3FF9000, 0x2000, {16, 17, 18, 19}},
  {NULL},
};

#define MAX_DEVICE_NUM 10
static struct device_desc *s3c4510b_devs[MAX_DEVICE_NUM];


#if 0
void
net_s3c4510b_set_update_intr (struct device_desc *dev)
{
  struct device_interrupt *intr = &dev->intr;
  struct machine_config *mc = (struct machine_config *) dev->mach;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
  mc->mach_set_intr (intr->interrupts[INT_S3C4510B]);
  mc->mach_update_intr (mc);
}

inline void
set_time (int packets)
{
  struct itimerval value;
  value.it_value.tv_sec = 0;
  value.it_value.tv_usec = packets;
  value.it_interval = value.it_value;
  setitimer (ITIMER_REAL, &value, NULL);
}

static void
send_interrupt ()
{
  int i;
  struct device_desc *dev;

  for (i = 0; i < MAX_DEVICE_NUM; i++)
    {
      if ((dev = s3c4510b_devs[i]) != NULL)
	{
	  struct net_device *net_dev = (struct net_device *) dev->dev;
	  struct machine_config *mc = (struct machine_config *) dev->mach;
	  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
	  if ((io->need_update))
	    {
	      /* only update once. */
	      net_s3c4510b_set_update_intr (dev);
	      io->need_update = 0;
	      set_time (0);
	      return;
	    }

	}
    }
}
static void
init_sigaction (void)
{
  struct sigaction act;
  act.sa_handler = send_interrupt;
  act.sa_flags = 0;
  sigemptyset (&act.sa_mask);
  sigaction (SIGALRM, &act, NULL);
}
#endif

static void
mac_write (struct device_desc *dev)
{
  struct device_interrupt *intr = &dev->intr;
  struct net_device *net_dev = (struct net_device *) dev->dev;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
  struct machine_config *mc = (struct machine_config *) dev->mach;
  ARMul_State *state = (ARMul_State *) mc->state;
  fault_t fault;
  u32 ptr, status, len;
  int i;
  fault = mmu_read_word (state, io->bdmatxptr, &ptr);
  /*
     if( fault ) {
     *addr = io->bdmatxptr;
     return fault;
     }
   */
  if (!(ptr & BDMA_owner))
    return 0;
  ptr &= ~BDMA_owner;
  fault = mmu_read_word (state, io->bdmatxptr + 8, &len);
  /*
     if( fault ) {
     *addr = io->bdmatxptr + 8;
     return fault; 
     }       
   */
  len &= 0xffff;
  if (len > sizeof (io->mac_buf))
    return;
  for (i = 0; i < len; i++)
    {
      fault = mmu_read_byte (state, ptr + i, io->mac_buf + i);
      /*
         if( fault ) {
         *addr = ptr + i;
         return fault;
         }
       */
    }
  //Update TXstatus 
  status = len | (Comp << 16);
  fault = mmu_write_word (state, io->bdmatxptr + 8, status);
  //print_packet(io->mac_buf, len);
  /*
     if( fault ) {
     *addr = io->bdmatxptr + 8;
     return fault;
     }
   */
  //set owner bit of desc to CPU
  fault = mmu_write_word (state, io->bdmatxptr, ptr);
  /*
     if( fault ) {
     *addr = io->bdmatxptr;
     return fault;
     }
   */
  //get next desc
  fault = mmu_read_word (state, io->bdmatxptr + 12, &io->bdmatxptr);
  /*
     if( fault ) {
     *addr = io->bdmatxptr + 12;
   */
  net_dev->net_write (net_dev, io->mac_buf, len);
  //write( skyeye_config.net[0].fd, io->mac_buf, len  );
  //trigger interrupt
  if (io->mactxcon & EnComp)
    {
      mc->mach_set_intr (intr->interrupts[INT_S3C4510B_MACTX]);
      mc->mach_update_intr (mc);
      //s3c4510b_set_interrupt(INT_MACTX);
      //s3c4510b_update_int(state);
    }
  return 0;

}

static void
mac_read (struct device_desc *dev)
{
  struct device_interrupt *intr = &dev->intr;
  struct net_device *net_dev = (struct net_device *) dev->dev;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
  struct machine_config *mc = (struct machine_config *) dev->mach;
  ARMul_State *state = (ARMul_State *) mc->state;
  int packet_len, s3c4510b_len;
  fault_t fault;
  u32 ptr, status_len;
  int n, i;

  //*addr = 0;
  packet_len = net_dev->net_read (net_dev, io->mac_buf, sizeof (io->mac_buf));
  //n = read(skyeye_config.net[0].fd, mac_buf, sizeof(mac_buf));
  if (packet_len <= 0)
    return 0;
  fault = mmu_read_word (state, io->bdmarxptr, &ptr);
  //print_packet(io->mac_buf, packet_len);
  /*
     if( fault ) {
     *addr = io->bdmarxptr;
     return fault;
     }
   */
  if (!(ptr & BDMA_owner))
    return 0;

  ptr &= ~BDMA_owner;
  //if( len + 2  > sizeof(mac_buf) ) return 0;
  /* FIXME:for s3c4510b frame, ptr offset is 2 */
  for (i = 0; i < packet_len; i++)
    {
      fault = mmu_write_byte (state, ptr + 2 + i, *(io->mac_buf + i));
      /*
         if(fault) {
         *addr = ptr + 2 + i;
         return fault;
         }
       */
    }
  //in desc, set Good bit for RX status , and set len 
  status_len = (Good << 16) | (packet_len + 4);
  //printf("status_len:%x\n",status_len); 
  fault = mmu_write_word (state, io->bdmarxptr + 8, status_len);
  /*
     if(fault) {
     *addr = io->bdmarxptr+8;
     return fault;
     }
   */

  //set owner bit of desc to CPU
  fault = mmu_write_word (state, io->bdmarxptr, ptr);
  /*
     if(fault) {
     *addr = io->bdmarxptr;
     return fault;
     }
   */

  //get next desc
  fault = mmu_read_word (state, io->bdmarxptr + 12, &io->bdmarxptr);
  /*
     if(fault) {
     *addr = io->bdmarxptr + 12;
     return fault;
     }
   */
  /* update bdmastat register */
  io->bdmastat |= S_BRxRDF;
  mc->mach_set_intr (intr->interrupts[INT_S3C4510B_BDMARX]);
  mc->mach_update_intr (mc);

  return 0;

}


static void
net_s3c4510b_fini (struct device_desc *dev)
{
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
  free (dev->dev);
  free (io);
}

static void
net_s3c4510b_reset (struct device_desc *dev)
{
  struct net_device *net_dev = (struct net_device *) dev->dev;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
  int i;

  io->bdmatxptr = 0xFFFFFFFF;
  io->bdmarxptr = 0xFFFFFFFF;
}

static void
net_s3c4510b_update (struct device_desc *dev)
{
  struct device_interrupt *intr = &dev->intr;
  struct net_device *net_dev = (struct net_device *) dev->dev;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;
  struct machine_config *mc = (struct machine_config *) dev->mach;

  if ((io->bdmarxcon & RxEn))
    {
      fd_set frds;
      struct timeval tv;
      int ret;
      FD_ZERO (&frds);
      FD_SET (net_dev->net_fd, &frds);
      tv.tv_sec = 0;
      tv.tv_usec = 0;
      if ((ret = select (net_dev->net_fd + 1, &frds, NULL, NULL, &tv)) > 0)
	{
	  if (FD_ISSET (net_dev->net_fd, &frds))
	    {
	      mac_read (dev);
	    }
	}
    }

}


int
net_s3c4510b_read_word (struct device_desc *dev, u32 addr, u32 * data)
{
  struct net_device *net_dev = (struct net_device *) dev->dev;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;

  int offset = (u16) (addr - dev->base + 0x9000);
  int ret = ADDR_HIT;

  //printf("%s:addr %x, %x\n", __FUNCTION__, addr, MACON);
  *data = 0;
  switch (offset)
    {
    case MACON:
      *data = io->macon;
      break;
    case CAMCON:
      *data = io->camcon;
      break;
    case MACTXCON:
      *data = io->mactxcon;
      break;
    case MACTXSTAT:
      *data = io->mactxstat;
      break;
    case MACRXCON:
      *data = io->macrxcon;
      break;
    case MACRXSTAT:
      *data = io->macrxstat;
      break;
    case STADATA:
      *data = io->stadata;
      break;
    case STACON:
      *data = io->stacon;
      break;
    case CAMEN:
      *data = io->camen;
      break;
    case BDMATXPTR:
      *data = io->bdmatxptr;
      break;
    case BDMARXPTR:
      *data = io->bdmarxptr;
      break;
    case BDMASTAT:
      *data = io->bdmastat;
      break;
    case BDMARXCON:
      *data = io->bdmarxcon;
      break;
    case BDMATXCON:
      *data = io->bdmatxcon;
      break;
    case BDMARXLSZ:
      *data = io->bdmarxlsz;
      break;
    default:
      break;
    }
  return ret;

}

int
net_s3c4510b_write_word (struct device_desc *dev, u32 addr, u32 data)
{
  struct net_device *net_dev = (struct net_device *) dev->dev;
  struct net_s3c4510b_io *io = (struct net_s3c4510b_io *) dev->data;

  int offset = (u16) (addr - dev->base + 0x9000);
  int ret = ADDR_HIT;

  //printf("%s\n", __FUNCTION__);
  switch (offset)
    {
    case MACTXCON:
      if (data & TxEn == TxEn)
	{
	  /*
	     u32 addr;
	     fault_t fault;
	     fault = mac_write(dev);
	     if( fault ) {
	     mmu_data_abort(state, fault, addr);
	     return;
	     }
	   */
	  mac_write (dev);
	}
      io->mactxcon = data;
      break;
    case BDMATXPTR:
      io->bdmatxptr = data;
      break;
    case BDMARXPTR:
      io->bdmarxptr = data;
      break;
    case BDMASTAT:
      io->bdmastat &= (~data);
      break;
    case MACON:
      io->macon = data;
      break;
    case MACRXCON:
      io->macrxcon = data;
      break;
    case BDMARXCON:
      io->bdmarxcon = data;
      break;
    case BDMATXCON:
      io->bdmatxcon = data;
      break;
    case BDMARXLSZ:
      io->bdmarxlsz = data;
      break;
    case CAMEN:
      io->camen = data;
      break;
    default:
      break;
    }

  return ret;
}

static int
net_s3c4510b_setup (struct device_desc *dev)
{
  int i;
  int enough = 0;
  struct net_s3c4510b_io *io;
  struct device_interrupt *intr = &dev->intr;

  dev->fini = net_s3c4510b_fini;
  dev->reset = net_s3c4510b_reset;
  dev->update = net_s3c4510b_update;
  dev->read_word = net_s3c4510b_read_word;
  dev->write_word = net_s3c4510b_write_word;

  io = (struct net_s3c4510b_io *) malloc (sizeof (struct net_s3c4510b_io));
  memset (io, 0, sizeof (struct net_s3c4510b_io));
  if (io == NULL)
    return 1;
  dev->data = (void *) io;

  net_s3c4510b_reset (dev);

  //init_sigaction();

  /* see if we need to set default values.
   * */
  set_device_default (dev, s3c4510b_net_def);

  for (i = 0; i < MAX_DEVICE_NUM; i++)
    {
      if (s3c4510b_devs[i] == NULL)
	{
	  s3c4510b_devs[i] = dev;
	  enough = 1;
	  break;
	}
    }
  if (enough == 0)
    return 1;

  return 0;
}

void
net_s3c4510b_init (struct device_module_set *mod_set)
{
  int i;
  register_device_module ("s3c4510b", mod_set, &net_s3c4510b_setup);

  for (i = 0; i < MAX_DEVICE_NUM; i++)
    s3c4510b_devs[i] = NULL;

}

//zzc:#endif __CYGWIN__
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区啪啪| 国产精品久久久久四虎| 白白色亚洲国产精品| 日韩电影在线观看电影| 国产精品久久久久久久久免费相片 | 日韩精品每日更新| 中文一区一区三区高中清不卡| 色八戒一区二区三区| 成人性视频免费网站| 人人狠狠综合久久亚洲| 亚洲图片一区二区| 国产精品久久久久影院亚瑟| 精品日韩欧美在线| 在线成人免费观看| 色综合久久中文字幕| 高清久久久久久| 极品销魂美女一区二区三区| 日韩中文字幕91| 亚洲国产成人av好男人在线观看| 国产精品久久看| 久久精品在这里| 精品粉嫩超白一线天av| 91精品国产乱| 欧美欧美欧美欧美首页| 在线视频国内自拍亚洲视频| 成人黄色电影在线| 国产精品一区二区三区四区| 蜜桃视频在线观看一区二区| 亚洲一二三四在线观看| 亚洲欧美aⅴ...| 专区另类欧美日韩| 国产精品白丝在线| 日韩毛片视频在线看| 国产精品妹子av| 国产精品美女视频| 一色屋精品亚洲香蕉网站| 成人免费在线视频观看| 国产精品久久久久久久久久久免费看| 国产亚洲精品aa| 久久久五月婷婷| 国产日产亚洲精品系列| 亚洲国产精品ⅴa在线观看| 久久久久久久久伊人| 久久精品一区二区三区四区| 久久午夜羞羞影院免费观看| 国产日韩欧美制服另类| 欧美激情一二三区| 国产精品电影一区二区| 亚洲视频精选在线| 亚洲一区二区av在线| 丝袜诱惑制服诱惑色一区在线观看| 五月天国产精品| 久久国产夜色精品鲁鲁99| 久99久精品视频免费观看| 国产a视频精品免费观看| www.av亚洲| 欧美色欧美亚洲另类二区| 欧美福利视频导航| 久久伊99综合婷婷久久伊| 国产精品乱码一区二区三区软件| 亚洲三级视频在线观看| 亚洲一区二区精品久久av| 喷白浆一区二区| 国产成人精品亚洲777人妖 | 一区二区三区视频在线观看| 亚洲自拍另类综合| 久久se这里有精品| 成人精品视频一区二区三区 | 亚洲.国产.中文慕字在线| 美女视频黄 久久| 国产99久久久国产精品潘金| 91极品视觉盛宴| 日韩欧美国产电影| 中文字幕 久热精品 视频在线| 亚洲免费观看视频| 久久精品国产**网站演员| 国产91精品精华液一区二区三区| 在线欧美日韩国产| 久久天堂av综合合色蜜桃网| 亚洲素人一区二区| 韩国理伦片一区二区三区在线播放| 99久精品国产| 日韩区在线观看| 中文字幕一区二区三区不卡 | 国产精品一区二区在线观看网站| 94-欧美-setu| 精品久久久久一区| 亚洲精品国产成人久久av盗摄| 日韩国产欧美在线播放| 成人av免费在线观看| 欧美一区二区视频在线观看2020| 中文字幕第一区综合| 日韩激情av在线| 91免费版在线看| 久久这里只有精品视频网| 亚洲成人自拍网| av激情综合网| 精品国产麻豆免费人成网站| 玉米视频成人免费看| 国产大片一区二区| 91精品福利在线一区二区三区| 国产精品福利一区二区| 国内一区二区在线| 正在播放亚洲一区| 一卡二卡欧美日韩| 成人av手机在线观看| 2024国产精品| 蜜臀av一区二区在线免费观看| 一本色道久久综合狠狠躁的推荐| 久久香蕉国产线看观看99| 奇米色777欧美一区二区| 在线观看精品一区| 自拍偷拍亚洲激情| 波多野结衣中文字幕一区| 国产日产亚洲精品系列| 黄色日韩三级电影| 欧美xxxxxxxxx| 日本 国产 欧美色综合| 欧美三级电影网| 亚洲精品欧美在线| 91麻豆免费观看| 中文字幕在线不卡一区| 国产成人午夜精品影院观看视频| 日韩欧美一二区| 久久99国内精品| 欧美xfplay| 精品一区二区三区日韩| 日韩一区二区不卡| 蜜臀va亚洲va欧美va天堂| 日韩丝袜情趣美女图片| 日韩av不卡一区二区| 欧美一区二区三区的| 日韩国产在线观看| 欧美电影免费观看完整版| 偷拍日韩校园综合在线| 91精品一区二区三区久久久久久| 日本va欧美va瓶| 精品国产乱码久久久久久蜜臀 | 成人av网址在线| 综合色天天鬼久久鬼色| 色哟哟国产精品免费观看| 亚洲免费观看高清完整版在线| 在线一区二区观看| 午夜欧美视频在线观看| 7777女厕盗摄久久久| 麻豆91免费观看| 久久久久高清精品| 99视频精品免费视频| 亚洲男人都懂的| 欧美日韩视频在线第一区 | 99久久99精品久久久久久| 亚洲精品成人悠悠色影视| 欧美写真视频网站| 日韩和欧美的一区| 久久新电视剧免费观看| caoporn国产一区二区| 一区二区三区精品久久久| 欧美精品vⅰdeose4hd| 美女一区二区久久| 国产精品久久久久久久久快鸭| 欧美在线影院一区二区| 美女任你摸久久| 欧美国产日韩在线观看| 欧美性受xxxx黑人xyx性爽| 奇米精品一区二区三区四区| 欧美激情综合在线| 欧美在线观看视频一区二区三区| 日本成人在线看| 国产精品麻豆网站| 欧美精品国产精品| 欧美裸体一区二区三区| 国产一区二区不卡| 亚洲精品成人在线| 久久综合色之久久综合| 99re热视频精品| 免费成人小视频| 国产精品二三区| 91麻豆精品国产91久久久| 国产a久久麻豆| 欧美aaaaaa午夜精品| 亚洲欧美怡红院| 日韩精品一区二区三区在线| 91麻豆蜜桃一区二区三区| 韩国欧美国产1区| 一区二区三区国产| 国产日韩欧美激情| 欧美理论在线播放| hitomi一区二区三区精品| 奇米在线7777在线精品| 亚洲色图丝袜美腿| 久久久久久久性| 91精品国产麻豆国产自产在线| 成人免费视频视频| 另类小说一区二区三区| 一区二区三区在线免费| 久久久久久久久97黄色工厂| 欧美人伦禁忌dvd放荡欲情| 国产成a人亚洲精| 欧美bbbbb| 性做久久久久久免费观看欧美|