嵌入式Linux驱动开发从基础到框架

想讲好嵌入式Linux的驱动开发并不容易,各位业界大神从最基础的字符驱动到中断并发再到驱动框架、应用层调用。但是总觉得业界写的书都是点到为止,可能也有篇幅过长、嵌入式Linux驱动框架碎片化的考虑。在一众嵌入式Linux驱动书中笔者最推崇宋宝华的《Linux设备驱动开发详解》,但他完全可以更进一步上升到驱动框架个例(比如USB wifi模块驱动)和应用层调用。有些书从c语言基础谈起,真是莫名其妙,不懂C语言应该去学C语言而不是来学驱动。

1、基础和原料

驱动程序本身也是程序,所有程序都有基础和调用原料库(最底层的编译器调用汇编指令集)。所以为了写出驱动程序第一步是要了解写的规则(基础)和调用库(原料)。

写驱动的规则,一般的书开局一个字符驱动讲到最后就没了,其实字符驱动只是引子。驱动的基础其实太多了。首先是分离分层和设备书概念,但这个是非常具体的,什么东西放设备树以及设备树如何在开机阶段被解析注册进总线的,驱动是如何注册进总线的,驱动如何提供设备名和主次设备号给应用层调用(内核这里看到是驱动,应用层那里看到一个个设备文件)等等。很多人以为驱动就设备树、总线、驱动三个具体的文件包打天下,要是这样只能写出简单的字符驱动,从这三大块很容易分出非常多的文件。然后是中断屏蔽、原子操作、锁、信号量、互斥体、阻塞、非阻塞、异步和同步、中断等纯粹的程序原理性东西,这个跟硬件基本没有关系,是程序设计在驱动开发里的高级体现。最后就是原料了,一本Linux内核API手册也只是字典,活用还是要多看代码。

熟悉了基础和原料,大概就能写出比较复杂的字符驱动了,但离真正用得上还很远。总体来说在了解驱动的基础和原料后还是要实际看几个大型的驱动才有收获。

2、驱动框架

很多人以为写个字符驱动就差不多了,再加个阻塞非阻塞就顶天了,这样的驱动绝不会被合并到内核设备树里,SOC厂也不会放进自己的SDK里发布,因为缺少实际可用的框架包装。Linux的驱动框架种类繁多、单种内容多,比如一个看似很简单的GPIO驱动却要包装sysfs文件系统框架、再配合pinctrl,产生了非常多的源文件,一般人早就云里雾里了。而且应用层接口也是被包进驱动框架里的,比如GPIO被包进sysfs后在应用就是通过/sys里的文件属性操作的。

驱动的框架可以分为简单框架和复杂框架。简单框架就是类似sysfs(kobject, ktype, kset)、udev(kobject, ktype, kset)、proc还有USB、I2C、SPI等这种一对一的,就是一种驱动就用一种框架。但是在日益复杂的外设面前简单框架基本要被复杂框架套用才能在现实中用上,比如一个USB驱动外面不挂成U盘或wifi能用吗?复杂框架包括input、wifi、framebuffer等等。

驱动框架这个真没法自己写出来,能看懂改哪里已经不错,更何况现在除了论坛,书本专门讲的很少。

3、应用层调用

内核对于应用层真是厚爱,所有难写的代码全在内核层,应用层除了对设备文件和属性文件来几个open、read、write、ioctl等,好像没别的。举个例子framework框架的驱动在底层够复杂了吧,看看在应用层的接口,稍微了解点属性控制的,不难写出显示程序了吧。如果用上成熟的Qt和tslib,完全可以忽略硬件了。

应用层简单不代表驱动在做应用层接口时简单,很多人以为实现一个file_operation结构体就好了,但是如何实现呢?同步异步、阻塞非阻塞、ioctl属性如何实现呢等等。

4、驱动重点不是从无到有而是移植修改

现在的写驱动的书好像真能教人从无到有写出一个驱动,但可惜除了简单的GPIO控制基本用不了。极少有人能单枪匹马实现从无到有写出一个驱动,而且这些一般都在芯片厂或者给Linux内核提供代码的大牛。普通开发者就是拷贝,修改,调试,不行就改改。但要达到知道改哪里的程度也要大量学习。

嵌入式Linux内核层的开发远不如单片机程序灵活,单片机领域因为碎片化超级严重各种RTOS、框架、状态机等等满天飞。也正因为如此可能很多人觉得过于简单,业内大量程序员转安卓系统底层开发尤其是framework层开发。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值