Linux驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而且门槛又不是特别高,而内核级开发从业人员要少得多,而且资料又较少。
有许多刚刚接触到Linux驱动开发的同学会感觉非常困惑,面对复杂的Linux内核有一种无从下手的感觉。今天就和大家分享一下,让刚刚步入驱动开发的同学少走一些弯路。
一、要知道将来要做什么?学习,都是有目的性的,要么是兴趣使然,要么就是刚性需求,为了找一份好的工作。在这里先和大家聊聊做设备驱动将来可以做哪些方面。
我把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级代码的开发,也能做外设驱动的开发的。
二、用面向对象的思想去思考面向对象,即OO思想,大家应该非常熟悉。linux的内核虽然用面向过程的C语言实现,但是仍然是通过面向对象的思想去设计的。
如果从单片机转行做linux设备驱动,会发现和单片机的或者裸机的驱动设计有很大区别。设计linux设备驱动不单单是对硬件设备的操作,更多需要考虑的是扩展性和代码的复用。
所以就出现了platform device/driver,i2c device/driver,spi device/driver,抽象出了设备和驱动两部分,使设备细节和驱动分离。另外还出现了一些框架,提供了底层接口的封装,做开发时要习惯用OO思想去设计。当然要记住条条大路通罗马,不使用这些device/driver也可以实现设备驱动,只是不太推荐这样做。
三、从各驱动框架入手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一样,各个节点中记录设备相关的信息,提供给驱动使用。
文末有学习路线参考!
更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取.
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
给大家推荐一下驱动开发转内核大神的学习路线
全方面系统全面的讲解底层原理开发技术:
1、五大专题,共计150 个课时
2、20个实战操作模块,2w 代码;
主要从
- 进程管理专题
- 内存管理专题
- 网络协议栈专题
- 设备驱动管理专题
- 文件系统及内核组件专题
全方面系统全面的讲解底层原理开发技术:
最新Linux内核大纲进程管理专题
内存管理专题
网络协议栈专题
设备驱动管理专题
文件系统及内核组件专题
项目实战
适合于
- 1.从事业务开发多年,对底层原理理解不够深入的在职工程师
- 2. 从事嵌入式方向开发,想转入互联网开发的在职工程师
- 3. 从事Qt/MFC等桌面开发,薪资多年涨幅不大的在职工程师
- 4. 从事非开发岗位(算法岗,运维岗,测试岗),想转后台开发岗位的在职工程师
- 5. 工作中技术没有挑战,工作中接触不到新技术的在职工程师
- 6. 自己研究学习速度较慢,不能系统构建知识体系的开发人员
- 7. 了解很多技术名词,但是深入细问又不理解的工程师
- 8. 计算机相关专业想进入大厂的在校生(本科及以上学历,有c/c 基础)
等等
,