图片 1
【本网讯】
福建永安煤业公司仙亭矿在四季度决战活动中,把对标挖潜工作当作头等大事来抓,针对生产设备陈旧、老化等问题,充分调动职工的积极性,深挖设备潜力、本着节约、省时的原则及时处理,为企业提质增效提供保障。图为维修人员正在对半煤筛选设备进行抢修。

主设备号可以分为动态和静态申请。

参考

linux驱动开发流程
linux设备驱动第一篇:设备驱动程序简介
Linux设备驱动开发 –
混杂设备驱动

第5章设备故障的记录

     
Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct
file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设的种类较多,操作方式各不相同。Struct
file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。打开一个文件就是调用这个文件file_operations中的open操作。不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件,接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。

驱动开发流程

  1. 查看原理图,理解设备的工作原理。
  2. 定义主设备号。
    设备由一个主设备号和一个次设备号来标识。主设备号唯一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅
    由设备驱动程序解释,区分被一个设备驱动控制下的某个独立的设备。
  3. 实现初始化函数。在驱动程序中实现驱动的注册和卸载。
  4. 设计所要实现的文件操作,定义file–operations结构。
  5. 实现所需的文件操作调用,如read,write等。
  6. 实现中断服务,并用request–irq向内核注册,中断并不是每个设备驱动所必需的。
  7. 编译该驱动程序到内核中,或者用insmod命令加载模块。
  8. 测试该设备,编写应用程序,对驱动程序进行测试。

第13条设备维修人员的设备故障处理程序如下。

root#ls -l /dev/ttyS[0-3]
crw-rw—-  1 root  root 4, 64 Feb 18 23:34 /dev/ttyS0
crw-r—–  1 root  root 4, 65 Nov 17 10:26 /dev/ttyS1
crw-rw—-  1 root  root 4, 66 Jul  5  2000 /dev/ttyS2
crw-rw—-  1 root  root 4, 67 Jul  5  2000 /dev/ttyS3

混杂设备

在linux系统中,存在一类字符设备,它们共享一个主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的miscdevice设备。

  • 混杂设备与字符驱动的区别:
  1. 相对字符驱动而言,内核封装好了api,相对更容易开发;
  2. 由于只占用一个从设备号,故而每一个驱动都只能用于一个设备,无法和字符驱动比,能够用于多个设备;
