【讯为Linux驱动开发】2.注册一个字符设备

【问】如何描述一个字符设备?

dev结构体

其中需要关心三个成员变量:

所属模块 :struct module *owner;

文件操作结构体: const struct file_operations *ops

设备号 : dev_t

当应用层使用指令open("/dev/hello", HELLO),系统就会进入驱动程序中执行cdev_open函数

【问】 如何连接系统调用open和驱动程序dev_open函数

file_operations结构体中就将这两个函数进行连接:

static struct file_operations cdev_ops = {.owner = THIS_MODULE;.open = cdev_open;
}
【问】应用程序和驱动程序的桥梁是什么?

设备节点,设备节点创建在/dev目录下。

比如 open("/dev/hello" ,HELLO);

【问】如何创建设备节点?

使用udev机制,在注册设备的时候自动创建,在注销设备的时候自动销毁。

1.创建类:

class_creat(struct module *owner ,const char *name)

THIS_MODULE 和 类的名字

对应删除:class_destroy(struct class *cls) 类

2.在类下创建设备:

device_creat(struct class *cls ,struct device *parent, dev_t devt , NULL ,const char *fmt )

1.哪个类     2.父设备是谁? NULL一般    3.设备号     4.NULL 5.设备节点的名字

3.删除类:

device_destroy(struct class *cls, dev_t devt)

类    设备号

【注册字符设备模版 】

static int major = 0;
static int minor = 0;
module_param(major ,int ,S_IRUGO);
module_param(minor ,int ,S_IRUGO);dev_t dev_num;static int cdev_open(struct inode *inode, struct file *filp)
{printk("cdev_open success\n");return 0;
}static ssize_t cdev_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{printk("cdev_read success\n");return 0;
}static ssize_t cdev_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{printk("cdev_write success\n");return 0;            
}static int cdev_release(struct inode *inode, struct file *filp)
{printk("cdev_release success\n");return 0;       
}struct file_operations cdev_file_operations = {.owner = THIS_MODULE;.open = cdev_open;.read = cdev_read;.write = cdev_write;.release = cdev_release;
}struct cdev cdev_test;static int moduleparam_init()
{int ret;/* 动态申请 */ret = alloc_chrdev_region(&dev_num,0,1);  if(ret<0){printk("alloc_chrdev_region error\n");}//动态注册设备号成功,则打印printk("alloc_chrdev_region ok\n");  major_num =MAJOR(dev_num); //将主设备号取出来minor_num = MINOR(dev_num);//将次设备号取出来printk("major_num = %d\n",major_num);//打印传入进来的主设备号printk("minor_num = %d\n",minor_num);//打印传入进来的次设备号cdev_test.owner = THIS_MODULE;cdev_init(cdev_test, cdev_file_operations);cdev_add(&cdev_test, dev_num, 1);class = class_creat(THIS_MODULE, "test");device = device_creat(class,NULL,dev_num,,NULL,"/dev/test")return 0;
}static void hello_exit(void)
{unregister_chrdev_region(MKDEV(major_num,minor_num),DEVICE_NUMBER);//注销设备号cdev_del(&cdev_test);  //销毁字符设备device_destroy(class,dev_num);class_destroy(class);printk("gooodbye! \n");
}module_init(moduleparam_init);
module_init(moduleparam_exit);

【应用程序验证】

int main(int argc, char *argv[])
{int fd;char buf[64] = 0;fd = open("/dev/test", HELLO);  /* 打开设备节点 */   close(fd);return 0;  
}
【问】app.c如何编译?

使用3568开发板对应的交叉编译器

linux源码  / prebuilts /gcc /linux-x86 / aarch64 / gcc ..............................

然后进入bin文件夹找到 gnu - gcc

编译命令:

进入app.c目录:

交叉编译器的绝对路径 加 / 交叉编译器的名字  加  app.c

生成a.out文件

拷贝 a.outfile .ko 文件进开发板

