aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
阅读:1236回复:1

再问,再问

楼主#
更多 发布于:2005-05-22 18:05
1.可以报一下具体书名吗?那本inside 2000和linux内核分析,还有linux驱动开发的这三本。我真的想具体了解一下,向您看齐。

2.还是关于Polling的,我知道NE2000下使用我所谓的第一种方式,因为它的中断有一种叫做发送完成中断。但是在win2000驱动开发大全中,有提到发送完成可以不需要用中断来提示可以用轮训的方式来知道硬件的发送完成情况。我想问这是不是说可以用下面的方式:
KNdisTimer m_Timer;
KNDIS_DECLARE_TIMERCALLBACK(Driver_TimerAdapter, OnPolling);
m_Timer.SetPeriodic(m_Delay);
这样用一个Polling函数来定期的检查这个状态位,
如果硬件条件允许并且有数据包的话在进行发送。
这样可以吗?

3.关于DMA方式的传输,其实我并不怎么感兴趣。我是想了解多包接收下,驱动程序使用indicatepacket应该怎么运作。因为DMA方式正好可以实现这种多包接收所以就举了个例子,其实我看到DS中的SAMPLE还有两个1394和USB的例子也是用这种方式,就是想了解如何用这种方式来实现数据的接收。
在DS的环境下,封装的太好了,
就struct_WDM_RFD这么一个结构体,然后
KNdisSystemReceiveArea< Adapter, WDM_RFD >* m_pRxArea;
在主程序里面
有一些DescriptorInitialize和DescriptorInvalidate等的一些函数。
但是就是太简单了太抽象了,反而什么都搞不懂。
不过这样说好像你也不知道该怎么解释噢,问得不好。
(1)
就先问一下,硬件只要实现把接收到的若干个数据包,按顺序通知驱动程序每个包的内存地址开头和长度,就可以实现indicatepacket或者indicatereceive的接收了。实现indicatepacket并不需要硬件什么特殊的照顾吧。只要是只关于软件的,我在看看代码思考思考就可以了解的,怕的就是硬件有什么特殊的设计。
(2)
KNdisPacket Pkt(m_pRxArea->GetPacket());
KNdisBuffer Buf = Pkt.QueryFirstBuffer();
pRfd = reinterpret_cast<PHW_RFD>(m_pRxArea->GetDescriptor(Pkt));
m_pRxArea->Complete(pRfd);
FrameLength = pRfd->RfdActualCount & 0x3fff;
Buf.AdjustLength( FrameLength );
这是我将E100bex的例子中摘抄下来的,我想问问上面那个m_pRxArea里面所获得的包,刚刚开始有没有从网络上接收到的数据,还是说就是一个包描述符,类似就像一个个空包裹一样,要填满一个数据包在向上指示。我感觉像是这样的,但是没有看到有什么动作代码将数据添进去阿,
然后对这个包Pkt进行GetDescriptor就可以得到这个PHW_RFD的结构体pRfd,然后得到这个包的长度。
这个应该说明在这个m_pRxArea里面的数据包Pkt是充实的,是包含着接收到的数据包的。
但是这样的话,也没看到硬件是如何通知驱动每个数据包的地址开头和长度的。还有硬件应该也是不管那个结构体的内部构造吧。
太乱了,不知道这个该怎么提问。但是大概把我的想法说了说,我这个困惑很久了。


就是因为硬件那边还没做出来,所以试不了。我也是第一次做驱动,所以很多问题不能通过试验来解决,只好来这儿问了。而且硬件那边也没有关于作类似网卡的先例,很多问题他们也搞不清楚,只好我来问。真的麻烦您了。

背景:我们的所谓网卡并不支持以太网协议,我们上层仍然用TCP/IP用NDIS但是下层使用自己定义的协议,也就是这种数据只在我们的机子上用我们的硬件和驱动才能正确的接收。
周维彬
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-05-22 20:25
1.<<linux设备驱动程序>>,<<windows 2000 内部揭密>>
<<深入理解linux内核>>

2.从理论上讲,没有问题。但是需要你的驱动处理排队的问题

3.我在windows 更多的是做软驱动,在linux上倒是做过很多硬件驱动程序。windows 上的这两个程序没有分析过,有时间我看看,再说吧。
游客

返回顶部