![](https://upload-images.jianshu.io/upload_images/138606-467a5b328015825b.png)

第3章设备故障前管理要求

Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。

字符设备与块设备的区分

每一个字符设备或者块设备都在/dev目录下对应一个设备文件。读者可以通过查看/dev目录下的文件的属性,来区分设备是字符设备还是块设备。使用cd命令进入/dev目录,并执行ls
-l命令就可以看到设备的属性

[root@tom /]# cd /dev                           /*进入/dev目录*/  
[root@tom dev]# ls -l                           /*列出/dev中文件的信息*/、 
 /*第1字段     2    3    4      5    6         7      8  */  
crw-rw----+     1 root root    14,  12  12-21 22:56 adsp  
crw-------      1 root root    10, 175  12-21 22:56 agpgart  
crw-rw----+     1 root root    14,   4  12-21 22:56 audio  
brw-r-----      1 root disk   253,   0  12-21 22:56 dm-0  
brw-r-----      1 root disk   253,   1  12-21 22:56 dm-1  
crw-rw----      1 root root    14,   9  12-21 22:56 dmmidi

ls
-l命令的第1个字段中的第1个字符c表示设备是字符设备,b表示设备是块设备;
第234字段对驱动程序开发来说没有关系;
第5,6字段分别表示设备的主设备号和次设备号;
第7字段表示文件的最后修改时间。第8字段表示设备的名字。
由第1和8字段可知,adsp是字符设备,dm-0是块设备。其中adsp设备的主设备号是14,次设备号是12。

第5条设备故障后的管理工作是指在设备故障发生后,及时分析设备的故障原因,研究解决方案,采取相关措施排除故障或改进设备,以防止设备故障的再次发生。

将32位新格式设备号转换成32位旧格式设备号。

linux中三种驱动设备

linux系统将设备分为3类:字符设备、块设备、网络设备。

图片 2

  • 字符设备
    字符设备是能够像字节流(类似文件)一样被访问的设备,有字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少要实现open、close、read、write系统调用。字符设备可以通过文件系统节点来访问,这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道。一个字符设备是一种字节流设备,对设备的存取只能按顺序按字节的存取而不能随机访问,字符设备没有请求缓冲区,所有的访问请求都是按顺序执行的。但事实上现在一些高级字符设备也可以从指定位置一次读取一块数据。

  • 块设备
    块设备也是通过设备节点来访问。块设备上能够容纳文件系统。在大多数unix系统中,进行I/O操作时块设备每次只能传输一个或多个完整的块,而每块包含512字节(或更2的更高次幂字节的数据)。linux可以让应用程序向字符设备一样读写块设备,允许一次传递任意多字节的数据。因而,块设备和字符设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。存储设备一
    般属于块设备,块设备有请求缓冲区,并且支持随机访问而不必按照顺序去存取数据,比如你可以
    先存取后面的数据,然后在存取前面的数据,这对字符设备来说是不可能的。Linux下的磁盘设备都是块设备,尽管在Linux下有块设备节点,但应用程序一般是通过文件系统及其高速缓存来访问块设备的,而不是直接通过设备节点来读写块设备上的数据。

  • 网络设备
    网络设备不同于字符设备和块设备,它是面向报文的而不是面向流的,它不支持随机访问,也没有请求缓冲区。由于不是面向流的设备,因此将网络接口映射到文件系统中的节点比较困难。内核和网络设备驱动程序间的通讯,完全不同于内核和字符以及块驱动程序之间的通讯,内核调用一套和数据包传输相关的函数而不是read,write。网络接口没有像字符设备和块设备一样的设备号,只有一个唯一的名字,如eth0、eth1等,而这个名字也不需要与设备文件节点对应。

关注手机本网(

如:mknod /dev/mydevice c 254
0

字符设备与块设备的区别

  1. 字符设备是面向流的,最小访问单位是字节;而块设备是面向块的,最小访问单位是512字节或2的更高次幂。
  2. 字符设备只能顺序按字节访问,而块设备可随机访问。
  3. 块设备上可容纳文件系统,访问形式上,字符设备通过设备节点访问,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。
  4. 网络设备没有设备节点是因为,网络设备是面向报文的,很难实现相关read、write等文件读写函数。所以驱动的实现也与字符设备和块设备不同。

第2章设备故障管理内容

 

排除设备故障。

网络接口用来与其他设备交换数据,它可以是硬件设备,也可以是纯软件设备,如loopback接口就是一个纯软件设备。网络接口由内核中的网络子系统驱动,负责发送和接收数据包,但它不需要了解每项事务如何映射到实际传送的数据包,许多网络连接(尤其是使用TCP协议的连接)是面向流的,但网络设备围绕数据包的传输和接收设计。网络驱动程序不需要知道各个连接的相关信息,它只需处理数据包。网络接口没有像字符设备和块设备一样的设备号,只有一个唯一的名字,如eth0、eth1等,而这个名字也不需要与设备文件节点对应。内核使用一套与数据包传输相关的函数来与网络设备驱动程序通信,它们不同于字符设备和块设备的read()和write()方法。

第10条设备维修人员在检测设备时需要着重掌握设备容易引起故障的部位、机构和零部件的技术状态以及设备的异常信息。

系统中的每一个字符设备和块设备(网络接口没有设备号)都有一个设备号,传统的UNIX以及早期版本Linux中的设备号是16位的,主次设备号都是8位的,低8位为次设备号,高8位为主设备号,因此系统最多分别支持65536个字符设备和65536个块设备,这个限制已经不能满足当前层出不穷的各种新设备的需要,所以Linux2.6中对设备号已经进行了扩展,一个设备号为32位,主设备号为12位,次设备号为20位,但是这32位设备号的编码方式有新旧两种,旧的设备编号格式为:最高12位为主设备号,最低20位为次设备号;新的设备编号格式为:bit[19:8]是主设备号,bit[31:20]是次设备号的高12位,bit[7:0]是次设备号的低8位。如果知道了一个设备的主设备号major和次设备号minor,那么用MKDEV(major,minor)生成是该设备的旧格式的设备号,用new_encode_dev(MKDEV(major,minor))生成的则是新格式的设备号。Linux支持的各种设备的主设备号定义在include/linux/major.h文件中,而已经在官方注册的主设备号和次设备号在Documentation/devices.txt文件中可以找到。

第4章设备故障后的管理要求

(c代表子都设备,254为主设备号,0为次设备号)

第6条设备维修管理人员需要做好设备的宣传培训工作,使设备使用人员与设备维修专员能够自觉遵守设备的操作、检测、检修等相关规章制度。

相关文章