Linux2.6.39下DM9K驱动源码分析

一、s3c2440和dm9k的电路连接如下图:

Linux2.6.39下DM9K驱动源码分析

从上图可以看出dm9k引用了16条数据线(sd0-sd15)和s3c2440(ldata0-ldata15)相连,引用了一条地址线(CMD)和S3C2440(ADDR2)相连。CPU就是通过CMD这条地址线来判断LDATA0-LDATA15这16条数据线传送的究竟是地址还是数据的。dm9k的片选信号AEN(Address enable a low activie signal used to select the dm9k)位和S3C2440的LnGCS4(BANK4)相连,BANK4的访问地址[0x2000 0000 - 0x2800 0000)

在dm9k芯片手册的5.1节有(TXD[2:0] is also used as the strap of  IO  base address IO base = (strap pin TXD[2:0]) * 10h + 300h),而mini2440开发板中对于dm9k电路TXD[3:0]引脚都未接的所以得出IO base=300h     中断使用了EINT7(GPF7)

这些放在移植的时候来分析再好不过了 其实

2、dm9000.c源码分析

分析之前先看看驱动程序中几个重要的结构

/**************************************************************************************************************************************************************/

* dm9000_driver变量。是platform_driver结构体变量,其中包含了重要的:驱动的名字(内核中用来匹配的唯一标识)和几个重要操作函数。

static struct platform_driver dm9000_driver = {
    .driver    = {
        .name    = "dm9000",    //驱动名
        .owner     = THIS_MODULE,
        .pm     = &dm9000_drv_pm_ops,//只想网卡的挂起和重启函数指针
    },
    .probe   = dm9000_probe,
    .remove  = __devexit_p(dm9000_drv_remove),
};

/**************************************************************************************************************************************************************/

dm9000_netdev_ops变量。是net_device_ops结构体变量, 其中定义了操作net_device的重要函数,我们在驱动程序中根据需要的操作要填充这些函数

static const struct net_device_ops dm9000_netdev_ops = {
    .ndo_open        = dm9000_open,//打开网络接口设备
    .ndo_stop        = dm9000_stop,//停止网络接口设备
    .ndo_start_xmit        = dm9000_start_xmit,//开始发送数据包
    .ndo_tx_timeout        = dm9000_timeout,//当数据包发送超时时该函数被调用
    .ndo_set_multicast_list    = dm9000_hash_table,
    .ndo_do_ioctl        = dm9000_ioctl,//进行设备特定的IO控制
    .ndo_change_mtu        = eth_change_mtu,
    .ndo_validate_addr    = eth_validate_addr,
    .ndo_set_mac_address    = eth_mac_addr,//设置MAC地址
#ifdef CONFIG_NET_POLL_CONTROLLER
    .ndo_poll_controller    = dm9000_poll_controller,//采用轮询的方式接收数据
#endif
};

/**************************************************************************************************************************************************************/

* dm9000_ethtool_ops变量。是ethtool_ops结构体变量,为了支持ethtool,其中的函数主要是用于查询和设置网卡参数(有的驱动程序可能不支持ethtool)

static const struct ethtool_ops dm9000_ethtool_ops = {
    .get_drvinfo        = dm9000_get_drvinfo,
    .get_settings        = dm9000_get_settings,
    .set_settings        = dm9000_set_settings,
    .get_msglevel        = dm9000_get_msglevel,
    .set_msglevel        = dm9000_set_msglevel,
    .nway_reset        = dm9000_nway_reset,
    .get_link        = dm9000_get_link,
    .get_wol        = dm9000_get_wol,
    .set_wol        = dm9000_set_wol,
     .get_eeprom_len        = dm9000_get_eeprom_len,
     .get_eeprom        = dm9000_get_eeprom,
     .set_eeprom        = dm9000_set_eeprom,
    .get_rx_csum        = dm9000_get_rx_csum,
    .set_rx_csum        = dm9000_set_rx_csum,
    .get_tx_csum        = ethtool_op_get_tx_csum,
    .set_tx_csum        = dm9000_set_tx_csum,
};

/**************************************************************************************************************************************************************/

* board_info结构体。用来保存芯片相关的一些信息的,差不多每个芯片级驱动里面都有一个类似的结构体

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyxjyy.html