5.2.10.应用程序如何调用驱动 mknod /dev/test c 250 0 创建设备文件,应用app 程序 调用 我们 驱动 壳子

news2025/1/11 14:20:03

5.2.10.应用程序如何调用驱动


5.2.10.1、驱动设备文件的创建
(1)何为设备文件

 

  索引驱动
(2)设备文件的关键信息是:设备号 = 主设备号 + 次设备号,使用ls -l去查看设备文件,就可以得到这个设备文件对应的主次设备号。

        4颗LED不可能 都占用 主设备号,设备号 = 主设备号 + 次设备号
(3)使用mknod创建设备文件:mknod /dev/xxx c 主设备号 次设备号

  xxx : 设备文件名 ,我们这里是 test

c : 字符设备;  主设备号: 我们这里是 250;  次设备号: 0

 

 

5.2.10.2、写应用来测试驱动
(1)还是原来的应用
(2)open、write、read、close等

1.  增加了 app.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define FILE  "/dev/test"   // 刚才mknod创建的设备文件 名,必须保持一致


int main(void)
{
	int fd = -1;
	
	fd = open(FILE, O_RDWR);
	if(fd < 0)
	{
		printf("open %s error \n",FILE);
		return -1;
	}
	printf("open %s success..\n",FILE);
	
	//读文件
	
	
	
	
	
	//关闭 文件
	close(fd);
	
	return 0;
}


2.  Makefile 文件

#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个
#KERN_VER = $(shell uname -r)
#KERN_DIR = /lib/modules/$(KERN_VER)/build	

		
# 开发板的linux内核的源码树目录  
KERN_DIR = /root/driver/kernel

obj-m	+= module_test.o

all:
	make -C $(KERN_DIR) M=`pwd` modules 
	# app 是在 开发板运行 所以 arm-linux-gcc 
	arm-linux-gcc app.c -o app
cp:
	cp *.ko app /root/rootfs/rootfs/driver_test
	#cp app  /root/rootfs/rootfs/driver_test	

.PHONY: clean	
clean:
	make -C $(KERN_DIR) M=`pwd` modules clean
	

3. module_test.c  无更改,只是 KERN_INFO 更换 KERN_DEBUG

#include <linux/module.h>		// module_init  module_exit
#include <linux/init.h>			// __init   __exit
#include <linux/fs.h>


#define MYMAJOR 200  /* 定义 register_chrdev 注册设备的 主设备号 */

#define MYNAME  "test_char" /* 定义 register_chrdev 注册设备的 设备名字 */

int mymajor; /* 定义 register_chrdev 注册设备号*/

/* NOTE  自己定义函数指针  test_chrdev_open  */
static int test_chrdev_open(struct inode *inode, struct file *file)
{
	/* 这个函数中真正应该 放置 打开这个硬件设备的 操作代码 ,我们先 printk 代替一下 */
	printk(KERN_INFO "test_chrdev_open\n");  
	
	return 0;

} /* test_chrdev_open() */




/* NOTE  自己定义函数指针 test_chrdev_release ,   release对应的就是 close  */
static int test_chrdev_release(struct inode *inode, struct file *file)
{
	printk(KERN_INFO "test_chrdev_release\n");

	return 0;
}



//自定义  file_operations 结构体 及其元素填充
/* NOTE  定义 register_chrdev 注册设备的 设备结构体 test_fops */
static const struct file_operations test_fops = {
	.owner		= THIS_MODULE,                    /* 所有的驱动 代码这一行不需要动,所有的都是这样,不是函数指针, 惯例直接写即可 */
	
	.open		= test_chrdev_open,  /* 将来应用 open 打开这个设备时实际 调用的就是这个 .open  函数指针*/
	.release	= test_chrdev_release,         /* release对应的就是 close    函数指针 */
};









// 模块安装函数
static int __init chrdev_init(void)
{	
	int ret = -1;  /* 定义 register_chrdev 的返回值  */
	
	printk(KERN_INFO "chrdev_init helloworld init\n");
	
	
	// 在 module_init 宏 调用函数中去注册字符串 设备驱动
	mymajor = register_chrdev(0, "test_char", &test_fops);   /* major设成0,内核帮我们自动分配空白的设备号,分配的值会 做返回值 ,负数还是返回失败  */
	if(mymajor < 0)
	{
		printk(KERN_ERR "registe_chrdev fail \n");
		return -EINVAL;  /* 返回一个错误码 需要加 ’-‘负号*/
	}
	printk(KERN_INFO "自动分配 register_chrdev success....mymajor = %d \n",mymajor);
	
	return 0;
}

