Hello,World驱动之旅,用户层简单交互(三)

news2024/11/16 5:44:10

目录

(一)上篇回顾:上一篇讲到用户层怎么与驱动模块进行交互。Hello,World驱动之旅,对外接口(二)-CSDN博客

(二)通过简单程序与驱动交互

读操作,代码如下:

写操作,代码如下:

主函数如下:

(三)编译源码指令:gcc test.c -o test

(四)执行指令:./test

(五)源代码如下


(一)上篇回顾:上一篇讲到用户层怎么与驱动模块进行交互。Hello,World驱动之旅,对外接口(二)-CSDN博客

1.通过insmod加载驱动

2.通过指令echo指令对驱动文件节点进行写操作

3.通过指令cat对驱动文件节点进行读操作

4.驱动底层记录写入次数,并通过cat读操作反馈出来。

(二)通过简单程序与驱动交互

前文已经通过指令echo、cat与驱动模块进行了交互,接下来我们通过简单的C语言程序与驱动程序进行交互。

读操作,代码如下:

int sys_files_read(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }
    //打开文件
    fd = open(path, O_RDONLY);    
    if(fd > 0){
        //读文件
        ret = read(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        //关闭文件
        close(fd);
        return ret;
    }else{
        return -3;
    }
}

open、read、close为linux系统调用,通过指令“man 2  xxxx”可以查看具体系统调用用法,包括头文件、参数、返回值、错误码等。xxx即为open、read、write等,示例指令如下:

写操作,代码如下:

//sys file write operation
int sys_files_write(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }
    //打开文件
    fd = open(path, O_WRONLY);    
    if(fd > 0){
        //写文件
        ret = write(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        //关闭文件
        close(fd);
        return 0;
    }else{
        return -3;
    }
}

主函数如下:

int main(int argc,char **argv){
    int ret;
    char *buf = (char *)malloc(1024);
    if(NULL == buf){
        printf("not enought memory\n");
        return -1;
    }
    
    ret = sys_files_read(TEST_DRIVER_SYSFILE,buf,1024);
    if(ret > 0){
        printf("%s",buf);
    }else{
        printf("read file error,error code=%d\n",ret);
    }
    ret = sys_files_write(TEST_DRIVER_SYSFILE, "1", 1);
    if(0 != ret){
        printf("write file error,error code=%d\n",ret);
    }else{
        printf("write %s successful\n",TEST_DRIVER_SYSFILE);
    }
    free(buf);
    return 0;
}

其中驱动节点文件"/sys/class/cdevhelloclass/test"对应宏定义TEST_DRIVER_SYSFILE 即为驱动文件所对应的底层节点文件。main函数中,每次对该文件进行一次读写操作。

(三)编译源码指令:gcc test.c -o test

(四)执行指令:./test

貌似结果与预期不符,从code返回-3可知,程序在open的时候就出错了,具体什么原因导致的出错,我们可以通过errno获取,稍微修改下程序,在return -3之前增加如下代码:

printf("%s\n",strerror(errno));

再编译执行一次,效果如下,提示没有相应目录:

是的、由于我虚拟机重启了,此处未加载驱动模块,执行指令sudo insmod hello.ko,再次执行指令如下:

有变化,没有文件或者目录错误解决了,当前提示没有权限,使用ls命令看看具体该文件本身所具备的权限,执行如下指令ls -l /sys/class/cdevhelloclass/test

果然,当前文件的用户属于root,目前只有root用户可以读写(rw-)、其他用户只能读(r--),接下来解决思路有两个:

第一:通过sudo指令执行test程序,

第二:通过chmod指令修改驱动文件权限sudo chmod 666 /sys/class/cdevhelloclass/test

我们可以看到,该文件的权限由之前的rw-r--r--,修改为rw-rw-rw-,再次通过指令./test执行,不加sudo,效果如下,异常已解决,同时我们也可以看出,每执行一次,我们的count都会增加1。

至此介绍完一个简单的与底层驱动交互的test程序,麻雀虽小五脏俱全。接下来我们看看,如何通过java来与我们的驱动进行交互,可以满足后续的Android开发。

(五)源代码如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define TEST_DRIVER_SYSFILE ("/sys/class/cdevhelloclass/test")

