Linux内核驱动开发-字符设备驱动框架

1前置条件

(1)【linux】内核编译结束
(2)【linux】目录配置跳转文件:

在这里插入图片描述

补充:配置的跳转文件只能在【linux】目录下使用,子目录无法使用

2驱动框架

2.1编写驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>

#define DEVICE_MAJOR 200
#define DEVICE_NAME  "first_device"

int first_driver_open(struct inode *node, struct file *fp)
{
	printk("first_driver_open\n");
	return 0;
}

ssize_t first_driver_read(struct file *fp, char __user *user_buffer, size_t len, loff_t *offset)
{
	printk("first_driver_read\n");
	return 0;
}

ssize_t first_driver_write(struct file *fp, const char __user *user_buffer, size_t len, loff_t *offset)
{
	printk("first_driver_write\n");
	return 0;
}

int first_driver_close(struct inode *node, struct file *fp)
{
	printk("first_driver_close\n");
	return 0;
}

static struct file_operations fops = 
{
	.owner = THIS_MODULE,
	.open = first_driver_open,
	.read = first_driver_read,
	.write = first_driver_write,
	.release = first_driver_close
};

static int __init first_driver_init(void)
{	
	register_chrdev(DEVICE_MAJOR, DEVICE_NAME, &fops);
	printk("first_driver_init OK\n");
	return 0;
}

static void __exit first_driver_exit(void)
{	
	unregister_chrdev(DEVICE_MAJOR, DEVICE_NAME);
	printk("first_driver_exit OK\n");
}


module_init(first_driver_init);
module_exit(first_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXX");

2.2 编译驱动程序

2.2.1编译方式1

【step1】:将编写完成的驱动程序放至【linux/drivers/char】目录下
【cp ./file_name.c linux/drivers/char】
【step2】:修改内核配置文件
【vi linux/drivers/char/Kconfig】

在这里插入图片描述

【step3】:修改编译规则,添加工程文件
【vim linux/drivers/char/Makefile】

在这里插入图片描述

在这里插入图片描述

【step4】:菜单配置
【make menuconfig】

在这里插入图片描述

在这里插入图片描述

修改为<M>模式

在这里插入图片描述
附:3种模式讲解

当然,也可以使用【help】选项查看相关信息

在这里插入图片描述
在这里插入图片描述

【step5】:调用编译命令,进行驱动程序的编译
【make modules】	

在这里插入图片描述

至此,采用方式1编译完成。当然,也可以查看编译后文件是否存在:

在这里插入图片描述

这是一个需要手动添加到操作系统的文件。

2.2.2编译方式2

【step1】:创建一个文件夹:是linux目录下的任意目录
【mkdir my_drivers】

在这里插入图片描述

【step2】:将驱动程序源码放入该目录

在这里插入图片描述

【step3】:该目录下创建【Makefile】文件
【vim Makefile】
KERNELDIR := /home/linux/s3c2440/linux-2.6.32.2/
CURRENT_PATH := $(shell pwd)
obj-m := first_driver.o

build: kernel_modules

kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
【step4】:编译
【make】

在这里插入图片描述

至此,采用方式2编译完成。当然,也可以查看编译后文件是否存在:

在这里插入图片描述

这是一个需要手动添加到操作系统的文件。

2.3移植驱动程序

(1)将编译产生的【filename.ko】文件移植到开发板
【cp drivers/char/first_driver.ko ~/nfs/rootfs】

在这里插入图片描述

在开发板种可以看到文件移植成功:

在这里插入图片描述

2.4加载驱动程序

(1)加载被移植到开发板的【filename.ko】文件
【insmod filename.ko】

在这里插入图片描述

补充:
查看加载成功的驱动:
	【lsmod】

2.5卸载驱动程序

(1)卸载被移植到开发板的【filename.ko】文件
	【rmmod filename】

2.6创建设备文件

2.6.1创建设备文件方式1

手动创建设备文件
【mknod[options] name type major minor】
【options】:
【name】:【/dev】下的设备文件名
【type】:设备型号,【c】
【major】:主设备号
【minor】:子设备号
eg:【mknod /dev/first_driver c 200 0】

在这里插入图片描述

设备创建完毕,可以使用【ls】命令查看是否成功创建设备文件。

在这里插入图片描述

补充:
应用程序就是以【name】为入口点来调用驱动程序的。
【mknod ?】:查看命令帮助
【cat /proc/devices/】:查看设备
【ls /dev】:查看设备文件

删除设备文件:

在这里插入图片描述

2.7调用驱动程序

【step1】:其实就是在开发板上编写一个应用程序(主要是指main函数)
编写应用程序:打开设备文件->调用文件I/O(系统I/O)->
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>

int main(void)
{
    int fd=0;

    fd=open("dev/first_device",O_RDWR);
    if(fd<0)
    {
        printf("opening is error\n");
        return -1;
    }

    while(1)
    {
        int n=123;
        read(fd,&n,4);
        sleep(1);
        write(fd,&n,4);
        sleep(1);
    }
    return 0;
}
【step2】:编译应用程序

在这里插入图片描述

【step3】:关闭开发板原有的设备驱动程序
通过菜单配置命令:【make menuconfig】
将对应的驱动模块的模式【<>】改为图中所标记的模式。

在这里插入图片描述

2.8编译并移植内核文件

【make uImage】

在这里插入图片描述

编译完成之后,将产生的镜像文件移植到开发板:
【cp arch/arm/boot/uImage ~/tftpboot/】

在这里插入图片描述

2.9运行操作系统内核

接下来,将操作系统运行在开发板上:
【tftp 0x30008000 uImage】
【bootm 0x30008000】

2.10开发板文件配置

当新的内核文件在开发板上成功运行之后,接下来需要对开发板上的一个文件进行配置:

在这里插入图片描述

关闭led相关配置:

在这里插入图片描述

补充:
(1)【reboot】:该命令将重启开发板,让开发板回到初始状态,从运行内核文件之后的所有操作需要重新配置。

在这里插入图片描述

(2)通过配置环境变量可以让开发板上电以后自动运行操作系统并挂载根目录:
【setenv bootcmd 'tftp 0x30008000; bootm 0x30008000'】
注意:环境变量配置完成一定要进行保存操作!!!

在这里插入图片描述

(3)环境变量配置完成之后可以重启开发板:可以看到开发板将自动运行操作系统并挂载根文件系统。
【reset】:重启开发板

在这里插入图片描述

3板载驱动程序示例

路径:【linux-2.6.32.2/drivers/char/mini2440_hello_module.c 】

#include <linux/kernel.h>
#include <linux/module.h>


static int __init mini2440_hello_module_init(void)
{
    printk("Hello, Mini2440 module is installed !\n");
    return 0;
}

static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good-bye, Mini2440 module was removed!\n");
}

