刚开始做linux驱动的时候,比较迷惑:我应该怎么做驱动呢,看设备的官方文档然后根据寄存器的设置编写驱动?
但是随手打开一个设备的datasheet,就头大无比,N多的寄存器,N多的操作限制。想要读懂datasheet很难,想要根据datasheet编写驱动更难,想要编写一个能够使设备性能最大化的驱动难上加难。
但是驱动还是应该写的,否则项目不就over了。但是应该怎么写呢?
OK,以最近接手的赛灵思的zynq-7000芯片为例。
开发工具ISE提供了集成的软件开发环境,只要你包含了一个外设IP核,它就自动生成了裸机环境下该外设的驱动程序,你所要做的只是在应用程序中以正确的步骤调用驱动提供的API接可以了,POLL和中断模式任君选择。更人性化的是,SDK为每一个IP 核都提供了至少一个example,想要了解外设的驱动流程,先去读懂这些example吧。阅读中最重要的是要逐层深入,一窥究竟xilinx自带的驱动是如何操作外设的registers的。
有了上面的基础后,就开始编写linux下的驱动吧,ioremap、mmap、read32、write32、request_irq等等任君选择。
coding....
问题来了,驱动好难写啊!!!
复杂的外设还要考虑dma,还要构造外设结构体,还要使用等待队列等等....项目等不及啊
怎么办?
其实有捷径:你想想,硬件生产商其实每做一个外设,都是给它编写驱动了,否则设备不就裸奔了。关键是你要去理解设备的性能,然后在官方的驱动上加以利用,调用它的API编写自己的驱动,达到用户定制的目的。
个人理解而已,大拿们肯定自己写完所有的驱动code了,努力吧