RK3568笔记三十三: helloworld 驱动测试

若该文为原创文章,转载请注明原文出处。

报着学习态度,接下来学习驱动是如何使用的,从简单的helloworld驱动学习起。

开始编写第一个驱动程序—helloworld 驱动。

一、环境

1、开发板:正点原子的ATK-DLRK3568
2、系统: buildroot
3、内核:正点原子提供的虚拟机和rk3568_linux_sdk

二、驱动的基本框架

Linux 驱动的基本框架主要由模块加载函数,模块卸载函数,模块许可证声明,模块参数, 模块导出符号,模块作者信息等几部分组成,其中模块参数,模块导出符号,模块作者信息是 可选的部分,也就是可要可不要。剩余部分是必须有的。
1. 模块加载函数
当使用加载驱动模块时,内核会执行模块加载函数,完成模块加载函数中的初始化工作。
2.模块卸载函数
当卸载某模块时,内核会执行模块卸载函数,完成模块卸载函数中的退出工作。
3.模块许可证声明
许可证声明描述了内核模块的许可权限,如果不声明模块许可,模块在加载的时候,会收到“内核被污染(kernel tainted)”的警告。可接受的内核模块声明许可包括“GPL”“GPL v2”。
4.模块参数(可选择)
模块参数是模块被加载的时候可以传递给它的值。
5.模块导出符号(可选择)
内核模块可以导出的符号,如果导出,其他模块可以使用本模块中的变量或函数。
6.模块作者信息等说明(可选择)

三、helloworld 驱动代码

#include <linux/module.h>
#include <linux/kernel.h>static int __init helloworld_init(void) //驱动入口函数
{printk(KERN_EMERG "helloworld_init\r\n");//注意:内核打印用 printk 而不是 printfreturn 0;
}static void __exit helloworld_exit(void) //驱动出口函数
{printk(KERN_EMERG "helloworld_exit\r\n");
}module_init(helloworld_init); //注册入口函数module_exit(helloworld_exit); //注册出口函数MODULE_LICENSE("GPL v2"); //同意 GPL 开源协议MODULE_AUTHOR("yifeng"); //作者信息

根据驱动的基本框架,编写了最简单的helloworld程序,加载驱动和卸载驱动时直接打印信息。

编译驱动需要内核代码,环境自行编译。

根据正点原子的手册编译需要设置环境变量,这里直接填写到makefile里

makefile:

# 内核目录
KERNELDIR := /home/alientek/rk3568_linux_sdk/kernel
# rk3568是arm64架构
ARCH=arm64
# 交叉工具链
CROSS_COMPILE=/opt/atk-dlrk356x-toolchain/usr/bin/aarch64-buildroot-linux-gnu-
export  ARCH  CROSS_COMPILECURRENT_PATH := $(shell pwd)
obj-m := helloworld.obuild: kernel_moduleskernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

在这里插入图片描述直接make会生成helloworld.ko文件 ,这就是编译生成的内核驱动模块

四、测试

启动开发板,把生成的helloworld.ko文件拷贝到板子上。

加载ko文件

insmod helloworld.ko

在这里插入图片描述

查看当前加载的内核模块

lsmod

在这里插入图片描述
查看当前系统中有没有 helloworld这个设备

cat /proc/devices

结果查询不到,因为没注册。

卸载驱动模块

rmmod helloworld.ko

在这里插入图片描述

这个模块是最基础的模板,下面大部分驱动都以此模板编写。

如有侵权,或需要完整代码,请及时联系博主。

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

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

相关文章

d3dcompiler_43.dll文件是什么?如何快速有效的解决d3dcompiler_43.dll文件丢失问题

dcompiler_43.dll 是一个Windows系统中的系统文件&#xff0c;属于DirectX软件的一部分。这个dcompiler_43.dll&#xff08;动态链接库&#xff09;文件主要用于处理与3D图形编程有关的任务&#xff0c;是运行许多游戏和高级图形程序必需的组件之一。那么如果电脑丢失d3dcompil…

香蕉派BPI-Wifi6迷你路由器公开发售

Banana Pi BPI-Wifi6 Mini 公开发售。 Banana Pi BPI-Wifi6 Mini 开源路由器采用Triductor TR6560 TR5220 wifi SOC设计&#xff0c;是一款迷你尺寸的wifi6路由器解决方案。内置高性能双核ARM Cortec A9处理器用于WIFI报文转发或智能业务处理&#xff0c;内置高性能LSW和硬件N…

ubuntu 上vscode +cmake的debug调试配置方法

