【IMX6ULL驱动开发学习】02.hello驱动程序之cdev注册字符设备驱动程序和设置次设备号

目录

​编辑

一、register_chrdev

二、解决方法

2.1 alloc_chrdev_region函数:注册一系列字符设备编号

2.2 cdev_init函数:初始化cdev结构体 

2.3  cdev_add函数:将字符设备添加到系统中

 三、驱动程序


一、register_chrdev

major = register_chrdev(0, "100ask_hello", &hello_drv);

【IMX6ULL驱动开发学习】01.编写第一个hello驱动+自动创建设备节点(不涉及硬件操作)_阿龙还在写代码的博客-CSDN博客

在之前的hello驱动程序中,入口函数会用 register_chrdev来注册字符设备驱动程序,好处是方便快捷,缺点是霸占了主设备号下的所有此设备号。当我们手动创建一个设备节点(主设备号相同),因为有多个次设备号,所以用上面的设备节点也可以访问hello驱动程序。

Linux内核提供的主设备号是有限的,如果设备很多的情况下主设备号就可能不够用了,那怎么办呢?
解决办法:可以在注册驱动设备的时候,给设备分配好固定的次设备号。

二、解决方法

先定义两个静态全局变量

static struct cdev hello_cdev;
static dev_t dev;

2.1 alloc_chrdev_region函数:注册一系列字符设备编号

int ret;
// major = register_chrdev(0, "100ask_hello", &hello_drv);ret = alloc_chrdev_region(&dev, 0, 2, "hello");  // dev/hello c 245 0
if (ret < 0) {printk(KERN_ERR "alloc_chrdev_region() failed for hello\n");return -EINVAL;
}
  • register_chrdev 该函数会把主设备号下所有次设备号都霸占了

  • dev为输出变量,这个结构体里会含有设备的主次设备号

  • 0为次设备号,2为想获得几个次设备号,hello为名字

  • 如果自己创建设备节点 mknod /dev/xyz c 245(具体数字看对应的主设备号) 1

  • 因为有两个次设备号,所以用上面的设备节点也可以访问驱动程序

2.2 cdev_init函数:初始化cdev结构体 

cdev_init(&hello_cdev, &hello_drv);
  • 初始化hello_cdev,让hello_cdev与hello_drv结构体挂钩

2.3  cdev_add函数:将字符设备添加到系统中

ret = cdev_add(&hello_cdev, dev, 2);
if (ret)
{printk(KERN_ERR "cdev_add() failed for hello\n");return -EINVAL;
}
  • 添加hello_cdev 2为此设备号个数

 三、驱动程序

hello_drv.c

#include "asm-generic/errno-base.h"
#include "asm/cacheflush.h"
#include "linux/cdev.h"
#include "linux/fs.h"
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/mman.h>
#include <linux/random.h>
#include <linux/init.h>
#include <linux/raw.h>
#include <linux/tty.h>
#include <linux/capability.h>
#include <linux/ptrace.h>
#include <linux/device.h>
#include <linux/highmem.h>
#include <linux/backing-dev.h>
#include <linux/shmem_fs.h>
#include <linux/splice.h>
#include <linux/pfn.h>
#include <linux/export.h>
#include <linux/io.h>
#include <linux/uio.h>
#include <linux/uaccess.h>static struct class *hello_class;
static struct cdev hello_cdev;
static dev_t dev;static unsigned char hello_buf[100];static int hello_open (struct inode *node, struct file *filp)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}
static ssize_t hello_read (struct file *filp, char __user *buf, size_t size, loff_t *offset)
{unsigned long len = size > 100 ? 100 : size;printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);copy_to_user(buf, hello_buf, len);return len;
}static ssize_t hello_write(struct file *filp, const char __user *buf, size_t size, loff_t *offset)
{unsigned long len = size > 100 ? 100 : size;printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);copy_from_user(hello_buf, buf, len);return len;
}static int hello_release (struct inode *node, struct file *filp)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}/* 1. create file_operations */
static const struct file_operations hello_drv = {.owner      = THIS_MODULE,.read		= hello_read,.write		= hello_write,.open		= hello_open,.release    = hello_release,
};/* 2. register_chrdev *//* 3. entry function */
static int hello_init(void)
{int ret;//申请主次设备号的空间 主次设备号放在dev结构体中//dev为输出变量,这个结构体里会含有设备的主次设备号//0为次设备号,2为想获得几个次设备号,hello为名字ret = alloc_chrdev_region(&dev, 0, 2, "hello");// dev/hello c 245 0if (ret < 0) {printk(KERN_ERR "alloc_chrdev_region() failed for hello\n");return -EINVAL;}//初始化hello_cdev,让hello_cdev与hello_drv结构体挂钩cdev_init(&hello_cdev, &hello_drv);//添加hello_cdev 2为此设备号个数ret = cdev_add(&hello_cdev, dev, 2);if (ret){printk(KERN_ERR "cdev_add() failed for hello\n");return -EINVAL;}hello_class = class_create(THIS_MODULE, "hello_class");if (IS_ERR(hello_class)) {printk("failed to allocate class\n");return PTR_ERR(hello_class);}device_create(hello_class, NULL, dev, NULL, "hello");  /* /dev/hello */return 0;
}/* 4. exit function */
static void hello_exit(void)
{device_destroy(hello_class, dev);class_destroy(hello_class);//unregister_chrdev(major, "100ask_hello");cdev_del(&hello_cdev);unregister_chrdev_region(dev, 2);
}module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/81655.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NAND Flash 失效之 Data Rentention | 闪存数据保持力 | 数据放几年就坏掉了?

