• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > Davicom公司DM9000A和DM9010 ISA NIC 以太網驅動分析

    Davicom公司DM9000A和DM9010 ISA NIC 以太網驅動分析

    作者: 時間:2012-11-02 來源:網絡 收藏

    #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控制相關文章:pid控制原理




    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 特克斯县| 大关县| 丰都县| 周口市| 沈丘县| 恩施市| 犍为县| 五家渠市| 贵溪市| 拜城县| 高阳县| 淮南市| 柳林县| 安义县| 朝阳县| 积石山| 伊川县| 富川| 宁明县| 隆昌县| 尼勒克县| 武宁县| 仁化县| 肇庆市| 荔波县| 鹿泉市| 金平| 米林县| 长汀县| 昆山市| 奇台县| 邓州市| 沁水县| 汉寿县| 渑池县| 廊坊市| 襄城县| 卓尼县| 镇康县| 灵台县| 巫山县|