当前位置: 首页 > news >正文

编写hello驱动程序

hello的驱动编写

编写驱动程序的步骤

1.确定主设备号,也可以让内核分配
2.定义自己的 file_operations 结构体
3.实现对应的 drv_open/drv_read/drv_write 等函数,填入 file_operations 结构 体
4.把 file_operations 结构体告诉内核:register_chrdev
5.谁来注册驱动程序啊?得有一个入口函数:安装驱动程序时,就会去调用这 个入口函数
6.有入口函数就应该有出口函数:卸载驱动程序时,出口函数调用unregister_chrdev
7.其他完善:提供设备信息,自动创建设备节点:class_create,

代码

驱动代码
hello_drv.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/device.h>
#include <linux/ioctl.h>
#include <linux/ctype.h>
#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/uaccess.h>
#include <linux/compat.h>
#include <linux/platform_device.h>static ssize_t hello_read(struct file *file, char __user *buf, size_t count,loff_t *ppos);
static ssize_t hello_write(struct file *file, const char __user *buf,size_t count, loff_t *ppos);
static int hello_open(struct inode *inode, struct file *file);
int hello_close(struct inode *inode, struct file *file);char kernel_buf[1024] = "www.ask100.com";
static struct class *hello_class;
#define MIN(a,b) (a<b ? a:b)//1确定主设备号,也可以让内核分配
static unsigned int major = 0 ; //2定义自己的 file_operations 结构体
static const struct file_operations hello_fops = {.owner	 = THIS_MODULE,.open    = hello_open,.read    = hello_read,.write   = hello_write,.release = hello_close,
};//3.实现对应的 drv_open/drv_read/drv_write 等函数,填入 file_operations 结构体
static int hello_open(struct inode *inode, struct file *file)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;}static ssize_t hello_write(struct file *file, const char __user *buf,size_t count, loff_t *ppos)
{int len;printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);len = copy_from_user(kernel_buf, buf, MIN(1024,sizeof(kernel_buf)));kernel_buf[len] = '\0';return MIN(1024,sizeof(kernel_buf));}static ssize_t hello_read(struct file *file, char __user *buf, size_t count,loff_t *ppos)
{int err;printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);err = copy_to_user(buf, kernel_buf, MIN(1024,sizeof(kernel_buf)));return MIN(1024,sizeof(kernel_buf));
}int hello_close(struct inode *inode, struct file *file)
{printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}//4.把 file_operations 结构体告诉内核:register_chrdev
//5.谁来注册驱动程序啊?得有一个入口函数:安装驱动程序时,就会去调用这个入口函数
static int __init hello_init(void)
{int err;major = register_chrdev(0,"hello",&hello_fops);hello_class = class_create(THIS_MODULE, "hello");err = PTR_ERR(hello_class);if (IS_ERR(hello_class))return -1;device_create(hello_class, NULL, MKDEV(major, 0), NULL, "hello"); /*/dev/hello*/return 0;}//6.有入口函数就应该有出口函数:卸载驱动程序时,出口函数调用unregister_chrdevstatic void __init hello_exit(void)
{device_destroy(hello_class, MKDEV(major, 0));class_destroy(hello_class);unregister_chrdev(major, "hello");}//7.其他完善:提供设备信息,自动创建设备节点:class_create,device_create
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

测试程序
hello_drv_test.c


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>/** ./hello_drv_test -w abc* ./hello_drv_test -r*/
int main(int argc, char **argv)
{int fd;char buf[1024];int len;/* 1. 判断参数 */if (argc < 2) {printf("Usage: %s -w <string>\n", argv[0]);printf("       %s -r\n", argv[0]);return -1;}/* 2. 打开文件 */fd = open("/dev/hello", O_RDWR);if (fd == -1){printf("can not open file /dev/hello\n");return -1;}/* 3. 写文件或读文件 */if ((0 == strcmp(argv[1], "-w")) && (argc == 3)){len = strlen(argv[2]) + 1;len = len < 1024 ? len : 1024;write(fd, argv[2], len);}else{len = read(fd, buf, 1024);		buf[1023] = '\0';printf("APP read : %s\n", buf);}close(fd);return 0;
}

