opera1
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2003-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3781回复:23

我正在做NDIS miniport driver.

楼主#
更多 发布于:2002-02-20 15:29
不知有没有做过或正在做的兄弟,有些问题想探讨一下。  
信箱:liupan@263.net
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-02-20 16:41
有什么问题说出来听听!
zzy918
驱动牛犊
驱动牛犊
  • 注册日期2001-04-26
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-02-21 09:59
我也正在看这方面的东西,有什么问题说出来大家讨论。
KungFu
驱动大牛
驱动大牛
  • 注册日期2001-09-27
  • 最后登录2008-04-08
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望24点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-02-21 11:25
ndis miniport driver包含哪几种。我就知道nic。
我不写驱动好多年
mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-21 10:13
我想请教一下各位
我做的是一个网络驱动 将一个装有dsp的板卡(pci接口)映射为一个网卡 因为dsp的功能就是进行特定格式的数据封装收发 但是我在搭建框架和获取pci资源的时候出现了问题
ddk里边提到的微端口nic驱动必要的例程是必须都全部完成么?还是只需要留出入口
获取pci资源时候 似乎系统提示有问题 无法正确给pci设备分配资源

请大家赐教 谢谢!
Meagan
驱动牛犊
驱动牛犊
  • 注册日期2003-05-14
  • 最后登录2006-01-03
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-22 16:43
不需要完全实现吧,我看到的一些例子就没有完全实现。
我也疑惑NdisMPciAssignResources这个函数的功能,你是调用这个函数分配资源的吗? :P
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-22 17:44
NdisMQueryAdapterResources
wirelessboy
驱动牛犊
驱动牛犊
  • 注册日期2002-04-21
  • 最后登录2003-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-25 13:47
我想请教一下各位
我做的是一个网络驱动 将一个装有dsp的板卡(pci接口)映射为一个网卡 因为dsp的功能就是进行特定格式的数据封装收发 但是我在搭建框架和获取pci资源的时候出现了问题
ddk里边提到的微端口nic驱动必要的例程是必须都全部完成么?还是只需要留出入口
获取pci资源时候 似乎系统提示有问题 无法正确给pci设备分配资源

请大家赐教 谢谢!


DSP+网卡(8019)芯片的东东我做过,不过没有PCI。听师兄说,如果只是简单的数据封装收发,好像FPGA要快一点的。

还有,你的东东是用在PC上吗?如果是,觉得PCI的东东只要按照现在的网卡芯片接口设计应该没有问题的。
mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-25 13:56
我做的是PC架构上的板卡驱动.使用p3 cpu的工控机,板卡是CPCI接口的,需要驱动的芯片是TI的DSP.该dsp提供pci接口,我能看见的就是这些.驱动程序需要将这个主控dsp映射为NDIS驱动,因为这块版卡的作用相当于一块802.3的网卡,只是数据格式不一样而以.
mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-08-25 13:58
因此 我根据e100bex的例子搭建框架 确发现那个是在是庞大无比 我根本用不了那么多东西 但是也无法精简的能正常使用 按照例子里边的分配pci资源  NdisMPciAssignResources  得不到我想要的结果
bigtreebig
驱动牛犊
驱动牛犊
  • 注册日期2004-03-17
  • 最后登录2018-05-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-21 13:35
你们怎么收发帧的啊?我是初学者,想在网卡上收到帧,然后对帧进行转换,在发到出去
trison
驱动牛犊
驱动牛犊
  • 注册日期2003-12-01
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-26 10:19
我想请教一下各位
我做的是一个网络驱动 将一个装有dsp的板卡(pci接口)映射为一个网卡 因为dsp的功能就是进行特定格式的数据封装收发 但是我在搭建框架和获取pci资源的时候出现了问题
ddk里边提到的微端口nic驱动必要的例程是必须都全部完成么?还是只需要留出入口
获取pci资源时候 似乎系统提示有问题 无法正确给pci设备分配资源

请大家赐教 谢谢

请问你的板卡是自己做的,还是TI公司的?老板让我将C6201EVM映射为一个网卡,不知该如何做,好郁闷啊!dsp进行特定格式的数据封装收发
的功能是固件编程实现的吗,希望能借鉴你的思路.
start
驱动小牛
驱动小牛
  • 注册日期2001-11-05
  • 最后登录2010-09-03
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望27点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-27 10:41
dsp板卡映射为nic驱动,做什么用处呢?
second
trison
驱动牛犊
驱动牛犊
  • 注册日期2003-12-01
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-05-25 16:24
通过DSP共享上网呀!
lsshao
驱动牛犊
驱动牛犊
  • 注册日期2004-02-03
  • 最后登录2007-10-29
  • 粉丝0
  • 关注0
  • 积分33分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-05-26 11:56
