I don't know a lot about drivers on Linux either, but like you I'd like to investigate.
In principle, controlling hardware devices is generally quite easy. Devices I used (on other systems) tended to be "memory mapped". This means that control "ports" on the hardware device would be mapped so that they look like standard memory in a particular address range. As long as you know the specs of the device, then it's quite easy to construct a program to read and write to this pretend-memory to make the device do what you want. Most devices also generate interrupts when they need the computer to react to something quickly.
Linux drivers provide an interface between a device (which looks like a file) and the hardware. So for example the driver may be called when a character is written to your device (e.g. /dev/mydevice). It is then up to the driver to do something with this character - maybe write it so a particular memory-mapped location, or buffer it up, or write something to a control location on the device.
Of course this is just the broad principle - it can get more complicated than this. I am considering purchase a book which I have heard only superb reviews of called "Linux
Device Drivers" by Alessandro Rubini, published by
O'Reilly, ISBN 1-56592-292-1 (http://www.oreilly.com/catalog/linuxdrive/)
Also check out the
and the outdated http://people.redhat.com/johnsonm/devices.html