I've been experimenting with using a stripped-down Linux kernel instead of u-boot. The idea (which is not original -- you can find several other similar projects via Google) is to use the power of the Linux networking, filesystem, and USB stacks to load whatever kernel you want, and then the kexec system call to warm-boot into it.
Unfortunately, I've hit a brick wall: after loading a kernel (via "kexec -l ...") and executing it ("kexec -e"), the new kernel hangs during initialization when it tries to access various hardware registers. These same hardware registers are accessed when the kernel is booted via u-boot, so there's some bug here I haven't been able to track down. (See
this thread for more details.)
If anyone can help me solve this, I'd be very grateful, and we could move on to the final step of flashing the minimal kernel and booting it directly from the hardware. My early tests are promising: the minimal kernel and initramfs are only 1.5MB, and it boots to a shell in about 5 seconds.