01要知道将来要做什么
linux设备驱动开发作业分为两大类,一类是做BSP级的开发,别的一类是做外设驱动的开发。
BSP的开发指的是板级代码的开发,和CPU是密切相关的,例如I2C/SPI Adapter的驱动。假如运用通用的芯片,比方三星的Exynos,飞思卡尔的I.MX系列,TI的OMAP或许DaVinci系列,根本都会有现成的BSP包,这部分代码通常是芯片厂商供给和大型公司贡献。大家能够看看linux内核源码中/arch/arm/mach-omap,内部很多代码都是诺基亚贡献。做BSP级的开发需求有较深的功底,首先要十分了解CPU特性,别的要使代码有良好的扩展性和复用性,方便后续移植。有这样需求的往往是芯片商或运用专用芯片的设备商。
外设驱动开发就相对简略一些,都是和特定的外设硬件打交道。经过利用BSP级代码供给的API或许linux供给的更高层的笼统接口来操作硬件。实践上和应用层的开发大同小异。例如操作I2C总线上的EEPROM,实践上的读和写操作都有现已封装好的API来完成.而开发者需求做的是了解外设的特性,经过封装好的API对外设进行操作。新入门的开发者主张从外设驱动开发下手,按部就班。当然,一个优秀的开发者是即能够做BSP级代码的开发,也能做外设驱动的开发的。例如操作I2C总线上的EEPROM,实践上的读和写操作都有现已封装好的API来完成.而开发者需求做的是了解外设的特性,经过封装好的API对外设进行操作。新入门的开发者主张从外设驱动开发下手,按部就班。当然,一个优秀的开发者是即能够做BSP级代码的开发,也能做外设驱动的开发的。
02用面向对象的思维去考虑
面向对象,即OO思维,大家应该非常了解。linux的内核尽管用面向过程的C言语完成,可是仍然是经过面向对象的思维去规划的。
假如从单片机转行做linux设备驱动,会发现和单片机的或许裸机的驱动规划有很大区别。规划linux设备驱动不单单是对硬件设备的操作,更多需求考虑的是扩展性和代码的复用。 所以就呈现了platform device/driver,i2c device/driver,spi device/driver,笼统出了设备和驱动两部分,使设备细节和驱动别离。别的还呈现了一些结构,供给了底层接口的封装,做开发时要习惯用OO思维去规划。当然要记住条条大路通罗马,不运用这些device/driver也能够完成设备驱动,仅仅不太引荐这样做。
03从各驱动结构下手
Linux供给了各种结构(子系统),对底层进行封装,笼统出相同操作的接口,这样能够更好的完成复用。想入门linux驱动开发,能够先从结构下手,把握API的运用,再逐步深入研究,从上到下去学习。不要把驱动开发幻想的太杂乱,实践和英语的完型填空差不多,结构有了,只需求自己去填写操作具体硬件的细节代码罢了。
几个比较重要和常用的结构有:
GPIO:这个就不必多说了,刚开始触摸驱动的根本会操练经过GPIO点亮LED的操作,linux封装了相关的gpio操作接口。
SPI:学会spi device/driver的用法,以及收发音讯API,能够参阅一些代码,根本都是相同的套路。
I2C:学会i2c device/driver的用法,和学习SPI的套路相同。
PINCTRL:非常重要的一个结构,担任CPU引脚复用,由于现在的CPU都很杂乱,一个引脚支撑多种复用。
V4L2:一个非常杂乱的视频收集结构,具体能够参阅相关的文档。驱动里边有很多比如可供参阅,同时供给了模板vivi.c
Framebuffer:显现相关的结构,了解其中API,并且有模板skeletonfb.c。
DMA Engine: 把DMA操作进行封装,目前驱动代码中关于DMA的操作很多是运用私有的BSP包中的DMA接口,假如支撑DMA Engine的话,主张运用DMA Engine。
中断:比较常用的了,接口不多,很少把握。
USB结构:USB结构比较杂乱,API较多,能够经过读已有的代码进行学习。
MTD结构:存储相关比较重要的结构,网上相关的文档很多。
设备树:设备树是在新的内核里边引进来的,能够把板级代码中的各种device经过设备树文件去描述,动态创立,这样更灵敏。其实不要把设备树幻想的太杂乱,实践和解析JSON,XML相同,各个节点中记载设备相关的信息,供给给驱动运用。
作者:云叔
链接:https://www.zhihu.com/question/21192856/answer/2874445135
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。