An example

Take the main.c from the FADS8xx system:

#include "ipl.h"

unsigned int image;

int
main (void)
{
/*
 * Image is located at 0x2840000	
 * Therefore, we don't require an image_download_8250 function
 */
    image = image_scan (0x2840000, 0x2841000);

/*
 * Copy startup to ram; it will do any necessary work on the image
 */
    image_setup (image);

/*
 * Set up link register and jump to startup entry point
 */
    image_start (image);

    return (0);
}

In this case, we have a linearly addressable flash memory device that contains the image — that's why we don't need the image_download_8250() function.

The next function called is image_scan(), which is given a very narrow range of addresses to scan for the image. We give it such a small range because we know where the image is on this system — there's very little point searching for it elsewhere.

Then we call image_setup() with the address that we got from the image_scan(). This copies the startup code to RAM.

Finally, we call image_start() to transfer control to the startup program. We don't expect this function to return — the reason we have the return (0); statement is to keep the C compiler happy (otherwise it would complain about "Missing return value from function main").