WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(15)-CS8900 NDIS Miniport driver简析(1)

如何开发一个NDIS Miniport的网卡驱动,CS8900这个例子是个很好的参考.接下来我们就来分析下这个驱动,这样将来开发其他网卡驱动就知道怎么做了.
驱动共有4个文件:
cs8900.c:直接操作网卡的函数
interrupt.c:中断处理
miniport.c:NDIS miniport驱动接口实现
wince.c:驱动dll入口 

1.wince.c
我们先来看wince.c(应该改名为cs8900DriverEntry.c比较合适),其实这个文件就实现了DLL的入口函数DllEntry:

这就是在source文件定义DLLENTRY=DllEntry的原因.
这部分不需要做什么处理,真正驱动实现部分在其他3个文件里.

2.miniport.c
(1)DriverEntry
NDIS driver调用的第一个函数,该函数用来初始化NDIS Wrapper和注册miniport driver.
NDIS Wrapper是用来开发miniport driver和protocol driver的库,抽象了向OS提供的接口并提供一些支持函数.在CE中就是Network Driver Architecture (NDIS)组件提供的库.而另一个组件NDIS User-mode I/O Driver实际上就是实现了一个protocol driver,可以通过ReadFile和WriteFile来读写以太网帧.这些都是比较上层的实现,CE中都已经有组件实现好了.我们要实现的就是底层的部分.
DriverEntry函数首先声明了NDIS51_MINIPORT_CHARACTERISTICS(NDIS_MINIPORT_CHARACTERISTICS结构加上一些5.1下新的成员,实际用到的还是前者的成员)结构的变量CS8900Char, 原型在ndis.h中:

这个结构定义了NDIS的版本号,以及要导出Minioprt的相应的接口函数的函数指针。该结构会在DriverEntry函数中被设置,并进行注册.
DriverEntry函数首先调用NdisMInitializeWrapper通知NDIS一个新的miniport driver正在初始化,并获得一个NDIS wrapper的句柄.
初始化好CS8900Char函数指针后,调用NdisMRegisterMiniport注册一个网卡实例.
如果返回值不为NDIS_STATUS_SUCCESS,就调用NdisTerminateWrapper释放由NdisMInitializeWrapper分配的系统资源.

2.MiniportInitialize
这个函数在DriverEntry中被赋值给NDIS51_MINIPORT_CHARACTERISTICS结构(CS8900Char.InitializeHandler = MiniportInitialize;)用来设置网卡,分配硬件资源(根据注册表信息),分配IO操作所需的资源.
主要通过调用NdisOpenConfiguration,NdisReadConfiguration,NdisReadNetworkAddress获得注册表中网卡的配置信息,如网卡类型,中断号,IO基址等.
获得的信息都保存到PCS8900_ADAPTER这样一个结构体,供其他函数使用.其原型如下:

最后调用CS8900RegisterAdapter来注册网卡实例.
以下是MiniportInitialize的源代码:

(3).CS8900RegisterAdapter
在MiniportInitialize最后调用了CS8900RegisterAdapter来注册网卡实例.
该函数首先调用NdisMSetAttributes来通知NDIS Library网卡的主要特性.然后调用NdisMRegisterInterrupt和NdisMRegisterAdapterShutdownHandler来注册中断和shutdown处理.
NdisMRegisterInterrupt:映射NIC驱动由NdisMRegisterMiniport注册注册的MiniportISR和MiniportHandleInterrupt函数,并设置相应的中断向量
NdisMRegisterAdapterShutdownHandler:注册NIC驱动提供的MiniportShutdown函数,当系统关闭时被调用

还调用了CS8900Initialize进行了网卡硬件的初始化,设置了外部总线控制器,物理中断号和中断模式等;调用CS8900ReadEthernetAddress设置网卡MAC地址.这两个函数都实现在cs8900.c中,涉及硬件的代码我们之后再来分析.
最后调用NdisMRegisterAdapterShutdownHandler时注册了一个ShutdownHandler,仅仅设置一个标志,并没有具体处理.

下一篇我们来介绍其他几个在NDIS51_MINIPORT_CHARACTERISTICS结构注册的Handler

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值