Linux设备驱动(2)字符设备

设备号

设备号由主设备号和次设备号组成。linux下,一切设备皆文件,所有的设备都能在/dev目录下找到相应的文件。这些文件除了名字不一样以外,还每个设备文件都有不一样的设备号;

一般地,主设备号对应一个类型的驱动设备,之所以有次设备号,它是用来驱动同类型的设备。如串口,所有的串口共用一个主设备号,每个串口有不同的次设备号。

dev_t类型用来保存设备编号(包含主设备号和次设备号),实际上是一个32位整数,12位用来表示主设备号,后20位表示次设备号。

#define MINORBITS   20
#define MINORMASK   ((1U << MINORBITS) - 1)

//提取主设备号
#define MAJOR(dev)  ((unsigned int) ((dev) >> MINORBITS))
//提取次设备号
#define MINOR(dev)  ((unsigned int) ((dev) & MINORMASK))
//生成设备号
#define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))

设备号的分配和释放

静态分配

/**
 * register_chrdev_region() - register a range of device numbers
 * @from: the first in the desired range of device numbers; must include
 *        the major number.
 * @count: the number of consecutive device numbers required
 * @name: the name of the device or driver.
 *
 * Return value is zero on success, a negative error code on failure.
 */
int register_chrdev_region(dev_t from, unsigned count, const char *name)

指定从设备号from开始,申请count个设备号,在/proc/devices中的名字为name

动态分配

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

动态申请从次设备号baseminor开始的count个设备号,在/proc/devices中的名字为name,并通过dev指针把分配到的设备号返回给调用函数者。

释放

void unregister_chrdev_region(dev_t from, unsigned count)

设备注册

字符设备struct cdev

struct cdev {
    struct kobject kobj;
    struct module *owner;//一般初始化为THIS_MODULE
    const struct file_operations *ops;//文件操作结构体
    struct list_head list;
    dev_t dev;//设备号
    unsigned int count;//添加的设备个数
};

注册的三个步骤:

1)分配cdev;

2)初始化cdev;

3)添加cdev;

分配

直接定义struct cdev test_cdev;

或者动态分配

truct cdev* test_cdev;

test_cdev = cdev_alloc();

初始化

/**
 * cdev_init() - initialize a cdev structure
 * @cdev: the structure to initialize
 * @fops: the file_operations for this device
 *
 * Initializes @cdev, remembering @fops, making it ready to add to the
 * system with cdev_add().
 */
void cdev_init(struct cdev *cdev, const struct file_operations *fops)

这个函数干了两件事情:

1)内核自己填充了结构体中list和kobj的内容

2)把传入的文件操作结构体也填充进去

一般的,还要手工定义结构体成员owner。

添加

将cdev结构体与设备号关联起来:

int cdev_add(struct cdev *cdev, dev_t dev, unsigned count)

参数:

cdev:指定要被添加的cdev结构体;

dev:对应的设备号

count:从设备号dev开始添加count个设备.

函数干了也两件事:

1)把cdev结构体中还没填充的两个成员dev和count按照传入参数赋值。

2)把cdev结构体中传入内核,这样内核就知道对应设备号和具体的文件操作结构体了。

删除

void unregister_chrdev_region(dev_t from, unsigned count)
时间: 2024-08-09 23:54:18

Linux设备驱动(2)字符设备的相关文章

【转】深入浅出:Linux设备驱动之字符设备驱动

深入浅出:Linux设备驱动之字符设备驱动 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称

linux设备驱动之字符设备驱动模型(2)

在上一篇中我们已经了解了字符设备驱动的原理,也了解了应用层调用内核函数的机制,但是我们每次操作设备,都必须首先通过mknod命令创建一个设备文件名,比如说我们要打开u盘,硬盘等这些设备,难道我们还要自己创建,就如同刘老师常说的一句话,这也太山寨了吧,所以我们今天我们来点比较专业的,让函数帮我们自动创建: 在Linux 下,设备和驱动通常都需要挂接在一种总线上,总线有PCI.USB.I2C.SPI 等等,总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,一总线来管理设备和驱动函

深入浅出~Linux设备驱动之字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备

Linux设备驱动之字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备. 应用程序调用的流程框图: 三种设备的定义分别如下, 字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行.字符设备是面向流的设备,常见的字符设备如鼠标.键盘.串口.控制台.LED等. 块设备:是指可以从设备的任意位置读取一定长度的数据设备.块设备如硬盘.磁盘.U盘和SD卡等存储设备. 网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现.应用程序不能直接访

字符设备驱动体验,字符设备驱动学习

字符设备驱动学习 在Linux系统中,驱动程序通常采用内核模块的程序结构来进行编码.因此,编译/安装一个驱动程序,其实质就是编译/安装一个内核模块. 一.编译安装字符设备驱动程序 memdev文件中:在这个文件里和真实的硬件无关,只是虚构了一个数组 1 #include <linux/module.h> 2 #include <linux/fs.h> 3 #include <linux/init.h> 4 #include <linux/cdev.h> 5

Linux 设备驱动之字符设备驱动(一)

转载自:http://blog.chinaunix.net/uid-26833883-id-4369060.html

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

《驱动学习 - 字符设备驱动》

1.1字符设备驱动基础 字符设备驱动:设备对数据的处理是按照字节流的形式进行的. 在linux中,“一切皆文件”(除了网络设备),这表示设备最终都会体现为一个文件.设备文件通常位于/dev目录下. 内核通常用主设备号区别一类设备,次设备号用于区分同一类设备的不同个人或不同分区. 手动创建设备文件 mknod /dev/vser0 c 256 0 mknod是make node的缩写.用于创建一个节点(设备文件也叫设备节点).在linux系统中,一个节点代表一个文件. 原文地址:https://w

Linux 设备驱动开发 —— platform设备驱动应用实例解析

前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 -- platform 设备驱动 ,下面将通过一个实例来深入我们的学习. 一.platform 驱动的工作过程 platform模型驱动编程,platform 驱动只是在字符设备驱动外套一层platform_driver 的外壳. 在一般情况下,2.6内核中已经初始化并挂载了一条platform总线在sysfs文件系统中.那么我们编写platform模型驱动时,需要完成两个工作: a -- 实现platform驱动 架构就