Implementing the OEMPreDownload Function
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); }