Makefile


# 1. 使用不同的开发板内核时, 一定要修改KERN_DIR
# 2. KERN_DIR中的内核要事先配置、编译, 为了能编译内核, 要先设置下列环境变量:
# 2.1 ARCH,          比如: export ARCH=arm64
# 2.2 CROSS_COMPILE, 比如: export CROSS_COMPILE=aarch64-linux-gnu-
# 2.3 PATH,          比如: export PATH=$PATH:/home/book/100ask_roc-rk3399-pc/ToolChain-6.3.1/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin 
# 注意: 不同的开发板不同的编译器上述3个环境变量不一定相同,
#       请参考各开发板的高级用户使用手册KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88all:make -C $(KERN_DIR) M=`pwd` modules $(CROSS_COMPILE)gcc -o hello_drv_test hello_drv_test.c clean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.orderrm -f hello_testobj-m	+= hello_drv.oKERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88

用make命令编译后,将编译出的hello_drv.ko 和hello_drv_test传给板子

板子操作

  1. 安装驱动:insmod hello_drv.ko

2.lsmod : 查看已经安装的驱动,可以看到hello_drv已经安装

在这里插入图片描述

3.cat /proc/devices查看设备节点,看到hello节点已经被创建,这是再hello_drv.c文件里创建的节点,具体看hello_int函数
在这里插入图片描述

4.执行程序: 在这里插入图片描述

5.删除驱动程序 rmmod hello_drv

相关文章:

编写hello驱动程序

hello的驱动编写 编写驱动程序的步骤 1.确定主设备号&#xff0c;也可以让内核分配 2.定义自己的 file_operations 结构体 3.实现对应的 drv_open/drv_read/drv_write 等函数&#xff0c;填入 file_operations 结构 体 4.把 file_operations 结构体告诉内核&#xff1a;regist…...

ZYNQ中断例程

GPIO 中断系统初始化流程&#xff1a; 第一步:初始化 cpu 的异常处理功能 第二步&#xff1a;初始化中断控制器 第三步&#xff1a;向 CPU 注册异常处理回调函数&#xff1b; 第四步&#xff1a;将中断控制器中的对应中断 ID 的中断与中断控制器相连接 第五步&#xff1a;设置 …...

常用linux命令 linux_cmd_sheet

查看文件大小 ls -al 显示每个文件的kb大小 查看系统日志 dmesg -T | tail 在 top 命令中&#xff0c;RES 和 VIRT&#xff08;或者 total-vm&#xff09;是用来表示进程内存使用的两个不同指标&#xff0c;它们之间有以下区别&#xff1a; RES&#xff08;Resident Set Size…...

【proteus】8086 写一个汇编程序并调试

参考书籍&#xff1a;微机原理与接口技术——基于8086和Proteus仿真&#xff08;第3版&#xff09;p103-105&#xff0c;p119-122. 参考程序是p70&#xff0c;例4-1 在上一篇的基础上&#xff1a; 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图&#xff1a; …...

大数据之LibrA数据库常见术语(四)

Failover 指当某个节点出现故障时&#xff0c;自动切换到备节点上的过程。反之&#xff0c;从备节点上切换回来的过程称为Failback。 Freeze 在事务ID耗尽时由AutoVacuum Worker进程自动执行的操作。FusionInsight LibrA会把事务ID记在行头&#xff0c;在一个事务取得一行时&…...

Docker基础知识

文章目录 Docker Docker 一次构建&#xff0c;处处运行&#xff0c;类似于JVM 虚拟机是软件硬件&#xff08;需要Hypervisors实现硬件资源虚拟化&#xff09;&#xff1a; 资源占用大启动慢&#xff08;虚拟机是分钟级&#xff0c;Docker是秒级&#xff09;冗余步骤多 sha2…...

swoole 是什么?

Swoole是一个为PHP用C和C编写的基于事件的高性能异步& 协程并行网络通信引擎; 使 PHP 开发人员可以编写高性能的协程 TCP、UDP、Unix Socket、HTTP&#xff0c;WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网&#xff08;IO…...

我想要一个勋章

