`
saybody
  • 浏览: 907821 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Windows CE驱动N枪拍案惊奇系列 之 基于Wince5.0的DM9000A的驱动分析和移植步骤

阅读更多

基于Wince5.0DM9000A的驱动分析和移植步骤

华清远见非著名讲师 O(_)O 牛牛猛

点击链接加我好友!

http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1

欢迎大家去我CSDN博客上踩踩

http://blog.csdn.net/mistyeyed

首先要找到驱动程的入口点,从dm9000.def文件中可以看到dm9000的驱动程序(dm9000.dllexports的函数只有DriverEntry。可以确定这里便是DM9000 驱动入口函数。

详细查看这个位于driver.cpp文件中的入口函数会发现这个函数中主要有一个函数NdisMInitializeWrapper(

&hwrapper,

pDriverObject,

pRegistryPath,

NULL);

查看微软的帮助文档可知这个函数作用是This function notifies NDIS that a new miniport is initializing,翻译一下,函数的功能是通知NDIS这个函数是一个初始化函数,NDIS(网络驱动器标准接口),NdisMInitializeWrapper()函数是内核提供给我们的,可以直接调用。

接下来就是给

NDIS30_MINIPORT_CHARACTERISTICS这个结构体变量初始化,主要是设置一些回调函数,这是Windows程序的常见风格:

ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;

ndischar.Ndis30Chars.ResetHandler = MiniportReset;

ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;

ndischar.Ndis30Chars.HaltHandler = MiniportHalt;

ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;

ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler;

ndischar.Ndis30Chars.QueryInformationHandler=MiniportQueryInformation;

ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation;

ndischar.Ndis30Chars.SendHandler = MiniportSend;

很明显上面提到的通常要自己实现的。再下来就是NdisMRegisterMiniport()函数了,【F1】查看帮助文档,

This function registers an NIC or intermediate driver's Miniport_* entry points and name with the NDIS library when the driver initializes

顾名思义这是一个注册函数,想wince内核注册驱动程序,注册刚才初始化的结构体就是用刚才初始化的那个结构体NDIS30_MINIPORT_CHARACTERISTICS注册。搞过Linux驱动的兄弟一定对这种思路一定不陌生。

函数中只有一个函数NdisTerminateWrapper,接着查看帮助文档,

This function releases system resources allocated when the NIC driver called the NdisMInitializeWrapper function意思是说函数调用后获得系统资源。

帮助文档里有这样的描述:A miniport calls this function during initialization if it cannot find an NIC that it supports in the current platform or if it cannot successfully initialize at least one NIC or virtual NIC.那么后面将是从成功注册的结构体的第一个函数执行了即:NDIS_STATUS

MiniportInitialize(

OUT PNDIS_STATUS OpenErrorStatus,

OUT PUINT SelectedMediaIndex,

IN PNDIS_MEDIUM MediaArray,

IN UINT MediaArraySize,

IN NDIS_HANDLE MiniportHandle,

IN NDIS_HANDLE WrapperConfigHandle)

This function is a required function that sets up a network adapter, or virtual network adapter, for network I/O operations, claims all hardware resources necessary to the network adapter in the registry, and allocates resources the driver needs to carry out network I/O operations

意思是说,开启所有网口资源。我们看看MiniportInitialize函数中做了那些工作。

NIC_DRIVER_OBJECT *pnic;意思是实例化NIC_DRIVER_OBJECT

其中有NIC_DRIVER_OBJECT类的初始化,以及该类的EDriverInitialize函数调用,在此函数中全面展开了dm9000的所有初始化操作。

pnic->EDriverInitialize(

OpenErrorStatus,

SelectedMediaIndex,

MediaArray,

MediaArraySize);

pnic->DriverStart();

我们跟踪到EDriverInitialize中,发现这样一句话:

m_pLower = DeviceEntry(this,NULL);

主要是通过DeviceEntry()这个函数来实现(这个函数实现在dm9isa.cpp文件中),

extern "C" NIC_DEVICE_OBJECT *DeviceEntry(

NIC_DRIVER_OBJECT *pDriverObject,

PVOID pVoid)

{

return new C_DM9000(pDriverObject,pVoid);

}

DeviceEntry这个函数中只做了一件事:new了一个C_DM9000类的实例并return

接下来就该C_DM9000的实例了,真正进入DM9000的初始化阶段

m_pLower->DeviceSetDefaultSettings();

m_pLower->DeviceSetEepromFormat();

m_pLower->DeviceRetriveConfigurations(hconfig);

m_pLower->EDeviceValidateConfigurations();

完成若干初始化工作后, NIC_DRIVER_OBJECT又出现了,

pnic->DriverStart();函数将被调用,

驱动程序进入DriverStart()函数,

函数很简单但是比较重要,它在此DeviceEnableInterrupt()启动了中断,至此正常的话可以看到DM9:--MiniportInitialize的提示。

DriverStart函数中有个EDeviceValidateConfigurations函数会获得g_szDm9ConfigParams结构体中的中断号和片选地址:

{ CID_IO_BASE_ADDRESS, 0x20000000, NDIS_STRING_CONST("IoAddress")},

{ CID_IRQ_NUMBER, 16, NDIS_STRING_CONST("IrqNumber")},

Step-by-step移植:

1、获得dm9000的基于wince的驱动包,复制

%_winceroot%/ PLATFORM/SMDK2440A/Src/Drivers/目录下;

2、打开在driver目录下dirs文件,在该文件里将dm9000加入到dirs中;

3、打开driver/dm9000目录,在该目录下将dirssource等文件改了

4、中断和片选参考上面的提示即可。

附上我的注册表信息供大家参考哦!

IF BSP_DM9000 !

[HKEY_LOCAL_MACHINE/Comm/DM9CE]

"DisplayName"="DM9000A/9010 ISA Fast Ethernet Adapter"

"Group"="NDIS"

"ImagePath"="dm9isa.dll"

[HKEY_LOCAL_MACHINE/Comm/DM9CE/Linkage]

"Route"=multi_sz:"dm9ce1"

[HKEY_LOCAL_MACHINE/Comm/DM9CE1]

"DisplayName"="DM9000A/9010 ISA Fast Ethernet Adapter"

"Group"="NDIS"

"ImagePath"="dm9isa.dll"

[HKEY_LOCAL_MACHINE/Comm/Tcpip/Linkage]

"Bind"="dm9ce1"

[HKEY_LOCAL_MACHINE/Comm/DM9CE1/Parms]

"BusNumber"=dword:0

"BusType"=dword:0

"XmitBuffer"=dword:20

"RecvBuffer"=dword:20

"IrqNumber"=dword:10

"MACAddress" =hex:00,0A,EB,FD,7A,00

[HKEY_LOCAL_MACHINE/Comm/DM9CE1/Parms/TcpIp]

"EnableDHCP"=dword:0

"UseZeroBroadcast"=dword:0

"DefaultGateway"="192.168.4.1"

"IpAddress"="192.168.4.215"

"Subnetmask"="255.255.255.0"

"DNS"="202.106.0.20"

ENDIF BSP_DM9000 !

本文参考:

bluefish博客,出处http://bluefish.blog.51cto.com/214870/58106

感谢bluefish的分享。

分享到:
评论

相关推荐

    DM9000驱动 linux wince 的DM9000A的官方驱动

    总之,DM9000A的官方驱动程序对于在Linux和Windows CE系统中实现基于DM9000A的网络连接至关重要。它提供了硬件和操作系统之间的桥梁,使得设备能够无缝地进行网络通信。在使用过程中,遵循官方文档,理解驱动工作...

    基于WINCE的DM9000A的驱动

    在Windows CE(简称WinCE)操作系统中,驱动程序是连接硬件设备与系统内核的关键组件。本主题将详细探讨如何在WinCE环境下为DM9000A网络控制器编写和配置驱动程序。DM9000A是一款常用的以太网控制器,广泛应用于...

    dm9000网卡驱动wince实现

    ### dm9000网卡驱动在WinCE下的实现与移植 #### 1. 引言 dm9000是一种高性能、低功耗的快速以太网控制器,广泛应用于嵌入式系统中,尤其在基于ARM架构的开发板上。在WinCE环境下移植和实现dm9000网卡驱动,对于...

    S3C2442-WINCE 5.0 BSP包

    S3C2442-WINCE 5.0 BSP(板级支持包)是针对三星S3C2442处理器在Windows CE 5.0操作系统上的关键组件集合,它为开发者提供了构建嵌入式系统的基础设施。这个包包含了对多种硬件接口的驱动程序,如DM9000A网络控制器...

    wince下DM9000驱动程序

    在Windows CE(简称WinCE)操作系统环境下,DM9000驱动程序是用于支持DM9000网络控制器通信的关键组件。DM9000是一款集成以太网媒体访问控制器(MAC)和物理层(PHY)的单芯片解决方案,广泛应用于嵌入式系统中的...

    WINCE5.0-driver-for-dm9000.rar_visual c_wince5

    标题中的“WINCE5.0-driver-for-dm9000.rar”表明这是一个适用于Windows CE 5.0操作系统的DM9000网络芯片的驱动程序。Windows CE(Windows Embedded Compact)是微软开发的一个实时嵌入式操作系统,主要用于掌上设备...

    基于windows ce系统的dm9000a驱动

    在Windows CE系统中,开发设备驱动程序是构建嵌入式系统的关键步骤,特别是对于网络通信模块,如DM9000A。DM9000A是一款常用的以太网控制器,广泛应用于各种嵌入式设备中,提供快速的10/100Mbps网络连接。在基于PXA...

    DM9000A部分驱动

    在Linux操作系统中,为DM9000A编写驱动程序是实现设备与系统通信的关键步骤。下面我们将深入探讨DM9000A驱动的相关知识点。 一、DM9000A概述 DM9000A是Davicom半导体公司设计的一款高性能、低功耗的以太网控制器,...

    FPGA驱动DM9000A

    **FPGA驱动DM9000A的步骤:** 1. **了解DM9000A接口**:DM9000A与FPGA之间的接口通常包括数据线(如D0-D15用于读写数据)、控制线(如CS, RW, RD, INT)以及时钟信号。理解这些接口信号的含义是设计驱动的关键。 2...

    YC2440开发指南-WINCE5.0篇

    ### YC2440开发指南-WINCE5.0篇 ...通过以上步骤,可以成功安装并配置好WinCE 5.0开发环境,并为YC2440开发板生成定制化的Windows CE操作系统映像文件。这为后续的应用程序开发奠定了坚实的基础。

    基于ARM和DM9000A网络传输接收程序

    《基于ARM和DM9000A的网络传输接收程序详解》 在现代电子设备中,网络通信扮演着至关重要的角色。本项目聚焦于一种基于ARM微处理器和DM9000A网络接口芯片的网络传输接收程序,该程序旨在实现全面的网络功能,包括对...

    dm9000网卡驱动分析

    ### DM9000网卡驱动分析 #### 模块注册与初始化 ##### `dm9000_init`函数 该函数是DM9000网卡驱动的入口点,负责进行基本的信息打印以及调用`platform_driver_register`来注册平台设备驱动。此函数主要包含以下...

    基于网卡芯片dm9000的u-boot移植

    总结来说,基于网卡芯片DM9000的U-Boot移植涉及硬件连接、驱动配置、代码修改和初始化过程。通过理解DM9000的工作原理以及与其相关的MAC和PHY,你可以更有效地完成移植任务。记得在整个过程中密切关注硬件兼容性,...

    基于嵌入式Linux的DM9000A驱动的实现.pdf

    综上所述,基于嵌入式Linux的DM9000A驱动实现不仅涉及到硬件接口电路设计,还涵盖了驱动程序的编写与优化。这种技术方案适用于各种嵌入式系统,如信息终端、信息家电等,为构建网络化的嵌入式环境提供了有效的方法。...

    dm9000a源代码程序

    移植 DM9000A 驱动到新的平台主要涉及以下步骤: 1. **硬件接口适配**:检查目标系统是否提供了 DM9000A 所需的 I/O 端口和中断线,确定硬件连接方式,如 I/O 寻址或内存映射。 2. **中断处理注册**:根据目标操作...

    DM9000以太网FPGA驱动

    DM9000A是DM9000系列的一员,是一款集成了PHY(物理层)和MAC(媒体访问控制)的全双工10/100Mbps以太网控制器。它的功能包括自动协商、MDI-X支持、速率匹配、错误检测和校正等,能够为嵌入式设备提供高速、可靠的...

    dm9000网卡驱动程序分析

    - **设备类型识别**:驱动程序支持DM9000E、DM9000A和DM9000B三种不同的设备类型,通过枚举类型`dm9000_type`进行区分,确保驱动程序能够适配不同版本的DM9000芯片。 #### 总结 DM9000网卡驱动程序在ARM9开发板上...

    dm9000内核网卡驱动分析

    网卡开发必须要熟悉的驱动流程 dm9000网卡驱动分析

    DM9000驱动程序 wince

    在Windows CE(简称WinCE)操作系统中,驱动程序是连接硬件设备与系统内核的关键组件。DM9000是一款广泛应用于嵌入式系统的以太网控制器,它提供了网络连接功能,使得设备能够接入局域网或互联网。本文将详细探讨...

Global site tag (gtag.js) - Google Analytics