一.       知识点

1.      设备号;

2.      创建设备文件;

3.      设备注册;

4.      重要数据结构;

5.      设备操作;

 

二.主设备号

字符设备通过字符设备文件来存取。字符设备文件由使用ls  -l 的输出的第一列的”C”标识;

如果使用ls –l 命令,会看到在设备文件项中有2个数(由一个逗号分隔)这些数字就是设备文件的主次设备编

举例:

crw-rw----  1 root uucp     4,  66 04-18 21:59 ttyS2

crw-rw----  1 root uucp     4,  67 04-18 21:59 ttyS3

crw-rw-rw-  1 root root     1,   9 04-18 22:00 urandom

crw-rw----  1 root root   249,   0 04-18 22:00 usbdev1.1_ep00

crw-rw----  1 root root   249,   1 04-18 22:00 usbdev1.1_ep81

crw-rw----  1 root root   249,   2 04-18 22:00 usbdev2.1_ep00

crw-rw----  1 root root   249,   3 04-18 22:00 usbdev2.1_ep81

crw-rw----  1 root root   251,   0 04-18 22:00 usbmon0

crw-rw----  1 root root   251,   1 04-18 22:00 usbmon1

crw-rw----  1 root root   251,   2 04-18 22:00 usbmon2

crw-rw----  1 vcsa tty      7,   0 04-18 22:00 vcs

crw-rw----  1 vcsa tty      7,   1 04-18 22:00 vcs1

crw-rw----  1 vcsa tty      7,   2 04-18 22:00 vcs2

crw-rw----  1 vcsa tty      7,   3 04-18 22:00 vcs3

crw-rw----  1 vcsa tty      7,   4 04-18 22:00 vcs4

 

设备号

设备号用来做什么??

设备号的作用

 

1>.主设备号用来标识设备文件相连驱动程序

次设备号被驱动程序用来辨别操作的是哪个设备

 

*****主设备号用来反映设备类型******

***次设备号用来区分同类型的哪一个设备***

 

三.主次设备号

Q:内核中如何描述设备号?

A:dev_t

*****其实质为unsigned  int  32位整数,其中高12位为主设备号,低20位为次设备号。

 

Q:如何从dev_t中分解出主设备号?

AMAJOR(dev_t  dev)

 

Q:如何从dev_t只分解出次设备号?

AMINOR(dev_t dev)

 

四.分配主设备号

Linux 内核如何给设备分配主设备号?

可以采用静态申请,动态分配两种方法

(动态、静态是针对主设备号来说的)

 

静态申请

int  register_chrdev_region(dev_t from ,unsigned count ,const char *name)

 

功能:申请使用从from开始的count 个设备号(主设备号不变,次设备号增加)

参数:

From :希望申请使用的设备号数目

Count :希望申请使用的设备号数目

Name :设备名(体现在/proc/devices

 

动态分配

 

方法:

使用alloc_chrdev_region分配设备号

 

优点:简单,易于驱动推广

缺点:无法在安装驱动前创建设备文件(因为安装前还没分配到主设备号。)

 

解决办法:

安装驱动后,从/proc/devices中查询设备号

 

动态分配

Int alloc_chrdev_region(dev_t *dev,  unsigned baseminor,  unsigned count,  const char *name)

功能:动态申请count个设备号,第1个设备号的次设备号为baseminor.

参数:

Dev:分配到的设备号

Baseminor :起始次设备号

Count :要注册的设备号个数

Name :设备名(体现在/proc/devices

主设备号是动态产生的,次设备号(的第一个)是要指定的;

 

  五.注销设备号

       不论使用何种方法分配设备号,都应该在不再使用它们的时候释放这些设备号。

 

Void unregister_chrdev_region(dev_t  from,  unsigned count)

 功能:

释放从from 开始的count个设备号

 

六.创建设备文件

两种方法:1.使用mknod命令手工创建;

   2.自动创建

 

手工创建:

mknod用法:

mknod  filename type major minor

filename :设备文件名

type: 设备文件类型

major主设备号

minor :次设备号

 

例如:mknod serial c  100  0

 

之后 ls  serial0  命令可查

不要0也可以,通过0知道是第几个设备

 

七.重要结构

Linux 字符设备驱动程序设计中,有3种非常重要的数据结构:

1.      struct  file

2.      struct  inode

3.      struct  file_operations

 

Stuct  file 

代表一个开打的文件。系统中每一个打开的文件在内核空间都有一个关联的struct  file .  它由内核在打开文件时创建,在文件关闭后释放。

(一个文件被打开一次对应一个Struct  file,这个文件同时被打开10次,则对应10Struct  file)

 

***重要成员

Loff_t  f_pos  /*文件读写位置*/

Struct  file_operations *f_op

 

struct  inode

用来记录文件的物理上的信息。因此,他和代表打开文件的file结构是不同的。

一个文件可以对应多个file结构,但只有一个inode结构