色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Davicom公司DM9000A和DM9010 ISA NIC 以太網(wǎng)驅(qū)動(dòng)分析

          Davicom公司DM9000A和DM9010 ISA NIC 以太網(wǎng)驅(qū)動(dòng)分析

          作者: 時(shí)間:2012-11-02 來源:網(wǎng)絡(luò) 收藏

          #else

          #define DMFE_DBUG(dbug_now, msg, vaule)

          if (dbug_now) printk(KERN_ERR dmfe: %s %xn, msg, vaule)

          #endif

          #ifndef CONFIG_ARCH_MAINSTONE

          #pragma pack(push, 1)

          #endif

          typedef struct _RX_DESC

          {

          u8 rxbyte;

          u8 status;

          u16 length;

          }RX_DESC;

          typedef union{

          u8 buf[4];

          RX_DESC desc;

          } rx_t;

          #ifndef CONFIG_ARCH_MAINSTONE

          #pragma pack(pop)

          #endif

          enum DM9KS_PHY_mode {

          DM9KS_10MHD = 0,

          DM9KS_100MHD = 1,

          DM9KS_10MFD = 4,

          DM9KS_100MFD = 5,

          DM9KS_AUTO = 8,

          };

          /* Structure/enum declaration ------------------------------- */

          typedef struct board_info {

          u32 reset_counter; /* counter: RESET */

          u32 reset_tx_timeout; /* RESET caused by TX Timeout */

          u32 io_addr; /* Register I/O base address */

          u32 io_data; /* Data I/O address */

          int tx_pkt_cnt;

          u8 op_mode; /* PHY operation mode */

          u8 io_mode; /* 0:word, 2:byte */

          u8 device_wait_reset; /* device state */

          u8 Speed; /* current speed */

          int cont_rx_pkt_cnt;/* current number of continuos rx packets */

          struct timer_list timer;

          struct net_device_stats stats;

          unsigned char srom[128];

          spinlock_t lock;

          } board_info_t;

          /* Global variable declaration ----------------------------- */

          /*static int dmfe_debug = 0;*/

          static struct net_device * dmfe_dev = NULL;

          /* For module input parameter */

          static int mode = DM9KS_AUTO;

          static int media_mode = DM9KS_AUTO;

          static u8 irq = DM9K_IRQ;

          static u32 iobase = DM9KS_MIN_IO;

          /* function declaration ------------------------------------- */

          int dmfe_probe(struct net_device *);

          static int dmfe_open(struct net_device *);

          static int dmfe_start_xmit(struct sk_buff *, struct net_device *);

          static void dmfe_tx_done(unsigned long);

          static void dmfe_packet_receive(struct net_device *);

          static int dmfe_stop(struct net_device *);

          static struct net_device_stats * dmfe_get_stats(struct net_device *);

          static int dmfe_do_ioctl(struct net_device *, struct ifreq *, int);

          #if LINUX_VERSION_CODE KERNEL_VERSION(2,5,0)

          static void dmfe_interrupt(int , void *, struct pt_regs *);

          #else

          static irqreturn_t dmfe_interrupt(int , void *, struct pt_regs *);

          #endif

          static void dmfe_timer(unsigned long);

          static void dmfe_init_dm9000(struct net_device *);

          static unsigned long cal_CRC(unsigned char *, unsigned int, u8);

          static u8 ior(board_info_t *, int);

          static void iow(board_info_t *, int, u8);

          static u16 phy_read(board_info_t *, int);

          static void phy_write(board_info_t *, int, u16);

          static u16 read_srom_word(board_info_t *, int);

          static void dm9000_hash_table(struct net_device *);

          static void dmfe_timeout(struct net_device *);

          static void dmfe_reset(struct net_device *);

          #if defined(CHECKSUM)

          static u8 check_rx_ready(u8);

          #endif

          //DECLARE_TASKLET(dmfe_tx_tasklet,dmfe_tx_done,0);

          /* DM9000 network baord routine ---------------------------- */

          /*

          Search DM9000 board, allocate space and register it

          */

          struct net_device * __init dmfe_probe1(void)

          {

          struct net_device *dev;

          int err;

          #if LINUX_VERSION_CODE KERNEL_VERSION(2,5,0)

          dev = init_etherdev(NULL, sizeof(struct board_info));

          ether_setup(dev);

          #else

          dev= alloc_etherdev(sizeof(struct board_info));

          #endif

          if(!dev)

          return ERR_PTR(-ENOMEM);

          SET_MODULE_OWNER(dev);

          err = dmfe_probe(dev);

          if (err)

          goto out;

          #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)

          err = register_netdev(dev);

          if (err)

          goto out1;

          #endif

          return dev;

          out1:

          release_region(dev->base_addr,2);

          out:

          #if LINUX_VERSION_CODE KERNEL_VERSION(2,5,0)

          kfree(dev);

          #else

          free_netdev(dev);

          #endif

          return ERR_PTR(err);

          }

          int __init dmfe_probe(struct net_device *dev)

          {

          struct board_info *db; /* Point a board information structure */

          u32 id_val;

          u16 i, dm9000_found = FALSE;

          DMFE_DBUG(0, dmfe_probe(),0);

          /* Search All DM9000 serial */

          do {

          outb(DM9KS_VID_L, iobase);

          id_val = inb(iobase + 4);

          outb(DM9KS_VID_H, iobase);

          id_val |= inb(iobase + 4) 8;

          outb(DM9KS_PID_L, iobase);

          id_val |= inb(iobase + 4) 16;

          outb(DM9KS_PID_H, iobase);

          id_val |= inb(iobase + 4) 24;

          if (id_val == DM9KS_ID || id_val == _ID) {

          pid控制相關(guān)文章:pid控制原理




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