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)

从网络上读取数据,它会被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_INIT               pfnEDbgInit;             //初始化网卡
  2. PFN_EDBG_ENABLE_INTS        pfnEDbgEnableInts;       //打开网卡中断
  3. PFN_EDBG_DISABLE_INTS       pfnEDbgDisableInts;      //禁用网卡中断
  4. PFN_EDBG_GET_PENDING_INTS   pfnEDbgGetPendingInts;   //读网卡中断标记
  5. PFN_EDBG_GET_FRAME          pfnEDbgGetFrame;         //接收一帧数据
  6. PFN_EDBG_SEND_FRAME         pfnEDbgSendFrame;        //发送一帧数据
  7. PFN_EDBG_READ_EEPROM        pfnEDbgReadEEPROM;       //读网卡外接的eeprom
  8. PFN_EDBG_WRITE_EEPROM       pfnEDbgWriteEEPROM;      //写网卡外接的eeprom

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值