加载:insmod file.ko

手动创建设备节点 : mknod /dev/test c 2350 (设备名字和驱动中一致)

(在dev/test中可以看到设备节点)

执行 a.out 应用程序: ./a.out

成功调用,打印出驱动中的这两句话:

实验效果:

加载:insmod file.ko

因为是自动创建设备节点,所以 ls /dev/test  直接看

执行:./a.out

---------------------------------------------

-----------------------打印出打开设备和卸载设备信息

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

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

相关文章

学生成绩管理系统(大一大作业)

功能 实现添加&#xff0c;排序&#xff0c;修改&#xff0c;保存等功能 库函数 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<string.h> 头文件 #define functioncreate(major) void major##compare(mana mn){\int i,j,s…

使用Matlab软件绘制函数图像

【实验目的】 1.利用Matlab实现平面上曲线和三维空间中曲线绘制&#xff0c;重点掌握隐函数、极坐标图像绘制的相关命令。 2.利用Matlab实现三维曲面绘制&#xff0c;加深对高等数学课程所学内容的理解 【实验内容与实现】 1、用两种方法绘制下面的曲线图 &#xff08;1&am…

Autodesk 3ds Max软件下载安装;3ds Max功能强大的三维建模、渲染软件安装包获取

3ds Max&#xff0c;无论是初学者还是资深设计师&#xff0c;都能通过3ds Max在数字世界中实现自己的创意&#xff0c;打造出令人惊叹的三维作品。 在3ds Max中&#xff0c;灯光系统是至关重要的一环。它提供了光度学灯光和标准灯光两种主要类型&#xff0c;用于照亮和增强场景…

Spring家族中的消息通信解决方案

相信大家对消息通信架构以及各种消息中间件应该都不陌生。在分布式系统的设计和开发过程中&#xff0c;消息通信是用于实现系统解耦、提高扩展性的一大技术体系。而业界关于如何实现消息通信系统也有很多解决方案和对应的开发框架。不知道你有没有发现&#xff0c;在我们每天都…

计算机英文教材太难啃?Higress 和通义千问帮你!

作者&#xff1a;张添翼&#xff08;澄潭&#xff09; 计算机相关英文教材的中译本质量堪忧&#xff0c;对于计算机专业的学生来说&#xff0c;应该深有体会。因为大部分教材的译者本人可能未必完全吃透书中技术内容&#xff0c;又或者是领域技术大拿&#xff0c;但并不擅长英…

数据结构的归并排序(c语言版)

一.归并排序的基本概念 1.基本概念 归并排序是一种高效的排序算法,它采用了分治的思想。它的基本过程如下: 将待排序的数组分割成两个子数组,直到子数组只有一个元素为止。然后将这些子数组两两归并,得到有序的子数组。不断重复第二步,直到最终得到有序的整个数组。 2.核心…

LabVIEW2017破解安装教程

LabVIEW2017破解安装教程&#xff1a; 1、新版LabVIEW2017分为32位和64位两个平台&#xff0c;多种语言版本(需要LabVIEW2017中文版的朋友请选择WinChn版本)&#xff0c;大家选择自行选择符合系统的版本下载并解压 2、本次安装以Win 7 64位系统为例&#xff0c;运行“2017LV-64…

龙蜥社区 5 月度运营大事件回顾

各位龙蜥社区的朋友们&#xff0c;你们好&#xff01; 龙蜥社区 5 月运营月报如期而至&#xff01;本次从特别图送、龙蜥生态、龙蜥活动、龙蜥 SIG 月度动态、精彩内容推荐等几方面总结、回顾了 5 月发生的重要事件。

设计模式之过滤器模式FilterPattern(十)

一、过滤器模式 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种设计模式&#xff0c;这种模式允许开发人员使用不同的标准来过滤一组对象&#xff0c;通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模…

【长亭雷池WAF——“动态防护”功能深度体验】