目录 一、背景二、过程三、总结 一、背景 十年前结缘&#xff0c;也许是冥冥中自有天注定&#xff0c;注定要给自己多加一个今天的节日。 二、过程 一个勋章&#xff0c;一个有意义的标志。 一个勋章&#xff0c;一个时间轮上的帧。 一个勋章&#xff0c;一个二进制的节点。…...

微信小程序设计之主体文件app-json-pages

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…...

C语言-面试题实现有序序列合并

要求&#xff1a; a.输入两个升序排列的序列&#xff0c;将两个序列合并为一个有序序列并输出。 数据范围&#xff1a; 1≤n,m≤1000 1≤n,m≤1000 &#xff0c; 序列中的值满足 0≤val≤30000 输入描述&#xff1a; 1.输入包含三行&#xff0c; 2.第一行包含两个正整数n, m&am…...

Android12 启动页适配

印象中&#xff0c;在2022年末接到了一个针对Android12启动页适配的需求&#xff0c;当时也使用了一些适配方案&#xff0c;也写了一个Demo&#xff0c;但是最终没有付诸适配行动&#xff1b;当然并不是适配失败&#xff0c;而是根据官方适配方案适配后太丑了… 1024纪念文章&a…...

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…...

20231023 比赛总结

比赛链接 反思 A 花了很长时间&#xff0c;幸亏没怎么调就对了&#xff0c;以后还是应该先看其他题的 括号匹配题的套路感觉没有掌握透&#xff0c;感觉无非就是单调栈&#xff0c;哈希&#xff0c;折线图 B 感觉比 T 1 T1 T1 简单 C 正解还是很妙的&#xff0c;但 68…...

Vite创建vue3+ts+pinia+vant项目起步流程

pnpm介绍&安装 本质上他是一个包管理工具&#xff0c;和npm/yarn没有区别&#xff0c;主要优势在于 包安装速度极快磁盘空间利用效率高 安装&#xff1a; npm i pnpm -g使用&#xff1a; npm命令pnpm等效npm installpnpm installnpm i axiospnpm add axiosnpm i webpa…...

JVM 类的加载子系统

文章目录 类的加载过程加载阶段链接阶段初始化 类的加载器测试代码中获取对应的加载器获取加载器加载的路径不同类对应的加载器自定义加载器自定义加载器的方式 获取类的加载器的方式双亲委派机制双亲委派机制的好处 Java 的 SPI 机制1. 接口定义2. 具体实现3. 配置 META-INF/s…...

什么是1024程序员节

一年一度专属于程序员的节日“1024程序员节”要到来了&#xff0c;相信有很多的小伙伴跟我一样&#xff0c;对这个节日非常的熟悉&#xff0c;但也有一下小伙伴对这个节日非常陌生&#xff0c;没事&#xff0c;下面由我来讲解一下1024程序员节。 目录 节日背景 节日由来 社…...

spark获取hadoop服务token

spark 作业一直卡在accepted 问题现象问题排查1.查看yarn app日志2.问题分析与原因 问题现象 通过yarn-cluster模式提交spark作业&#xff0c;客户端日志一直卡在submit app&#xff0c;没有运行 问题排查 1.查看yarn app日志 appid已生成&#xff0c;通过yarn查看app状态为…...

Simulink 最基础教程(一)

1.1基本概念 一个典型的Simulink模型大致如上图这样&#xff1a; 1&#xff09;模块 block&#xff1a;图中画圈的那些&#xff0c;每个模块可以完成一些特定的任务&#xff0c;类似MATLAB中函数的概念。软件提供了很多模块&#xff0c;当然也可以自定义新的模块 2&#xff0…...

微信小程序:单行输入和多行输入组件

微信小程序提供了两种输入类型的输入框组件&#xff0c;分别是单行输入框 <input> 和多行输入框 <textarea>。 1. 单行输入组件&#xff08;input&#xff09; 单行输入框 <input> <input> 是一个用于收集用户输入的组件&#xff0c;主要用于收集单行…...

1024程序员

听说今天可以拿勋章&#xff0c;嘿嘿...

