I think I'll go for a SATA driver straight away. I'm sure a great deal of stuff can be ripped out the Linux drivers to reveal the basics. I find the specs to be more confusing than anything else to try and get the big picture and organise everything. From reading the ATA specs for example, I don't recall seeing that ATA_IDENTIFY had to be sent before issuing read/write commands, although it would have been in there somewhere.
I find that's a major problem with monster programming tasks like writing an OS. Getting lost in details is so easy.

Having said that, I have a book called Operating System Design: The XINU Approach (PC Edition) by Douglas Comer. It's a contender for the best OS design book with Tanenbaum's Operating Systems: Design and Implementation. Comer's book explains things like concurrency far better than any other OS book I've seen. The code is short and simple. It's not a great stretch of the imagination to apply the principles to a 32- or 64-bit system.
Edit: fix typos.