⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oeminit.c

📁 威盛 wince5.0 bsp 包 for x86 系统, 支持 VT8601 等北桥
💻 C
📖 第 1 页 / 共 2 页
字号:
               {
                    mov  dx, 0cf8h
                    mov  eax, PCIAddr
                    out  dx, eax
                    mov  dx, 0cfch
                    mov  eax, 2000h
                    out  dx, eax
               }

               PCIAddr += 0x60;
               __asm
               {
                    mov  dx, 0cf8h
                    mov  eax, PCIAddr
                    out  dx, eax
                    mov  dx, 0cfch
                    in   eax, dx
                    and  ax, 0fffeh
                    mov  usUSBIoBase, ax
                    mov  dx, ax
                    xor  ax, ax
                    out  dx, ax
               }

               for ( i = 0; i < 0x1000; i++)
               {
                  __asm
                  {
                       mov  ax, usUSBIoBase
                       add  ax, 2
                       mov  dx, ax
                       in   ax, dx
                       mov  usUSBStatus, ax
                       out  dx, ax
                  }

                  if (usUSBStatus & 0x20)
		     break;
               }
               DEBUGMSG(1, (TEXT("VIA USB2 IoBase %x\r\n"), usUSBIoBase));
               DEBUGMSG(1, (TEXT("VIA USB Status %x, Loop %d\r\n"), usUSBStatus, i));

               PCIAddr += 0xa0;
               __asm
               {
                    mov  dx, 0cf8h
                    mov  eax, PCIAddr
                    out  dx, eax
                    mov  dx, 0cfch
                    mov  eax, 2000h
                    out  dx, eax
               }

               // Check 8235
               PCIAddr += 0x100;
               PCIAddr -= 0xc0;
               __asm
	       {
                    mov  dx, 0cf8h
                    mov  eax, PCIAddr
                    out  dx, eax
                    mov  dx, 0cfch
                    in   eax, dx
                    mov  PCIData, eax
	       }

               if (PCIData==0x30381106)
               {
                  // For VT8235
                  PCIAddr += 0x20;
                  __asm
                  {
                       mov  dx, 0cf8h
                       mov  eax, PCIAddr
                       out  dx, eax
                       mov  dx, 0cfch
                       in   eax, dx
                       and  ax, 0fffeh
                       mov  usUSBIoBase, ax
                       mov  dx, ax
                       xor  ax, ax
                       out  dx, ax
                  }

                  for ( i = 0; i < 0x1000; i++)
                  {
                     __asm
                     {
                          mov  ax, usUSBIoBase
                          add  ax, 2
                          mov  dx, ax
                          in   ax, dx
                          mov  usUSBStatus, ax
                          out  dx, ax
                     }

                     if (usUSBStatus & 0x20)
                        break;
                  }
                  DEBUGMSG(1, (TEXT("VIA USB3 IoBase %x\r\n"), usUSBIoBase));
                  DEBUGMSG(1, (TEXT("VIA USB Status %x, Loop %d\r\n"), usUSBStatus, i));

                  PCIAddr += 0xa0;
                  __asm
                  {
                       mov  dx, 0cf8h
                       mov  eax, PCIAddr
                       out  dx, eax
                       mov  dx, 0cfch
                       mov  eax, 2000h
                       out  dx, eax
                  }
               }

               bUHCI = TRUE;
               break;
            }
         }

         if (bUHCI)
            break;
      }
        
      if (bUHCI)
        break;
   }

   CheckC5XL();

    // initialize memory (detect extra ram, MTRR/PAT etc.)
    x86InitMemory ();

    // initialize pKDIoControl is hardware debugging is supported
    if (g_fSupportHwDbg) {
        pKDIoControl = OEMKDIoControl;
    }

    // Reserve 128kB memory for Watson Dumps
    dwNKDrWatsonSize = (128 * 1024); 

    x86InitRomChain();
    // Add two Lines, VIA PowerSaver
    RETAILMSG(1, (TEXT("VIA PowerSaver: %s, %s"),TEXT(__DATE__), TEXT(__TIME__)));
    CheckCPU( );
    
