请教Linux下dm9000网卡驱动程序问题

时间:2021-07-31 17:16:20
应用程序网络编程是基于socket接口的,好像完全屏蔽了底层,不能像字符设备那样应用程序可以调用open、read、write等

驱动函数,请问系统是在哪里调用了驱动程序里的函数,什么时候调用?比如dm9000_open,dm9000_ioctl,

dm9000_phy_read,dm9000_phy_write等函数我想用它,怎么调用?

请高手指点

9 个解决方案

#1


有没有人能指点一下?帖子快沉了...

#2


该回复于2012-01-10 16:26:58被版主删除

#3


引用楼主 zzlguet 的回复:
应用程序网络编程是基于socket接口的,好像完全屏蔽了底层,不能像字符设备那样应用程序可以调用open、read、write等

驱动函数,请问系统是在哪里调用了驱动程序里的函数,什么时候调用?比如dm9000_open,dm9000_ioctl,

dm9000_phy_read,dm9000_phy_write等函数我想用它,怎么调用?

请高手指点

在用用程序编程的时候添加头文件 然后就可以使用了

#4


多谢指点,我看见网络应用程序编程都是用socket,没见有直接调用的,系统肯定调用了这些函数,不知道在哪里调用了?

#5


引用 4 楼 zzlguet 的回复:
多谢指点,我看见网络应用程序编程都是用socket,没见有直接调用的,系统肯定调用了这些函数,不知道在哪里调用了?

底层驱动封装已经封装好了

#6


我很想知道系统里面那个文件调用了这其中的一些函数,因为系统启动后就对硬件进行了初始化
ndev->open  = &dm9000_open;
ndev->hard_start_xmit    = &dm9000_start_xmit;
ndev->tx_timeout         = &dm9000_timeout;
ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
ndev->stop  = &dm9000_stop;
ndev->set_multicast_list = &dm9000_hash_table;
ndev->ethtool_ops  = &dm9000_ethtool_ops;
ndev->do_ioctl  = &dm9000_ioctl;

#ifdef CONFIG_NET_POLL_CONTROLLER
ndev->poll_controller  = &dm9000_poll_controller;
#endif

db->msg_enable       = NETIF_MSG_LINK;
db->mii.phy_id_mask  = 0x1f;
db->mii.reg_num_mask = 0x1f;
db->mii.force_media  = 0;
db->mii.full_duplex  = 0;
db->mii.dev      = ndev;
db->mii.mdio_read    = dm9000_phy_read;
db->mii.mdio_write   = dm9000_phy_write;

#7


驱动属于设备层的,与块和字符设备属于同级别,但的确没有这些设备的这样上层函数,这是个主要区别。
如果能使网卡,系统会自动调用这些函数,包括事件的处理。 至于socket网络层函数属于上层函数,可以认为没有直接的控制关系,只有是在查找路由等时候,才要查找相应的设备接口和调用收发函数。

#8


多谢各位分析解答,这些问题确实让我困惑,字符和块设备驱动都比较好理解,因为在应用程序里直接调用file_operations结构体成员函数,像open、read、write、close等函数,知道底层硬件什么时候做了什么事情,而网络应用程序socket编程只看到了连接建立、数据传输等操作,不清楚系统何时何处调用了驱动里面的函数,比如说如果对驱动进行了一些改动,改变了一些对硬件的操作,不知道这些操作什么时候被执行了呢?如果我想应用程序执行到一定阶段对dm9000寄存器和它PHY寄存器进行读写,该怎样去实现呢?是添加头文件直接调用底层驱动函数吗?

#9


socket发送数据,会查找相应的interface,并调用发送函数,当然不是socket直接调,要用过tcp/ip协议栈去调。
接收函数是自动发送给tcp/ip栈,然后socket可以读。 至于初始化和配置函数,是网卡自动加载时候进行的,属于设备自身的管理,跟socket没关

#1


有没有人能指点一下?帖子快沉了...

#2


该回复于2012-01-10 16:26:58被版主删除

#3


引用楼主 zzlguet 的回复:
应用程序网络编程是基于socket接口的,好像完全屏蔽了底层,不能像字符设备那样应用程序可以调用open、read、write等

驱动函数,请问系统是在哪里调用了驱动程序里的函数,什么时候调用?比如dm9000_open,dm9000_ioctl,

dm9000_phy_read,dm9000_phy_write等函数我想用它,怎么调用?

请高手指点

在用用程序编程的时候添加头文件 然后就可以使用了

#4


多谢指点,我看见网络应用程序编程都是用socket,没见有直接调用的,系统肯定调用了这些函数,不知道在哪里调用了?

#5


引用 4 楼 zzlguet 的回复:
多谢指点,我看见网络应用程序编程都是用socket,没见有直接调用的,系统肯定调用了这些函数,不知道在哪里调用了?

底层驱动封装已经封装好了

#6


我很想知道系统里面那个文件调用了这其中的一些函数,因为系统启动后就对硬件进行了初始化
ndev->open  = &dm9000_open;
ndev->hard_start_xmit    = &dm9000_start_xmit;
ndev->tx_timeout         = &dm9000_timeout;
ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
ndev->stop  = &dm9000_stop;
ndev->set_multicast_list = &dm9000_hash_table;
ndev->ethtool_ops  = &dm9000_ethtool_ops;
ndev->do_ioctl  = &dm9000_ioctl;

#ifdef CONFIG_NET_POLL_CONTROLLER
ndev->poll_controller  = &dm9000_poll_controller;
#endif

db->msg_enable       = NETIF_MSG_LINK;
db->mii.phy_id_mask  = 0x1f;
db->mii.reg_num_mask = 0x1f;
db->mii.force_media  = 0;
db->mii.full_duplex  = 0;
db->mii.dev      = ndev;
db->mii.mdio_read    = dm9000_phy_read;
db->mii.mdio_write   = dm9000_phy_write;

#7


驱动属于设备层的,与块和字符设备属于同级别,但的确没有这些设备的这样上层函数,这是个主要区别。
如果能使网卡,系统会自动调用这些函数,包括事件的处理。 至于socket网络层函数属于上层函数,可以认为没有直接的控制关系,只有是在查找路由等时候,才要查找相应的设备接口和调用收发函数。

#8


多谢各位分析解答,这些问题确实让我困惑,字符和块设备驱动都比较好理解,因为在应用程序里直接调用file_operations结构体成员函数,像open、read、write、close等函数,知道底层硬件什么时候做了什么事情,而网络应用程序socket编程只看到了连接建立、数据传输等操作,不清楚系统何时何处调用了驱动里面的函数,比如说如果对驱动进行了一些改动,改变了一些对硬件的操作,不知道这些操作什么时候被执行了呢?如果我想应用程序执行到一定阶段对dm9000寄存器和它PHY寄存器进行读写,该怎样去实现呢?是添加头文件直接调用底层驱动函数吗?

#9


socket发送数据,会查找相应的interface,并调用发送函数,当然不是socket直接调,要用过tcp/ip协议栈去调。
接收函数是自动发送给tcp/ip栈,然后socket可以读。 至于初始化和配置函数,是网卡自动加载时候进行的,属于设备自身的管理,跟socket没关