Linux2.6设备驱动开发

news2024/11/14 15:23:54

一:Linux2.6驱动设备开发的特点

1:首先是属于字符型设备注册的方法之一

        这种开发接口是在Linux2.6引入的,之前的版本不支持这种开发方式,也是目前最标准的开发方式。

2:Linux2.6的设备开发

        不再去限制设备号,与其对应的就是需要去申请可用的设备号。

3:Linux2.6注册完毕设备且成功之后并不会生成设备文件

对于这种情况有两种方法:

        通过指令手动生成

        通过内核其他接口函数生成

4:Linux2.6与杂项的区别

杂项:

        优点:简单

        缺点:没有分类。能注册的设备有限

Linux2.6:

        有点:主设备号不限制。2^12个主设备号,设备分类;2^20个次设备号

        缺点:函数流程相对于杂项复杂

总结:Linux2.6相对于杂项而言复杂,Linux2.6设备号范围比杂项大。

二:Linux2.6 驱动开发架构

1、先去申请设备号->alloc_chrdev_region();

2、初始化Linux2.6核心结构体 cdev->cdev_init();

3、添加注册设备->cdev_add

4、生成一个与之相对应的设备文件:class_create device_create

总结:在使用Linux2.6驱动时的开发步骤,需要先申请设备号,然后进行初始化,然后添加注册的设备,最后生成设备文件。

三:linux2.6驱动开发接口

现在进入到具体的开发流程

1:如何在内核中申请一个可以用的设备号

头文件:

#include "linux/fs.h"

对应的接口函数:

int alloc_chrdev_region(
        dev_t *dev, //uint32_t类型数字,也就是申请的设备号
        unsigned baseminor,//申请的起始次设备号
        unsigned count,//连续申请的设备数量
	    const char *name)//任意填写名字

函数功能:向内核申请目前可以用的设备号,可以申请多个设备号

函数返回值:

成功返回0,失败返回非0

释放设备号接口:

void unregister_chrdev_region(
    dev_t from, //填写的申请的首设备号
    unsigned count//释放几个信号
)

2:linux2.6的设备注册

头文件:

#include "linux/cdev.h"

初始化函数:

void cdev_init(
    struct cdev *cdev, //要初始化的cdev核心结构体
    const struct file_operations *fops//与cdev做绑定,注册的设备都会用此内核接口
)

动态开辟空间的方法:kzalloc();

添加函数:

int cdev_add(
    struct cdev *p, //cdev核心结构体
    dev_t dev, //要注册的设备的首设备号
    unsigned count//要注册的设备的数量
    )

删除函数:

void cdev_del(
    struct cdev *p//核心结构体
)

3:设备文件的生成

手动生成:

mknod /dev/led c 234(主设备号) 0(次设备号)

自动生成:

内核接口:

想要生成设备文件必须先创建类结构体->class

struct class * cls = class_create(THIS_MODULE,"led_class");

销毁一个类:

class_destroy(struct class * cls)
有了类结构体你就可以创建设备文件了
        struct device *device_create(
        struct class *class,
        struct device *parent,
        dev_t devt,
        void *drvdata,
        const char *fmt, ...
) *
class:
    刚才得到的类结构体
*parent:
    设备的父设备->没有父设备->NULL
*devt
    设备的设备号
*drvdata
    创建设备附带的私有数据->NULL
*fmt,...:
    跟 printf 一样的
直接当作字符串传递也是一样的
他就是你创建设备文件的名字!

如何销毁一个设备文件:

void device_destroy(struct class *class, dev_t devt)
class:
    类结构体
devt:
    设备号

4:事例:linux2.6下的LED驱动

#include"linux/fs.h"
#include"linux/module.h"
#include"linux/kernel.h"
#include"linux/cdev.h"
#include"linux/gpio.h"
#include"device.h"

dev_t  mydevnum;//设备号
struct cdev mycdev;//Cdev核心结构体
struct file_operations ops;//内核层的文件操集合结构体
struct class * cls;//类设备文件结构体
//开灯回调函数