我和你的工作几乎一样,关于我建议你采用KNdis函数,
关于PCI硬件读写基本上已经没有问题!!
第一步
声明硬件资源
Windows NT和Windows 2000定义了四种基本外围设备的硬件资源,例如NIC:
• I/O Ports
• Interrupt
• Memory
• DMA
枚举类型CM_RESOURCE_TYPE定义在ndis.h文件中,用于确定资源类型。
每一类资源都具有CM_PARTIAL_RESOURCE_DESCRIPTOR 结构描述的一组属性,该结构也定义在ndis.h文件中。例如, I/O端口属性包括I/O端口基地址,I/O端口长度范围等等。
DriverNetworks将硬件资源抽象成KNdisResource< CM_RESOURCE_TYPE>模块,提供了查询资源属性的访问方法。
NDIS Miniport 驱动处理硬件资源一般有以下三步:
1) Query the system 查询系统有关分配给miniport的硬件资源信息。
2) Query the attributes 查询每个资源的属性。
3) Initialize system objects 基于属性对系统对象初始化(例如, Interrupt 和I/O端口范围)  。
1.查询系统有关分配给miniport的硬件资源信息
根据NDIS版本和NIC总线类型,查询系统有许多不同的方法。NDIS4驱动采用总线特有的请求来完成Pre-PnP。DriverNetworks提供了两个类来完成该过程:KNdisPciResourceRequest和KNdisParamResourceRequest。
在NDIS 5中,PnP管理器处理所有硬件资源,包括non-PnP设备。对于NDIS 5驱动,系统采用非总线特有的KNdisPnpResourceRequest来查询,这是基于NdisMQueryAdapterResources的。尽管所有其他的NDIS 5资源请求类都很好用,但是一般还是习惯用KNdisPnpResourceRequest来查询硬件资源。
一般在Initialize()处理程序中对正确的请求初始化来实现系统查询。 例如:
KNdisPciResourceRequest req(this);
2.查询属性和初始化系统对象
在无论采用什么查询方法查询系统之后,接下来就要完成属性查询和初始化系统对象。 访问每一个资源都要求对正确资源类型初始化。例如:
KNdisResource<CmResourceTypeInterrupt> nt(req);
上面初始化一个中断资源描述符。
当系统对象初始化后,可以利用资源属性创建一个正确的系统对象。例如:
m_pInterrupt = new KNdisInterrupt(this,Int.Level(), Int.Affinity());
通过IsValid()方法检查错误,来确保资源对驱动来说是可用的。下面的代码示范了获得中断和I/O端口资源的技术:
NDIS_STATUS MyAdapter::Initialize(KNdisMedium& Medium, IN KNdisConfig& Config)
{. . .
  // get h/w resources
  KNdisPnpResourceRequest request(Config); // how do we query
  KNdisResource<CmResourceTypePort> Port(request); // what do we query
  KNdisResource<CmResourceTypeInterrupt> Int(request); // what do we query
// Make sure the resources are available
  if (!Port.IsValid())
  KNDIS_RETURN_ERROR (NDIS_STATUS_NOT_ACCEPTED);
  if (!Int.IsValid())
  KNDIS_RETURN_ERROR (NDIS_STATUS_NOT_ACCEPTED);
  // Register i/o port range system object:
  m_Ports.Initialize(this, Port);
  if (!m_Ports.IsValid())
  KNDIS_RETURN_ERROR (NDIS_STATUS_RESOURCES);
  // Register interrupt system object:
  m_Interrupt.Initialize(this, Int, NdisInterruptLatched);
  if (!m_Interrupt.IsValid())
  KNDIS_RETURN_ERROR (NDIS_STATUS_RESOURCES);
. . .
// OK!
  return NDIS_STATUS_SUCCESS;
}


