四、引入总线设备驱动的概念,基于平台驱动的LED字符设备驱动

文章讨论了Linux系统中如何通过平台驱动进行设备抽象,以LED、LCD和AD转换器为例,解释了如何使用platform_device和platform_driver结构体来统一管理不同设备。作者强调了设备驱动的通用性和层次设计的重要性,并批评了一些教程中的不足,建议结合多个来源学习以避免误解。

对于之前写好的LED字符设备驱动,我们在板级的层面抽象出了一个led_resource的结构体来表示一个LED灯。对于LED,我们抽象出了一个结构体来表示,那么LCD呢?AD转换器呢?是不是都要抽象成一个不同的结构体来表示呢?这样对于板级开发者来说太麻烦了,况且硬件设备众多,一个做LCD开发的可能不了解网卡,做网卡驱动开发的也不懂LCD,这样抽象起来难度就很大。那有没有什么方法能解决不同设备的抽象问题呢?答案肯定是有的,接着往下看。
Linux引入了总线驱动的概念,用一条虚拟的总线来管理设备和驱动。对于硬件设备,抽象出了一个platform_device的结构体来表示。对于可对硬件设备执行的操作,抽象出了一个platfrom_driver的结构体来表示。这样,对于不同的设备,我们都可以用通用的platform_device结构体来进行定义了,就不用自己绞尽脑汁地去定义一些不通用的结构体了。

下面的链接是基于平台驱动的LED字符设备驱动代码,一份是基本的平台驱动代码,另一份是经过分层设计后的平台驱动代码。
基本的平台驱动代码:基本的LED平台驱动代码,支持多个LED灯
分层设计的平台驱动:分层设计的LED平台驱动代码,支持多个LED灯

学习心得:
1)一个struct cdev表示的是一个具体的设备,比如一个LED灯
2)将struct cdev和设备私有数据放在一个结构体里面,可以实现绑定文件系统下的设备节点和平台设备资源。在open函数里面,使用container_of可以通过struct cdev找到设备的私有数据。
3)期间遇到了一些很基本的概念和理解上的问题,正点原子和韦东山的教程都没有讲,我就只能靠看他们的代码去猜,比如struct cdev到底表示一组设备还是一个具体的设备的问题。或者struct resource到底表示一个设备还是一个设备的资源的问题,看韦东山的代码,他就是把一个灯定义成了一个struct resource,就让我感觉struct resource是表示一个设备。但是从resource这个名称和各种预定义的资源类型看,它应该是表示一个设备用到的各种资源才对,比如用到的IO引脚,用到的中断,DMA等。最终,带着这些搞不清楚的问题,找到了野火的文档和代码,发现他们才是讲清楚了的,代码中也体现了这些问题,是按照实际使用规范来写的。就拿这个LED灯驱动来说,正点原子居然只支持一个灯,也没有讲怎么支持多个LED灯。韦东山的教程和代码支持了多个LED灯,但是代码太随意,看了让人概念都混淆了,完全不符合实际使用。韦东山和正点原子的代码,基本只能用来当作教学使用的demo,甚至很误导初学者对一些基本概念的理解。所以,大家可以结合几家教程一起来学习,正点原子的基本可以PASS掉了,推荐大家使用 韦东山 + 野火。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值