应用开发的基本知识

目录

一、设备驱动框架、标准接口与非标准接口

二、应用层对底层硬件操控

1、应用层操控硬件的两种方式

2、sysfs 文件系统

3、sysfs 与/sys

总结


一、设备驱动框架、标准接口与非标准接口

        Linux 内核中为了尽量降低驱动开发者难度以及接口标准化,就出现了设备驱动框架的概念; Linux 针对各种常见的设备进行分类,譬如 LED 类设备、输入类设备、 FrameBuffer 类设备、 video 类设备、 PWM 设备等等,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架, 这个就叫做设备驱动框架。

        设备驱动框架为驱动开发和应用层提供了一套统一的接口规范, 譬如对 LED 类设备来说, 内核提供了 LED 设备驱动框架,驱动工程师编写 LED 驱动时,使用 LED 驱动框架来开发自己的 LED 驱动程序,这样做的好处就在于,能够对上层应用层提供统一、标准化的接口、 同时又降低了驱动开发工程师的难度。

        当然,编写 LED 驱动程序并不仅仅只能使用内核设计的 LED 设备驱动框架,不用内核的 LED 驱动框架也是可以开发出 LED 驱动程序的,但如果这样写,使用这个驱动程序注册的 LED 那就不是标准设备了, 因为该驱动程序向应用层提供的接口并不是统一、 标准化接口。

        除此之外,还有很多硬件外设,尤其是嵌入式系统中所使用到的这些硬件外设,它们可能并不属于 Linux系统所规划的设备分类当中的任何一种设备类型,譬如在 Linux 系统中,有一种设备类型叫杂散/杂项类设备(misc device),可以想一想为什么叫杂散类设备,说明这种设备既不属于这种设备类型、又不属于另一种设备类型,无奈只能把它归为杂项类。

        因为一个计算机系统所能够连接、使用的外设实在太多了,不可能每一种外设都能够精准地分类到某一个设备类型中,通常把这些无法进行分类的外设就称为杂项设备,杂项设备驱动程序向应用层提供的接口通常都不是标准化接口、它是一种非标准接口,具体如何去操控这个设备通常只有实现代码的人知道。所以在嵌入式系统中,很多硬件外设的驱动程序都是定制的。

二、应用层对底层硬件操控

1、应用层操控硬件的两种方式

        应用层操控底层硬件是通过文件 I/O 的方式来实现,其实设备文件便是各种硬件设备向应用层提供的一个接口,应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/目录下,我们也把/dev 目录下的文件称为设备节点。

        设备节点并不是操控硬件设备的唯一途径,除此之外,我们还可以通过 sysfs 文件系统对硬件设备进行操控。

2、sysfs 文件系统

        sysfs 是一个基于内存的文件系统, 同 devfs、 proc 文件系统一样,称为虚拟文件系统; 它的作用是将内核信息以文件的方式提供给应用层使用。proc 文件系统, 应用层可以通过proc 文件系统得到系统信息和进程相关信息,与 proc 文件系统类似, sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图
        sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、 展示设备驱动模型中各组件的层次关系。 sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系, 用来导出内核对象(kernel object,譬如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。

        描述了内核对象、对象属性及对象间关系在用户空间 sysfs 中的表现如下

内核中的组成要素sysfs 中的表现
内核对象(譬如一个硬件设备)目录
对象属性(譬如设备属性)文件
对象关系链接文件

3、sysfs 与/sys

        sysfs 文件系统挂载在/sys 目录下,启动开发板,进入 Linux 系统(开发板出厂系统) 之后,进入到/sys 目录下查看

         上图显示的便是 sysfs 文件系统中的目录,每个目录下又有许多文件或子目录,对这些目录的说明如所示:

/sys 下的子目录说明
/sys/devices这是系统中所有设备存放的目录, 也就是系统中的所有设备在 sysfs 中的呈现、表达,也是 sysfs 管理设备的最重要的目录结构。
/sys/block块设备的存放目录,这是一个过时的接口,按照 sysfs 的设计理念,系统所有的设备都存放在/sys/devices 目录下,所以/sys/block 目录下的文件通常是链接到/sys/devices 目录下
的文件
/sys/bus这是系统中的所有设备按照总线类型分类放置的目录结构, /sys/devices 目录下每一种设备都是挂在某种总线下的,譬如 i2c 设备挂在 I2C 总线下。同样, /sys/bus 目录下的文件通常也是链接到了/sys/devices 目录。
/sys/class这是系统中的所有设备按照其功能分类放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。 按照设备的功能划分组织在/sys/class 目录下,譬如/sys/class/leds
目录中存放了所有的 LED 设备, /sys/class/input 目录中存放了所有的输入类设备。
/sys/dev这是按照设备号的方式放置的目录结构,同样该目录下的文件也是链接到了/sys/devices 目录。该目录下有很多以主设备号:次设备号(major:minor)命名的文件,这些文件都是链接文件,链接到/sys/devices 目录下对应的设备。
/sys/firmware描述了内核中的固件。
/sys/fs用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点。
/sys/kernel这里是内核中所有可调参数的位置。
/sys/module这里有系统中所有模块的信息。
/sys/power这里是系统中电源选项,有一些属性可以用于控制整个系统的电源状态。

        系统中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构;而/sys/bus、 /sys/class、 /sys/dev 分别将设备按照挂载的总线类型、功能分类以及设备号形式将设备组织存放在这些目录中,这些目录下的文件都是链接到了/sys/devices 中

        设备的一些属性、数据通常会通过设备目录下的文件体现出来,也就是说设备的数据、属性会导出到用户空间,以文件形式为用户空间提供对这些数据、属性的访问支持, 可以把这些文件称为属性文件; 读这些属性文件就表示读取设备的属性信息,相反写属性文件就表示对设备的属性进行设置、以控制设备的状态

总结

应用层想要对底层硬件进行操控,通常可以通过两种方式:
⚫ /dev/目录下的设备文件(设备节点)
⚫ /sys/目录下设备的属性文件
        具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控;当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、 GPIO 等,对于一些较复杂的设备通常会使用设备节点的方式, 譬如 LCD 等、触摸屏、摄像头等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值