I've been bitten by the embedded problem many times. For starters it's
very hard to develop patches for new hardware or ASICs on your
platform and submit them to the mainline while you are in development.
Aside from the general problem of going "here is a driver for
something you won't see or be able to test for 6 months" companies are
usually very wary of tipping their hand before product release, even
if they aren't that worried about the code being open.
Of course we pay for it in the end. Embedded platforms typically end
up with a relatively old platform, heavily patched, which they have to
maintain for the product lifetime. I'm currently porting some apps
that run with quite old libraries on an embedded machine to a modern
desktop system, a process that has more than a few hurdles if you need
to stay running on your embedded system as well. The kernel for the
platform is still a heavily patched 2.4 with RT extensions. It would
be nice to run on a modern 2.6 kernel with it's in-built RT support,
but it would require a fair amount of up-front engineering effort to
reach something as functional as we already have, even if it would be
more maintainable going forward.