3个步骤实现Windows直接运行安卓应用:开发者与玩家的跨平台解决方案

3个步骤实现Windows直接运行安卓应用&#xff1a;开发者与玩家的跨平台解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为手机应用无法在电脑上运行而困扰…...

不用重复编译!共享ModelSim仿真库的终极技巧(Vivado 2018+版本通用)

共享ModelSim仿真库的高效复用策略&#xff08;Vivado 2018通用指南&#xff09; 当团队协作开发FPGA项目或频繁切换不同工程时&#xff0c;每次重新编译仿真库不仅耗时&#xff0c;还会占用大量存储空间。本文将揭示如何通过巧妙配置modelsim.ini文件实现仿真库的跨工程共享&a…...

Flutter地图集成与跨平台定位从0到1:3大平台配置+5个避坑指南

Flutter地图集成与跨平台定位从0到1&#xff1a;3大平台配置5个避坑指南 【免费下载链接】flutter_amap A Flutter plugin use amap.高德地图flutter组件 项目地址: https://gitcode.com/gh_mirrors/fl/flutter_amap 在移动应用开发中&#xff0c;地图集成和定位服务是许…...

告别AI代码乱炖:用GitHub Spec Kit v0.0.79,像资深架构师一样拆解复杂功能

告别AI代码乱炖&#xff1a;用GitHub Spec Kit v0.0.79&#xff0c;像资深架构师一样拆解复杂功能 在当今快节奏的开发环境中&#xff0c;面对一个需要多模块协作的复杂功能时&#xff0c;许多开发者常常陷入两难&#xff1a;要么盲目依赖AI生成代码导致质量失控&#xff0c;要…...

JavaScript中全局执行上下文与函数上下文的生成过程

全局执行上下文在JS引擎启动时创建&#xff0c;函数执行上下文在每次调用时创建&#xff1b;前者作用域链仅含全局环境&#xff0c;后者在创建阶段就基于定义位置固定作用域链&#xff1b;var和function声明被提升并初始化&#xff0c;let/const仅注册于词法环境而处于暂时性死…...

真理纪元:贾子科学定理与人类逻辑主权的学术白皮书

真理纪元&#xff1a;贾子科学定理与人类逻辑主权的学术白皮书作者单位&#xff1a;鸽姆智库&#xff08;GG3M Think Tank&#xff09;作者简介&#xff1a;贾子&#xff08;Kucius&#xff09;&#xff0c;研究员&#xff0c;鸽姆智库&#xff08;GG3M Think Tank&#xff09;…...

智能编码伙伴:基于快马AI与openclaw打造你的AI辅助开发chrome插件

最近在开发一个Chrome插件时&#xff0c;发现结合AI能力可以大幅提升开发效率。于是尝试用openclaw框架和InsCode(快马)平台的AI辅助功能&#xff0c;打造了一个智能开发助手插件。这个项目让我深刻体会到AI如何改变传统插件开发模式&#xff0c;下面分享下具体实现思路和关键点…...

FreeRTOS在STM32上的内存管理:如何避免堆溢出和优化内存使用

FreeRTOS在STM32上的内存管理实战&#xff1a;从堆溢出防御到高效优化策略 在嵌入式开发中&#xff0c;内存管理往往是决定系统稳定性的关键因素。对于使用FreeRTOS的STM32开发者而言&#xff0c;如何合理配置内存、预防堆溢出以及优化内存使用&#xff0c;直接关系到产品的可…...

开源多人游戏解决方案:Nucleus Co-op让单机游戏秒变多人派对

开源多人游戏解决方案&#xff1a;Nucleus Co-op让单机游戏秒变多人派对 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirro…...

OFA视觉语义蕴含(iic/ofa_visual-entailment_snli-ve_large_en)零基础入门指南

OFA视觉语义蕴含&#xff08;iic/ofa_visual-entailment_snli-ve_large_en&#xff09;零基础入门指南 1. 镜像简介 本镜像已经完整配置好了 OFA 图像语义蕴含模型 运行所需的一切环境&#xff0c;基于 Linux 系统 Miniconda 虚拟环境构建。你不需要手动安装任何依赖、配置环…...