Linux驱动学习之点灯(四,linux2.6)

devtools/2024/9/20 1:31:20/ 标签: 学习

上篇最后的第二种点灯方法年代比较久远,register_chrdev()这个函数一下申请了255个设备号,不建议使用  如下图

下图的函数在linux2.6里是上图函数的升级版,不过他是静态分配,后续还得添加到cdev里

从上图函数不难发现,静态申请多个设备号,主设备号不变,次设备号++

一般我们会使用下图函数动态申请设备号,并添加到cdev里

第一个参数:无符号32位设备号的地址,申请成功后该地址空间里存放的就是设备号

第二个参数:次设备号起始地址,

第三个参数:申请设备号的数量(主设备号不变,次设备号++)

第四个参数:名字(随便给)

申请完设备号后,把它加入cdev链表里 

struct cdev cdev; //定义cdev
struct file_operations led_fops = {.owner=THIS_MODULE,.open=led_open,.release=led_close,.write=led_write,
};
cdev_init(&cdev, &led_fops);  //用文件操作结构体初始化cdev
cdev_add(&cdev, dev, 1);     //添加设备号

也可以动态分配

struct cdev *cdev; //定义cdev
cdev=cdev_alloc();
struct file_operations led_fops = {.owner=THIS_MODULE,.open=led_open,.release=led_close,.write=led_write,
};
cdev.ops=&fops;  //用文件操作结构体初始化cdev
cdev_add(cdev, dev, 1);     //添加设备号

这里不需要cdev_init 因为cdev_alloc 跟cdev_init 内操作一样,只是少了一个操作结构体赋值,所以单独补上。 

接下里就是创建/dev/led

    struct class *led;led = class_create(THIS_MODULE, "myled_class");device_create(led,NULL,dev,NULL,"led");

完整代码 

