字符设备驱动框架的编写

一. 简介

我们在学习裸机或者 STM32 的时候关于驱动的开发就是初始化相应的外设寄存器,在 Linux 驱动开发中,肯定也是要初始化相应的外设寄存器。
只是在 Linux 驱动开发中, 我们需要按照其规定的框架来编写驱动,所以说学 Linux 驱动开发重点是学习其驱动框架。

本文继上一篇文章的学习,前面几篇文章对字符设备驱动进行了简单的了解。文章地址如下:

字符设备驱动开发基础-CSDN博客

本文学习字符设备驱动的开发,主要学习字符设备驱动模块的加载与卸载。

二.  编写字符设备驱动框架

1.  Linux驱动的运行方式

Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启 动时就会自动运行驱动程序。
第二种就是将驱动编译成模块 (Linux 下模块扩展名为 .ko) ,在 Linux 内核启动以后使用 “ insmod ” 命令加载驱动模块。

选择驱动运行方式

在调试驱动时,一般都选择将其编译 为(.ko)模块,这样我们修改驱动以后,只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。 而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。总之,将驱动编 译为模块最大的好处就是方便开发,当驱动开发完成,确定没有问题以后就可以将驱动编译进 Linux 内核中。

2.   驱动的加载与卸载

模块有加载和卸载两种操作,我们在编写驱动时,需要注册这两种操作函数,模块的加载和 卸载注册函数如下:
module_init(xxx_init);   //注册模块加载函数
module_exit(xxx_exit);   //注册模块卸载函数
module_init() 函数用来向 Linux 内核注册一个模块加载函数,参数 xxx_init 就是需要注册的具体函数,当使用 “ insmod ” 命令加载驱动时, xxx_init() 这个函数就会被调用。
module_exit() 函数用来向 Linux 内核注册一个模块卸载函数,参数 xxx_exit 就是需要注册的具体函数,当使 用 “ rmmod ” 命令卸载具体驱动时, xxx_exit() 函数就会被调用。

3.  编写字符设备驱动框架

(1)  在 ubuntu系统下,创建一个存放驱动代码工程的目录,我这里在自己之前创建的正点原子文件目录下创建:

用 vscode软件打开 上面创建的工程目录 1_chrdevbase。通过 vscode在 目录 1_chrdevbase下创建一个 .c文件,命名为 chrdevbase.c,如下所示:

(2)  使用 vscode软件再打开 Linux内核源码,这里使用之前我更改的 NXP官方的 Linux内核源码。

Linux内核源码一般都会有使用到 驱动模块加载与卸载注册函数的。

在 Linux内核源码工程中,搜索 module_init() 函数与 module_eixt() 函数:

可以看到,Linux内核源码中,很多地方有调用到 module_init() 函数。当然也会调用到 module_exit()函数。

可以打开一个调用 module_init()函数的 .c文件,模仿 如何调用 module_init()函数。这里打开 aes_glue.c 文件,aes_glue.c文件中涉及 module_init()与 module_exit()函数的代码:

.......................................
static int __init aes_init(void)
{return crypto_register_alg(&aes_alg);
}static void __exit aes_fini(void)
{crypto_unregister_alg(&aes_alg);
}module_init(aes_init);
module_exit(aes_fini);
.......................................

模仿上面驱动模块的加载与卸载函数,编写 我的 chrdevbase.c 文件,再根据 上面 aes_glue.c中头文件添加相应的头文件,chrdevbase.c 文件的代码如下:

#include <linux/module.h>/*
*  驱动模块入口函数
*/
static int __init chrdevbase_init(void)
{return 0;
}/*
*  驱动模块出口函数
*/
static void __exit chrdevbase_exit(void)
{;
}/*
* 驱动模块的入口与出口函数
*/
module_init(chrdevbase_init); /* 入口 */
module_exit(chrdevbase_exit); /* 出口 */

(3) 设置vscode软件中 1_chrdevbase工程的 头文件路径。具体设置 Linux内核源码路径。

不设置的话,vscode可能会提示一些错误,一些函数也找不到函数定义。

将正点原子提供的 Linux驱动例程中,01_chrdevbase工程代码中 .vscode文件及其下的文件都拷贝到 现在的 工程下。我这里没有安装 FTP客户端,所以,没办法拷贝文件夹。所以,可以在我1_chrdevbase工程下首先创建 .vscode目录,再在 .vscode目录下分别创建文件,将正点原子提供的 01_chrdevbase工程代码中 .vscode目录下文件的内容分别拷贝到相应文件。

.vscode目录下,创建如下两个文件:

编写驱动的时候注意事项:

(1) 编译驱动时需要用到 Linux内核源码!因此,需要解压缩 Linux内核源码。因为驱动代码中可能会调用到Linux内核源码中的一些函数。

同时,还需要编译linux内核源码,得到zImage和 .dtb设备树文件。需要使用编译后得到的zImage和 .dtb设备树文件来启动系统。

使用的Linux内核源码包:

这里使用正点原子第三期我编译的 Linux内核源码,也就是 在 NXP官方提供的 Linux内核源码更改后的 Linux内核源码包。

