WinCE Eboot中的网络函数

作者:ARM-WinCE

一般使用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)

该函数主要做FlashRAM的地址影射。WinCE image在下载的时候是边下载边写入的,由于写入Flash速度慢,可能会影响到下载,所以该函数实现了一个RAM的缓冲区,就是将Flash地址映射到RAM中,这样下载的数据先被放在RAM缓冲区中,然后再写入Flash里面。该函数会被OEMWriteFlash调用。dwImageStart为被写入的WinCE imageFlash中的起始地址,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)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

从网络上读取数据,它会被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为跳转标记,用于决定是下载还是直接跳转执行。pdwDHCPLeaseTimeDHCP的延续时间。VersionMajorVersionMinor为版本号。szPlatformString为平台名称。szDeviceName为设备名称,在下载的时候会在Platform Builder中显示。CPUId为处理器的IddwBootFlags应设置为0

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

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

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

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

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

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

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

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

  1. PFN_EDBG_INITpfnEDbgInit;//初始化网卡
  2. PFN_EDBG_ENABLE_INTSpfnEDbgEnableInts;//打开网卡中断
  3. PFN_EDBG_DISABLE_INTSpfnEDbgDisableInts;//禁用网卡中断
  4. PFN_EDBG_GET_PENDING_INTSpfnEDbgGetPendingInts;//读网卡中断标记
  5. PFN_EDBG_GET_FRAMEpfnEDbgGetFrame;//接收一帧数据
  6. PFN_EDBG_SEND_FRAMEpfnEDbgSendFrame;//发送一帧数据
  7. PFN_EDBG_READ_EEPROMpfnEDbgReadEEPROM;//读网卡外接的eeprom
  8. PFN_EDBG_WRITE_EEPROMpfnEDbgWriteEEPROM;//写网卡外接的eeprom

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

你可能感兴趣的:(数据结构,网络协议,Flash,Office,WinCE)