0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何学习Linux驱动开发?

信盈达 2022-01-06 16:34 次阅读

Linux驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而且门槛又不是特别高,而内核级开发从业人员要少得多,而且资料又较少。

有许多刚刚接触到Linux驱动开发的同学会感觉非常困惑,面对复杂的Linux内核有一种无从下手的感觉。今天就和大家分享一下,让刚刚步入驱动开发的同学少走一些弯路。

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级代码的开发,也能做外设驱动的开发的。

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一样,各个节点中记录设备相关的信息,提供给驱动使用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7294

    浏览量

    142846
  • Linux
    +关注

    关注

    87

    文章

    10981

    浏览量

    206689
收藏 人收藏

    评论

    相关推荐

    盘点那些硬件+项目学习套件:STM32MP157 Linux开发板及入门常见问题解答

    驱动开发ARM Cortex-A7开发Linux系统移植,全体系学习; • STM32单片机学习
    发表于 02-01 14:25

    嵌入式Linux开发的三种方式

    嵌入式Linux开发主要有三种方式:裸机开发、SDK开发驱动开发
    的头像 发表于 01-22 14:22 243次阅读

    基于全志V3S芯片DIY Linux开发

    简介:大佬已在硬创社开源了近50款开发板,动手能力极强,于去年年底开始接触学习Linux,并由全志V3s、F1C200S等芯片开始上手DIY个人的Linux
    的头像 发表于 01-15 09:37 1158次阅读
    基于全志V3S芯片DIY <b class='flag-5'>Linux</b><b class='flag-5'>开发</b>板

    DIY个人的Linux开发板教程

    作者简介:大佬已在硬创社开源了近50款开发板,动手能力极强,于去年年底开始接触学习Linux,并由全志V3s、F1C200S等芯片开始上手DIY个人的Linux
    的头像 发表于 01-07 09:52 596次阅读
    DIY个人的<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>板教程

    linux安装网卡驱动教程

    Linux系统中安装网卡驱动是一个比较基础的操作,下面我将为你详细讲解如何安装网卡驱动。 第一步,检查网卡型号和驱动支持情况:首先,你需要确定你的网卡型号,并查看该网卡型号在
    的头像 发表于 11-17 11:11 1522次阅读

    一文总结linux的platform驱动

    linux设备驱动中,有许多没有特定总线的外设驱动,在实际开发中,又需要使用到总线、驱动和设备模型这三个概念,故而
    的头像 发表于 10-16 16:45 392次阅读
    一文总结<b class='flag-5'>linux</b>的platform<b class='flag-5'>驱动</b>

    嵌入式Linux应用开发的完全手册

    障碍。很多人买了开发板想进一步练习,却发现不知从何入手。 鉴于上述种种困难及需求,作者结合自己的学习经历、工.作心得写成此书,期望能帮助读者加快嵌入式 Linux 的入门速度,并体会到深入学习
    发表于 09-25 07:12

    ARM-Linux开发和 MCU开发的不同点 ARM-Linux的基本开发环境

    针对 ARM-Linux 程序的开发,主要分为三类:应用程序开发驱动程序开发、系统内核开发,针
    的头像 发表于 08-07 16:23 518次阅读

    怎么才算熟悉linuxLinux系统开发有何难点

    对于有一定 Linux 开发基础希望进阶学习 Linux 系统编程的开发人员来说,其难点在于,Linux
    发表于 07-28 11:45 414次阅读

    看看ARM-Linux开发和MCU开发的不同点

    针对ARM-Linux程序的开发,主要分为三类:应用程序开发驱动程序开发、系统内核开发。针对不
    发表于 07-25 09:25 753次阅读

    Linux内核学习笔记:initcall

    写过Linux驱动的人都知道`module_init`宏,因为它声明了一个驱动的入口函数。
    发表于 06-01 15:12 388次阅读

    Linux驱动中创建sysfs接口的方法

    在一些linux开发板中,经常可以看到通过echo的方式来直接控制硬件或者修改驱动
    发表于 05-31 16:24 561次阅读

    Linux clock子系统及驱动实例

    Linux驱动中,操作时钟只需要简单调用内核提供的通用接口即可,clock驱动通常是由芯片厂商开发的,在Linux启动时clock
    发表于 05-31 16:10 458次阅读
    <b class='flag-5'>Linux</b> clock子系统及<b class='flag-5'>驱动</b>实例

    ARM-Linux开发和MCU开发的不同点

    针对ARM-Linux程序的开发,主要分为三类:应用程序开发驱动程序开发、系统内核开发。针对不
    的头像 发表于 05-30 09:01 478次阅读

    迅为基于RK3568开发板的嵌入式学习Linux驱动视频

    迅为基于RK3568开发板的嵌入式学习Linux驱动视频
    的头像 发表于 05-19 16:30 549次阅读
    迅为基于RK3568<b class='flag-5'>开发</b>板的嵌入式<b class='flag-5'>学习</b>之<b class='flag-5'>Linux</b><b class='flag-5'>驱动</b>视频