前言&#xff1a; 在当今的网络安全环境中&#xff0c;Web应用防火墙&#xff08;WAF&#xff09;扮演着至关重要的角色。它们不仅能够防御常见的Web攻击&#xff0c;如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;等&#xff0c;还能够应对日益复杂的网络威胁。 长亭…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…

CAM350如何快速删除Gerber文件上的东西?

文章目录 CAM350如何快速删除Gerber文件上的东西?CAM350如何快速保存已经修改的Gerber文件? CAM350如何快速删除Gerber文件上的东西? CAM如何导入Gerber文件见此篇 今天遇上了一个删除Gerber文件上部分字母的任务&#xff0c;CAM350只能一点点删除线的操作把我手指头差点按…

订单排队与链动模式塑造社交电商新格局

在数字化浪潮中&#xff0c;社交电商凭借其独特的魅力与潜力&#xff0c;正逐渐崭露头角。本文将解读一种融合了订单排队与链动模式的创新商业模式。这一模式旨在通过提高消费者复购率&#xff0c;优化销售流程&#xff0c;从而推动销售增长&#xff0c;塑造社交电商新生态。 …

Mybatis03-ResultMap及分页

1、属性名和字段名不一致问题 1.问题 数据库中的字段 新建一个项目Mybatis-04&#xff0c;拷贝之前&#xff0c;测试实体类字段不一致的情况 public class User {private int id;private String name;private String password; }select * from mybatis.user where id #{id} …

2024年宜昌中级工程师职称如何申报呢?

今年宜昌中级职称如何报名&#xff1f;怎么申报&#xff1f;申报时间是什么时候呢&#xff1f;报名条件是什么呢&#xff1f; 一、2024年宜昌中级职称申报条件&#xff1a;1.社保条件&#xff1a;在宜昌本地注册登记6个月以上民营企业&#xff0c;专业技术岗位从事工程技术工作…

苍穹外卖笔记-02-借助小乌龟创建gitee仓库,apifox代替YApi,Swagger

TOC 1 借助小乌龟创建gitee苍穹外卖仓库 这里建议看视频bilibili比特鹏哥视频 使用软件 git TortoiseGit https://git-scm.com/downloads https://tortoisegit.org/ 使用代码托管平台gitee&#xff0c;git的使用和gitee的账号创建需要查询其他资料 在一个从未克隆仓库的…

3389远程桌面,如何进行3389远程桌面的连接操作

随着信息技术的快速发展&#xff0c;远程桌面连接技术逐渐成为企业、教育以及个人用户进行远程办公、技术支持以及协作交流的重要工具。其中&#xff0c;3389远程桌面因其稳定性和易用性而备受青睐。本文将从专业角度出发&#xff0c;为您详细介绍如何进行3389远程桌面的连接操…

大模型产品的选择:独特优势与个人倾向

层出不穷的大模型产品&#xff0c;你怎么选&#xff1f; 随着近日腾讯元宝APP的正式上线&#xff0c;国内大模型产品又添一员。关于接连出现的“全能“大模型AIGC产品&#xff0c;你都用过哪些呢&#xff1f;不妨来分享一下你的使用体验吧&#xff01;在这些大模型产品中&…

【React篇 】React项目中常用的工具库

我们可以从项目初始化、开发、构建、检查及发布的顺序总结react项目开发常用的工具库。 首先是初始化。 初始化工程项目一般用官方维护的 create-react-app&#xff0c;这个工具使用起来简单便捷&#xff0c;但 create-react-app 的配置隐藏比较深&#xff0c;修改配置时搭配…

LC 26删除有序数组中的重复项

去重题&#xff0c;双指针&#xff0c;&#xff0c;因为题干说原地删除&#xff0c;且nums其余元素不重要。一个cur记录当前不重复的数应该插在第几位了&#xff0c;for循环里的i相当于是第二个指针&#xff08;右指针&#xff09;&#xff0c;遍历数组来找不重复的元素 class …