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

Windows CE

开发平台:

Windows_Unix

  1. /*++
  2. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. PARTICULAR PURPOSE.
  6. Copyright (c) 2001. Samsung Electronics, co. ltd  All rights reserved.
  7. Module Name:  
  8.     halkitl.c
  9.     
  10. Abstract:
  11.     Platform specific code for KITL services.
  12.     NOTE: this file is included from kernelbuildexekitlnokdkitlnokd.c, NOT
  13.           built as part of the hal.lib. The reason is to support dual build (KITL
  14.           and non-KITL). Once we have all the tools supporting KITL, we may
  15.           consider taking the original EDBG support out of the directory.
  16. rev:
  17. 2002.4.3 : First S3C2410 version (SOC)
  18. 2002.1.28 : CE.NET port (kwangyoon LEE, kwangyoon@samsung.com)
  19. Notes: 
  20. --*/
  21. #include <windows.h>
  22. #include <nkintr.h>
  23. #include <kitl.h>
  24. #include <halether.h>
  25. #include <kitlprot.h>
  26. #include <p2.h>
  27. #include <s2440.h>
  28. #define LOG(x)  KITLOutputDebugString("%s == 0x%xrn", #x, x)
  29. PKITLTRANSPORT gpKitl;
  30. //------------------------------------------------------------------------------
  31. //------------------------------------------------------------------------------
  32. static void
  33. itoa10(
  34.     int n,
  35.     char s[]
  36.     )
  37. {
  38.     int i = 0; 
  39.     // Get absolute value of number
  40.     unsigned int val = (unsigned int)((n < 0) ? -n : n);
  41.     // Extract digits in reverse order
  42.     do {
  43.         s[i++] = (val % 10) + '0';
  44.     } while (val /= 10);
  45.     // Add sign if number negative
  46.     if (n < 0) s[i++] = '-';
  47.     s[i--] = '';
  48.     // Reverse string
  49.     for (n = 0; n < i; n++, i--) {
  50.         char swap = s[n];
  51.         s[n] = s[i];
  52.         s[i] = swap;
  53.     }
  54. }
  55. //#define PLATFORM_STRING  "SMDK2410"
  56. #define PLATFORM_STRING  "SMDK2440"
  57. //------------------------------------------------------------------------------
  58. //------------------------------------------------------------------------------
  59. void
  60. CreateDeviceName(EDBG_ADDR *pMyAddr, char *szBuf)
  61. {
  62.     strcpy(szBuf,PLATFORM_STRING);
  63.     szBuf += strlen(szBuf);
  64.     itoa10(((pMyAddr->wMAC[2]>>8) | ((pMyAddr->wMAC[2] & 0x00ff) << 8)), szBuf);
  65. }
  66. void InitDebugEther(void)
  67. {
  68.     // Initialize KITL transport
  69.     if (KitlInit(TRUE)) {
  70.         KITLOutputDebugString ("KITL Initializedn");
  71.         // no longer need to start kernel services
  72.         // since KITL config message told us what to start and
  73.         // kitl will start it accordingly
  74. //        if (gpKitl->dwBootFlags & KITL_FL_DBGMSG)
  75. //            SetKernelCommDev (KERNEL_SVC_DBGMSG, KERNEL_COMM_ETHER);
  76. //        if (gpKitl->dwBootFlags & KITL_FL_PPSH)
  77. //            SetKernelCommDev (KERNEL_SVC_PPSH, KERNEL_COMM_ETHER);
  78. //        if (gpKitl->dwBootFlags & KITL_FL_KDBG)
  79. //            SetKernelCommDev (KERNEL_SVC_KDBG, KERNEL_COMM_ETHER);
  80.     } else {
  81.         KITLOutputDebugString ("KITL Initialization Failed, No debugging support availablen");
  82.     }
  83. }
  84. BOOL InitParallelSerial (PKITLTRANSPORT pKitl)
  85. {
  86.     return FALSE;
  87. }
  88. void
  89. KitlEthEnableInts(BOOL bEnable)
  90. {
  91.     if (bEnable) 
  92.         OEMEthEnableInts();
  93.     else 
  94.         OEMEthDisableInts();
  95. }
  96. static EDBG_ADDR MyAddr;
  97. static BOOL GetDevCfg (LPBYTE pBuf, PUSHORT pcbBuf)
  98. {
  99.     // put our IP info in the buffer
  100.     if (*pcbBuf < sizeof (MyAddr)) {
  101.         return FALSE;
  102.     }
  103.         
  104.     memcpy (pBuf, &MyAddr, sizeof (MyAddr));
  105.     *pcbBuf = sizeof (MyAddr);
  106.     return TRUE;
  107. }
  108. static BOOL SetHostCfg (LPBYTE pData, USHORT cbData)
  109. {
  110.     // we automatically figure out the host address info during initial 
  111.     // handshake. No need to handle host cfg data here.
  112.     return TRUE;
  113. }
  114. static BOOL EthSend (LPBYTE pData, USHORT cbData)
  115. {
  116.     return OEMEthSendFrame (pData, cbData);
  117. }
  118.     
  119. /* InitEther
  120.  *
  121.  *  Initialize KITL Ether transport. The Odo platform uses a debug board 
  122.  *  based on the SMC 91C94 Ethernet controller.
  123.  *
  124.  *  Return Value:
  125.  *    Return TRUE if init is successful, FALSE if error.
  126.  */
  127. BOOL InitEther(PKITLTRANSPORT pKitl)
  128. {
  129.     EDBG_ADAPTER adp;
  130.     DWORD dwDHCPLeaseTime;
  131.     DWORD dwSubnetMask;
  132.     KITLOutputDebugString ("+InitEthern");
  133.     memset (&adp, 0, sizeof(adp));
  134.     memset (pKitl, 0, sizeof (KITLTRANSPORT));
  135.     // use existing code for ether initialization
  136.     if (!OEMEthInit (&adp))
  137.         return FALSE;
  138.     // we are going to completely ignore the info in bootargs and the adaptor info
  139.     // returned from OEMEthInit, except MAC address. Just to prove that KITL will connect standalone
  140.     // get the MAC address
  141.     MyAddr.wMAC[0] = adp.Addr.wMAC[0];
  142.     MyAddr.wMAC[1] = adp.Addr.wMAC[1];
  143.     MyAddr.wMAC[2] = adp.Addr.wMAC[2];
  144.     //MyAddr = adp.Addr;
  145.     
  146.     CreateDeviceName(&MyAddr, pKitl->szName);
  147.     KITLOutputDebugString ("Using device name: %sn", pKitl->szName);
  148.     // If we haven't been given an IP address from our loader (or if we're not using static IP), get an IP address
  149.     // from a DHCP server.
  150.     if (adp.Addr.dwIP)
  151.     {
  152.         // Static IP or we got the IP from our bootloader...
  153.         MyAddr.dwIP     = adp.Addr.dwIP;
  154.         dwSubnetMask    = 0;    // Don't care about subnet mask...
  155.         dwDHCPLeaseTime = adp.DHCPLeaseTime;
  156.     }
  157.     else
  158.     {
  159.         // Get a DHCP address...
  160.         if (!EbootGetDHCPAddr (&MyAddr, &dwSubnetMask, &dwDHCPLeaseTime))
  161.             return FALSE;
  162.     }
  163.     
  164.     MyAddr.wPort = htons (EDBG_SVC_PORT);
  165.     KITLOutputDebugString ("Device %s, IP %s, Port %dn", pKitl->szName, inet_ntoa (MyAddr.dwIP), htons (MyAddr.wPort));
  166.     // initialize KITL Ethernet transport layer
  167.     if (!KitlEtherInit (&MyAddr, dwDHCPLeaseTime)) {
  168.         KITLOutputDebugString ("Unable to initialize KITL Ether transportn");
  169.         return FALSE;
  170.     }
  171.     
  172.     // fill in the blanks in KITLTRANSPORT structure.
  173.     pKitl->FrmHdrSize = KitlEtherGetFrameHdrSize ();
  174.     pKitl->Interrupt = (UCHAR) adp.SysIntrVal;
  175.     pKitl->dwPhysBuffer = EDBG_PHYSICAL_MEMORY_START;
  176.     pKitl->dwPhysBufLen = 0x20000;                      // 128K of buffer available
  177.     pKitl->dwBootFlags = 0;
  178.     pKitl->WindowSize = EDBG_WINDOW_SIZE;
  179.     pKitl->pfnDecode = KitlEtherDecodeUDP;
  180.     pKitl->pfnEncode = KitlEtherEncodeUDP;
  181.     pKitl->pfnSend = EthSend;
  182.     pKitl->pfnRecv = OEMEthGetFrame;
  183.     pKitl->pfnEnableInt = KitlEthEnableInts;
  184.     pKitl->pfnSetHostCfg = SetHostCfg;
  185.     pKitl->pfnGetDevCfg = GetDevCfg;
  186.     KITLOutputDebugString ("-InitEthern");
  187.     return TRUE;
  188. }
  189. /* OEMKitlInit
  190.  *
  191.  *  Initialization routine - called from KitlInit() to perform platform specific
  192.  *  HW init.
  193.  *
  194.  *  Return Value:
  195.  *    Return TRUE if init is successful, FALSE if error.
  196.  */
  197. BOOL OEMKitlInit (PKITLTRANSPORT pKitl)
  198. {
  199.     KITLOutputDebugString ("+OEMKitlInitn");
  200.     RETAILMSG(1, (_T("+OEMKitlInitrn")));
  201.     // try to find a transport available
  202.     if (!InitEther (pKitl) 
  203.         && !InitParallelSerial (pKitl)) {
  204.         KITLOutputDebugString ("Unable to initialize KITL Transports!n");
  205.         return FALSE;
  206.     }
  207.     gpKitl = pKitl;
  208.     KITLOutputDebugString ("-OEMKitlInitn");
  209.     RETAILMSG(1, (_T("-OEMKitlInitrn")));
  210.     return TRUE;
  211. }