我这里的 Linux内核源码所在路径为:

/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga

更改 .vscode目录下 c_cpp_propertities.json文件下的 Linux源码路径:

{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga/include", "/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", "/home/wangtian/zhengdian_Linux/linux/kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated/"],"defines": [],"compilerPath": "/usr/bin/clang","cStandard": "c11","cppStandard": "c++17","intelliSenseMode": "clang-x64"}],"version": 4
}

下一篇文章学习对工程进行编译,并加载与卸载字符驱动模块。

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

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

相关文章

Todesk突然高速通道使用已结束

今天使用Todesk直接报出如下错误&#xff1a; 好像对于海外用户需要付费购买海外会员&#xff1f; 大家有没有什么可以替换的远程控制软件的吗&#xff1f;能分享一下吗&#xff1f;

使用 Python 使用贝叶斯神经网络从理论到实践

一、说明 在本文中&#xff0c;我们了解了如何构建一个机器学习模型&#xff0c;该模型结合了神经网络的强大功能&#xff0c;并且仍然保持概率方法进行预测。为了做到这一点&#xff0c;我们可以构建所谓的贝叶斯神经网络。 这个想法不是优化神经网络的损失&#xff0…

zkSend — — 在Sui上发红包像发电子邮件一样简单

*12月14日&#xff0c;知名区块链媒体平台The Block发表了这篇关于对Mysten Labs联合创始人Adeniyi Abiodun的采访&#xff0c;文中“我们”指代该媒体&#xff0c;数据均为截止撰写文章时数据&#xff0c;以下是正文。 两年前&#xff0c;当五名前Facebook工程师创立Mysten L…

鸿海携手Porotech共同开启Micro LED新篇章 | 百能云芯

近日&#xff0c;鸿海集团决定进一步强化其在Micro LED&#xff08;微发光二极体&#xff09;技术领域的实力。为此&#xff0c;鸿海宣布将与英国半导体企业Porotech展开战略合作&#xff0c;旨在共同开发MicroLED微显示器&#xff0c;并在AR&#xff08;扩增实境&#xff09;应…

如何使用Promethues监控系统指标并进行告警

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 前言 从零开始&#xff1a;使用Prometheus与Grafana搭建监控系统 克服网络障碍&#xff1a;Prometheus如何通过间接方式采集目标服务数据 在以上二节&#xff0c;我们介绍了如何使…

股东来了投资者权益知识竞赛规则

股东来了投资者权益知识竞赛是中证中小投资者服务中心在中国证监会指导下&#xff0c;围绕中小投资者需求创办的全国性投教活动。《股东来了》&#xff08;2023&#xff09;由投资者服务中心联合北京、浙江、甘肃、新疆四地证监局共同举办&#xff0c;活动覆盖全国36个赛区及港…

【Python】__init__.py文件的使用

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、__init__.py文件1.不创建__init__.py文件2.创建__init__.py文件 二、使用1.设置公共参数2.写from .** import **3.__all__ import * …

PyQt6 简单介绍与安装

前言&#xff0c;主要由这两篇文章参考并总结部分内容而成&#xff0c;参考文章一 && 参考文章二 PyQt6 简单介绍与安装 1、简单介绍2、PyQt6安装3、PyQt6版本查看4、PyQt6模块4.1 界面承载部分( 控件 )4.2 界面框架部分&#xff08;布局&#xff09;4.3 界面组件部分&…

IDEA的debug调用(超详细)

借鉴链接&#xff1a;IDEA中的debug断点调试技巧 简述&#xff1a;会F8和F9就够吃饭了~ debug顶部栏 :::tips Show Execution Point (Alt F10)&#xff1a;如果你的光标在其它行或其它页面&#xff0c;点击这个按钮可跳转到当前代码执行的行&#xff0c;即断点的位置&#…

JDBC 数据库连接池

目录 一、什么是数据库连接池二、为什么需要数据库连接池&#xff1f;三、JDBC 数据库连接池的实现四、C3P0的使用1、加入c3p0 jar包2、配置xml文件3、c3p0-config.xml模板4、C3P0的使用 五、Druid的使用1、加入Druid jar包2、定义配置文件:3、Druid连接池的使用 六、HikariCP的…

瑞安籍侨领池万进荣任意大利瑞安同乡总会第五届会长

浙江温州瑞安是全国重点侨乡&#xff0c;拥有海外侨胞16万人、侨领2100多名、归侨侨眷近12万人&#xff0c;在世界100多个国家和地区建有70多个侨团组织。 意大利瑞安同乡总会第五届理事会会长团全体成员 青年部全体成员 各兄弟会长及代表 12月10日&#xff0c;意大利瑞安同乡…

【海报】新年海报 制作

准备一张写好文字的图片。 模型&#xff1a; 电商\lofi_v4.safetensors [9462506675] best quality,masterpiece,8k,(soft lighting:1.2),firecrackers,Chinese new year,<lora:全网首发丨新年红包封面_v1.0:1>, 虚假&#xff0c;不真实&#xff0c;绘画&#xff0c;线条…