目录
- 内核基本框架(字符设备)
- 前言
- 应用程序接口
- 平台设备驱动
- 设备树简介
内核基本框架(字符设备)
前言
在前几次介绍中我们已经知道了一个最基本的字符设备该怎么写,但是随着我们学习平台驱动模型,驱动总线设备模型,设备树这些,很容易弄混淆,故在此进行梳理
应用程序接口
我们在讲驱动代码之前,都了解过,应用程序,无非就是open,write,read文件,我们想操作一个文件,写应用程序来控制硬件,首先需要开发者给予我们的接口,这接口就是我们之前讲的注册字符设备那一套,简单复习一下。
struct dev_t deveno; struct cdev *dev; struct class *class; struct device *device;//其实就是这四个的定义了 //我们需要定义这四个结构体变量,来注册我们的字符设备 //接下来我们要实现我们自己的open,write,read,release函数,其中openrelease必须,其他可选,并定义struct file_operations 变量来储存函数 //然后我们可以在init或者probe这些放初始化的函数里进行注册,总体就按照四个变量进行注册就行,先用alloc_chrdev_region申请设备号,cdev_init初始化绑定函数表,然后再用cdev_add把字符设备加入VFS,然后再定义class,device就OK然后我们就可以通过操作我们dev里生成的文件来读写我们想操作的硬件平台设备驱动
与上面建立与用户的联系的任务不同,平台设备驱动是为了建立内核与硬件的联系,你就比如,平台设备里面存放硬件资源,平台驱动里面存放与设备匹配后初始化的工作,它们做的就是让写的驱动获取硬件资源再工作,跟上面的那个是两套东西,分工不同,如果你想在驱动提供用户应用接口,就也需要注册字符设备。
设备树简介
简单梳理了一下之后,讲讲设备树,设备树就是一个设备节点树状图,里面存放着设备的信息资源,就是设备的描述性文件,它的优势是可以简单的实现跨板移植。打个比方,传统的c设备,把硬件信息全写进c代码,然后编译内核,板子更新微调硬件,就需要重新改c代码重新编译,非常浪费时间,而且随着外设越来越多,这个工程量也是大的吓人,于是设备树出现了,它仅仅是描述性文件,不带任何逻辑,我们可以用接口,读取这些资源在我们驱动里进行我们的逻辑,这样做有什么好处呢,就是我们在微调外设的时候只需要微调设备树就行,不需要重新编译,而且在不同板子中,可以让一套驱动适配多个板子,这就是设备树的好处,设备树很重要,这也是很多驱动工程师自嘲为设备树工程师的原因。