学linux驱动开发(小白该如何学习Linux驱动开发)

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驱动开发(小白该如何学习Linux驱动开发)(1)

学linux驱动开发(小白该如何学习Linux驱动开发)(2)

Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂

给大家推荐一下驱动开发转内核大神的学习路线

全方面系统全面的讲解底层原理开发技术:

1、五大专题,共计150 个课时

2、20个实战操作模块,2w 代码;

主要从

  • 进程管理专题
  • 内存管理专题
  • 网络协议栈专题
  • 设备驱动管理专题
  • 文件系统及内核组件专题

全方面系统全面的讲解底层原理开发技术:

最新Linux内核大纲

进程管理专题

学linux驱动开发(小白该如何学习Linux驱动开发)(3)

内存管理专题

学linux驱动开发(小白该如何学习Linux驱动开发)(4)

网络协议栈专题

学linux驱动开发(小白该如何学习Linux驱动开发)(5)

设备驱动管理专题

学linux驱动开发(小白该如何学习Linux驱动开发)(6)

文件系统及内核组件专题

学linux驱动开发(小白该如何学习Linux驱动开发)(7)

项目实战

学linux驱动开发(小白该如何学习Linux驱动开发)(8)

适合于

  • 1.从事业务开发多年,对底层原理理解不够深入的在职工程师
  • 2. 从事嵌入式方向开发,想转入互联网开发的在职工程师
  • 3. 从事Qt/MFC等桌面开发,薪资多年涨幅不大的在职工程师
  • 4. 从事非开发岗位(算法岗,运维岗,测试岗),想转后台开发岗位的在职工程师
  • 5. 工作中技术没有挑战,工作中接触不到新技术的在职工程师
  • 6. 自己研究学习速度较慢,不能系统构建知识体系的开发人员
  • 7. 了解很多技术名词,但是深入细问又不理解的工程师
  • 8. 计算机相关专业想进入大厂的在校生(本科及以上学历,有c/c 基础)

学linux驱动开发(小白该如何学习Linux驱动开发)(9)

学linux驱动开发(小白该如何学习Linux驱动开发)(10)

学linux驱动开发(小白该如何学习Linux驱动开发)(11)

学linux驱动开发(小白该如何学习Linux驱动开发)(12)

学linux驱动开发(小白该如何学习Linux驱动开发)(13)

学linux驱动开发(小白该如何学习Linux驱动开发)(14)

等等

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页