<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Windows CE Bootloader</title>
        <link>http://geekswithblogs.net/BruceEitman/category/8126.aspx</link>
        <description>A collection of posts about a Windows CE bootloader</description>
        <language>en-US</language>
        <copyright>Bruce Eitman</copyright>
        <managingEditor>Bruce.Eitman@EuroTech.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Platform Builder: Understanding the Serial Debug Port</title>
            <link>http://geekswithblogs.net/BruceEitman/archive/2008/09/08/platform-builder-understanding-the-serial-debug-port.aspx</link>
            <description>&lt;div style="MARGIN: 0in 0in 10pt"&gt;Recently, there have been a few questions in the newsgroups about the serial debug port. The questions were along the lines of:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in"&gt;&lt;span&gt;·&lt;span style="FONT: 7pt 'Times New Roman'"&gt;         &lt;/span&gt;&lt;/span&gt;Which COM port do I use for debug output?&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in"&gt;&lt;span&gt;·&lt;span style="FONT: 7pt 'Times New Roman'"&gt;         &lt;/span&gt;&lt;/span&gt;How do I change the COM port that is used for debug output?&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;These are actually quite common questions, so I thought I would address these. Every CPU and/or UART is different so I won’t give you a how to lesson, but I will provide you with enough information to look inside your BSP to figure it out for yourself.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;First, let’s address the term COM port. COM is a special name used in device drivers to indicate that the driver is manageable through special COM APIs for controlling the communications through a UART. The term doesn’t apply to the debug serial port because:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in"&gt;&lt;span&gt;1.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;       &lt;/span&gt;&lt;/span&gt;No device driver. The serial debug port must be available before the device manager is even running. The serial debug port is available in the single threaded bootloader and is available early in the kernel initialization.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in"&gt;&lt;span&gt;2.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;       &lt;/span&gt;&lt;/span&gt;No run time API support for baud rate, parity, stop bit…&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in"&gt;&lt;span&gt;3.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;       &lt;/span&gt;&lt;/span&gt;The debug serial port is not manageable by the COM APIs.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;&lt;strong&gt;Getting the Serial Debug Port Started&lt;/strong&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;On the most base level, the serial debug port can be initialized and written to in the assembly code that starts your bootloader. This is not the focus of this article, but I mention it because you may need to delve into the assembly code to change the serial debug port.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;Talking C though, the serial debug port is initialized in OEMInitDebugSerial(). OEMInitDebugSerial() should initialize the UART. It should set the baud rate, parity and stop bits, may need to turn on power to external hardware and may need to start a clock to run the UART. OEMInitDebugSerial() may select different UARTs or even disable the serial output depending on platform specific features.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;&lt;strong&gt;Outputting on the Serial Debug Port&lt;/strong&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;OEMWriteDebugString() and OEMWriteDebugByte() provide the functionality of outputting on the serial debug port. OEMWriteDebugByte () usually implements putting a byte on the output FIFO of the UART and OEMWriteDebugString () usually processes a string and calls OEMWriteDebugByte () for each character to be output.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;&lt;strong&gt;Reading Input on the Serial Debug Port&lt;/strong&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;OEMReadDebugByte() implements reading a byte from the UART input FIFO. OEMReadDebugByte() is non-blocking, so if a character isn’t available or an error occurs it returns with a status code of either &lt;span style="FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 115%"&gt;OEM&lt;/span&gt;&lt;span style="COLOR: black"&gt;_DEBUG_COM_ERROR, OEM_DEBUG_READ_NODATA. I have provided a code sample of reading from the serial debug port in &lt;a href="http://geekswithblogs.net/BruceEitman/archive/2008/05/09/windows-ce--using-the-debug-serial-port-for-input.aspx"&gt;&lt;u&gt;&lt;strong&gt;Windows CE: Using the debug serial port for input&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;&lt;strong&gt;&lt;span style="COLOR: black"&gt;Answering the Questions&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt"&gt;&lt;span style="COLOR: black"&gt;How would you answer the questions about the serial debug port? Every BSP is different, so I the only concrete advice that I can give is to look for the serial debug port functions in your code. But in more generic terms, these functions are often implemented in both the bootloader and the OAL or Kernel, so you may need to look in both. The functions are sometimes implemented in a file named debug.c. If you look at CEPC, you will find that it actually has three implementations of these functions in eboot, sboot and the kernel uses an implementation in Platform\Common.&lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="center"&gt;&lt;span style="FONT-SIZE: 9pt"&gt;Copyright © 2008 – Bruce Eitman&lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 10pt; LINE-HEIGHT: normal" align="center"&gt;&lt;span style="FONT-SIZE: 9pt"&gt;All Rights Reserved&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=125022"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=125022" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/BruceEitman/aggbug/125022.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bruce Eitman</dc:creator>
            <guid>http://geekswithblogs.net/BruceEitman/archive/2008/09/08/platform-builder-understanding-the-serial-debug-port.aspx</guid>
            <pubDate>Tue, 09 Sep 2008 01:32:51 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/BruceEitman/comments/125022.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/BruceEitman/archive/2008/09/08/platform-builder-understanding-the-serial-debug-port.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/BruceEitman/comments/commentRss/125022.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Platform Builder: Building a Bootloader</title>
            <link>http://geekswithblogs.net/BruceEitman/archive/2008/06/05/platform-builder-building-a-bootloader.aspx</link>
            <description>&lt;div style="MARGIN: 0in 0in 0pt"&gt;Building a bootloader isn't much different than building a driver or an application. In fact, if you have already built your project more than likely your bootloader has already been built. But what if you want to make a change to the bootloader? Then knowing how to build it, and more important what happens when you build it, will help get from changing code to testing faster.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;The first step is to find the source code. The source code may be in different places depending on the version of Windows CE that you are targeting and the BSP that you are using. The following are some locations to look:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;Windows CE 4.2 and earlier:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;            %_WINCEROOT%\Platform\&amp;lt;BSP Name&amp;gt;\eboot&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;            %_WINCEROOT%\Platform\&amp;lt;BSP Name&amp;gt;\sboot&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;Windows CE 5.0 and 6.0:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;            %_WINCEROOT%\Platform\&amp;lt;BSP Name&amp;gt;\src\Bootloader&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;If you have received your BSP from a third party, the location could be different.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;The next step is to identify what your bootloader will be named when it is built. The bib file for the bootloader will tell you the name of the file. The bib file will be you the bootlaoder folder usually. &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;Let's look at the relevant lines in both C:\WINCE600\PLATFORM\CEPC\SRC\BOOTLOADER\EBOOT\boot.bib and &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;C:\WINCE600\PLATFORM\CEPC\SRC\BOOTLOADER\SBOOT\boot.bib and see how they are different:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;eboot.bib&lt;/div&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;;   Name     Start     Size      Type&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;;   ------- -------- -------- ----&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;    EBOOT   00130000 00020000 RAMIMAGE&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;sboot.bib&lt;/div&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;;   Name     Start     Size      Type&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;;   ------- -------- -------- ----&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;    SBOOT    00130000 00010000 RAMIMAGE&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;The "Name" column for "Type" RAMIMAGE determines the file names that are created. In this case, eboot will create eboot.bin and eboot.nb0 while sboot will create sboot.bin and sboot.nb0. These files will be created and put in the appropriate sub folders in your platform's Target folder.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;Now we know what to build to create the bootloader, what is created, and where the files end up after building. Let's build the bootloader.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;Open a build window, which I discussed in &amp;lt;&amp;lt; Platform Builder: Build Tools, Opening a Build Window &amp;gt;&amp;gt; and change directories to the bootloader folder. Then run build.exe &amp;lt;&amp;lt; Platform Builder: Using Build.exe &amp;gt;&amp;gt;, and you are done.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;So how did it do it? The following discussion will look at C:\WINCE600\PLATFORM\CEPC\SRC\BOOTLOADER\EBOOT:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.75in; TEXT-INDENT: -0.25in"&gt;1.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;Build processed the sources file and then ran nmake to build the source files&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.75in; TEXT-INDENT: -0.25in"&gt;2.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;Nmake linked the object files and pre-built libraries to create eboot.exe (yes, I know that nmake doesn't actually do the linking)&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.75in; TEXT-INDENT: -0.25in"&gt;3.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;In the sources file, WINCETARGETFILES is defined to be equal to RomImage. WINCETARGETFILES tells build to process the target RomImage after building the target defined in the sources file. &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.75in; TEXT-INDENT: -0.25in"&gt;4.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;Build "knows" that the rule for WINCETARGETFILES is defined in makefile.inc.&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 0.75in; TEXT-INDENT: -0.25in"&gt;5.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;The rule for WINCETARGETFILES is:&lt;br /&gt;
&lt;br /&gt;
RomImage:&lt;br /&gt;
!IF "$(NOLINK)" == ""    &lt;br /&gt;
      romimage boot.bib&lt;br /&gt;
!ENDIF        &lt;br /&gt;
!IF "$(WINCEREL)"=="1"&lt;br /&gt;
      copy $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\eboot.* $(_FLATRELEASEDIR)&lt;br /&gt;
!ENDIF&lt;br /&gt;
&lt;br /&gt;
which says:&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 1.5in; TEXT-INDENT: -1.5in"&gt;&lt;span style="FONT: 7pt 'Times New Roman'"&gt;                                                               i.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;When building target RomImage, if the environment variable NOLINK is not set to some value, then run "romimage boot.bib" which creates the ROM images&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt 1.5in; TEXT-INDENT: -1.5in"&gt;&lt;span style="FONT: 7pt 'Times New Roman'"&gt;                                                             ii.&lt;span style="FONT: 7pt 'Times New Roman'"&gt;      &lt;/span&gt;&lt;/span&gt;When building target RomImage, if the environment variable WINCEREL is set to 1, then copy the ROM images from the Target folder to the _FLATRELEASEDIR&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;
 &lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; 
&lt;div style="MARGIN: 0in 0in 0pt 27pt; TEXT-INDENT: -27pt"&gt;&lt;span style="FONT-SIZE: 14pt"&gt; &lt;/span&gt;&lt;strong&gt;&lt;span style="FONT-SIZE: 14pt"&gt;&lt;a href="http://geekswithblogs.net/BruceEitman/archive/2008/06/06/platform-builder-summary-of-building-windows-ce.aspx"&gt;Go to Summary of Building Windows CE&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="MARGIN: 0in 0in 0pt"&gt; &lt;/div&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122649"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122649" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/BruceEitman/aggbug/122649.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bruce Eitman</dc:creator>
            <guid>http://geekswithblogs.net/BruceEitman/archive/2008/06/05/platform-builder-building-a-bootloader.aspx</guid>
            <pubDate>Thu, 05 Jun 2008 20:39:11 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/BruceEitman/comments/122649.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/BruceEitman/archive/2008/06/05/platform-builder-building-a-bootloader.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/BruceEitman/comments/commentRss/122649.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Windows CE: Bootloader Splash Screen</title>
            <link>http://geekswithblogs.net/BruceEitman/archive/2008/05/14/windows-ce-bootloader-splash-screen.aspx</link>
            <description>&lt;p&gt;I am sitting here at my desk experiencing some local network problems and thought I would take this time to discuss creating and using a splash screen in a bootloader.  My target OS is Windows CE, but this applies to any code that needs to draw to a display without the use of an OS since this is a bootloader.&lt;/p&gt;
&lt;p&gt;What is a bootloader splash screen?  The bootloader is a small peice of code that runs when the reset vector is processed.  This code's primary purpose is the initialize some hardware and look for OS updates.  This shouldn't take much time, but if you include the time that it takes for the OS to boot to the desktop there is a long pause before the user sees activity.  A long pause in  user time can be one second or more.  So it is nice to show the user that the device is doing something.  To do this many devices show a graphic on the display, this is commonly known as a splash screen.&lt;/p&gt;
&lt;p&gt;I am going to keep this as generic as I can.  So that means no code and nothing specific to any CPU, Display Controller or anything else.  But instead I hope to inspire you to think about a splash screen for your device and give you enough information to do some research and get a splash screen working.&lt;/p&gt;
&lt;p&gt;What needs to be done to add a splash screen:&lt;/p&gt;
&lt;ol dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
    &lt;ol&gt;
        &lt;li&gt;Find a good place in your existing code to add splash screen support&lt;br /&gt;
        This can be anyplace that works.  Probably best to do it after you get out of the assembly code and after you have done some basic initialization of other hardware and software. &lt;/li&gt;
        &lt;li&gt;Initialize your Display Controller&lt;br /&gt;
        The most common question that I see asked about this is how do I do that?  The good news is that in most cases you probably already have some code doing it in your display driver.  So it is a matter of porting that code to build and run in your bootloader.    If you don't have that code, then hopefully you have a datasheet for your display controller and can figure out from it how to initialize the display controller.  Just keep in mind that what you don't have is an operating system, so no threads, no events, not syncronization objects, no interrupts. &lt;/li&gt;
        &lt;li&gt;Add a graphic to your system&lt;br /&gt;
        This one can be fun.  Of course the first thing to do is figure out which graphic you will be able to decode to display from your bootloader.  I suggest keeping it simple.  A Windows Bitmap (BMP) or a just a blob of data works well.  Here are some thoughts on what you can do:&lt;br /&gt;
        - Add a structure to your code that includes the binarly data.  Of course creating the binary data can be challenging and may require that you write a desktop application to do it.&lt;br /&gt;
        - Add a file to your system.  This can be done by putting the file in an unused region of your ROM, on a CompactFlash or SD card, or in your persistent flash file system.  But, it will require that you have some way to read it from your bootloader.&lt;br /&gt;
        - Add the file to your bootloader .bib file.  You will need to figure out how to get it from the bootloader image then. &lt;/li&gt;
        &lt;li&gt;Draw a graphic and maybe a background color&lt;br /&gt;
        By now you have initalized the display controller and should have a frame buffer that you will write to.  So the rest is down hill.  You will need to write some code to read the graphic, this is where keeping it simple will come in handy.  A quick internet search for "file format bmp" should yeild enough information to decode a Windows Bitmap file. &lt;/li&gt;
        &lt;li&gt;Turn on the backlight&lt;br /&gt;
        Only you know how to do this. &lt;/li&gt;
        &lt;li&gt;Modify your display controller so that it doesn't clear the splash screen&lt;br /&gt;
        If you have a splash screen, you will now notice that the display driver probably will clear the screen.  This can cause a blank screen for short time before the desktop or your application starts.  If you remove the clearing of the display it will make it a smoother transition. &lt;/li&gt;
    &lt;/ol&gt;
&lt;/ol&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122128"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122128" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/BruceEitman/aggbug/122128.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Bruce Eitman</dc:creator>
            <guid>http://geekswithblogs.net/BruceEitman/archive/2008/05/14/windows-ce-bootloader-splash-screen.aspx</guid>
            <pubDate>Wed, 14 May 2008 14:50:51 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/BruceEitman/comments/122128.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/BruceEitman/archive/2008/05/14/windows-ce-bootloader-splash-screen.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/BruceEitman/comments/commentRss/122128.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>