一般使用EBOOT下載WinCE image都是通過(guò)網(wǎng)絡(luò),,就是指以太網(wǎng),,當(dāng)然也有通過(guò)USB下載的,不過(guò)網(wǎng)絡(luò)下載是最常用的了,。實(shí)際上下載的工作是在BLCOMMON模塊中完成的,,它會(huì)調(diào)用OEMReadData函數(shù)來(lái)下載數(shù)據(jù),OEMReadData由用戶來(lái)實(shí)現(xiàn),,一般如果是網(wǎng)絡(luò)下載,,都會(huì)在OEMReadData中直接調(diào)用EbootEtherReadData函數(shù)來(lái)從網(wǎng)絡(luò)讀取數(shù)據(jù),該函數(shù)由微軟實(shí)現(xiàn),,這個(gè)函數(shù)會(huì)再調(diào)用OEMEthGetFrame函數(shù)從網(wǎng)卡讀取數(shù)據(jù),,這個(gè)函數(shù)是要用戶根據(jù)自己使用的網(wǎng)卡芯片實(shí)現(xiàn)的網(wǎng)卡驅(qū)動(dòng)部分。http://blog.csdn.net/nanjianhui/archive/2008/11/21/3344247.aspx 不知道我上面說(shuō)明白了沒(méi)有,,實(shí)際上在EBOOT中,,BLCOMMON是最上層,為了實(shí)現(xiàn)下載,,我們需要實(shí)現(xiàn)相關(guān)的OEM下載函數(shù),,而這些OEM函數(shù)會(huì)調(diào)用WinCE提供的網(wǎng)絡(luò)函數(shù),這些函數(shù)在”\WINCE600\public\common\oak\drivers\ethdbg\eboot”下面,,這個(gè)目錄下面的代碼會(huì)被編譯成eboot.lib的庫(kù),,用于提供一個(gè)小的TCP/IP協(xié)議棧和TFTP服務(wù)。Eboot.lib會(huì)調(diào)用底層的網(wǎng)卡驅(qū)動(dòng)函數(shù)實(shí)現(xiàn)網(wǎng)卡上的數(shù)據(jù)傳輸,,而底層的網(wǎng)卡驅(qū)動(dòng)函數(shù)實(shí)際上還是一些OEM函數(shù)要用戶來(lái)實(shí)現(xiàn)的,。 先來(lái)介紹一下EBOOT下載的相關(guān)OEM函數(shù): 1. LPBYTE OEMMapMemAddr(DWORD dwImageStart, DWORD dwAddr) 該函數(shù)主要做Flash到RAM的地址影射。WinCE image在下載的時(shí)候是邊下載邊寫入的,,由于寫入Flash速度慢,,可能會(huì)影響到下載,,所以該函數(shù)實(shí)現(xiàn)了一個(gè)RAM的緩沖區(qū),就是將Flash地址映射到RAM中,,這樣下載的數(shù)據(jù)先被放在RAM緩沖區(qū)中,,然后再寫入Flash里面。該函數(shù)會(huì)被OEMWriteFlash調(diào)用,。dwImageStart為被寫入的WinCE image在Flash中的起始地址,,dwAddr為被寫入的Bin文件的起始地址,返回值為映射后的RAM中的地址,。 2. BOOL OEMReadData(DWORD cbData, LPBYTE pbData) 該函數(shù)在下載WinCE image的時(shí)候用于讀取下載數(shù)據(jù),,一般網(wǎng)絡(luò)下載,在該函數(shù)中直接調(diào)用EbootEtherReadData函數(shù)即可,。當(dāng)然,,也可以在該函數(shù)中添加其他的讀寫方式,比如從SD卡中讀取,。cbData為要讀取的字節(jié)數(shù),,pbData是一個(gè)Buffer,返回TRUE為成功,。 3. void OEMShowProgress(DWORD dwPacketNum) 該函數(shù)用于顯示下載進(jìn)度,,主要是給用戶一個(gè)信息??梢栽谠摵瘮?shù)里面打印串口信息或者操作LED來(lái)告訴用戶當(dāng)前下載的狀態(tài),。dwPacketNum為當(dāng)前已經(jīng)下載的packet數(shù)。 下面來(lái)介紹一下網(wǎng)絡(luò)控制函數(shù): 1. BOOL EbootEtherReadData(DWORD cbData, LPBYTE pbData) 從網(wǎng)絡(luò)上讀取數(shù)據(jù),,它會(huì)被OEMReadData調(diào)用,,cbData為要讀取的字節(jié)數(shù),pbData是一個(gè)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) 該函數(shù)用于初始化網(wǎng)絡(luò)傳輸,它會(huì)被OEMPreDownload函數(shù)調(diào)用,。pEdbgAddr為一個(gè)網(wǎng)卡地址結(jié)構(gòu),,其中包括IP地址,MAC地址和端口號(hào),。pdwSubnetMask為子網(wǎng)掩碼,。pfJumping為跳轉(zhuǎn)標(biāo)記,用于決定是下載還是直接跳轉(zhuǎn)執(zhí)行,。pdwDHCPLeaseTime為DHCP的延續(xù)時(shí)間,。VersionMajor和VersionMinor為版本號(hào)。szPlatformString為平臺(tái)名稱,。szDeviceName為設(shè)備名稱,,在下載的時(shí)候會(huì)在Platform Builder中顯示。CPUId為處理器的Id,。dwBootFlags應(yīng)設(shè)置為0,。 3. EDBG_OS_CONFIG_DATA* EbootWaitForHostConnect(EDBG_ADDR* pDevAddr, EDBG_ADDR* pHostAddr) 該函數(shù)用于等待PC端的Platform Builder的連接,并接收用于相關(guān)服務(wù)的IP地址和端口號(hào)的信息,,也包括KITL標(biāo)記位,,該函數(shù)會(huì)被OEMLaunch函數(shù)調(diào)用。pDevAddr為設(shè)備端的地址信息,,包括IP地址,,MAC地址和端口號(hào)。pHostAddr為Host端的地址信息,,包括IP地址,,MAC地址和端口號(hào)。返回的是一個(gè)EDBG_OS_CONFIG_DATA結(jié)構(gòu),,其中包含各個(gè)服務(wù)的地址信息配置和用戶設(shè)置等信息,。 下面介紹一下實(shí)現(xiàn)網(wǎng)卡驅(qū)動(dòng)的OEM函數(shù): 1. BOOL OEMEthSendFrame(BYTE* pData, DWORD dwLength) 該函數(shù)用于發(fā)送一幀數(shù)據(jù),它會(huì)被eboot.lib調(diào)用來(lái)發(fā)送數(shù)據(jù)到網(wǎng)卡上,。pData為數(shù)據(jù)buffer,,dwLength為長(zhǎng)度。返回TRUE為成功,。 2. BOOL OEMEthGetFrame(BYTE* pData, UINT16* pwLength) 該函數(shù)用于接收一幀數(shù)據(jù),,它會(huì)被eboot.lib調(diào)用來(lái)接收網(wǎng)卡上的數(shù)據(jù)。pData為數(shù)據(jù)buffer,,dwLength為長(zhǎng)度,。返回TRUE為成功。 WinCE為網(wǎng)卡驅(qū)動(dòng)提供了一個(gè)模板,,一般開(kāi)發(fā)EBOOT中的網(wǎng)卡驅(qū)動(dòng)都會(huì)按照該模板來(lái)封裝相關(guān)的函數(shù),,具體網(wǎng)卡驅(qū)動(dòng)函數(shù)模板定義如下: PFN_EDBG_INIT pfnEDbgInit; //初始化網(wǎng)卡 上述定義可以在halether.h文件中找到,就是一些函數(shù)指針,,當(dāng)然還有一些沒(méi)有列出,,那些用于支持KITL,這里不做介紹,。一般在EBOOT中網(wǎng)卡驅(qū)動(dòng)在ether.c文件中實(shí)現(xiàn),,根據(jù)需要實(shí)現(xiàn)上述模板中的相關(guān)的實(shí)體函數(shù)。實(shí)際上OEMEthSendFrame和OEMEthGetFrame可以直接調(diào)用pfnEdbgSendFrame和pfnEdbgGetFrame兩個(gè)函數(shù)指針指向的函數(shù),,目前在大多數(shù)BSP中也是這樣實(shí)現(xiàn)的,。pfnEdbgInit所指向的函數(shù)用于初始化網(wǎng)卡一般會(huì)在OEMPlatformInit中被調(diào)用。 |
|