依公知及经验整理,原创保护,禁止转载。专栏 《深入理解Flash:闪存特性与实践》 图1: Data Retention 对 Vt 电压分布影响 图片来源: 知乎 [2] 全文 1900 字, 内容摘要 Data Retention 产生 Data Retention 的影响因素  如何规避 Data Rention 问题 发生Data Retent…

MyCat分片规则——应用指定分片规则、日期分片、固定分片hash算法

1.应用指定分片规则 2.固定分片hash算法 3.字符串hash解析 4.按天&#xff08;日期&#xff09;分片 5.按自然月进行分片

Django入门 - Http协议前后端交互

Http协议前后端交互 在前后端交互当中&#xff0c;前端后端用的协议是http协议 先请求后响应&#xff0c;响应完之后连接就会断开我们可以认为它其实是一个短连接 或者 无连接。在它内部其实是基于TCP协议的&#xff0c;它也会有三次握手&#xff0c;但是这是内部的&#xff…

[oeasy]python0081_[趣味拓展]ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI

光标位置 回忆上次内容 上次了解了 新的转义模式 \033 逃逸控制字符 escape 这个字符 让字符串 退出标准输出流进行控制信息的设置 可以设置 光标输出的位置 ASR33中的ALT MODE 是 今天的ESC键吗&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#x1f914; 查询文档…

开源语言模型的历史和重要性;Edge浏览器将推出Bing AI重写文本功能

&#x1f989; AI新闻 &#x1f680; 微软即将推出桌面版Microsoft Edge浏览器的Bing AI重写文本功能 摘要&#xff1a;微软最近在桌面版Microsoft Edge浏览器中引入了一个新功能&#xff0c;允许用户使用Bing AI重写文本。用户可以选择不同的语气、格式和长度&#xff0c;然…

安全杂记 - Linux文本三剑客之awk

目录 1.什么是AWK2.正则表达式3.语法4.内置变量示例printf命令5.复现awk经典实例(1).插入几个新字段(2).格式化空白(3).筛选IPv4地址(4).筛选给定时间范围内的日志 1.什么是AWK awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客。三者的功能都是处理文本&a…

一百四十三、Linux——Linux的CentOS 7系统语言由中文改成英文

一、目的 之前安装CentOS 7系统的时候把语言设置成中文&#xff0c;结果Linux文件夹命名出现中文乱码的问题&#xff0c;于是决定把Linux系统语言由中文改成英文 二、实施步骤 &#xff08;一&#xff09;到etc目录下&#xff0c;找到配置文件locale.conf # cd /etc/ # ls…

Python自动化测试用例:如何优雅的完成Json格式数据断言

目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客&#xff0c;记录当时获取一个多级json中指定key的数据&#xff1a; #! /usr/bin/python # coding:utf-8 """ aut…

399. 除法求值