#include "linux/device.h"
#include "linux/export.h"
#include "linux/gpio.h"
#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/init.h"
#include "linux/fs.h"
#include "linux/cdev.h"
#include "linux/uaccess.h"dev_t dev;
struct cdev cdev;
struct class *led;
static int led_open (struct inode *a, struct file *b){return 0;
}
static int led_close (struct inode *a, struct file *b){return 0;
}
static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{char val;unsigned long a=copy_from_user(&val,buf,1);if(a){}else{}if(val=='1'){printk("开灯\r\n");gpio_set_value(21,1);gpio_set_value(22,1);printk("ok\r\n");}    else{printk("关灯\r\n");gpio_set_value(21,0);gpio_set_value(22, 0);printk("ok\r\n");}return 0;
}
struct file_operations led_fops = {.owner=THIS_MODULE,.open=led_open,.release=led_close,.write=led_write,
};
static int __init led_init(void)
{//申请设备号int ret=  alloc_chrdev_region(&dev,0,1,"led_dev");if(ret<0){return -1;   //加载失败}printk(KERN_INFO "LED driver loaded successfully\n");//初始化LINUX2.6 cdev结构体cdev_init(&cdev, &led_fops);cdev_add(&cdev, dev, 1);gpio_request(21,"led");gpio_direction_output(21, 0);gpio_request(22,"led");gpio_direction_output(22, 0);led = class_create(THIS_MODULE, "myled_class");device_create(led,NULL,dev,NULL,"led");return 0;
}
static void __exit led_exit(void)
{device_destroy(led, dev);class_destroy(led);cdev_del(&cdev);printk(KERN_INFO "LED driver unloaded successfully\n");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");


http://www.ppmy.cn/devtools/100614.html

相关文章

pytorch 参数冻结 parameter-efficient fine-tuning

目标&#xff1a;在网络中冻结部分参数进行高效训练 框架&#xff1a;pytorch &#xff08;version 1.11.0) 基本实现&#xff1a; 需要学习的参数requires_grad设置为True&#xff0c;冻结的设置为False需要学习的参数要加到 optimizer的List中&#xff1b;对于冻结的参数&…

JavaScript 模块化开发:ES6 模块与 CommonJS 的对比与应用

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 随着前端项目规模的增长&#xff0c;代码组织和管理变得越来越复杂。模块化开发成为解决这一问题的有效手段&#xff0c;能够帮助开发者将代码进行分割、复用和维护。JavaScript 在发展过程中出现了多种模块化规范&…

基于x86 平台opencv的图像采集和seetaface6的人脸跟踪功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸跟踪功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸跟踪模块从而实现…

string类的使用与实现

标准库中的string类 string类(了解) string类的文档介绍 注意&#xff1a;在使用string类时&#xff0c;必须包含#include头文件以及using namespace std; auto和范围for 在了解string的用法前在学习一个知识&#xff1b; auto关键字 auto是作为一个新的类型指示符来指示编译器…

反转链表 II 简单链表问题

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

OpenAI 将向企业开放 GPT-4o 模型定制版

OpenAI 最近发布了一项新功能&#xff0c;使企业客户可以通过微调技术定制 GPT-4o 模型&#xff0c;从而应对日益激烈的人工智能竞争&#xff0c;并展示其投资回报。这一新功能的推出使得企业能够使用自己的数据对 GPT-4o 模型进行个性化调整&#xff0c;以满足他们的特定需求和…

Linux云计算 |【第二阶段】SECURITY-DAY4

主要内容&#xff1a; Kali系统、扫描与抓包、Nginx安全加固、Linux基本防护 补充&#xff1a;使用Curl命令查看网页头部信息和页面内容 不加选项&#xff0c;默认查看网页的内容&#xff1b; [ -I ] 选项&#xff1a;访问服务器页面时&#xff0c;显示HTTP的头部信息&#xf…

git提交项目,报403无权限

这个在公司内网git上提交项目时&#xff0c;使用的是刚分配到的账号和密码。创建完组和项目后一切准备完毕了&#xff0c;但是在提交时缺出了乌龙&#xff0c;报403&#xff0c;上面一堆英文&#xff0c;大致的意思是说我没有上传本项目的权限&#xff0c;报错信息如下图所示&a…

盘古信息IMS MCM制造协同管理系统:为中小企业数字化转型量身打造的数字化方案

近年来&#xff0c;全球经济的不稳定性&#xff0c;给中小企业的经营和发展带来了巨大的挑战。为提升企业竞争力&#xff0c;中小企业纷纷谋求数字化转型路径&#xff0c;优化生产流程、提高运营效率、降低生产成本&#xff0c;以应对变幻莫测的市场环境。IMS MCM是盘古信息为广…

浅谈Java Spring Boot

一、基本介绍 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发展…

45+用户占比近30%,网文产业如何赋能IP长链?

网文市场加速发展&#xff0c;巨头抢占中老年用户 作者&#xff5c;吕娆炜 排版&#xff5c;张思琪 干货抢先看 1. 我国网文产业市场规模突破3000亿元&#xff0c;在用户方面&#xff0c;截至2023年底&#xff0c;我国网文用户数量达5.37亿&#xff0c;同比增长9%&#xff0c…

系统架构师学习笔记 (一)

学习目标 了解系统架构的基本概念。掌握系统架构设计的原则。学习如何评估和选择合适的技术栈。了解云服务的基础知识及其在架构中的应用。 系统架构的基本概念 定义&#xff1a;系统架构是指一个系统的设计蓝图&#xff0c;它定义了系统的各个组成部分及其相互之间的关系。…

java知识点:包装类

包装类&#xff1a; 基本概述&#xff1a; java是面向对象的&#xff0c;但是java的基本数据类型却不能创建对象&#xff0c;不是面向对象的&#xff0c;为了解决这个问题&#xff0c;在设计类的时候为每个基本数据类型设计了一个对应的类&#xff0c;称为包装类 包装类把基本…

正则表达式简记

正则表达式简记 一、查找开头子串与结尾子串二、分组匹配替换字符串三、查找嵌套字符串 一、查找开头子串与结尾子串 正则表达式中以^字符表示待查找子串位于字符串开头位置&#xff0c;以$字符表示待查找子串位于字符串结尾位置&#xff0c;示例代码如下&#xff1a; import…

25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.3 二叉树的遍历和线索二叉树 选择题部分

一、单项选择题 ———————————————————— ———————————————————— 解析&#xff1a;二叉树中序遍历的最后一个结点一定是从根开始沿右子女指针链走到底的结点,设用p指示。若结点p不是叶结点(其左子树非空)&#xff0c;则前序遍历的最后一…

TCP/UCP

Loop本地回环 定义&#xff1a;Loop本地回环通常指的是以127开头的IP地址段&#xff08;127.0.0.1 – 127.255.255.254&#xff09;&#xff0c;其中127.0.0.1是最常用的地址&#xff0c;被称为本地回环地址&#xff08;Loop back address&#xff09;。特点&#xff1a;不属于…

RAG 技术原理

目录 RAG 技术原理背景和概念实现步骤1. ChatGPT/GLM 等大语言模型的调用2. 读取知识库数据3. 文本索引与答案检索4. 文本嵌入与向量检索5. 文本多路召回与重排序6. 文本问答Promopt优化 原创链接 RAG 技术原理 背景和概念 在自然语言处理领域&#xff0c;大型语言模型&#x…

Ubuntu 20.04安装中文输入法

本文旨在详细介绍在Ubuntu 20.04操作系统中安装中文输入法的步骤和方法。我们将从选择适合的中文输入法软件、下载与安装过程、配置输入法设置以及解决可能遇到的问题等方面展开讲解&#xff0c;帮助用户轻松实现在Ubuntu 20.04系统下流畅输入中文的需求。无论你是Ubuntu的新手…

MyBatis框架学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

sqlilabs less16-20关手工注入

第16关 一.判断闭合方式 闭合方式点“&#xff09; admin")and11# 二.判断数据库长度 admin") and if(length(database())>7, 0, sleep(5))# 页面无延迟 admin") and if(length(database())>8, 0, sleep(5))# 页面有延迟说明数据库长度为8 三.判断数…