原创 WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(14)-移植CS8900

2011-4-6 17:46 1679 3 3 分类: MCU/ 嵌入式

还有一个没有实现的重要驱动就是网卡驱动了,在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文件:

  1. TARGETNAME=cs8900  
  2. WINCEOEM=1  
  3.   
  4. RELEASETYPE=PLATFORM  
  5. TARGETTYPE=DYNLINK  
  6.   
  7. DLLENTRY=DllEntry  
  8.   
  9. MSC_OPTIMIZATION=/Ox /Fc  
  10.   
  11. TARGETLIBS=                                                     \  
  12.    $(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\ndis.lib      \  
  13.    $(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\ntcompat.lib  \  
  14.    $(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\coredll.lib \  
  15.    $(_PROJECTROOT)\cesysgen\oak\lib\$(_CPUINDPATH)\ceddk.lib   \  
  16.      
  17. DEFINES=$(CDEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS40_MINIPORT -DWIN_CE -DARM_PROCESSOR   
  18.   
  19.   
  20. C_COMPILER_FLAGS=$(C_COMPILER_FLAGS) /Fc  
  21. LINKER_FLAGS=$(LINKER_FLAGS) -MAP  
  22.   
  23. RCNOFONTMAP=1  
  24.   
  25. DRIVER_ALIGNMENT=0x200  
  26.   
  27. CDEFINES=$(CDEFINES) -DNDIS_MINIPORT_DRIVER -DCS8900  
  28.   
  29. INCLUDES= \  
  30.   $(_TARGETPLATROOT)\SRC\inc;\  
  31.   $(_WINCEROOT)\PUBLIC\COMMON\SDK\INC;$(_WINCEROOT)\PUBLIC\COMMON\OAK\INC;$(_WINCEROOT)\PUBLIC\COMMON\DDK\INC; \  
  32.   $(_TARGETPLATROOT)\SRC\COMMON\S3C2410X\INC  
  33.     
  34. SOURCES= miniport.c\  
  35.          interrup.c\  
  36.          cs8900.c\  
  37.          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映射.代码如下:
  1. // Then get virtual address for IO port  
  2. pOalPortRegs = OALPAtoVA(S3C2410X_BASE_REG_PA_IOPORT, FALSE);  
  3. // Set GPG1 as EINT9  
  4. value = INREG32(&pOalPortRegs->GPGCON);  
  5. OUTREG32(&pOalPortRegs->GPGCON, (value & ~(3 << 2))|(2 << 2));  
  6. // Disable pullup  
  7. value = INREG32(&pOalPortRegs->GPGUP);  
  8. OUTREG32(&pOalPortRegs->GPGUP, value | (1 << 1));  
  9. // High level interrupt  
  10. value = INREG32(&pOalPortRegs->EXTINT1);  
  11. OUTREG32(&pOalPortRegs->EXTINT1, (value & ~(0xf << 4))|(0x1 << 4));  
  12. // Add static mapping for Built-In OHCI   
  13. OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_USBH);  
  14. // Add static mapping for CS8900 EINT9  
  15. 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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条