一、s3c2440和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结构体。用来保存芯片相关的一些信息的,差不多每个芯片级驱动里面都有一个类似的结构体