// 模块卸载函数
static void __exit chrdev_exit(void)
{
	printk(KERN_INFO "chrdev_exit helloworld exit\n");
	
	// 在 module_exit宏 调用函数中去注销 字符串 设备驱动
	unregister_chrdev(mymajor, "test_char");  /* 这里不判断返回值 了,一般不会出错 */
}


module_init(chrdev_init);
module_exit(chrdev_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL");				// 描述模块的许可证
MODULE_AUTHOR("aston");				// 描述模块的作者
MODULE_DESCRIPTION("module test");	// 描述模块的介绍信息
MODULE_ALIAS("alias xxx");			// 描述模块的别名信息




/***********************************************************
如果 KERN_DEBUG 打印不出来,更改打印级别 或者  	
printk(KERN_DEBUG "chrdev_init helloworld init\n"); 

[root@liang_x210 driver_test]# cat /proc/sys/kernel/printk
7       4       1       7
[root@liang_x210 driver_test]# echo 8 > /proc/sys/kernel/printk
[root@liang_x210 driver_test]# cat /proc/sys/kernel/printk
8       4       1       7
************************************************************/



(3)实验现象预测和验证

 

5.2.10.3、总结
(1)整体流程梳理、注意分层

1.当我们 执行 ./app 程序时
    fd = open(FILE, O_RDWR);

2.其实就是执行 module_test.c
    static int test_chrdev_open(struct inode *inode, struct file *file)
    { printk(KERN_INFO "test_chrdev_open\n");  }


3.  当我们 执行 close(fd); /* app.c文件 */
4.  其实就是执行 module_test.c
    static int test_chrdev_release(struct inode *inode, struct file *file)
    { printk(KERN_INFO "test_chrdev_release\n"); }

 代码更改图片:

 

(2)后续工作:添加读写接口

 

 

 

 

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

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

相关文章

【深度学习】日常笔记14

对神经网络模型参数的初始化方案对保持数值稳定性有很重要的作用。初始化⽅案的选择可以与⾮线性激活函数的选择有趣的结合在⼀起。 突然有感触&#xff1a;做习题和模拟考研就分别是训练集和验证集&#xff0c;考研不就是最后的测试集&#xff08;&#xff09; p168的↓的解释…

【计算机编程语言】JAVA-MyBatis(Eclipse)

文章目录 MyBatis1.简介1.1什么是Mybatis1.2持久化1.3持久层1.4为什么需要Mybatis 2.第一个Mybatis程序2.1搭建环境2.1.1.搭建数据库&#xff1a;2.1.2.新建项目&#xff08;工程&#xff09;2.1.3导入依赖 2.2创建一个模块2.2.1.编写Mybatis的核心配置文件2.2.2.编写Mybatis的…

linux学成之路(基础篇(二十三)MySQL服务(下)

目录 MySQL服务之SQL语句 一、SQL语句类型 一、 DDL语句 二、DML语句 三、DCL语句 四、DQL 语句 二、 数据库操作 一、查看 二、创建 三、进入 四、删除数据库 五、更改数据库名称 六、更改字符集 三、数据表管理 一、数据类型 一、数值类型 TINYINT SMALLINT…

JUC并发编程之CompletableFuture详解

目录 1.Future接口 1.1 Future介绍 1.1.1 FutureTask 1.1.2 代码示例 2. CompletableFuture 2.1 基本概念 2.2 代码示例 2.2.1 创建CompletableFuture 2.2.2 函数式接口&#xff08;补充&#xff09; 2.2.3 异步任务组合 1.Future接口 1.1 Future介绍 JUC并发编程中的…

(三)InfluxDB入门(借助Web UI)

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 3 章 InfluxDB入门&#xff08;借助Web UI&#xff09; 借助Web UI&#xff0c;我们可以更好地理解InfluxD…

SiddonGpu编译过程记录

1. 还是想要能够快速生成DRR&#xff0c;用了这个up的代码GitHub - fabio86d/CUDA_DigitallyReconstructedRadiographs: GPU accelerated python library for generation of Digitally Reconstructed Radiographs (March 2018) 在看步骤的时候不是很清晰。尤其是procedure to…

生产环境Session解决方案、Session服务器之Redis

目录 一、服务器配置 二、安装nginx 三、安装配置Tomcat&#xff1a; 四、配置session Session服务器之Redis Redis与Memcached的区别 安装部署redis 一、服务器配置 IP地址 主机名 软件包列表 192.168.100.131 huyang1 nginx 192.168.100.133 huyang3 JDK Tomca…

隧道安全监测解决方案

隧道安全监测 解决方案 一、监测目的 通过监控量测&#xff0c;实现信息化施工&#xff0c;不仅能及时掌握隧道实际的地质情况&#xff0c;掌握隧道围岩、支护衬砌结构的受力特征和变形情况&#xff0c;据此可以尽早发现塌方、大变形等灾害征兆&#xff0c;及时采取措施&…

Qgis二次开发-加载高德在线地图失败报错Raster layer Cannot instantiate the ‘wms‘ data provider

1.加载在线的高德地图 以下是在线高德地图地址。 http://webrd01.is.autonavi.com/appmaptile?x{x}&y{y}&z{z}&langzh_cn&size1&scale1&style8 以下是代码示例&#xff1a; #include <QApplication> #include <QMainWindow> #include …

Django学习笔记-表单(forms)的使用

在Django中提供了了form表单&#xff0c;可以更为简单的创建表单模板信息&#xff0c;简化html的表单。 一、网页应用程序中表单的应用 表单通常用来作为提交数据时候使用。 1.1 创建表单模板文件夹 在项目文件夹下创建一个template文件夹&#xff0c;用于存储所有的html模…

Integer 和 int

一、区别 1.Integer是int的包装类&#xff0c;int则是java的一种基本的数据类型&#xff1b; 2.Integer变量必须实例化之后才能使用&#xff0c;而int变量不需要实例化&#xff1b; 3.Integer实际是对象的引用&#xff0c;当new一个Integer时&#xff0c;实际上生成一个指针指向…

Linux vsftp三种模式的简单配置部署

环境&#xff1a;Debian 6.1.27-1kali1 (2023-05-12) vsftpd 安装 --查看是否当前系统是否已安装 apt list --installed | grep vsftpd 没有安装的话&#xff0c;就正常安装 apt-get update apt-get install vsftpd 一、匿名用户模式 分享一些不重要文件&#xff0c;任…

AI学习笔记二:YOLOV5环境搭建及测试全过程

若该文为原创文章&#xff0c;转载请注明原文出处。 记录yolov5从环境搭建到测试全过程。 一、运行环境 1、系统&#xff1a;windows10 &#xff08;无cpu) 2、yolov5版本&#xff1a;yolov5-5.0 3、python版本&#xff1a;py3.8 在创建虚拟环境前需要先把miniconda3和py…

Font Awesome 5使用

Font Awesome 5介绍 Font Awesome 5 的专业版有7842个图标。 要使用免费的Font Awesome 5 图标&#xff0c;您可以选择下载Font Awesome库&#xff0c;或者在Font Awesome注册一个帐户&#xff0c;并获得一个代码&#xff08;称为KIT CODE&#xff09;&#xff0c;以便在将Fo…

Wireshark抓包分析教程(ubuntu版本)

安装 first&#xff0c;多亏我们的C知道&#xff0c;成功安装了wireshark&#xff0c; Steps are as following&#xff1a; 添加wireshark的软件源(PPA:personal package archive(档案)) sudo apt-add-repository ppa:wireshark-dev/stable ppa:wireshark-dev/stable 是一个…

Quad Remesher 参数效果记录

基本属性 Detect Hard-Edges by angle 这个属性最好开启&#xff0c;它用于保持必要的边缘

WEB:ics-06

背景知识 burpsuite的使用 题目 所有都尝试点了一遍&#xff0c;只有报表中心可以打开 先查看源代码&#xff0c;没有发现有用的信息 选择了日期范围但是毫无反应&#xff0c;这里发现url中有一个id1&#xff0c;尝试抓包爆破 使用bp进行抓包 设置有效载荷配置&#xff0c;开…

(链表) 剑指 Offer 24. 反转链表 ——【Leetcode每日一题】

❓剑指 Offer 24. 反转链表 难度&#xff1a;简单 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < …

小程序如何删除/上架/下架商品

在小程序中&#xff0c;产品的删除、上架和下架是常见的操作&#xff0c;可以根据实际需求来管理商品的展示与销售。下面将介绍如何在小程序中删除上架下架商品的具体步骤。 进入商品管理页面&#xff0c; 在个人中心点击管理入口&#xff0c;然后找到“商品管理”菜单并点击。…

Git----分布式版本控制系统

1. 简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。它是世界上目前最先进的分布式版本控制系统。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversio…