Compartilhar via


Implementing the OEMPreDownload Function

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Você precisa implementar o OEMPreDownload função para inicializar o transporte TFTP ou protocolo baixar Platform Builder em estação de trabalho seu desenvolvimento. Você também pode implementar OEMPreDownload Para obter um endereço IP através do DHCP; opcionalmente caso contrário, você precisa um endereço estático.

A seguinte lista mostra as tarefas que o OEMPreDownload função precisa executar:

  • Gerar um exclusivo nome plataforma hardware a ser usado pelo criador da plataforma para downloads. O nome plataforma hardware é geralmente um nome texto estático combinado com um derivado valor endereço MAC NIC.
  • Obter um endereço IP a partir de um servidor DHCP ou atribuir um endereço estático IP.
  • Inicializar o transporte TFTP ou protocolo baixar Platform Builder. Você pode fazer isso, chamado de EbootInitEtherTransport função definida no Eboot.lib; Portanto, certifique-se que você incluir Eboot.lib no seu arquivo fontes carregador inicializar.
    • Se o endereço é obtido de um servidor DHCP, EbootInitEtherTransport Retorna o endereço e informações tempo arrendamento, que devem ser armazenadas nos argumentos inicializar, inicializar args.
    • EbootInitEtherTransport Também retorna informações de configurações usuário Construtor de expressões de plataforma, como se iniciar um processo baixar ou salto para uma imagem existente carregador inicializar de destino. Depending on o valor da bGotJump retornado do parâmetro, BL_JUMP ou BL_DOWNLOAD o OEMPreDownload função.

Para obter mais informações sobre a biblioteca suporte Eboot.lib, consulte Biblioteca de códigos Eboot.

Para implementar a função OEMPreDownload

  • Para editar o arquivo Main.c, adicionando a codificar necessário para implementar totalmente o OEMPreDownload função.

    O seguinte exemplo de código mostra a implementação das OEMPreDownload função de plataforma de hardware usada nesse exemplo carregador inicializar.

    DWORD OEMPreDownload(void)
    {
        CHAR szDeviceName[EDBG_MAX_DEV_NAMELEN];
        BOOL  bGotJump = FALSE;
        DWORD dwDHCPLeaseTime = 0;
        PDWORD pdwDHCPLeaseTime = &dwDHCPLeaseTime;
        DWORD dwBootFlags = 0;
    
    
        // If user wants to jump to existing image - skip download.
        //
        if (!g_bDownloadImage)
        {
            g_bWaitForConnect = FALSE;  // Do not wait for desktop to connect.
            return(BL_JUMP);
        }
    
        // If the user wants to use a static IP address, do not request an address from a DHCP server. This is done by passing in a NULL for the DHCP lease time variable.
        //
        if (pDriverGlobals->eth.TargetAddr.dwIP && pDriverGlobals->eth.SubnetMask)
        {
            pdwDHCPLeaseTime = NULL;
            RETAILMSG(1, (TEXT("INFO: Using static IP address %s.\r\n"), inet_ntoa(pDriverGlobals->eth.TargetAddr.dwIP))); 
            RETAILMSG(1, (TEXT("INFO: Using subnet mask %s.\r\n"), inet_ntoa(pDriverGlobals->eth.SubnetMask))); 
        }
    
        // Create device name based on Ethernet address (this is how Platform Builder identifies this device).
        //
        memset(szDeviceName, 0, EDBG_MAX_DEV_NAMELEN);
        CreateDeviceName(&pDriverGlobals->eth.TargetAddr, szDeviceName, PLATFORM_STRING);
    
        EdbgOutputDebugString("INFO: Using device name: '%s'\n", szDeviceName);
    
        // Initialize the TFTP transport.
        //
        if (!EbootInitEtherTransport(&pDriverGlobals->eth.TargetAddr,
                                     &pDriverGlobals->eth.SubnetMask,
                                     &bGotJump,
                                     pdwDHCPLeaseTime,
                                     EBOOT_VERSION_MAJOR,
                                     EBOOT_VERSION_MINOR,
                                     PLATFORM_STRING,
                                     szDeviceName,
                                     EDBG_CPU_ARM720,
                                     dwBootFlags))
        {
            return(BL_ERROR);
        }
    
    
        // Save the DHCP lease time (you could use a static IP in which case, the lease time does not matter).
        //
        pDriverGlobals->eth.DHCPLeaseTime = dwDHCPLeaseTime;
    
        return(bGotJump ? BL_JUMP : BL_DOWNLOAD);
    }
    
    static void
    itoa10(
        int n,
        char s[]
        )
    {
        int i = 0; 
    
        // Get absolute value of number.
        unsigned int val = (unsigned int)((n < 0) ? -n : n);
    
        // Extract digits in reverse order.
        do {
            s[i++] = (val % 10) + '0';
        } while (val /= 10);
    
        // Add the minus sign if the number is negative.
        if (n < 0) s[i++] = '-';
    
        s[i--] = '\0';
    
        // Reverse string.
        for (n = 0; n < i; n++, i--) {
            char swap = s[n];
            s[n] = s[i];
            s[i] = swap;
        }
    }
    
    void CreateDeviceName(EDBG_ADDR *pMyAddr, char *szBuf, LPSTR szPlatformString)
    {
        // NOTE: ensure that the caller's buffer (szBuf) is big enough to
        // hold the static platform string and numerical suffix.
    
        strcpy(szBuf, szPlatformString);
        szBuf += strlen(szBuf);
        itoa10(((pMyAddr->wMAC[2]>>8) | ((pMyAddr->wMAC[2] & 0x00ff) << 8)), 
                 szBuf);
    }
    

See Also

Tasks

How to Develop a Boot Loader