int led_on (struct inode *i, struct file *f)
{
	gpio_set_value(21,1);
	gpio_set_value(22,0);
	return 0;
}
//关灯回调函数
int led_off (struct inode *i, struct file *f)
{
	gpio_set_value(21,0);
	gpio_set_value(22,1);
	return 0;
}
//入口函数
static int __init myled_init(void)
{
	//申请设备号
	int ret = alloc_chrdev_region(&mydevnum,0,1,"myled");
	if(ret < 0)
	{
		return -EINVAL;//加载失败
	}
	printk("主设备:%d\t\t次设备:%d\r\n",mydevnum>>20,mydevnum&0xFFFFF);
	//初始化Linux2.6 cdev结构体
	
	ops.owner = THIS_MODULE;
	ops.open = led_on;
	ops.release =led_off;
	cdev_init(&mycdev,&ops);
	//添加cdev设备
	cdev_add(&mycdev,mydevnum,1);
	//生成一个类设备文件
	cls=class_create(THIS_MODULE, "led_class");
	//创建设备文件
	device_create(cls,NULL,mydevnum,NULL,"led");
	//初始化硬件
	gpio_request(21,"led1");
	gpio_request(22,"led2");
	gpio_direction_output(21,0);
	gpio_direction_output(22,0);
	
	return 0;
}
//出口函数
static void __exit myled_exit(void)
{
	//卸载程序只有一个原则 ->倒序
	gpio_free(21);
	gpio_free(22);
	device_destroy(cls,mydevnum);
	class_destroy(cls);
	cdev_del(&mycdev);
	unregister_chrdev_region(mydevnum,1);
}
module_init(myled_init);
module_exit(myled_exit);
MODULE_LICENSE("GPL");

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

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

相关文章

(javaweb)SpringBootWeb案例(毕业设计)案例--部门管理

目录 1.准备工作 2.部门管理--查询功能 3.前后端联调 3.部门管理--新增功能 1.准备工作 mapper数据访问层相当于dao层 根据页面原型和需求分析出接口文档--前后端必须遵循这种规范 大部分情况下 接口文档由后端人员来编写 前后端进行交互基于restful风格接口 http的请求方式…

TypeScript学习笔记(二)——TypeScript 高级类型

目录 1. class 类 1.1 class 关键字的基本使用 1.2 类继承 1.3 类成员可见性 1.4 类成员只读修饰符 2. 类型兼容性 2.1 类型兼容性 2.2 接口兼容性 2.3 函数兼容性 3. 交叉类型 4. 泛型 4.1 创建泛型函数 4.2 泛型约束 4.3 多个泛型的类型变量约束 4.4 泛型接口…

【深度学习入门项目】基于支持向量机的手写数字识别

目录 导入必要的包1. 数据集2. 数据处理3. 训练过程4. 输出结果完整代码 本项目使用SVM训练模型&#xff0c;用于预测手写数字图片。 导入必要的包 numpy: 这个库是Python中常用的数学计算库。在这个项目中&#xff0c;我使用numpy来处理图像数据&#xff0c;将图像数据转换为…

FPGA开发——DS18B20读取温度并且在数码管上显示

一、简介 在上一篇文章中我们对于DS18B20的相关理论进行了详细的解释&#xff0c;同时也对怎样使用DS18B20进行了一个简单的叙述。在这篇文章我们通过工程来实现DS18B20的温度读取并且实现在数码管伤显示。 1、基本实现思路 根据不同时刻的操作&#xff0c;我们可以使用一个状…

