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

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

3天内不再提示

Linux驱动开发的学习方法

凉白不开 来源:凉白不开 作者:凉白不开 2022-04-22 09:52 次阅读

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

审核编辑:汤梓红

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

    关注

    87

    文章

    10990

    浏览量

    206738
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
  • 驱动框架
    +关注

    关注

    0

    文章

    14

    浏览量

    4004
收藏 人收藏

    评论

    相关推荐

    嵌入式Linux开发的三种方式

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

    请问初学者要怎么快速掌握FPGA的学习方法?

    对于初学者 FPGA的编程语言是什么? FPGA芯片的基础结构也不了解. FPGA开发工具的名称和使用方法都不知道. 要学的很多啊,请问有什么自学的学习方法么?
    发表于 01-02 23:01

    一文总结linux的platform驱动

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

    stm32学习方法及资料

    1、 一共 24 个库,不可能都学,都学也没用。按照我的工作需求必须学的有 16 个,这 16 个也不是全学。主要学习来源是各种例程代码、“固件函数库用户手册”和“参考手册”。具体学习方法是通读
    发表于 10-13 06:30

    《电子工程师必备——九大系统电路识图宝典》+附录5学习方法

    刚刚接触电子技术的新手朋友来说,找到适合自己的学习方法更是至关重要。希望通过本文的分享,你能在探索电子技术的旅程中取得更多的成功和成就。 谢谢! 本人帖子: 米尔-STM32MP135开发板试用2-
    发表于 10-06 23:25

    STM32的学习方法

    STM32学习方法
    发表于 09-28 06:18

    JZ2440V3开发板的使用手册

    开发板资源介绍、学习方法、环境搭建、烧写流程等在学习嵌入式 Linux 之前,肯定要有 C 语言基础。嵌入式 Linux 可以分为两部分:底
    发表于 09-22 07:59

    梳理单片机学习方法、产品开发流程

    梳理单片机学习方法、产品开发流程
    的头像 发表于 09-21 17:20 393次阅读
    梳理单片机<b class='flag-5'>学习方法</b>、产品<b class='flag-5'>开发</b>流程

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

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

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

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

    联合学习在传统机器学习方法中的应用

    联合学习在传统机器学习方法中的应用
    的头像 发表于 07-05 16:30 544次阅读
    联合<b class='flag-5'>学习</b>在传统机器<b class='flag-5'>学习方法</b>中的应用

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

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

    Linux之PWM驱动

    本文主要讲述了Linux的PWM驱动框架、实现方法驱动添加方法和调试方法
    发表于 05-25 09:19 408次阅读
    <b class='flag-5'>Linux</b>之PWM<b class='flag-5'>驱动</b>

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

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

    Linux的PWM驱动框架及实现方法

    本文主要讲述了Linux的PWM驱动框架、实现方法驱动添加方法和调试方法
    的头像 发表于 05-14 15:24 1017次阅读
    <b class='flag-5'>Linux</b>的PWM<b class='flag-5'>驱动</b>框架及实现<b class='flag-5'>方法</b>