Many kernel enthusiasts dream to develop device drivers. Developing a Linux device driver is a daunting tasks. There are many resources scattered all over the internet, which are very useful for learning. Though most of those resources can teach device driver API’s through skeleton code or dummy device driver and is really helpful, but I felt they put a lot of information all together which might deviate the new programmer or make them disappointed. When I was trying to learn device driver programming for my GSoC project, I was going through a lot of tutorial and I felt most of the tutorials are too much for me to take. Also most of them didn’t use some real hardware or did use something unavailable to me. So I wanted something which will guide me from very basic to advance level, step by step. At the same time I wanted a driver that can be used on some very common device that I already have. Hence I felt writing about this tutorial where I’ll try to explain the way I learnt device driver programming. I’m no expert and all I would try is to express what I learnt. Throughout this tutorial I’ll cover some basics of device driver development. We’ll start development by learning what is a kernel module, then we’ll develop a simple kernel module and step by step we’ll move towards more complex device drivers which will let us talk to a real(and pretty common too!!!) hardware. Needless to say, while writing this tutorial I took a lot of help from online resources and books and any enthusiast developer should go through those books and online resources to master it Linux device driver programming concepts.