【转载】WinCE Eboot中的网络函数

转载自:http://blog.csdn.net/nanjianhui/archive/2008/11/21/3344247.aspx


一般使用EBOOT下载WinCE image都是通过网络,就是指以太网,当然也有通过USB下载的,不过网络下载是最常用的了。实际上下载的工作是在BLCOMMON模块中完成的,它会调用OEMReadData函数来下载数据,OEMReadData由用户来实现,一般如果是网络下载,都会在OEMReadData中直接调用EbootEtherReadData函数来从网络读取数据,该函数由微软实现,这个函数会再调用OEMEthGetFrame函数从网卡读取数据,这个函数是要用户根据自己使用的网卡芯片实现的网卡驱动部分。

不知道我上面说明白了没有,实际上在EBOOT中,BLCOMMON是最上层,为了实现下载,我们需要实现相关的OEM下载函数,而这些OEM函数会调用WinCE提供的网络函数,这些函数在”\WINCE600\public\common\oak\drivers\ethdbg\eboot”下面,这个目录下面的代码会被编译成eboot.lib的库,用于提供一个小的TCP/IP协议栈和TFTP服务。Eboot.lib会调用底层的网卡驱动函数实现网卡上的数据传输,而底层的网卡驱动函数实际上还是一些OEM函数要用户来实现的。

先来介绍一下EBOOT下载的相关OEM函数:

1. LPBYTE OEMMapMemAddr(DWORD dwImageStart, DWORD dwAddr)

该函数主要做Flash到RAM的地址影射。WinCE image在下载的时候是边下载边写入的,由于写入Flash速度慢,可能会影响到下载,所以该函数实现了一个RAM的缓冲区,就是将Flash地址映射到RAM中,这样下载的数据先被放在RAM缓冲区中,然后再写入Flash里面。该函数会被OEMWriteFlash调用。dwImageStart为被写入的WinCE image在Flash中的起始地址,dwAddr为被写入的Bin文件的起始地址,返回值为映射后的RAM中的地址。

2. BOOL OEMReadData(DWORD cbData, LPBYTE pbData)

该函数在下载WinCE image的时候用于读取下载数据,一般网络下载,在该函数中直接调用EbootEtherReadData函数即可。当然,也可以在该函数中添加其他的读写方式,比如从SD卡中读取。cbData为要读取的字节数,pbData是一个Buffer,返回TRUE为成功。

3. void OEMShowProgress(DWORD dwPacketNum)

该函数用于显示下载进度,主要是给用户一个信息。可以在该函数里面打印串口信息或者操作LED来告诉用户当前下载的状态。dwPacketNum为当前已经下载的packet数。

下面来介绍一下网络控制函数:

1. BOOL EbootEtherReadData(DWORD cbData, LPBYTE pbData)

从网络上读取数据,它会被OEMReadData调用,cbData为要读取的字节数,pbData是一个Buffer,返回TRUE为成功。

2. BOOL EbootInitEtherTransport( EDBG_ADDR* pEdbgAddr, LPDWORD pdwSubnetMask, BOOL* pfJumping, DWORD* pdwDHCPLeaseTime, UCHAR VersionMajor, UCHAR VersionMinor, char* szPlatformString, char* szDeviceName, UCHAR CPUId, DWORD dwBootFlags)

该函数用于初始化网络传输,它会被OEMPreDownload函数调用。pEdbgAddr为一个网卡地址结构,其中包括IP地址,MAC地址和端口号。pdwSubnetMask为子网掩码。pfJumping为跳转标记,用于决定是下载还是直接跳转执行。pdwDHCPLeaseTime为DHCP的延续时间。VersionMajor和VersionMinor为版本号。szPlatformString为平台名称。szDeviceName为设备名称,在下载的时候会在Platform Builder中显示。CPUId为处理器的Id。dwBootFlags应设置为0。

3. EDBG_OS_CONFIG_DATA* EbootWaitForHostConnect(EDBG_ADDR* pDevAddr, EDBG_ADDR* pHostAddr)

该函数用于等待PC端的Platform Builder的连接,并接收用于相关服务的IP地址和端口号的信息,也包括KITL标记位,该函数会被OEMLaunch函数调用。pDevAddr为设备端的地址信息,包括IP地址,MAC地址和端口号。pHostAddr为Host端的地址信息,包括IP地址,MAC地址和端口号。返回的是一个EDBG_OS_CONFIG_DATA结构,其中包含各个服务的地址信息配置和用户设置等信息。

下面介绍一下实现网卡驱动的OEM函数:

1. BOOL OEMEthSendFrame(BYTE* pData, DWORD dwLength)

该函数用于发送一帧数据,它会被eboot.lib调用来发送数据到网卡上。pData为数据buffer,dwLength为长度。返回TRUE为成功。

2. BOOL OEMEthGetFrame(BYTE* pData, UINT16* pwLength)

该函数用于接收一帧数据,它会被eboot.lib调用来接收网卡上的数据。pData为数据buffer,dwLength为长度。返回TRUE为成功。

WinCE为网卡驱动提供了一个模板,一般开发EBOOT中的网卡驱动都会按照该模板来封装相关的函数,具体网卡驱动函数模板定义如下:

PFN_EDBG_INIT               pfnEDbgInit;             //初始化网卡 
PFN_EDBG_ENABLE_INTS        pfnEDbgEnableInts;       //打开网卡中断 
PFN_EDBG_DISABLE_INTS       pfnEDbgDisableInts;      //禁用网卡中断 
PFN_EDBG_GET_PENDING_INTS   pfnEDbgGetPendingInts;   //读网卡中断标记 
PFN_EDBG_GET_FRAME          pfnEDbgGetFrame;         //接收一帧数据 
PFN_EDBG_SEND_FRAME         pfnEDbgSendFrame;        //发送一帧数据 
PFN_EDBG_READ_EEPROM        pfnEDbgReadEEPROM;       //读网卡外接的eeprom 
PFN_EDBG_WRITE_EEPROM       pfnEDbgWriteEEPROM;      //写网卡外接的eeprom

上述定义可以在halether.h文件中找到,就是一些函数指针,当然还有一些没有列出,那些用于支持KITL,这里不做介绍。一般在EBOOT中网卡驱动在ether.c文件中实现,根据需要实现上述模板中的相关的实体函数。实际上OEMEthSendFrame和OEMEthGetFrame可以直接调用pfnEdbgSendFrame和pfnEdbgGetFrame两个函数指针指向的函数,目前在大多数BSP中也是这样实现的。pfnEdbgInit所指向的函数用于初始化网卡一般会在OEMPlatformInit中被调用。

posted @ 2010-12-22 10:26  风雨雪夜  阅读(177)  评论(0编辑  收藏  举报