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

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. #include <windows.h>
  12. #include <halether.h>
  13. #include <s2440.h>
  14. #include "loader.h"
  15. #include <drv_glob.h>
  16. #define FROM_BCD(n) ((((n) >> 4) * 10) + ((n) & 0xf))
  17. #define TO_BCD(n)       ((((n) / 10) << 4) | ((n) % 10))
  18. extern PDRIVER_GLOBALS pDriverGlobals;
  19. //
  20. // Function pointers to the support library functions of the currently installed debug ethernet controller.
  21. //
  22. PFN_EDBG_INIT             pfnEDbgInit;
  23. PFN_EDBG_ENABLE_INTS      pfnEDbgEnableInts;
  24. PFN_EDBG_DISABLE_INTS     pfnEDbgDisableInts;
  25. PFN_EDBG_GET_PENDING_INTS pfnEDbgGetPendingInts;
  26. PFN_EDBG_GET_FRAME        pfnEDbgGetFrame;
  27. PFN_EDBG_SEND_FRAME       pfnEDbgSendFrame;
  28. PFN_EDBG_READ_EEPROM      pfnEDbgReadEEPROM;
  29. PFN_EDBG_WRITE_EEPROM     pfnEDbgWriteEEPROM;
  30. PFN_EDBG_SET_OPTIONS      pfnEDbgSetOptions;
  31. BOOL    CS8900DBG_Init(PBYTE iobase, DWORD membase, USHORT MacAddr[3]);
  32. UINT16  CS8900DBG_GetFrame(PBYTE pbData, UINT16 *pwLength);
  33. UINT16  CS8900DBG_SendFrame(PBYTE pbData, DWORD dwLength);
  34. /*
  35.     @func   BOOL | InitEthDevice | Initializes the Ethernet device to be used for download.
  36.     @rdesc  TRUE = Success, FALSE = Failure.
  37.     @comm    
  38.     @xref   
  39. */
  40. BOOL InitEthDevice(PBOOT_CFG  pBootCfg)
  41. {
  42. USHORT wMAC[3];
  43. PBYTE  pBaseIOAddress = NULL;
  44. DWORD  dwMultiplier = 0;
  45.  
  46. // Boot CS8900.
  47. //
  48. if (!pBaseIOAddress)
  49. {
  50. // Use the MAC address programmed into flash by the user.
  51. //
  52. memcpy(wMAC, pBootCfg->EdbgAddr.wMAC, 6);
  53.   
  54.     pfnEDbgInit      = CS8900DBG_Init;
  55.     pfnEDbgGetFrame  = CS8900DBG_GetFrame;
  56.     pfnEDbgSendFrame = CS8900DBG_SendFrame;
  57. pBaseIOAddress  = (PBYTE)CS8900DBG_IOBASE;
  58. dwMultiplier    = CS8900DBG_MEMBASE;
  59. memcpy(pDriverGlobals->eth.TargetAddr.wMAC, pBootCfg->EdbgAddr.wMAC, 6);
  60. pDriverGlobals->misc.EbootDevice = (UCHAR)DOWNLOAD_DEVICE_CS8900; 
  61. }
  62.     // Initialize the built-in Ethenet controller.
  63.     //
  64.     if (!pfnEDbgInit((PBYTE)pBaseIOAddress, dwMultiplier, wMAC))
  65.     {
  66.         EdbgOutputDebugString("ERROR: InitEthDevice: Failed to initialize Ethernet controller.rn");
  67.         return(FALSE);
  68.     }
  69.     // Make sure MAC address has been programmed.
  70. //
  71.     if (!wMAC[0] && !wMAC[1] && !wMAC[2])
  72. {
  73.         EdbgOutputDebugString("ERROR: InitEthDevice: Invalid MAC address read from NIC.rn");
  74.         return(FALSE);
  75.     }
  76.     memcpy(&pDriverGlobals->eth.TargetAddr.wMAC, &wMAC, (3 * sizeof(USHORT)));
  77. return(TRUE);
  78. }
  79. /*
  80.     @func   BOOL | OEMGetRealTime | Returns the current wall-clock time from the RTC.
  81.     @rdesc  TRUE = Success, FALSE = Failure.
  82.     @comm    
  83.     @xref   
  84. */
  85. static BOOL OEMGetRealTime(LPSYSTEMTIME lpst) 
  86. {
  87. volatile RTCreg *s2440RTC = (RTCreg *)RTC_BASE;
  88. do
  89. {
  90. lpst->wYear = FROM_BCD(s2440RTC->rBCDYEAR) + 2000 ;
  91. lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON   & 0x1f);
  92. lpst->wDay = FROM_BCD(s2440RTC->rBCDDAY   & 0x3f);
  93. lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);
  94. lpst->wHour = FROM_BCD(s2440RTC->rBCDHOUR  & 0x3f);
  95. lpst->wMinute = FROM_BCD(s2440RTC->rBCDMIN   & 0x7f);
  96. lpst->wSecond = FROM_BCD(s2440RTC->rBCDSEC   & 0x7f);
  97. lpst->wMilliseconds = 0;
  98. }
  99. while(!(lpst->wSecond));
  100. return(TRUE);
  101. }
  102. /*
  103.     @func   DWORD | OEMEthGetSecs | Returns a free-running seconds count.
  104.     @rdesc  Number of elapsed seconds since last roll-over.
  105.     @comm    
  106.     @xref   
  107. */
  108. DWORD OEMEthGetSecs(void)
  109. {
  110.     SYSTEMTIME sTime;
  111.     OEMGetRealTime(&sTime);
  112.     return((60UL * (60UL * (24UL * (31UL * sTime.wMonth + sTime.wDay) + sTime.wHour) + sTime.wMinute)) + sTime.wSecond);
  113. }
  114. /*
  115.     @func   BOOL | OEMEthGetFrame | Reads data from the Ethernet device.
  116.     @rdesc  TRUE = Success, FALSE = Failure.
  117.     @comm    
  118.     @xref   
  119. */
  120. BOOL OEMEthGetFrame(PUCHAR pData, PUSHORT pwLength)
  121. {
  122.     return pfnEDbgGetFrame(pData, pwLength);
  123. }
  124. /*
  125.     @func   BOOL | OEMEthSendFrame | Writes data to an Ethernet device.
  126.     @rdesc  TRUE = Success, FALSE = Failure.
  127.     @comm    
  128.     @xref   
  129. */
  130. BOOL OEMEthSendFrame(PUCHAR pData, DWORD dwLength)
  131. {
  132.     BYTE Retries = 0;
  133.     while(Retries++ < 4)
  134.     {
  135.         if (!pfnEDbgSendFrame(pData, dwLength))
  136.                 return(TRUE);
  137.         EdbgOutputDebugString("INFO: OEMEthSendFrame: retrying send (%u)rn", Retries);
  138.     }
  139.     return(FALSE);
  140. }