阅读:3847回复:23
我正在做NDIS miniport driver.
不知有没有做过或正在做的兄弟,有些问题想探讨一下。
信箱:liupan@263.net |
|
沙发#
发布于:2002-02-20 16:41
有什么问题说出来听听!
|
|
板凳#
发布于:2002-02-21 09:59
我也正在看这方面的东西,有什么问题说出来大家讨论。
|
|
地板#
发布于:2002-02-21 11:25
ndis miniport driver包含哪几种。我就知道nic。
|
|
|
地下室#
发布于:2003-08-21 10:13
我想请教一下各位
我做的是一个网络驱动 将一个装有dsp的板卡(pci接口)映射为一个网卡 因为dsp的功能就是进行特定格式的数据封装收发 但是我在搭建框架和获取pci资源的时候出现了问题 ddk里边提到的微端口nic驱动必要的例程是必须都全部完成么?还是只需要留出入口 获取pci资源时候 似乎系统提示有问题 无法正确给pci设备分配资源 请大家赐教 谢谢! |
|
5楼#
发布于:2003-08-22 16:43
不需要完全实现吧,我看到的一些例子就没有完全实现。
我也疑惑NdisMPciAssignResources这个函数的功能,你是调用这个函数分配资源的吗? :P |
|
6楼#
发布于:2003-08-22 17:44
NdisMQueryAdapterResources
|
|
7楼#
发布于:2003-08-25 13:47
我想请教一下各位 DSP+网卡(8019)芯片的东东我做过,不过没有PCI。听师兄说,如果只是简单的数据封装收发,好像FPGA要快一点的。 还有,你的东东是用在PC上吗?如果是,觉得PCI的东东只要按照现在的网卡芯片接口设计应该没有问题的。 |
|
8楼#
发布于:2003-08-25 13:56
我做的是PC架构上的板卡驱动.使用p3 cpu的工控机,板卡是CPCI接口的,需要驱动的芯片是TI的DSP.该dsp提供pci接口,我能看见的就是这些.驱动程序需要将这个主控dsp映射为NDIS驱动,因为这块版卡的作用相当于一块802.3的网卡,只是数据格式不一样而以.
|
|
9楼#
发布于:2003-08-25 13:58
因此 我根据e100bex的例子搭建框架 确发现那个是在是庞大无比 我根本用不了那么多东西 但是也无法精简的能正常使用 按照例子里边的分配pci资源 NdisMPciAssignResources 得不到我想要的结果
|
|
10楼#
发布于:2004-04-21 13:35
你们怎么收发帧的啊?我是初学者,想在网卡上收到帧,然后对帧进行转换,在发到出去
|
|
11楼#
发布于:2004-04-26 10:19
我想请教一下各位 请问你的板卡是自己做的,还是TI公司的?老板让我将C6201EVM映射为一个网卡,不知该如何做,好郁闷啊!dsp进行特定格式的数据封装收发 的功能是固件编程实现的吗,希望能借鉴你的思路. |
|
12楼#
发布于:2004-04-27 10:41
dsp板卡映射为nic驱动,做什么用处呢?
|
|
|
13楼#
发布于:2004-05-25 16:24
通过DSP共享上网呀!
|
|
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 和内存映射寄存器: • KNdisIoRange / KNdisIoRegister / KNdisIoRegisterSafe<T> • KNdisMemoryRange / KNdisMemoryRegister / KNdisMemoryRegisterSafe<T> 这些类都是基类KNdisPeripheralAddress的派生类。 NDIS Miniport驱动必须考虑以下问题: • Registering向系统注册I/O端口和内存区。 • Accessing访问单个I/O或内存映射端口。 • De-registering注销I/O端口和内存区 1. 注册I/O端口和内存区 1)在adapter类中包括KNdisIoRange和/或KNdisMemoryRange数据成员。例如: class MyAdapter : public KNdisMiniAdapter { . . . KNdisIoRange		m_Ports; KNdisMemoryRange	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(); |
|
15楼#
发布于:2004-05-26 13:47
怎样将PCI接口的DSP板6201EVM声明为以太网卡,是不是配置空间里面的分类代码也得改成以太网卡的分类代码(DSP板的分类代码0B40-协处理器,以太网卡的分类代码0200-以太网卡)?可以DSP的分类代码厂家不允许修改呀(包括板载EEPROM的PCI配置信息(里头有分类代码)部分,也是不可以修改的)。
另外, 问一下lsshao: 我和你的工作几乎一样,关于我建议你采用KNdis函数,关于PCI硬件读写基本上已经没有问题!!你的板子要实现些什么功能,如何实现呀?说来我们这些新手借鉴一下?谢谢了先。 |
|
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部分,对锁存中断的处理是重要的,也就是中断应答,中断服务程序等的处理。 |
|
17楼#
发布于:2004-06-28 11:21
折腾了许久 这个6416DSP的miniport就快搞定了。 请问mboma,你的DSP板有IO口吗,我用的6201没有IO口,只有Memory ,不知道怎么访问Memory?你的DSP板与PC通信是通过HPI接口,还是其它方法?能不能指点一下.我现在只会用HPI与板子通信!不胜感谢!!! |
|
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设备功能的程序。
拙见,欢迎大家共讨论。 |
|
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.................. |
|
上一页
下一页