c-设备驱动程序分类



因此,根据我的两本关于设备驱动程序的书(适用于Linux),值得注意的是O'REILLY版本("Linux设备驱动程序(第三版)")有三种类型的设备驱动程序:

  1. 一次读取/写入字节数据的字符驱动程序。

  2. 读取和写入数据块(文件存储设备)的块驱动程序。

  3. 发送和接收帧的网络驱动程序(对于以太网和wifi,这些是48位的数据块)。

那么,视频和声音驱动程序在哪里合适呢?我问这个问题是因为AFAIK你的屏幕有一条总线,可以将帧从主板发送到显示器,而你屏幕上的图像是一个内存映射(一个方形阵列),以一定的帧/秒刷新。声音驱动器还以44.1KHz的采样率向DAC发送16位(2字节)帧。这些是角色驱动因素吗?我认为它们与网络驱动程序属于类似的类别,因为网络接口、屏幕、扬声器、麦克风和网络摄像头都是读取和写入帧(字节数组)的设备。

描述这些类型设备的更准确的方法是:

  • 字符设备处理数据流。您可以向它们写入数据,也可以从中读取数据,但不能跳过。如果没有可用的数据,从中读取数据可能会被阻止。常见的字符设备包括终端、串行端口和特殊设备,如/dev/null/dev/random。不过,这不一定是一次一个字节:许多设备都以较大的帧形式返回数据。(例如,/dev/input下的Linux输入设备以32字节帧的形式返回数据,每个帧代表一个事件。)

  • 块设备处理一个固定的数据块。您可以将数据读写到它们中的任何位置,也可以使用mmap()将它们映射到内存。它们通常用于表示存储设备(如磁盘),但也可以用于表示其他更不寻常的东西。

  • 网络设备是一种特殊情况。它们或多或少专门用于实际与网络接口的设备(例如,以太网NIC、无线网络硬件、蜂窝调制解调器等)。它们根本没有出现在/dev中。

字符和块设备都可以使用ioctl()实现不适合正常框架的特殊操作(例如,更改串行端口的波特率、弹出CD等),因此,在某种程度上,使用哪种操作的决定可能有些随意。然而,对于您所描述的设备类型:

  • 音频设备通常表示为字符设备。

    旧的OSS Linux声音系统将声音设备表示为/dev/dsp:从中读取数据将读取代表麦克风输入的PCM数据,并将PCM数据写入其中将通过声卡播放。更现代的ALSA音响系统使用了一套更复杂的设备和格式,但概念是一样的。

  • 视频设备是一种不寻常的情况。

    一些简单的"帧缓冲区"视频驱动程序被实现为块设备,如/dev/fb0。这个设备表示屏幕上的图像——例如,使用32位颜色的1024x768屏幕将由3MB缓冲区表示——写入它会更改图像。它最常用的方法是将它映射到内存中。

    不过,大多数现代视频设备并没有那么简单。它们中的许多部分实现为内核驱动程序,部分实现为X11设备驱动程序,可以直接映射和写入视频硬件。它们有时可能包括一个额外的字符或块设备(例如,一些Nvidia显卡使用字符设备/dev/nvidia),但从该设备读取或写入哪些数据的细节在很大程度上是专有的。

它们是字符驱动程序。

gfxhttp://www.x.org/wiki/Development/Documentation/HowVideoCardsWork/

音频http://www.alsa-project.org/~tiwai/编写alsa驱动程序/

相关内容

  • 没有找到相关文章

最新更新