I am not really sure you are serious. I even suspected this is a kind of trolling.
But if you are serious…
I really sympathize with you and respect your thirst for knowledge and understanding.
First of all, you should understand you're going to live a very difficult like, and not because of all those technical difficulties. Probably you will enjoy them. You can expect problem of a very different sort. In real life most "engineers" working in the industry have the attitude directly opposite to yours. They do all what it takes to learn as little as possible and are looking for some quick and cheep solutions and unearned easy money. Just take a look on other questions here at CodeProject to see what I'm talking about. If you reach the level of expertize you desire, all that people will hate you. They won't mind to use your expertize to their benefits though but will cell you short at any chance. They will be afraid of potential competition from your side and will do their best to let you down.
Not everything is that grim. You will certainly find some decent people in difference places. Nobody knows how many ears would it take to get you a chance to work with them.
Speaking of the fields of technology you're interesting in, you're asking too many questions, so hardly anyone would be able to help you right direction in all the fields in one quick answer. I can only give you the basic ideas. You should understand that if you go in for every technical detail, you will never get time for this. Therefore, you need to focus on fundamental (and theoretical) aspects of programming. At the same time, you need to practice all the time. The false illusion of knowledge can be too strong. Fortunately, there is pretty good way to check up your understanding: implement key solutions into working code. This is not 100% reliable though. The solution may work, but only for a while. You should go away from trial and error approach and use fundamental approach. For every line you write you should understand why. You should find analytical approach to every problem. This is all about fundamental aspects.
At the same time, there is a lot of junk knowledge: a lot of concrete software/firmware products by concrete manufacturers. You need to save time and learn them only when it is really required by some practical purpose. You need to work not toward erudition, but for really deep understanding. (Even though the job hunting is based on concrete junk knowledge, this is a bad illness of the industry; so you need to put yourself above this. You principle should be working for yourself first, then for your company; at the same time, you will need to be able to achieve ultimate commercial and other goals; this is no a very easy balance.)
As to the knowledge itself, these days this is much easier. You can use Google, Wikipedia and other sources. The real problem is selecting effective and solid sources of information. With time, you will find your ways to tell "cool" from "real" looking at many indirect symptoms. You should trust less and check up more, especially in the early stages of your self-development, before you develop better intuition.
For the bright note, I would like to give you only one reference, but the one I think every developer should know first. It is probably the most encouraging, too:
Peter Norvig, Teach Yourself Programming in Ten Years,
http://norvig.com/21-days.html[
^].
Good luck,
—SA