还有一个没有实现的重要驱动就是网卡驱动了,在eboot里有一段网卡的处理程序,实际上是一些网卡的读写函数,用于PB下载和KITL的,而在CE最终运行时如果我们需要进行网络通信,那就需要NDIS架构的网络驱动.
在WinCE中,通过NDIS(The Network Driver Interface Specification),WinCE系统和网卡及网络协议进行交互。NDIS提供了一个完全的网络驱动的抽象层,目前WinCE支持NDIS5.1,其中包括对RNDIS,NDISWAN,Token Ring等的支持。在WinCE中,整个网络架构体系如图:
更多关于NDIS的介绍可以参考PB的帮助文档.这里我们只要知道我们的网卡驱动是遵循NDIS架构的,这样应用程序的网络通信才能实现.
在WinCE中支持三种类型的网络驱动:Miniport driver,Intermediate driver和Protocol driver,我们要实现的就是硬件网卡的驱动,也就是Miniport driver.开发Miniport Driver,在底层调用NDIS的接口访问底层硬件,在上层提供接口函数供高层协议调用进行网卡配置或者数据通信.
网上有很多基于2410/2440的CS8900的NDIS miniport driver,我们可以在此基础上修改移植到自己的平台上. 我们先介绍下移植所需要的工作,如注册表,中断映射,source文件设置等.
1.代码文件和source文件
驱动共有4个文件:
cs8900.c:直接操作网卡的函数
interrupt.c:中断处理
miniport.c:NDIS miniport驱动接口实现
wince.c:驱动dll入口
souce文件:
TARGETNAME=cs8900 WINCEOEM=1 RELEASETYPE=PLATFORM TARGETTYPE=DYNLINK DLLENTRY=DllEntry MSC_OPTIMIZATION=/Ox /Fc TARGETLIBS= / $(_PROJECTROOT)/cesysgen/sdk/lib/$(_CPUINDPATH)/ndis.lib / $(_PROJECTROOT)/cesysgen/sdk/lib/$(_CPUINDPATH)/ntcompat.lib / $(_PROJECTROOT)/cesysgen/sdk/lib/$(_CPUINDPATH)/coredll.lib / $(_PROJECTROOT)/cesysgen/oak/lib/$(_CPUINDPATH)/ceddk.lib / DEFINES=$(CDEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS40_MINIPORT -DWIN_CE -DARM_PROCESSOR C_COMPILER_FLAGS=$(C_COMPILER_FLAGS) /Fc LINKER_FLAGS=$(LINKER_FLAGS) -MAP RCNOFONTMAP=1 DRIVER_ALIGNMENT=0x200 CDEFINES=$(CDEFINES) -DNDIS_MINIPORT_DRIVER -DCS8900 INCLUDES= / $(_TARGETPLATROOT)/SRC/inc;/ $(_WINCEROOT)/PUBLIC/COMMON/SDK/INC;$(_WINCEROOT)/PUBLIC/COMMON/OAK/INC;$(_WINCEROOT)/PUBLIC/COMMON/DDK/INC; / $(_TARGETPLATROOT)/SRC/COMMON/S3C2410X/INC SOURCES= miniport.c/ interrup.c/ cs8900.c/ wince.c
2.BSPIntrInit
GEC2410的网卡中断引脚连接在IRQ_EINT9上,因此在BSPIntrInit中进行相应引脚的初始化,这部分代码SMDK2410中已经实现,我们只需要将IRQ_EINT9与SYSINTR_ETHERNET映射.代码如下:
// Then get virtual address for IO port pOalPortRegs = OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT, FALSE); // Set GPG1 as EINT9 value = INREG32(&pOalPortRegs->GPGCON); OUTREG32(&pOalPortRegs->GPGCON, (value & ~(3 << 2))|(2 << 2)); // Disable pullup value = INREG32(&pOalPortRegs->GPGUP); OUTREG32(&pOalPortRegs->GPGUP, value | (1 << 1)); // High level interrupt value = INREG32(&pOalPortRegs->EXTINT1); OUTREG32(&pOalPortRegs->EXTINT1, (value & ~(0xf << 4))|(0x1 << 4)); // Add static mapping for Built-In OHCI OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_USBH); // Add static mapping for CS8900 EINT9 OALIntrStaticTranslate(SYSINTR_ETHERNET, IRQ_EINT9);
其中SYSINTR_ETHERNET是逻辑中断号,我们需要在Bsp_cfg中定义:
#define SYSINTR_ETHERNET (SYSINTR_FIRMWARE+6) //0x16
其他的中断初始化及设置BSP都已经设置好,无需修改,具体实现在/WINCE500/PLATFORM/COMMON/SRC/ARM/SAMSUNG/S3C2410X/INTR/intr.c
3.注册表设置
首先使能BSP_NOCS8900(这里在GEC2410.bat设置set BSP_NOCS8900=0)
IF BSP_NOCS8900 !
; HIVE BOOT SECTION
;================= CS8900 =================
[HKEY_LOCAL_MACHINE/Drivers/CS8900]
"Dll"="ndis.dll"
"Prefix"="NDS"
"Miniport"="CS8900"
[HKEY_LOCAL_MACHINE/Comm/CS8900]
"DisplayName"="CS8900"
"Group"="NDIS"
"ImagePath"="CS8900.dll"
[HKEY_LOCAL_MACHINE/Comm/CS8900/Linkage]
"Route"=multi_sz:"CS89001"
[HKEY_LOCAL_MACHINE/Comm/CS89001]
"DisplayName"="CS8900"
"Group"="NDIS"
"ImagePath"="CS8900.dll"
[HKEY_LOCAL_MACHINE/Comm/CS89001/Parms]
"BusNumber"=dword:0
"BusType"=dword:0
"Sysintr"=dword:16 ;对应于SYSINTR_ETHERNET
"DuplexMode"=dword:1
"IoBaseAddress"=dword:A7000300
"Transceiver"=dword:3
"CardType"=dword:1
[HKEY_LOCAL_MACHINE/Comm/CS89001/Parms/TcpIp]
;这里使用静态IP的设置
"EnableDHCP"=dword:0
"DefaultGateway"="192.168.1.1"
"LLInterface"=""
"UseZeroBroadcast"=dword:0
"IpAddress"="192.168.1.10"
"Subnetmask"="255.255.255.0"
"DNS"="192.168.1.1"
[HKEY_LOCAL_MACHINE/Comm/Tcpip/Linkage]
"Bind"="CS89001"
;============= End of CS8900 =================
; END HIVE BOOT SECTION
ENDIF BSP_NOCS8900 !
有了这些设置在控制面板的网络配置里就可以看到CS89001的网卡图标了,就可以像在windows里一样进行网络配置了.同时用HIVE标记,这样所做的配置修改就可以保存了.
4.添加组件
NDIS组件,TCPIP协议栈,当然LAN的支持也是必须的,同时要去除KITL的支持,否则会发生冲突.
下一篇来详细分析下这个CS8900 NDIS Miniport driver