doing this kind of stuff inside or outside the kernel depends on many considerations like performance needed, is special hardware used etc... Another consideration is the policies / means: in an ideal world drivers only provide means for user space applications / libraries policies. My opinion for this kind of problem is to do all that can be in user space, and developing kernel space code only when necessary.
but getting my hands dirty with kernel code sounds like a daunting task for me that I've never done it
It depends on the kind of driver you want to write, but thanks to the well done kernel API, it's often not so difficult, see one of the best reference to start with there
It's difficult to help you more without more specific details on what kind of driver you need.