注册字符设备接口

老接口:register_chrdev//注册设备驱动(实现注册设备号和相应的file_operation操作结构体)
//缺点:只有主设备号,没有(不支持)次设备号
新接口
register_chrdev_region(注册设备号)/alloc_chrdev_region(自动分配设备号) + cdev

cdev结构体及相关函数

结构体:
        struct cdev {
            struct kobject kobj;
            struct module *owner;
            const struct file_operations *ops;//包含具体可用的操作函数
            struct list_head list;
            dev_t dev;//主、次设备号
            unsigned int count;
        };

相关函数:
  cdev_alloc(为cdev结构体分配内存空间)、cdev_init、
  cdev_add(向驱动注册函数)、cdev_del

设备号相关的宏:MKDEV、MAJOR、MINOR

新的接口注册字符设备驱动步骤:
  1、注册/自动分配主次设备号
    register_chrdev_region(注册设备号)/alloc_chrdev_region(自动分配设备号)
  2、注册字符设备驱动
    cdev_init
    cdev_add
新的接口注销字符设备驱动步骤:
  1、注销字符设备驱动
    cdev_del
  2、注销申请的主次设备号
    unregister_chrdev_region

中途出错的倒影式错误处理方法
(1).内核中很多函数包含了很多的操作,这些操作每一步都可能出错,而且出错
后面的步骤就没有进行下去的必要了。
(2).将容易出错的地方分别做顺序标记,一旦出错,按顺序回滚错误处理。比如,第三步出错了,则利用goto跳转到相应的出错标记flag处,
处理第一、二步成功执行后产生的东西(比如分配的设备号进行注销)

使用cdev_alloc函数:
实现功能:使用kalloc分配一个cdev结构体堆内存空间给一个cdev结构体指针变量
目的:减少.data数据段大小(仅占用一个指针的数据段),方便内存的按需释放
(结构体指针变量仅占用一个指针的大小,而结构体变量仅占用一个结构体的大小)
程序使用内存的情况:
  全局变量    .data数据段
    局部变量     栈
  malloc      堆
附注:使用cdev_alloc函数时,cdev_init函数可以使用一句代码替代:如

pcdev = cdev_alloc();
pcdev->owner = THIS_MODULE
//cdev_init(pcdev,&test_fops);
pcdev->ops = &test_fops;

原文地址:https://www.cnblogs.com/embeded-linux/p/11109776.html

时间: 2024-08-29 05:02:16

注册字符设备接口的相关文章

register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1)register_chrdev  比较老的内核注册的形式   早期的驱动(2)register_chrdev_region/alloc_chrdev_region + cdev  新的驱动形式 (3)register_chrdev()函数是老版本里面的设备号注册函数,可以实现静态和动态注册两种方法

使用register_chrdev注册字符设备

1.2.2  使用register_chrdev注册字符设备 注册字符设备可以使用register_chrdev函数. int register_chrdev (unsigned int major, const  char *name, struct file_operations*fops); register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号. 注销字符设备可以使用unregister_chrdev函数. int unregister_chrde

002_linux驱动之_register_chrdev注册字符设备

(一)解析:register_chrdev函数和unregister_chrdev函数 (二)register_chrdev函数原型 int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops) * register_chrdev() -为字符设备注册一个主号码. * @major:用于动态分配的主要设备号或0 * @name:这一系列设备的名称 * @fops:与此设备相

Samsung_tiny4412(笔记)-->字符设备驱动基本操作及调用流程

/*********************************************************************************** * * Samsung_tiny4412(笔记)-->字符设备驱动基本操作及调用流程 * * 声明: * 以下所有的shell命令都是在root权限下运行的; * * 2015-3-7 阴 深圳 尚观 Sbin 曾剑锋 *******************************************************

Linux字符设备驱动框架

字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l /dev的时候,就能看到大量的设备文件,c就是字符设备,b就是块设备,网络设备没有对应的设备文件.编写一个外部模块的字符设备驱动,除了要实现编写一个模块所需要的代码之外,还需要编写作为一个字符设备的代码. 驱动模型 Linux一切皆文件,那么作为一个设备文件,它的操作方法接口封装在struct fi

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

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

LDD3阅读笔记-字符设备驱动

主要开发流程介绍 module_init宏和module_exit宏 当模块装载时需要调用module_init宏指定的函数,卸载时需要调用 module_exit宏指定的函数 以下是简单的init流程: 初始化设备 初始化file_operation 获取字符设备号 注册字符设备 当卸载模块时,需要释放申请的设备号. 主设备号和次设备号 对字符设备的访问是通过文件系统内的设备名称进行的.那些名称被称为特殊 文件.设备文件,或者简单称为文件系统树的节点,他们通常位于/dev目录. 通常而言,主设

在dev目录创建一个字符设备驱动的流程

1.struct file_operations 字符设备文件接口 1: static int mpu_open(struct inode *inode, struct file *file) 2: { 3: return 0; 4: } 5:   6:   7:   8: static int mpu_close(struct inode *inode, struct file *file) 9: { 10: return 0; 11: } 12:   13:   14: static lon

Linux应用程序访问字符设备驱动详细过程解析

下面先通过一个编写好的内核驱动模块来体验以下字符设备驱动 可以暂时先忽略下面的代码实现! memdev.c #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/cdev.h> #include <asm/uaccess.h> int dev1_registers[5]; int dev2_registers[5]; stru