module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lagent AgentLego 智能体应用搭建——笔记

Lagent & AgentLego 智能体应用搭建——笔记 一、智能体简介1.1、为什么要有智能体1.1.1、幻觉问题1.1.2、时效性1.1.3、可靠性 1.2、智能体的含义1.3、智能体的组成1.3.1、大脑1.3.2、感知1.3.3、动作 1.4、智能体范式1.4.1、AutoGPT1.4.2、Rewoo1.4.3、ReAct 二、Lagent …

账号安全及应用

一、账号安全控制 1.1系统账号清理 将用户设置为无法登陆 锁定账户 删除账户 设定账户密码&#xff0c;本质锁定 锁定配置文件-chattr&#xff1a; -a 让文件或目录仅供附加用途。只能追加 -i 不得任意更动文件或目录。 1.2密码安全控制 chage 1.3历史命令 history&am…

Unity 踩坑记录 Rigidbody 刚体重力失效

playerSetting > physics > Gravity > 设置 Y 的值为负数

SpringBoot 根据不同环境切换不同文件路径

最简单的办法就是使用多个 application.yml 配置文件 。一个叫 application-test.yml 测试用&#xff1b;另一个是正式使用的 application-prod.yml 。win环境下大部分是开发测试时候使用的&#xff0c;服务正式上线需要部署在Linux服务器上又换成了Linux。但开发初期或者项目…

Docker容器概念介绍与基本管理

前言 在软件开发和部署环境中&#xff0c;使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署&#xff0c;提高开发效率和应用程序的可移植性。 目录 一、虚拟化产品介绍 1. 云服务模型 1.1 IaaS 1.2 PaaS 1.3 SaaS 1.4 DaaS 2. 产品介绍 2.1 虚…

5款好用的监控员工电脑软件推荐 (如何监控员工上班工作情况)

在现代的商业环境中&#xff0c;管理和监控员工的工作内容是至关重要的。 为了确保员工的工作效率和质量&#xff0c;公司需要使用一些工具来监控他们的工作进程。 以下是五款实用的监控员工工作内容的软件。 域智盾软件 域智盾是一款专为企业打造的智能管理系统。 它借助人…

FPGA设计篇——波形绘制软件

FPGA设计篇——波形绘制软件 写在前面一、Visio二、TimeGen三、WaveDrom写在最后 写在前面 在FPGA设计过程中&#xff0c;经常需要编写设计文档&#xff0c;其中&#xff0c;不可缺少的就是仿真波形的绘制&#xff0c;可以直接截取Vivado或者Modelsim平台实际仿真波形&#xff…