int sys_files_read(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }

    fd = open(path, O_RDONLY);    
    if(fd > 0){
        ret = read(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        close(fd);
        return ret;
    }else{
        printf("%s\n",strerror(errno));
        return -3;
    }
}

//sys file write operation
int sys_files_write(char *path,char *buf,int len){
    int ret;
    int fd;
    if(NULL == buf){
        return -1;
    }
    fd = open(path, O_WRONLY);    
    if(fd > 0){
        ret = write(fd, buf, len);
        if(ret<0){
            close(fd);
            return -2;
        }
        close(fd);
        return 0;
    }else{
        printf("%s\n",strerror(errno));
        return -3;
    }
}

int main(int argc,char **argv){
    int ret;
    char *buf = (char *)malloc(1024);
    if(NULL == buf){
        printf("not enought memory\n");
        return -1;
    }
    
    ret = sys_files_read(TEST_DRIVER_SYSFILE,buf,1024);
    if(ret > 0){
        printf("%s",buf);
    }else{
        printf("read file error,error code=%d\n",ret);
    }
    ret = sys_files_write(TEST_DRIVER_SYSFILE, "1", 1);
    if(0 != ret){
        printf("write file error,error code=%d\n",ret);
    }else{
        printf("write %s successful\n",TEST_DRIVER_SYSFILE);
    }
    free(buf);
    return 0;
}

Hello,World驱动之旅,初识驱动模块(一)-CSDN博客

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

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

相关文章

Day28

回溯算法part02 LC组合总和II 终止条件&#xff0c;sumn且mid.size()k加入result。其他终止条件sum>n或者mid.size()>k也结束一样可以引入剪枝操作进行优化&#xff0c;其实sum>n也可以算是剪枝操作的一部分 LC17电话号码的字母组合&#xff08;超时5min&#xff…

复利效应(应用于成长)

应用 每个人在智力、知识、经验上&#xff0c;复利效应都一样&#xff0c;只要能积累的东西&#xff0c;基本上最终都会产生复利效应。 再来看一下复利公式&#xff1a;FP*(1i)^n P本金&#xff1b;i利率&#xff1b;n持有期限。在使用时&#xff0c;一定要注意4个限定条件&a…

网络安全快速入门(十二)(下) 目录结构相关命令补充

12.4 补充命令 我们已经了解了linux的目录结构&#xff0c;接下来我们大概看一下针对目录及文件的一些相关命令&#xff0c; 我们本章只讲三个目录及文件相关的命令&#xff0c;分别是tree&#xff0c;find及校验文件命令&#xff0c;我们一个一个来看这些命令。 12.4.1 tree命…

数学建模——线性回归模型

目录 1.线性回归模型的具体步骤和要点&#xff1a; 1.收集数据&#xff1a; 2.探索性数据分析&#xff1a; 3.选择模型&#xff1a; 4.拟合模型&#xff1a; 5.评估模型&#xff1a; 1.R平方&#xff08;R-squared&#xff09;&#xff1a; 2.调整R平方&#xff08;Ad…

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

[初学者来练]用html+css+javascript个人博客作业需求

文章目录 项目概述项目需求页面设计主页文章列表页文章详情页用户交互额外功能&#xff08;可选&#xff09; 技术要求提交要求评分标准文件代码格式提示HTML 页面结构CSS 样式设计JavaScript 交互功能 项目概述 这个项目旨在通过使用HTML、CSS和JavaScript创建一个简单而功能…

零样本身份保持:ID-Animator引领个性化视频生成技术新前沿

在最新的研究进展中&#xff0c;由Xuanhua He及其团队提出的ID-Animator技术&#xff0c;为个性化视频生成领域带来了突破性的创新。这项技术的核心在于其零样本&#xff08;zero-shot&#xff09;人物视频生成方法&#xff0c;它允许研究者和开发者根据单一的参考面部图像生成…

如何在云电脑实现虚拟应用—数据分层(应用分层)技术简介

如何在云电脑实现虚拟应用—数据分层&#xff08;应用分层&#xff09;技术简介 近几年虚拟化市场实现了非常大的发展&#xff0c;桌面虚拟化在企业中应用越来越广泛&#xff0c;其拥有的如下优点得到大量企业的青睐&#xff1a; 数据安全不落地。在虚拟化环境下面数据保存在…