#ifdef DEBUG
    lpWriteDebugStringFunc(TEXT("Firmware Init Done.\r\n"));
#endif
}

BOOL x86IoCtlPostInit (
    UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf, 
    UINT32 nOutBufSize, UINT32 *lpBytesReturned
) {

    // Critical sections to be initialized
    extern CRITICAL_SECTION RTC_critsect;

    // Initialize critical sections
    InitializeCriticalSection(&RTC_critsect);
    g_fPostInit = TRUE;
    
    return TRUE;
}

#include "pehdr.h"
#include "romldr.h"
#include "romxip.h"

/*
  Initialize the rom chain
*/

#define NOT_FIXEDUP        (DWORD*)-1
extern  ROMChain_t         *OEMRomChain;

DWORD *pdwXIPLoc = NOT_FIXEDUP;

static void x86InitRomChain (void)
{
    // Added for MultiXIP stuff
    static      ROMChain_t  s_pNextRom[MAX_ROM] = {0};
    DWORD       dwRomCount = 0;
    DWORD       dwChainCount = 0;
    DWORD *     pdwCurXIP;
    DWORD       dwNumXIPs;
    PXIPCHAIN_ENTRY pChainEntry = NULL;

#ifdef DEBUG
    TCHAR       szXIPName[XIP_NAMELEN];
    int         i;  // loop ctr
#endif

#ifdef DEBUG
    lpWriteDebugStringFunc(TEXT("Looking for rom chain\n"));
#endif

    if(pdwXIPLoc == NOT_FIXEDUP){
#ifdef DEBUG
        lpWriteDebugStringFunc(TEXT("Rom chain NOT found\n"));
#endif
        return;  // no chain or not fixed up properly
    }

#ifdef DEBUG
    lpWriteDebugStringFunc(TEXT("Rom chain found\n"));
#endif


    // set the top bit to mark it as a virtual address
    pdwCurXIP = (DWORD*)(((DWORD)pdwXIPLoc) | 0x80000000);

    // first DWORD is number of XIPs
    dwNumXIPs = (*pdwCurXIP);

    if(dwNumXIPs > MAX_ROM){
      lpWriteDebugStringFunc(TEXT("ERROR: Number of XIPs exceeds MAX\n"));
      return;
    }

    pChainEntry = (PXIPCHAIN_ENTRY)(pdwCurXIP + 1);

    while(dwChainCount < dwNumXIPs)
    {
        if ((pChainEntry->usFlags & ROMXIP_OK_TO_LOAD) &&  // flags indicates valid XIP
            *(LPDWORD)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)
        {
            s_pNextRom[dwRomCount].pTOC = *(ROMHDR **)(((DWORD)(pChainEntry->pvAddr)) + ROM_SIGNATURE_OFFSET + 4);
            s_pNextRom[dwRomCount].pNext = NULL;

#ifdef DEBUG
            lpWriteDebugStringFunc( _T("XIP found: ") );

            for (i = 0; (i< (XIP_NAMELEN-1)) && (pChainEntry->szName[i] != '\0'); ++i)
            {
                szXIPName[i] = (TCHAR)pChainEntry->szName[i];
            }
            szXIPName[i] = TEXT('\0');
            lpWriteDebugStringFunc( szXIPName );

            lpWriteDebugStringFunc( _T("\n") );
#endif

            if (dwRomCount != 0)
            {
                s_pNextRom[dwRomCount-1].pNext = &s_pNextRom[dwRomCount];
            }
            else
            {
                OEMRomChain = s_pNextRom;
            }
            dwRomCount++;
        }
        else
        {
            lpWriteDebugStringFunc( _T("Invalid XIP found\n") );
        }

        ++pChainEntry;
        dwChainCount++;
    }

#ifdef DEBUG
{
  ROMChain_t         *pchain = OEMRomChain;

  lpWriteDebugStringFunc( _T("chain contents...\n") );
  while(pchain){
    lpWriteDebugStringFunc( _T("found item\n") );
    pchain = pchain->pNext;
  }
}
#endif
    
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -