您现在的位置是:主页 > news > 专业网站建设首选公司/软文推广方案
专业网站建设首选公司/软文推广方案
admin2025/6/6 15:29:44【news】
简介专业网站建设首选公司,软文推广方案,网页制作需要下载什么软件,企业宣传片制作软件文章目录裸机操作dm9000的裸机操作文件解析dm9000 linux 相关文件dm9000 mm.c 解析dm9000 dm9000.c 解析接口分析实现了哪些ops底层ops上层ops还有哪些接口工作任务中断dm9000 驱动的 接口层次划分接口调用流程发送数据接收数据控制 TODO其他ops接口什么时候会调用到 TODO实例探…
专业网站建设首选公司,软文推广方案,网页制作需要下载什么软件,企业宣传片制作软件文章目录裸机操作dm9000的裸机操作文件解析dm9000 linux 相关文件dm9000 mm.c 解析dm9000 dm9000.c 解析接口分析实现了哪些ops底层ops上层ops还有哪些接口工作任务中断dm9000 驱动的 接口层次划分接口调用流程发送数据接收数据控制 TODO其他ops接口什么时候会调用到 TODO实例探…
文章目录
- 裸机操作
- dm9000的裸机操作
- 文件解析
- dm9000 linux 相关文件
- dm9000 mm.c 解析
- dm9000 dm9000.c 解析
- 接口分析
- 实现了哪些ops
- 底层ops
- 上层ops
- 还有哪些接口
- 工作任务
- 中断
- dm9000 驱动的 接口层次划分
- 接口调用流程
- 发送数据
- 接收数据
- 控制 TODO
- 其他ops接口什么时候会调用到 TODO
- 实例探索
- 用ftrace 抓取发送和接收过程
- 一个最少的网卡驱动要实现什么接口
裸机操作
dm9000的裸机操作
这里 讲了如何对dm9000 访问
本文主要讲解dm9000 在linux下的驱动
文件解析
dm9000 linux 相关文件
drivers/net$ tree
.
├── ethernet
│ ├── davicom
│ │ ├── dm9000.c
│ │ ├── dm9000.h
│ │ ├── Kconfig
│ │ └── Makefile
│ ├── Kconfig
│ └── Makefile
├── Kconfig
├── loopback.c // 回环设备的驱动
├── Makefile
└── mii.c // mii 协议的代码描述,这里面EXPORT_SYMBOL出来的符号都被dm9000.c 用了
dm9000 mm.c 解析
- mii.c 中 EXPORT_SYMBOL 出来的符号
mii_link_ok
mii_nway_restart
mii_ethtool_gset
mii_ethtool_get_link_ksettings
mii_ethtool_sset
mii_ethtool_set_link_ksettings
mii_check_link
mii_check_media
mii_check_gmii_support
generic_mii_ioctl
dm9000 dm9000.c 解析
- dm9000.c 框架
dm9000.c 中 没有 EXPORT_SYMBOL 出来符号,且全部都是static 的probe 做了一些 net_device_ops-> ndo_init 中需要做到的事情,所以把 ndo_init 直接留空了
dm9000.c 中 写了1795行
1413 - 1707 是probe1429 - 1442 给dm9000 上电1444 - 1460 给dm9000 复位1462 - 1466 从设备树中获取信息,是不是用了ext phy,是不是no-eeprom,mac地址1469 - 1683 行申请 struct net_device , 并填充成员申请 struct board_info , 并填充成员1. dev.parent2. struct board_info *db2.1 lock2.2 addr_lock2.3 phy_poll2.4 addr_res2.5 data_res2.6 addr_req2.7 io_addr2.8 data_req2.9 io_data2.10 dumpblk2.11 outblk2.12 inblk2.13 flags2.14 msg_enable2.15 mii.phy_id_mask / mii.reg_num_mask/ mii.force_media/mii.full_duplex/mii.dev/2.16 mii.mdio_read/mii.mdio_write3. irq4. irq_wake5. base_addr期间,reset 了 dm9000,读了id,知道dm9000的具体型号6. hw_features7. features8. netdev_ops9. watchdog_timeo10.ethtool_ops期间 读了 eeprom, 获取了 mac地址,并校验是否有效期间,platform_set_drvdata(pdev, ndev);register_netdev(ndev);1760 - 1770 是 removeunregister_netdev(ndev);dm9000_release_board(pdev, netdev_priv(ndev));free_netdev(ndev);1710 - 1729 是 suspend经过层层判断,然后dm9000_shutdown(包括 Power-Down PHY,Disable RX)// 这个动作 也会在 dm9000_netdev_ops->ndo_open 即 dm9000_stop 中做1732 - 1752 是 resume对应suspend后 resume 的动作做了 dm9000_init_dm9000 和 dm9000_unmask_interrupts// 这2个动作 也会在 dm9000_netdev_ops->ndo_open 即 dm9000_open 中做
接口分析
实现了哪些ops
底层ops
对下,实现了这些ops
mdio_read
mdio_writedm9000_get_eeprom
dm9000_set_eepromdm9000_get_link_ksettings
dm9000_set_link_ksettingsior
iowdumpblk
inblk
outblk
上层ops
对上,实现了这些ops
struct net_device_ops netdev_ops
struct ethtool_ops ethtool_opshttp://lnmp.ailinux.net/ethtoolhttps://zhuanlan.zhihu.com/p/55131870
1367 static const struct net_device_ops dm9000_netdev_ops = {
1368 .ndo_open = dm9000_open,
1369 .ndo_stop = dm9000_stop,
1370 .ndo_start_xmit = dm9000_start_xmit,
1371 .ndo_tx_timeout = dm9000_timeout,
1372 .ndo_set_rx_mode = dm9000_hash_table,
1373 .ndo_do_ioctl = dm9000_ioctl,
1374 .ndo_set_features = dm9000_set_features,
1375 .ndo_validate_addr = eth_validate_addr,
1376 .ndo_set_mac_address = eth_mac_addr,
1377 #ifdef CONFIG_NET_POLL_CONTROLLER
1378 .ndo_poll_controller = dm9000_poll_controller,
1379 #endif
1380 };
731 static const struct ethtool_ops dm9000_ethtool_ops = { 732 .get_drvinfo = dm9000_get_drvinfo, 733 .get_msglevel = dm9000_get_msglevel, 734 .set_msglevel = dm9000_set_msglevel, 735 .nway_reset = dm9000_nway_reset, 736 .get_link = dm9000_get_link, 737 .get_wol = dm9000_get_wol, 738 .set_wol = dm9000_set_wol, 739 .get_eeprom_len = dm9000_get_eeprom_len, 740 .get_eeprom = dm9000_get_eeprom, 741 .set_eeprom = dm9000_set_eeprom, 742 .get_link_ksettings = dm9000_get_link_ksettings, 743 .set_link_ksettings = dm9000_set_link_ksettings, 744 };
还有哪些接口
工作任务
INIT_DELAYED_WORK(&db->phy_poll, dm9000_poll_work);dm9000_poll_work...注意,如果不是 TYPE_DM9000E , 则 不会 循环调用dm9000_interrupt // 中断调用schedule_delayed_work(&db->phy_poll, 1);
dm9000_openschedule_delayed_work(&db->phy_poll, 1);盲猜是中断或者ifconfig eth0 up开启了这个循环调用
中断
dm9000_interrupt
dm9000_wol_interrupt
dm9000 驱动的 接口层次划分
dev_queue_xmit__dev_xmit_skbsch_direct_xmitdev_hard_start_xmitxmit_onenetdev_start_xmit__netdev_start_xmitops->ndo_start_xmitstatic irqreturn_t dm9000_interruptdm9000_tx_done
static irqreturn_t dm9000_interruptdm9000_rxnetif_rx
接口调用流程
发送数据
接收数据
控制 TODO
其他ops接口什么时候会调用到 TODO
实例探索
用ftrace 抓取发送和接收过程
- ping 命令的ftrace
一个最少的网卡驱动要实现什么接口
- dm9000精简代码
- [arm vexpress code 中的 virt_net_card 驱动