How to Develop a Boot Loader (Windows Embedded CE 6.0)
1/5/2010
A boot loader manages the boot process of the target device by initializing the target device, downloading the run-time image, and booting the run-time image on the target device.
After you develop a boot loader, you can use the boot management capabilities of your boot loader to save time during the OS development process.
Without a boot loader, you must transfer a run-time image to your target device through a slow, manual process.
With a boot loader, you can quickly download a new development run-time image to your target device.
For more information about boot loaders, see Boot Loaders.
Hardware and Software Assumptions
The boot loader described in this topic is developed for an example hardware platform containing the following hardware specifications:
- ARM V4I CPU
- 64 MB RAM
- 32 MB Intel Strataflash (28F128)
- A supported Ethernet controller, such as NE2000 or SMC9000. As a simplification for this boot loader development process, the controller is built-in and not a PCI or PCMCIA device.
The following table shows the memory map for this hardware platform.
Physical address Length Description 0000.0000 - 01FF.FFFF
32 MB
Flash
A000.0000 - A3FF.FFFF
64 MB
RAM
The boot loader design assumes that the CPU begins fetching code at physical address 0 following a reset.
You are developing a new boot loader, using as much from the included support libraries as possible.
Your reference OS is Windows Embedded CE 6.0.
You have access and familiarity with Platform Builder for Windows Embedded CE 6.0 and the build process. Platform Builder includes with all the sources and libraries needed to support boot loader development.
You have available documentation, such as databooks or datasheets and the latest errata, on the hardware platform, CPU, peripheral chips, and other hardware on which your boot loader will run.
This procedure used a sample boot loader with the following design simplifications:
- The boot loader resides in system flash memory and runs at every hardware reboot.
- Use Ethernet for the download transport. This is built in with no PCMCIA or PCI interface.
- Download a Windows Embedded CE .bin file, for example, Nk.bin, to RAM.
- There is no support for booting a local run-time image, although the flash memory routines are covered. Memory management unit (MMU) or caches are not used. The ROMOFFSET configuration option in the run-time image Config.bib file should reflect the fact that all addresses are physical.
When designing your own boot loader, you can implement enhancements within the framework presented in this topic. For example, you may support a removable Ethernet adapter using PCMCIA or Compact Flash memory or use USB as your download transport.
You might want to store the run-time image in NAND flash memory. For more information about memory design tradeoffs, see the article System Memory Management in Windows CE .NET.
For more information about the hardware platform description and design of the boot loader described in this process, see Boot Loader Design.
Although the boot loader and the OEM adaptation layer (OAL) typically share hardware platform initialization code, the steps in the following procedure focus on the boot loader. However, keep code sharing in mind when organizing the source files.
The following procedure explains the boot loader development process from the beginning. However, you can save development time by modifying an existing boot loader image for a hardware platform of similar design.
Platform Builder for CE 6.0 includes tested boot loader source code for various hardware platforms, which you can use as the basis for further development.
To develop a boot loader, follow the steps in the table below.
Note
In the following steps, code examples are used to demonstrate each step. In some cases, these examples are code fragments and might be brought together from different parts of the boot loader development process. Because of this, not all code examples compile.
Step | Topic |
---|---|
1. Build a complete platform based on a sample BSP for the CPU you intend to target. For example, if you intend to target x86, then build a sample platform (i.e. PDA, Webpad) based on the CEPC BSP before creating your own boot loader. Your new boot loader will link to libraries (i.e. BLCOMMON, Ethdbg) that are built once when the sample platform is initially created. |
Creating an OS Design with the Windows Embedded CE OS Design Wizard |
2. Create a directory for your new boot loader code. For example: %_WINCEROOT%\Platform\MyPlatform\Src\Bootloader\Eboot. The boot loader code directory is typically in a hardware platform directory. You must include the directory in the hardware platform dirs file to build it as part of Platform Builder. |
Not applicable |
3. Set up a command-line build shell to create and build the boot loader.
Note:
All further steps rely on the assumption that the boot loader development process takes place in a build shell environment.
|
|
4. Generate all static libraries required by the boot loader image.
For more information about Sysgen.bat, see Sysgen Tool. |
Not applicable |
5. Create a file for your boot loader's StartUp function, and then establish a function framework as a starting point. |
|
6. Create a sources file and makefile file in the boot loader directory. |
|
7. Build your first boot loader executable (.exe) file. |
|
8. Implement the boot loader's StartUp function. |
|
9. Create a boot loader main function. This is typically using C programming language. Starting with this step, all boot loader code should be able to operate in C instead of assembly language.
Note:
If you build during this step, you receive a number of undefined values, because BLCOMMON expects to call a number of functions that have not yet been implemented. Therefore, you should at least implement stub versions of these functions.
|
|
10. Create stub versions for a number of OEM functions, including generic hardware platform routines and flash memory operations. |
|
11. Add the new source files, Main.c. and Flash.c, created in the previous step to the SOURCES line in the sources file.
|
|
12. Create the .bib file, which will be used by Romimage.exe to convert the boot loader .exe file into .bin and .nb0 files. |
|
13. Rebuild the boot loader.
Note:
After this point, the basic boot loader source infrastructure is in place.
Note:
To complete the remaining steps of this procedure, you must do the following:
|
|
14. Implement the following serial debug functions in your boot loader code: These functions are required BLCOMMON callback functions that you must implement in your boot loader code. You can use other libraries to help implement the functions. You can copy and possibly modify much of the code from existing hardware platforms. You should choose a hardware platform that is as similar to your own as possible to minimize the need for changes. |
|
15. Rebuild the boot loader and verify that your code works by testing it on the target device. You should now be able to verify the following:
If you encounter problems, verify that you correctly implemented serial debug functions. |
|
16. Create the driver globals and boot args shared data areas. |
|
17. Implement the remaining hardware platform initialization code by implementing the OEMPlatformInit function. |
|
18. Add Ethernet debug libraries that have routines referenced in OEMPlatformInit to the TARGETLIBS entry in the boot loader sources file.
Note:
After this point in the development process, the CPU, board-level logic, and network controller are all initialized.
Note:
To complete the remaining steps in this procedure, you must do the following:
|
|
19. Implement the following Ethernet controller-related functions: |
|
20. Implement the OEMPreDownload function. |
|
21. Test boot loader communications by doing the following:
|
Not applicable |
22. Create a test .bin file to download from Platform Builder. |
|
23. Verify that the boot loader can use Platform Builder to download a .bin file. |
|
24. Implement the OEMLaunch function.
Note:
After you complete this step, you have essentially completed development of the boot loader.
Note:
The boot loader should now be able to
Note:
To complete the remaining steps in this procedure, you must add support for writing the downloaded boot loader image to flash memory.
Note:
By doing so, the boot loader can update its own saved image.
Note:
You can also do the following:
Note:
For more information about design tradeoffs, especially NOR versus NAND flash memory, see this Microsoft Web site.
|
|
25. Implement the OEMIsFlashAddr function. |
|
26. Implement the OEMMapMemAddr function. |
|
27. Implement the following flash memory erase functions: |
|
28. Implement the OEMWriteFlash function. |
|
29. Modify the .bib file to produce a boot loader image that downloads to flash memory.
Note:
After you complete this step, you have completed development of a basic Ethernet boot loader that can download a run-time image to RAM or to flash memory. You can now add additional functionality to enhance the basic boot loader.
Note:
The following list shows some of the additional functionality you can include in an enhanced boot loader:
Note:
Because the boot loader can have many variations, the following steps show only a few enhancements you can add to a basic boot loader.
|
|
30. To add support for download progress indication, implement the OEMShowProgress function. You do not need to add functionality to the OEMShowProgress function, but you must leave the stub version in your boot loader code to prevent errors when the compiler compiles the code. |
|
31. To verify the RAM or flash memory used by the run-time image before the run-time image is downloaded completely, add support for memory verification. |
|
32. If you are developing a multi-BIN run-time image and you would find multi-BIN run-time image notification useful, add support for multi-BIN run-time image notification. |
|
33. To have your boot loader validate the run-time image before downloading or running it, add support for run-time image signatures. |
See Also
Tasks
How to Develop an OEM Adaptation Layer
Concepts
How to Create a Board Support Package