Linux设备驱动入门进阶分享: 从一个小白跟着导师看视频自学然后到工作岗位上去实践再到当培训讲师最后再回到工作实践中去研发去沉淀我清楚的知道一个小白学习Linux驱动的痛苦与困难,也清楚一个自学或者培训的没经验的童鞋在学习中的迷茫点,也同样清楚这些没经验的童鞋在刚跨入工作岗位面对真正项目的束手无策,因为这些我都亲身经历过,所以我想把我对驱动入门的理解和前辈们的总结再进行一个整合,分享给那些还没入门的童鞋。
本系列导航 (一)初识Linux驱动 (二)Linux设备驱动的模块化编程 (三)写一个完整的Linux驱动程序访问硬件并写应用程序进行测试 (四)Linux设备驱动之多个同类设备共用一套驱动 (五)Linux设备驱动模型介绍 (六)Linux驱动子系统-I2C子系统 (七)Linux驱动子系统-SPI子系统 (八)Linux驱动子系统-PWM子系统 (九)Linux驱动子系统-Light子系统 (十)Linux驱动子系统-背光子系统 (十一)Linux驱动-触摸屏驱动
从用户的角度:我们用的鼠标、键盘、无线网卡等都需要安装相对应的驱动程序后才能正常使用这些设备。 从开发者的角度:驱动是直接和硬件打交道的软件,可以使计算机和设备进行通信的特殊程序,相当于硬件的接口,操作系统或应用程序只能通过这个接口才能控制硬件设备进行工作。向下,驱动程序需要控制硬件进行相应的操作;向上,驱动程序需要向应用程序提供操作硬件的接口,所以驱动在整个嵌入式系统中处于一个中间的位置,具有承 上(应用程序)启下(底层硬件)的作用。
总是有初学者会问,既然驱动能起到承上启下的作用,能串联应用程序和硬件组成一个完整的嵌入式系统,为什么还要有操作系统这样复杂的东西呢,反而让我们的驱动学习起来更加复杂?没有操作系统只有驱动的确能构建一嵌入式系统,那这个系统就是我们通常所说的裸机系统或者单片机系统,只能完成一些简单的操作,如果有了操作系统就能具有以下功能: a. 一个复杂的软件系统需要处理多个并发任务,如果没有操作系统,想完成多任务并发是很困难的。 b. 操作系统可以给我们提供内存管理机制,一个典型的例子就是,对含有MMU32位处理器而言,操作系统可以让每个进程都可以独立的访问4G的内存空间。
那么操作系统的存在给驱动提供了什么样的好处呢?有些学习过单片机的同学老是抱怨说,我学习裸机驱动感觉很简单,当学习带有操作系统的驱动的时候,十分复杂,感觉太难。事实确实是这个样子,那为什么要这么做呢?其实操作系统就是通过给驱动制造麻烦,从而来达到给上层应用提供便利的目的:操作系统提供给应用程序统一的系 统调用接口来访问对应的驱动程序,从而来操作硬件设备,起到了分层的作用,写应用程序的人不用关心底层驱动怎么实现,只需要调用统一的接口就可以,做驱动的人,只需要按照操作系统提供的框架去完成驱动程序就可以了。 我下面画一个图来解释这个过程:
Linux驱动的学习涉及应用层(例如访问字符驱动以文件的形式,所以需要文件IO知识)和硬件(操作硬件需要看原理图,芯片手册,读写寄存器等)等方面的知识,涉及知识面广,架构多而复杂,所以初学者一定要有一定的Linux应用层和单片机开发相关的知识储备,这样上手起来可能会更加容易一点。另外,对于初学者,在学习驱动的时候,不能太纠结于细节(如为弄清某段代码,不断跟源代码),最好从使用的角度,宏观上、框架上去进行把握,等熟悉了之后,再慢慢深入。另外需要多实践,尽量有自己的开发板及外围器件,亲自动手操作,而不是只看视频或者阅读书籍。
a. 熟悉Linux驱动开发流程,能独立开发简单的驱动。 b. 熟悉常用的Linux驱动框架(平台总线模型,I2C、SPI驱动框架,framebuffer驱动框架)。 c. 掌握驱动代码的跟踪分析,调试手段等。这一条是最重要的,实际工作中其实不是从0写驱动,大多都是芯片厂商提供源码,然后你去整合到项目的平台上,然后调试。