基于vue框架的班级网站的设计与实现vg66m(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;班级,学生,班级活动,班级相册,班级开支,活动记录 开题报告内容 基于Vue框架的班级网站设计与实现 开题报告 一、引言 随着互联网技术的飞速发展&#xff0c;网络已经成为人们日常生活中不可或缺的一部分。在教育领域&#xff0c;班级…

大白话解析:深入浅出大模型RAG模块全解析

文章目录 什么是 RAG&#xff1f; 技术交流&资料通俗易懂讲解大模型系列 RAG模块化 什么是模块化RAG&#xff1f; 索引模块 块优化 滑动窗口从小到大元数据附加 结构化组织 层次化索引知识图谱文档组织 预检索模块 查询扩展 多查询子查询CoVe 查询转换 重写HyDE 查询路由…

TON链上游戏项目开发基本要求及模式创建与海外宣发策略

TON&#xff08;The Open Network&#xff09;是由Telegram开发的区块链平台&#xff0c;以其高速、低延迟、和高扩展性吸引了大量开发者和项目方。TON链上游戏项目作为一个新兴领域&#xff0c;结合了区块链技术和游戏产业&#xff0c;为用户提供了全新的游戏体验和经济激励。…

精益生产咨询:为企业量身定制的高效能蜕变计划!——张驰咨询

在当今这个快速变化、竞争激烈的市场环境中&#xff0c;企业如何保持持续的竞争优势&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;同时又能快速响应市场需求&#xff0c;成为了每一个企业家必须面对的重大课题。精益生产&#xff08;Lean Production&#xff09;作…

第5节:Elasticsearch核心概念

我的后端学习笔记大纲 我的ElasticSearch学习大纲 1.Lucene和Elasticsearch的关系: 1.Lucene&#xff1a;最先进、功能最强大的搜索库&#xff0c;直接基于lucene开发&#xff0c;非常复杂&#xff0c;api复杂2.Elasticsearch&#xff1a;基于lucene&#xff0c;封装了许多luc…

跳槽?面试软件测试需要掌握的知识你Get了吗

想从事软件测试相关的工作&#xff0c;立志成为一名优秀的软件测试工程师。 一名优秀的软件测试工程师&#xff0c;需要扎实的专业基础&#xff0c;包括测试相关技术、编程技能、数据库知识、计算机网络、以及操作系统等等。对于没有测试经验的应届生求职者来说&#xff0c;面…

SpringBoot项目部署时application.yml文件的加载优先级和启动脚本

文章目录 application.yml文件的加载优先级(由高到低)第一级命令行参数第二级Jar包同级目录 /config第三级Jar包同级目录第四级classpath 下的/config第五级classpath 根路径/总结&#xff1a; logback.xml 文件加载顺序当application.yml 和 bootstrap.yml 同时存在时java jar…

淘宝天猫详情接口API:实现轻松购物,探索最具性价比的商品

随着电子商务的蓬勃发展&#xff0c;网络购物已经成为现代人日常生活中的重要部分。在这个浩瀚的电商海洋中&#xff0c;淘宝和天猫无疑是最为耀眼的两大平台。然而&#xff0c;如何在众多的商品中挑选出性价比最高的产品&#xff1f;淘宝天猫详情接口API为您提供了解决方案。 …

基于vue框架的班级管理系统3pdep(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,班级事务,班级,成绩信息,请假,销假,班级信息,教师 开题报告内容 基于Vue框架的班级管理系统 开题报告 一、引言 随着教育信息化进程的加快&#xff0c;学校管理工作逐渐从传统的纸质化、人工化向数字化、智能化转变。班级作为学…

Python与自动化测试:提高软件质量和稳定性

在软件开发过程中&#xff0c;自动化测试是提高软件质量和稳定性的重要手段之一。Python作为一种简洁而强大的编程语言&#xff0c;为自动化测试提供了丰富的工具和库。本文将介绍几个常见的自动化测试案例&#xff0c;并提供详细的Python代码示例&#xff0c;帮助您更好地理解…

前端面试——js作用域

说一说JS的作用域吧 作用域的分类 作用域分为&#xff1a;全局作用域&#xff0c;函数作用域&#xff0c;块级作用域 作用域的特性 全局作用域&#xff1a; 能够让变量和函数在全局位置访问&#xff0c;其挂载在浏览器的window对象下面 其中var定义的变量和function函数存…

怀旧风吹到体育圈,刘翔、郭晶晶等再翻红?明星与体育冠军代言的区别!

今年奥运&#xff0c;怀旧风吹到了体育圈&#xff0c;曾经的奥运冠军如刘翔、郭晶晶等再度成为公众焦点。这段时间&#xff0c;刘翔频频出现在伊利、霸王茶姬等品牌的广告中&#xff0c;还和法国球星姆巴佩合作拍摄了小红书广告。同样备受品牌关注的还有郭晶晶&#xff0c;巴黎…

【Python实现全屏播放视频】

效果如下&#xff1a; 虽然视频比较抽象&#xff0c;但是确实是用python(cv2)实现的 代码&#xff1a; import cv2 from playsound import playsound from threading import Threaddef func1():cap cv2.VideoCapture("mp4/out.mp4") #替换为视频路径ret, frame ca…

记一次长事务方法带来的坑

文章目录 1. 沟通需求2.分析需求3. 波折起4.初版完成5.锁等待超时6.消费者超时7.总结 1. 沟通需求 产品找到我说&#xff0c;咱要将一波数据给更新了&#xff0c;因为涉及业务&#xff0c;就不说具体的内容了&#xff0c;需要支持分页滚动&#xff0c;校对数据后进行推送&…

无人机系统的关键技术

一、飞控系统&#xff1a;是无人机完成整个飞行过程的关键&#xff0c;决定了无人机的飞行性能和稳定性。 二、导航系统&#xff1a;提供无人机所需的位置、速度和飞行姿态等信息&#xff0c;引导无人机按照指定航线飞行。 三、动力系统&#xff1a;提供飞行动力&#xff0c;…

报表工具是开源还是商用的好?如何选择适合自己的报表工具?

在当今数字化转型的浪潮中&#xff0c;制作既精确又直观的报表已成为个人高效工作与企业精准沟通的核心工具。然而&#xff0c;面对市场上纷繁复杂的报表工具选项&#xff0c;选择最适合自身或企业需求的那一款&#xff0c;宛如漫步于迷雾笼罩的森林&#xff0c;挑战重重&#…