第二步
访问I/O端口
DriverNetworks 提供了一组类来访问NIC的I/O 和内存映射寄存器:
&#8226; KNdisIoRange / KNdisIoRegister / KNdisIoRegisterSafe<T>
&#8226; KNdisMemoryRange / KNdisMemoryRegister / KNdisMemoryRegisterSafe<T>
这些类都是基类KNdisPeripheralAddress的派生类。
NDIS Miniport驱动必须考虑以下问题:
&#8226; Registering向系统注册I/O端口和内存区。
&#8226; Accessing访问单个I/O或内存映射端口。
&#8226; De-registering注销I/O端口和内存区
1. 注册I/O端口和内存区
1)在adapter类中包括KNdisIoRange和/或KNdisMemoryRange数据成员。例如:
class MyAdapter : public KNdisMiniAdapter {
. . .
  KNdisIoRange&#9;&#9;m_Ports;
  KNdisMemoryRange&#9;m_Memory;
. . .
};
2)在adapter类的Initialize()处理程序中,采用KNdisXxxResource类查询中断资源分配情况。
3)根据第二步返回的资源属性对KNdisIoRange和/或KNdisMemoryRange数据成员初始化。例如:
NDIS_STATUS MyAdapter::Initialize
(KNdisMedium& Medium, IN KNdisConfig& Config)
{
  . . .
  // get h/w resources
  KNdisPnpResourceRequest request(Config);
  KNdisResource<CmResourceTypePort> Port(request);
  // Make sure the resources are available
  if (!Port.IsValid())
    KNDIS_RETURN_ERROR (NDIS_STATUS_NOT_ACCEPTED);
  // Register i/o port range system object:
  m_Ports.Initialize(this, Port);
  if (!m_Ports.IsValid())
    KNDIS_RETURN_ERROR (NDIS_STATUS_RESOURCES);
  . . .
}
2. 访问单个I/O或内存映射端口
代表IO或内存区的系统对象一旦创建,DriverNetworks提供四种方法访问硬件:
1)KNdisIoRange和KNdisMemoryRange直接读in(ULONG offset),直接写out(ULONG offset,data)
下面给一个更新偏移地址为4的I/O寄存器的例子:
UCHAR reg = m_Ports.inb (4);
if (reg | 1)
  m_Ports.outb(4, reg | 1);
else
  m_Ports.outb(4, 0);
2)KNdisIoRegister和KNdisMemoryRegister提供内部寄存器。
KNdisIoRegister reg = m_Ports[4]; // 创建一个偏移地址为4的寄存器对象
if (UCHAR(reg) | 1)
  reg |= UCHAR(reg) | 1;
else
  reg = 0;
3)使用KNdisIoRegister和KNdisMemoryRegister的安全版本KNdisIoRegisterSafe<T>和KNdisMemoryRegisterSafe<T>。上面两个方法不提供读写数据宽度和寄存器实际宽度的检测。例如,使用m_Ports.outd(4, 1)向一个8位寄存器写入一个ULONG类型数据。虽然编译和链接都通过,但是可能会导致NIC的出错。寄存器类的安全版本是参数都是寄存器类型(例如,ULONG, USHORT和UCHAR)的模块。读写一个组正确的类型都导致编译错误。例如:
ULONG new val = 0;
KNdisIoRegisterSafe<UCHAR> reg = m_Ports[4];
if (UCHAR(reg) | 1)
  reg |= UCHAR(reg) | 1;
else
  reg = val; // error: wrong type
4)基于NdisImmediateXxx函数,通过immediate I/O原语访问I/O。在硬件资源查询和IO或内存注册之前immediate I/O使驱动就能访问NIC硬件。由于系统要执行硬件资源翻译并对每个IO请求映射,过程很慢。Immediate I/O仅在驱动初始化过程使用,例如,在资源分配之前,驱动读取卡上的EEPROM来检测板的类型。一般来说,在PnP环境下不建议这样做。
DriverNetworks通过KNdisConfig类提供immediate I/O支持。这种方法与第一种方法类似。例如:
UCHAR reg = Config.inb(4);
if (reg | 1)
  Config.outb(4, reg | 1);
else
  Config.outb(4, 0);
3. 注销I/O端口和内存区
一般地,NDIS Miniport驱动在MyAdapter::Halt()处理程序中注销端口和内存域。另外,也可以在MyAdapter destructor析构函数中完成,DriverNetworks在完成Halt()处理程序之后立即调用析构函数。
m_Ports.Invalidate();
m_Memory.Invalidate();