题目描述&#xff1a; 主要思路&#xff1a; 本题主要利用并查集的思想&#xff0c;重点是要弄明白分子和分母的指向关系以及一系列的值的变化规则。 查询时如果两个数字不在一个集合里那么结果就为-1. class Solution { public:unordered_map<string,string> f;unorde…

MongoDB创建用户 、数据库、索引等基础操作

MongoDB的权限认证是相对来说比较复杂的&#xff0c;不同的库创建后需要创建用户来管理。 本机中的MongoDB是docker 启动的&#xff0c;所以先进入docker的镜像中 docker exec -it mongodb bash 这样就进入到了镜像MongoDB中&#xff0c;然后输入命令连接MongoDB数据库 注…

【Spring】实现FactoryBean接口

FactoryBean FactoryBean是一个接口&#xff0c;需要创建一个类来实现该接口&#xff0c;该接口中有三个方法&#xff0c;通过重写其中的两个方法&#xff0c;获得一个对象&#xff0c;三个方法分别是&#xff1a; 1.getObject():通过一个对象交给IOC容器管理2.getObjectType(…

亿欧智库:2023中国宠物行业新趋势洞察报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 户外赛道本质上迎合了全球共性需求的增长&#xff0c;从养宠意愿的转化到养宠生活的需求&#xff0c;多层次的需求推动行业发展新趋势 从需求端进行分析&#xff0c;可以将养宠意愿的转化分为三个层…

解决:Springboot视频接口报大量的ClientAbortException找不到原因

浏览器有自己的缓冲策略&#xff0c;比如视频接口吐出了100MB的视频数据&#xff0c;浏览器可不会全部拿走&#xff0c;而是按需去拿&#xff0c; 举个例子&#xff0c;浏览器拿的视频数据够看半分钟的&#xff0c;就停止读取数据了&#xff0c;但是http连接并未断开&#xff…

安装ubuntu 18.04 系统(1)——制作系统安装U盘

https://rufus.ie/zh/ 下载该软件&#xff0c;准备制作启动盘下载自己想要的镜像&#xff0c;http://mirrors.163.com/ubuntu-releases/18.04/&#xff0c; 我选择的是ubuntu-18.04.6-live-server-amd64.iso 因为&#xff0c;科研写程序使用&#xff0c;不需要桌面版本。开始制…

pytorch Stream 多流处理

CUD Stream https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions 中指出在kenel的调用函数中最后一个可选参数表示该核函数处在哪个流之中。 - 参数Dg用于定义整个grid的维度和尺寸&#xff0c;即一个grid有多少个block。为dim3类型。…

深入探索C++模板:从基础到高级应用

目录 一、 泛型编程 1.1 为什么需要泛型编程&#xff1f; 二、模板 2.1 概念 2.2 函数模板 2.2.1 概念 2.2.2 语法 2.2.3 示例 2.2.4 模板实例化 隐式实例化 显示实例化 2.2.5 模板参数的匹配原则 2.3 类模板 2.3.1 概念 2.3.2 语法 2.3.3 示例 2.3.4 注意事项…

Html页面连线工具

在项目中遇了一个需要连线配置的功能。该功能引用了 bootstrap、layui 、svg-line等插件 下载链接 lixhttps://download.csdn.net/download/dongyan3595/88168121

用Python获取链家二手房房源数据,做可视化图分析数据

前言 数据采集的步骤是固定: 发送请求, 模拟浏览器对于url地址发送请求获取数据, 获取网页数据内容 --> 请求那个链接地址, 返回服务器响应数据解析数据, 提取我们需要的数据内容保存数据, 保存本地文件 所需模块 win R 输入cmd 输入安装命令 pip install 模块名 (如果你…

机器学习竞赛、CV/NLP 竞赛入门没人带解决办法

我的第一个AI竞赛是在Datawhale夏令营的帮助下参加的。 一周左右的夏令营&#xff0c;让我从环境都配不好的小白到对pytorch基本入门。 夏令营的氛围督促我赶紧学习&#xff0c;赶紧进步&#xff1b;夏令营群里的大佬推荐的入门视频让我pytorch入门。 了解datawhale是通过b站…

github 无语的问题,Host does not existfatal: Could not read from remote repository.

Unable to open connection: Host does not existfatal: Could not read from remote repository. image.png image.png image.png Please make sure you have the correct access rights and the repository exists. 如果github desktop和git pull 和git clone全部都出问题了&…