风电功率预测 | 基于CNN卷积神经网络的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于卷积神经网络(Convolutional Neural Network, CNN)的风电功率预测可以通过以下步骤实现: 数据准备:收集与风电场发电功率相关的数据,包括风速、风向、温度、湿度等气象数据以及风电场的历史功率数据。 数据预处理:对…

Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度

概念如下&#xff1a; 狄尔沃斯定理_百度百科 (baidu.com) 本质就是找要求序列中最长的单调的子序列&#xff08;不一定连续&#xff09;的长度。 模板如下&#xff1a; 时间复杂度为O&#xff08;N^2&#xff09; #include<iostream>using namespace std;int dp[100…

基于GWO灰狼优化的CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 GRU网络 4.3 注意力机制&#xff08;Attention&#xff09; 4.4 GWO优化 5.算法完整程序工程 1.算法运行效果图预览…

银河麒麟V10操作系统编译LLVM18踩坑记录

1、简述 要在银河麒麟V10操作系统上编译一个LLVM18&#xff0c;这个系统之前确实也没有用过&#xff0c;所以开始了一系列的摸排工作&#xff0c;进行一下记录。 首先肯定是要搞一个系统&#xff0c;所以去到银河麒麟的网站&#xff0c;填写了一个申请 产品试用申请国产操作系…

力扣416. 分割等和子集

Problem: 416. 分割等和子集 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该题目可以归类为0-1背包问题&#xff0c;具体到细节可以再归纳为背包是否装满问题 1.首先判断数组元素和的奇偶性&#xff08;奇数则不能划分&#xff09; 2.我们定义一个二维布尔类型数组…

只用了三天就入门了Vue3?

"真的我学Vue3&#xff0c;只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器&#xff0c;放心你只需要学一些基础的…

C++进阶:红黑树介绍及模拟实现(图示详解过程)

C进阶&#xff1a;红黑树介绍及模拟实现 上次介绍了AVL树&#xff1a;C进阶&#xff1a;AVL树详解及模拟实现&#xff08;图示讲解旋转过程&#xff09; 今天就来紧接着来红黑树啦!!! 文章目录 1.红黑树介绍约束规则 2.项目文件规划3.整体框架&#xff08;节点和Tree&#xf…

【java】异常与错误

Throwable包括Error和Expected。 Error Error错误是程序无法处理的&#xff0c;由JVM产生并抛出的。 举例&#xff1a;StackOverflowError \ ThreadDeath Expected Expected异常包括两类&#xff0c;即受检异常(非运行时异常)和非受检异常(运行时异常)&#xff0c;异常往往…

【微记录】Makefile中wildcard(通配)的一种用法--如何避免某个头文件路径不存在造成CLFAGS添加后编译报错?

文章目录 背景方法&#xff1a;wildcard补充信息wildcard解释Make中wildcard用法 背景 工程中&#xff0c;如果某个代码需要再不同平台有不同的依赖头文件&#xff0c;于是会出现不同平台依赖头文件路径不一样&#xff0c;但是为了适配多个平台如何做到避免某个头文件路径不存…

笔记本黑屏,重新开机主板没有正常运作的解决办法

拆开笔记本后壳&#xff0c;打开看到主板&#xff0c;将主板上的这颗纽扣电池拆下来&#xff0c;如果是带连接线的&#xff08;如下图&#xff09;&#xff0c;可以将接口处线头拔出&#xff0c;等1分钟再把线接上。 ------------- 以下是科普 首先&#xff0c;电脑主板上的这…

【学习笔记】C++每日一记[20240513]

简述静态全局变量的概念 在全局变量前加上static关键字&#xff0c;就定义了一个静态全局变量。通常情况下&#xff0c;静态全局变量的声明和定义放在源文件中&#xff0c;并且不能使用extern关键字将静态全局变量导出&#xff0c;因此静态全局变量的**作用于仅限于定义静态全…

[初学者必看]JavaScript 简单实际案例练习,锻炼代码逻辑思维

文章目录 创意小项目合集&#xff1a;从简易图片轮播到购物车1. 图片轮播器2. 动态列表3. 模态框&#xff08;Modal&#xff09;4. 简单的表单验证5. 简易待办事项列表&#xff08;Todo List&#xff09;6. 简易图片画廊7. 简易时钟8. 简易搜索框高亮9. 简易颜色选择器10. 简易…