trison
驱动牛犊
驱动牛犊
  • 注册日期2003-12-01
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-05-26 13:47
怎样将PCI接口的DSP板6201EVM声明为以太网卡,是不是配置空间里面的分类代码也得改成以太网卡的分类代码(DSP板的分类代码0B40-协处理器,以太网卡的分类代码0200-以太网卡)?可以DSP的分类代码厂家不允许修改呀(包括板载EEPROM的PCI配置信息(里头有分类代码)部分,也是不可以修改的)。
另外, 问一下lsshao:
我和你的工作几乎一样,关于我建议你采用KNdis函数,关于PCI硬件读写基本上已经没有问题!!
你的板子要实现些什么功能,如何实现呀?说来我们这些新手借鉴一下?谢谢了先。
mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-06-25 09:56
折腾了许久 这个6416DSP的miniport就快搞定了。
我是用DS做的,用它生成了框架,自己对IO、Memory和INT的代码进行了一些改造,参考了一下DS里边e100bex的程序结构。
实际上就是做一个NIC的miniport,medium type可以用802.3,这个驱动向下对硬件的接口就是PCI,也就是说只用看DSP文档中PCI接口的部分。重点看内存基地址的映射、通过IO对寄存器的访问、中断寄存器如何读写。
整个程序逻辑部分就是基本的NIC miniport的框架。你就把它当成一个通用的网卡,只是网卡芯片用的是DSP,MAC处理都是在DSP里用程序处理的,这个不用管。驱动只看得到DSP的PCI接口,就是这么简单。
对于PCI部分,对锁存中断的处理是重要的,也就是中断应答,中断服务程序等的处理。
trison
驱动牛犊
驱动牛犊
  • 注册日期2003-12-01
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-06-28 11:21
 
折腾了许久 这个6416DSP的miniport就快搞定了。
我是用DS做的,用它生成了框架,自己对IO、Memory和INT的代码进行了一些改造,参考了一下DS里边e100bex的程序结构。
实际上就是做一个NIC的miniport,medium type可以用802.3,这个驱动向下对硬件的接口就是PCI,也就是说只用看DSP文档中PCI接口的部分。重点看内存基地址的映射、通过IO对寄存器的访问、中断寄存器如何读写。
整个程序逻辑部分就是基本的NIC miniport的框架。你就把它当成一个通用的网卡,只是网卡芯片用的是DSP,MAC处理都是在DSP里用程序处理的,这个不用管。驱动只看得到DSP的PCI接口,就是这么简单。
对于PCI部分,对锁存中断的处理是重要的,也就是中断应答,中断服务程序等的处理。

请问mboma,你的DSP板有IO口吗,我用的6201没有IO口,只有Memory ,不知道怎么访问Memory?你的DSP板与PC通信是通过HPI接口,还是其它方法?能不能指点一下.我现在只会用HPI与板子通信!不胜感谢!!!
mboma
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2010-03-11
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-06-28 14:16
DSP板上有很多处理器 其中的一个6416是主控DSP,通过PCI外设部分与PC接口。也就是说PC机,win2k中看到的只是这块DSP的PCI口。而主控DSP里边跑有嵌入式的控制程序,控制整个板的设备运行。主机通过向主控DSP的PCI通信进而操纵了整个板。但其实操纵整个板的程序是在主控DSP里的。个人觉得就像USB里边驱动向USBD发的是URB,而总线驱动操纵设备的Firmware,这个Firmware才是真正处理USB设备功能的程序。

拙见,欢迎大家共讨论。

trison
驱动牛犊
驱动牛犊
  • 注册日期2003-12-01
  • 最后登录2005-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-06-30 11:06
感谢mboma回复。你的DSP板当成一个通用的网卡,得写网卡的MiniPort驱动程序。DSP板的分类代码是0B40即协处理器,而网卡的分类代码是0200,并且DSP板的分类代码无论是配置空间还是EEPROM里头都是不能改动的。你是怎样使操作系统把它认成网卡的?是不是只要在.inf文件里指定
Class          = Net
ClassGUID      = {4d36e972-e325-11ce-bfc1-08002be10318}
就可以了,分类代码不用去管它?
另外,网卡驱动程序收发包时,怎么与PC交换数据,是不是还得调用DSP板子的驱动来收发数据,网卡驱动又是如何调用DSP板子的驱动的呢?请再指教!涕零ing..................
上一页
游客

返回顶部