simulator.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:9k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /* ++
  12.     Bootloader test app to debug as an app
  13. -- */
  14. #include <windows.h>
  15. #include <pcireg.h>
  16. #include <ethdbg.h>
  17. #include <drv_glob.h>
  18. #include <nkintr.h>
  19. #include <pehdr.h>
  20. #include <romldr.h>
  21. #include <blcommon.h>
  22. #include <bootpart.h>
  23. #include "s2440.h"
  24. #include "loader.h"
  25. #include "warning.h"
  26. extern void main (void);
  27. DWORD OEMAddressTable[1];
  28. WCHAR wcImageName[256] = _T("\Release\nk.bin");
  29. //WCHAR wcImageName[256] = _T("\Release\eboot.bin");
  30. HANDLE  hFile = INVALID_HANDLE_VALUE;
  31. //PUINT16 g_pwReadBuf = NULL;
  32. PUCHAR  g_pucReadBuf = NULL;
  33. PUCHAR  g_pucReadBufBase = NULL;
  34. DWORD   g_dwFileSize = 0;
  35. DWORD   g_dwBytesRead = 0;
  36. BOOL    g_bMode;
  37. const DWORD c_SegmentSize =  0xFFFF; // 64 kb
  38. //const DWORD c_SegmentSize =  0xFFFF*2; // 128 kb
  39. // Use for 64-bit math
  40. ULARGE_INTEGER g_FilePointer = {
  41. 0, // low
  42. 0  // high
  43. };
  44. void CleanExit(DWORD dwExitCode);
  45. void
  46. ExeMain(
  47.     void
  48.     )
  49. {
  50.     DWORD dwFileSize=0, dwBytesRead=0, dwErr=0;
  51.     // we are testing bootloader code, so...
  52.     g_bMode = SetKMode(TRUE);
  53.     /* ++
  54.     Open & read image into local buffer.
  55.     To set this up you need to either
  56.         a) use the Release facility in CE.NET
  57.         b) s ppshcopy ppsh:nk.bin 
  58.     You can also use ActiveSync, network, etc. to get your image onto the device's
  59.     filesystem. The caveat of dragging large images to the deivce is lack of SDRAM.
  60.     Use method a) if possible.
  61.     -- */
  62.     if (!wcImageName[0])
  63.         return;
  64.     RETAILMSG(1, (TEXT("rnrn++++++++++++++++++++++++++++++++++++++++++++++++++++++++n")));
  65.     RETAILMSG(1, (TEXT("Microsoft Windows CE Catfish Eboot Simulator n")));
  66.     RETAILMSG(1, (TEXT("Opening image: '%s' n"), wcImageName));
  67.     hFile = CreateFile(wcImageName,
  68.                    GENERIC_READ,
  69.                    0, // exclusive access
  70.                    NULL,
  71.                    OPEN_EXISTING,
  72.                    0, 0);
  73.     if (hFile == INVALID_HANDLE_VALUE ) {
  74.         RETAILMSG(1, (TEXT("CreateFile ERROR:%d on file:%sn"), GetLastError(), wcImageName));
  75.         goto _Error;
  76.     }
  77.     dwFileSize = GetFileSize(hFile, NULL);
  78.     if (!dwFileSize || dwFileSize == 0xFFFFFFFF) {
  79.         RETAILMSG(1, (TEXT("GetFileSize(%u) ERROR: %dn"), dwFileSize, GetLastError()));
  80.         goto _Error;
  81.     }
  82.     RETAILMSG(1, (TEXT("Image size: %u n"), dwFileSize));
  83.     g_dwFileSize = dwFileSize;
  84.     // we read a page at time to handle large files
  85.     g_pucReadBufBase = (PUCHAR)LocalAlloc(LPTR, c_SegmentSize);
  86.     if ( !g_pucReadBufBase ) {
  87.         RETAILMSG(1, (TEXT("LocalAlloc ERROR:%d for %d bytesn"), GetLastError(), c_SegmentSize));
  88.         goto _Error;
  89.     }
  90.     g_pucReadBuf = g_pucReadBufBase;
  91. #if 0
  92.     // pre-fetch the first segment, #0
  93.     b = ReadFile(hFile, g_pucReadBufBase, c_SegmentSize, &dwBytesRead, NULL);
  94.     if ( !b || !dwBytesRead) {
  95.         RETAILMSG(1, (TEXT("ReadFile ERROR:%d on file:%s, %u bytes readn"), GetLastError(), wcImageName, dwBytesRead));
  96.         goto _Error;
  97.     }
  98.     if ( dwBytesRead < min(dwFileSize, c_SegmentSize) ) {
  99.         RETAILMSG(1, (TEXT("ReadFile ERROR:%u bytes read, expected: %un"), dwBytesRead, min(dwFileSize, c_SegmentSize)));
  100.         goto _Error;
  101.     }
  102. #endif
  103.     __try {
  104.         main();
  105.     } __except(EXCEPTION_EXECUTE_HANDLER) {
  106.         RETAILMSG(1, (TEXT("*** EBoot Simulator: EXCEPTION: 0x%x ***n"), GetExceptionCode()));
  107.     }
  108. _Error:
  109.     // working case should never get here
  110.     CleanExit(1);
  111. }
  112. void CleanExit(DWORD dwExitCode)
  113. {
  114.     if (dwExitCode) {
  115.         RETAILMSG(1, (_T("*** EBoot CleanExit ERROR: %u ***n"), dwExitCode ));
  116.     }
  117.     if (hFile != INVALID_HANDLE_VALUE)
  118.         CloseHandle(hFile);
  119.     if (g_pucReadBufBase)
  120.         LocalFree(g_pucReadBufBase);
  121.     SetKMode(g_bMode);
  122.     RETAILMSG(1, (_T("*** EBoot Simulator Complete on '%s', Result: %s ***n"),
  123.         wcImageName, dwExitCode ? _T("FAILED") : _T("PASSED")));
  124.     RETAILMSG(1, (_T("--------------------------------------------------------n")));
  125.     exit(dwExitCode);
  126. }
  127. void Launch(unsigned int dwLaunchAddr)
  128. {
  129.     RETAILMSG(1, (_T("*** EBoot Simulator: Launch: 0x%X ***n"), dwLaunchAddr));
  130.     CleanExit(ERROR_SUCCESS);
  131. }
  132. //
  133. // Functions to simulate Ethernet download
  134. //
  135. static BYTE volatile *pbEthernetBase=(BYTE *)SMC_ETHERNET_IO_BASE_U_VIRTUAL;
  136. #define READ_PORT_USHORT(port)         (*(volatile PUSHORT const)(port))
  137. #define WRITE_PORT_USHORT(port, value) (*(volatile PUSHORT const)(port) = value)
  138. static __inline USHORT ReadWord( USHORT wOffset )
  139. {
  140. return READ_PORT_USHORT((PUSHORT)(pbEthernetBase + (wOffset)));
  141. };
  142. static __inline VOID WriteWord( USHORT wOffset, USHORT Value )
  143. {
  144.     WRITE_PORT_USHORT((PUSHORT)(pbEthernetBase + (wOffset)),(USHORT)(Value));
  145. };
  146. BOOL SMCInit(BYTE *pbBaseAddress, DWORD dwMultiplier, USHORT MacAddr[3] )
  147. {
  148.     // just get the MAC addr
  149.     #define BANKSEL_REG     14
  150.     #define BANK1           0x3301
  151.     #define MACADDR_REG0 4
  152.     #define MACADDR_REG1 6
  153.     #define MACADDR_REG2 8
  154.     WriteWord( BANKSEL_REG, BANK1 );
  155. MacAddr[0] = ReadWord( MACADDR_REG0 );
  156.     MacAddr[1] = ReadWord( MACADDR_REG1 );
  157.     MacAddr[2] = ReadWord( MACADDR_REG2 );
  158.     return TRUE;
  159. }
  160. UINT16 SMCSendFrame( BYTE *pbData, DWORD dwLength )
  161. {
  162.     RETAILMSG(1, (_T("vSMCSendFramen")));
  163.     return 0; // success
  164. }
  165. //
  166. // SMCGetFrame: simulated SMC.LIB function.
  167. // Gets frames from the NIC by reading from our buffer.
  168. // returns number of bytes read.
  169. //
  170. UINT16 SMCGetFrame( BYTE *pbData, UINT16 *pwLength )
  171. {
  172.     static DWORD dwSegment = 0;
  173.     DWORD dwBytesRead=0;
  174.     DWORD dwRemain = 0;
  175.     PUCHAR pucData;
  176.     WORD wBufLen;
  177.     BOOL b;
  178.     if ( !g_pucReadBufBase )
  179.         return 0;
  180.     if (!pbData || !pwLength || !*pwLength) {
  181.         RETAILMSG(1, (_T("!!! SMCGetFrame ERROR: no user buffer !!!n")));
  182.         DebugBreak();
  183.         return 0;
  184.     }
  185.     pucData = pbData;
  186.     wBufLen = *pwLength;
  187.     RETAILMSG(1, (_T("SMCGetFrame: Length:%un"), wBufLen));
  188.     __try {
  189.         while ( (g_dwBytesRead <= g_dwFileSize) && wBufLen && pbData)
  190.         {
  191.             // fetch next file segment?
  192.             if ( (g_dwBytesRead % c_SegmentSize) == 0)
  193.             {
  194.                 dwRemain = g_dwFileSize - g_dwBytesRead;
  195.                 RETAILMSG(1, (TEXT("Read: %u bytes so far, %u bytes remain. Fetching file segment %u n"),
  196.                     g_dwBytesRead, dwRemain, dwSegment++));
  197.                 // fetch it
  198.                 b = ReadFile(hFile, g_pucReadBufBase, c_SegmentSize, &dwBytesRead, NULL);
  199.                 if ( !b ) {
  200.                     RETAILMSG(1, (TEXT("ReadFile ERROR:%d on image:'%s', %u bytes readn"),
  201.                         GetLastError(), wcImageName, dwBytesRead));
  202.                     DebugBreak();
  203.                     return 0; // terminate download
  204.                 }
  205.                 RETAILMSG(1, (TEXT("ReadFile: returned %u bytes, expected: %un"),
  206.                     dwBytesRead, min(dwRemain, c_SegmentSize)));
  207.                 if ( dwBytesRead < min(dwRemain, c_SegmentSize) ) {
  208.                     RETAILMSG(1, (TEXT("ReadFile WARNING: %u bytes read, expected: %un"),
  209.                         dwBytesRead, min(dwRemain, c_SegmentSize)));
  210.                     DebugBreak();
  211.                 }
  212.                 // reset worker pointer
  213.                 g_pucReadBuf = g_pucReadBufBase;
  214.             }
  215.             // read from our local file buffer
  216.             *pucData++ = *g_pucReadBuf++;
  217.             // bump counters
  218.             wBufLen--;
  219.             g_dwBytesRead++;
  220.         }
  221.     } __except(EXCEPTION_EXECUTE_HANDLER) {
  222.         RETAILMSG(1, (TEXT("*** EBoot Simulator: SMCGetFrame EXCEPTION: 0x%x ***n"),
  223.             GetExceptionCode()));
  224.     }
  225.     return (g_dwBytesRead <= g_dwFileSize ? 1 : 0);
  226. }
  227. //
  228. // EbootEtherReadData: simluated EBOOT.LIB function.
  229. // Handles large buffer requests for SMCGetFrame.
  230. // Note SMCGetFrame only handles UINT16 lengths.
  231. //
  232. BOOL EbootEtherReadData (DWORD cbData, LPBYTE pbData)
  233. {
  234.     UINT16 wLength;
  235.     while (cbData) {
  236.         wLength = (cbData > 0xFFFF) ? 0xFFFF : (UINT16)cbData;
  237.         if ( !SMCGetFrame(pbData, &wLength) )
  238.             return FALSE;
  239.         cbData -= wLength;
  240.         pbData += wLength;
  241.     }
  242.     return TRUE;
  243. }