JVM学习笔记(四)类加载与字节码技术

目录 一、类文件结构 二、字节码指令 2.3 图解方法执行流程 1&#xff09;原始 java 代码 2&#xff09;编译后的字节码文件 3&#xff09;常量池载入运行时常量池 4&#xff09;方法字节码载入方法区 5&#xff09;main 线程开始运行&#xff0c;分配栈帧内存 6&…

分布式-知识体系

分布式系统 本质就是一堆机器的协同&#xff0c;要做的就是用各种手段来让机器的运行达到预期 分布式业务场景 分布式四纵四横说 基于 MSA&#xff08;微服务架构&#xff09;的分布式知识体系 相关概念 – 【摘自网络原文】 节点与网络 节点 传统的节点也就是一台单体的物…

搞嵌入式到底属于程序员吗?

搞嵌入式到底属不属于程序员呢&#xff1f;毫无疑问&#xff0c;当然算啊&#xff01;而且我十分赞同另一位朋友所说的&#xff1a;嵌入式程序员是难得的全栈型程序员。尽管嵌入式领域方向众多且繁杂&#xff0c;但他们同样也是会写代码的程序员。 嵌入式行业主要分为硬件和软…

《从零开始的Java世界》11网络编程

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

打开IIS网站网页错误提示Argument ‘Key must not be null‘ cannot be null.解决方案 Oracle数据库监听

打开网页异常如下&#xff1a; /“应用程序中的服务器错误。 Argument Key must not be null cannot be null.参数名:Key must not be null 客户端 连接oracle 提示&#xff1a;ORA-12541:TNS:无监听程序 按组合键WindowsR&#xff0c;打开运行 输入命令&#xff1a;lsnrctl s…

周报不止是汇报进度,如何用周报轻松提升团队协作效率?

周报是工作中常见的沟通工具&#xff0c;对于项目经理来说尤其重要。写周报不仅仅是为了完成一项任务&#xff0c;它更是项目管理中不可或缺的环节&#xff0c;它不仅有助于项目经理跟踪项目进度&#xff0c;还加强了团队成员间的沟通与协作。以下是几个关键的原因&#xff1a;…

Geoserver的RESTful接口使用

概述 GeoServer提供了一个RESTful接口&#xff0c;客户端可以通过该接口获取有关实例的信息并进行配置更改。REST接口使用简单的HTTP调用&#xff0c;通过客户端就可以配置GeoServer&#xff0c;而无需使用Web管理接口。 Geoserver中的关系 工作区、数据源、图层、图层组以及…

用 LMDeploy 高效部署 Llama-3-8B,1.8倍vLLM推理效率

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

微信小程序Vue+nodejs+uniapp课堂教学辅助在线学习系统

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 后台主要实现功能&#xff1a;一、用户的管理(用户的信息管理) 二、 课程的管理&#xff08;课程发布&#xff0c;课后成绩的查看&#xff0c…

【C语言__联合和枚举__复习篇10】

目录 前言 一、联合体 1.1 联合体的概念 1.2 联合体与结构体关于声明和内存布局的比较 1.3 联合体的大小如何计算 1.4 使用联合体的2个示例 二、枚举体 2.2 枚举体的概念 2.2 枚举体的优点 前言 本篇主要讨论以下问题&#xff1a; 1. 联合体是什么&#xff0c;它有什么特点 …

每天一题crypto(1)---RSA(小明文攻击)

零.做题&#xff1a; 看到N很大&#xff0c;如果满足 就表示模过程中&#xff0c;没有丢失信息&#xff0c;所以 直接解即可&#xff0c;不要管pq等等 一.题目&#xff1a; N很大 from Crypto.Util.number import * from gmpy2 import *flag bNSSCTF{******}p getPrime(5…

【SpringBoot整合系列】SpringBoot配置多数据源

目录 背景技术选型配置多数据源思路(以两个为例)代码实现1.导入依赖2.各自的配置 3.各自的dataSourcenews数据库的smbms数据库的注意&#xff1a;Primary注解 4.各自的SqlSessionFactory等news数据库的smbms数据库的 5.去掉启动类头上的MapperScan6.各自的mapper接口7.各自的ma…

防火墙分为哪三类以及他们的优缺点

1. 包过滤防火墙&#xff08;Packet Filtering Firewall&#xff09;2. 状态检查防火墙&#xff08;Stateful Inspection Firewall&#xff09;3. 应用层防火墙&#xff08;Application Layer Firewall&#xff09;零基础入门学习路线视频配套资料&国内外网安书籍、文档网络…
最新文章