在ubuntu配置pcl点云库以及opencv库的时候&#xff0c;需要在CMakeLists.txt中加入相应的代码。配置完成后&#xff0c;无法调试&#xff0c;与在windows上体验vs studio差别有点大。 找了好多调试debug配置方法&#xff0c;最终能用的有几种&#xff0c;但是有一种特别好用&a…

ubuntu部署minio集群

minio集群介绍 官方文档&#xff1a;https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html 本方案采用在多节点多驱动器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企业级性能、可用​​性和可扩展性&#…

jmeter-beanshell学习4-beanshell截取字符串

再写个简单点的东西&#xff0c;截取字符串&#xff0c;参数化文件统一用csv&#xff0c;然后还要用excel打开&#xff0c;如果是数字很容易格式就乱了。有同事是用双引号把数字引起来&#xff0c;报文里就不用加引号了&#xff0c;但是这样beanshell处理起来&#xff0c;好像容…

Facebook社交平台的未来发展趋势分析

随着科技和社交需求的不断演变&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;其未来发展的趋势备受关注。从技术创新到社会影响&#xff0c;Facebook正在经历着前所未有的变化和挑战。本文将探讨Facebook未来发展的几个关键趋势&#xff0c;并分析其可能的影响和…

MySQL MVCC

总结自小林coding&#xff0c;bojiangzhou 脏读、不可重复读、幻读 说的都是并发读取的问题&#xff0c;最简单的方式就是给记录加一把锁&#xff0c;不管是更新、读取记录都需要竞争到这把锁之后才能操作。但这种方式的并发性能可想而知会有多么低。 于是 InnoDB 就设计了MVC…

LeetCode HOT100(二)双指针

移动0 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 解法1&#xff1a;双指针交换 指针L&…

“论基于构件的软件开发方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 基于构作的软件开发 (Component-Based Software Development&#xff0c;CBSD) 是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中的构件可以是COTS &#xff08;Commercial-Off-the-Shelf&#xff09;构件&#x…

Spring Boot轻松整合Minio实现文件上传下载功能

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹&#xff0c;进入minio文件夹&#xff0c;并创建data目录&#xff1b; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data 执行如下命令进行下载 [rootxx…

Java内存划分详解:从基础到进阶

Java内存划分详解&#xff1a;从基础到进阶 1. 程序计数器&#xff08;Program Counter Register&#xff09;2. Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;3. 堆&#xff08;Heap&#xff09;4. 方法区&#xff08;Method Area&#xff09;5. 运行时常量…

[计网初识1] TCP/UDP

学习内容 1.TCP建立链接的3次握手&#xff0c;断开连接的4次挥手 2.TCP报文段组成 内容 1.TCP 建立连接的3次握手? 假设主动方是客户端&#xff0c;被动方是服务端。 第一次 客户端给服务端发送 “hello,我是客户端” (TCP段中 SYN1) 第二次 服务端给客户端发送"我接…

从零开始的python学习生活2

接上封装 class Phone:__volt0.5def __keepsinglecore(self):print("让cpu以单核运行")def if5G(self):if self.__volt>1:print("5G通话已开启")else:self.__keepsinglecore()print("电量不足&#xff0c;无法使用5G通话&#xff0c;已经设置为单…

Django项目创建的准备工作【 2 】

【 一 】调整后端目录 #1 目录结构 """ ├── luffy_api├── logs/ # 项目运行时/开发时日志目录 - 包├── manage.py # 脚本文件├── luffy_api/ # 项目主应用&#xff0c;开发时的代码保存 - 包├── apps/ …

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作&#xff1a;将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作&#xff1a;…

系统服务综合实验(dns服务,nfs服务)

题目&#xff1a;现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4…

three-tile: 1. 第一个three-tile程序

上篇介绍了&#xff1a;three-tile&#xff1a; 一个开源的轻量级三维瓦片库-CSDN博客 three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 项目地址&…

C#知识|账号管理系统:UI层-添加账号窗体设计思路及流程。

哈喽,你好啊,我是雷工! 前边练习过详情页窗体的设计思路及流程: 《C#知识|上位机UI设计-详情窗体设计思路及流程(实例)》 本节练习添加账号窗体的UI设计,以下为学习笔记。 01 效果展示 02 添加窗体 在UI层添加Windows窗体,设置名称为:FrmAddAcount.cs 设置窗体属…

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层&#xff08;应用层&#xff09;反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

数据结构模板2

Trie树&#xff1a;用来高效存储和查找字符串集合的数据结构&#xff1a; 模板题&#xff1a;https://www.acwing.com/problem/content/837/ AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int son[100010][26],cnt[100010],idx; char str[100010]; …