还有一个没有实现的重要驱动就是网卡驱动了,在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
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映射.代码如下:
-
- pOalPortRegs = OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT, FALSE);
-
- value = INREG32(&pOalPortRegs->GPGCON);
- OUTREG32(&pOalPortRegs->GPGCON, (value & ~(3 << 2))|(2 << 2));
-
- value = INREG32(&pOalPortRegs->GPGUP);
- OUTREG32(&pOalPortRegs->GPGUP, value | (1 << 1));
-
- value = INREG32(&pOalPortRegs->EXTINT1);
- OUTREG32(&pOalPortRegs->EXTINT1, (value & ~(0xf << 4))|(0x1 << 4));
-
- OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_USBH);
-
- OALIntrStaticTranslate(SYSINTR_ETHERNET, IRQ_EINT9);
// 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
文章评论(0条评论)
登录后参与讨论