底层驱动day8作业

代码:

//驱动程序
#include<linux/init.h>
#include<linux/module.h>
#include<linux/of.h>
#include<linux/of_gpio.h>
#include<linux/gpio.h>
#include<linux/timer.h>struct device_node *dnode;
//unsigned int gpiono;
char kbuf[128] = {0};
//定义定时器对象
struct timer_list mytimer;
struct gpio_desc *gpiono;int major;
struct class *cls;
struct device *dev;
int mycdev_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;
}ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof)
{printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);int ret=copy_from_user(kbuf,ubuf,size);if(ret){printk("copy_from_user filed\n");return -EIO;}printk("%d\n",kbuf[0] - 48);gpiod_set_value(gpiono,kbuf[0] - 48);return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);return 0;
}// 定义操作方法结构体变量并赋值
struct file_operations fops = {.open = mycdev_open,.write = mycdev_write,.release = mycdev_close,
};void handler(struct timer_list *timer)
{printk("hello world\n");mod_timer(timer,jiffies + 5 * HZ);
}static int __init mycdev_init(void)
{dnode = of_find_node_by_path("/myled");if(NULL == dnode){printk("解析设备节点信息失败\n");return  -ENXIO;}//获取LED1 GPIO编号gpiono = gpiod_get_from_of_node(dnode,"led1-gpio",0,GPIOD_OUT_LOW,NULL);if(IS_ERR(gpiono)){printk("申请gpio信息失败\n");return -PTR_ERR(gpiono);}//初始化定时器对象timer_setup(&mytimer,handler,0);mytimer.expires = jiffies + HZ;//注册定时器add_timer(&mytimer);major = register_chrdev(0, "mychrdev", &fops);if (major < 0){printk("字符设备驱动注册失败\n");return major;}printk("字符设备驱动注册成功:major=%d\n", major);// 向上提交目录cls = class_create(THIS_MODULE, "mychrdev");if (IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls);}printk("向上提交目录成功\n");// 向上提交设备节点信息int i; // 向上提交三次设备节点信息for (i = 0; i < 3; i++){dev = device_create(cls, NULL, MKDEV(major, i), NULL, "myled%d", i);if (IS_ERR(dev)){printk("向上提交设备节点失败\n");return -PTR_ERR(dev);}}printk("向上提交设备节点成功\n");return 0;
}static void __exit mycdev_exit(void)
{del_timer(&mytimer);//gpio_free(gpiono);gpiod_put(gpiono);// 销毁设备节点信息int i;for (i = 0; i < 3; i++){device_destroy(cls, MKDEV(major, i));}// 销毁目录class_destroy(cls);// 注销字符设备驱动unregister_chrdev(major, "mychrdev");
}module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
//应用程序
#include<stdio.h>
#include<stdlib.h>
#include<sys/ioctl.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
int main(int argc, char const *argv[])
{char buf[128] = {0};int fd = open("/dev/myled0",O_RDWR);while(1){printf("请输入>>>");scanf("%s",buf);write(fd,buf,1);}return 0;
}

 实验现象:

 

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

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

相关文章

职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它

办公是现代生活不可避免的组成部分&#xff0c;科技的快速发展&#xff0c;给了我们更多新的生活方式&#xff0c;促使我们更加关注自己的身体状况&#xff0c;我们挨过了饭都吃不饱的年代&#xff0c;随着办公人群的不断扩张&#xff0c;不知道你有没有发现身边人或多或少都有…

CHAT——新手必看的文章

今天小编用CHAT写一篇文章&#xff1a;Ipad新手注意事项&#xff0c;一定要看。 标题&#xff1a;iPad新手必读&#xff1a;一篇你绝对不能错过的关于iPad使用的注意事项 当你买了一台全新的iPad&#xff0c;无论是为了工作还是娱乐&#xff0c;这款强大而引人入胜的设备都提供…

这三种方法轻松实现Excel文档名翻译

在电脑使用中&#xff0c;我们常常需要批量修改文件名并翻译。这时候&#xff0c;我们可以使用“固乔文件管家”软件来轻松实现这一需求。下面就介绍三种方法&#xff0c;帮助你轻松实现Excel文档名翻译。 方法一&#xff1a;使用“固乔文件管家”软件批量修改文件名 1.安装并打…

KaiwuDB 获山东省工信厅“信息化应用创新优秀解决方案”奖

10月23日&#xff0c;山东省工信厅正式公示《2023年山东省信息化应用创新典型应用案例及优秀解决方案名单》&#xff0c;面向全省、全国重点推荐山东省技术水平先进、应用示范效果突出、产业带动性强的信息化解决方案及应用实践&#xff0c;对于进一步激发山东省信息技术产业创…

SpringBoot -- 请求数据多态映射(jackson)

有些情况下&#xff0c;服务端提供了一个抽象类及其多个实现类&#xff0c;当前端传递 json 数据到后端时&#xff0c;我们希望映射得到的对象数据是根据某个特征区分开的具体的实现类对象。 文章目录 实现方式示例抽象类对象若干实现类测试接口及前端传递请求体接参结果 JsonT…

两个字符串的最小ASCII删除和

题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。 示例 思路 这个题的解法一和最长公共子序列的解法大致相同&#xff0c;我们可以在此代码基础上稍微更改即可。 代码如下 解法一 public int minimumDeleteSum1(Stri…

MetaAI提出全新验证链框架CoVE,大模型也可以通过“三省吾身”来缓解幻觉现象

​ 论文名称&#xff1a; Chain-of-Verification Reduces Hallucination in Large Language Models 论文链接&#xff1a; https://arxiv.org/abs/2309.11495 曾子曰&#xff1a;“吾日三省吾身” --出自《论语学而》 时至今日&#xff0c;生成幻觉&#xff08;hallucination&…

案例分析真题-质量属性

案例分析真题-质量属性 2009 年真题 【问题1】 【问题2】 2011 年真题 【问题1】 骚戴理解&#xff1a;首先要知道这样的题目没有可靠性&#xff0c;只有可用性&#xff0c;更没有容错性&#xff0c;这里我&#xff08;3&#xff09;写成了i&#xff0c;而不是f&#xff0c;仔…

众和策略:微软大动作

当地时间周二&#xff0c;美股首要指数全线收涨。但从月度数据来看&#xff0c;美股首要指数录得“三连跌”&#xff0c;10月份&#xff0c;道指跌1.36%&#xff0c;标普500指数跌2.2%&#xff0c;纳指跌2.78%。其间&#xff0c;标普和道指均为2020年3月以来初次呈现三个月连跌…

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比DW与PW计算量普通卷积计算量计算量对比 2、MobileNet V1MobileNet V1网络结构MobileNet V1网络结构代码 3、MobileNet V2倒残差结构模块倒残…

linux系统的环境变量-搞清环境变量到底是什么

环境变量 引例环境变量常见的环境变量echoexportenvunsetset 通过代码获取环境变量使用第三个参数获取使用全局变量enviorn获取环境变量通过系统调用获取环境变量 环境变量具有全局属性main函数前两个参数的作用 引例 在linux系统中&#xff0c;我们使用ls命令&#xff0c;直接…

模型实际训练笔记1—AlexNet

1、AlexNet网络模型介绍&#xff1a; AlexNet 是一种深度卷积神经网络&#xff0c;由Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在2012年开发。它是深度学习领域的重要里程碑&#xff0c;因为它在当年的 ImageNet 大规模图像分类竞赛&#xff08;ILSVRC&#xff09…

pc通过window.open打开新页面,新页面要使用原来页面的token

原文链接&#xff1a; https://blog.csdn.net/weixin_42342065/article/details/127420783 (以下为本人笔记使用) 对于前端来说&#xff0c;一般在登录获取token之后会把token存入缓存以及放置在Request Headers请求头中&#xff0c;但是使用iframe/window.open/a这三种标签打…

微信小程序-授权登录(手机号码)

1、WXBizDataCrypt.js-下载地址 2、UNIAPP代码 <template> <view class"work-container"> <view class"login"> <view class"content"> <button class"button_wx&q…

(四)上市企业实施IPD成功案例分享之——天士力

众所周知&#xff0c;药物有创新药和仿制药两种&#xff0c;其实这是根据新药研发的方式划分的&#xff0c;而创新药则经历一个从无到有的过程。无论是仿制药还是创新药&#xff0c;都是基于市场需求为前提进行的研发过程&#xff0c;药物研发立项同样需要满足治疗人类的疾病&a…

Android 13 Handler详解

1.Handler 简介 Handler 是一套 Android 消息传递机制。在多线程应用场景中&#xff0c;将子线程中需要更新 UI 的操作消息&#xff0c;传递到 UI 主线程&#xff0c;从而实现子线程通知 UI 更新最终实现异步消息处理。说白了是用于线程之间的通信。 Handler主要有4个重要类&a…

学习笔记|两因素析因设计的方差分析|效应量|统计分析策略|《小白爱上SPSS》课程:SPSS第九讲 | 两因素析因设计的方差分析,超级详细

目录 学习目的软件版本原始文档两因素析因设计的方差分析一、实战案例二、统计策略三、SPSS操作1、正态性检验2、方差分析 四、结果解读Tips&#xff1a;效应量越大越好吗&#xff1f;统计分析策略 五、简单效应操作及结果1、SPSS操作2、结果解读 六、规范报告1、规范表格2、规…

关于宝塔面板提示“upgrade your ACME client to support TLSv1.2 or better”的解决办法

今天续期SSL证书的时候提示“upgrade your ACME client to support TLSv1.2 or better”&#xff0c;这一般是旧系统情况下TLS版本过低&#xff1a;acme.sh版本低于2.8所引起的&#xff0c;也就是提示&#xff1a;升级你的系统至 TLS 1.2 协议或更高版本。 但是国内服务器无法…

创建javaEE项目(无maven),JSP(九大内置对象)、Servlet(生命周期)了解

一、Servlet和jsp 0.创建web项目(无maven)&#xff1a; 1.创建一个普通的java项目 2.项目根目录右键&#xff0c;添加模板 3.配置tomcat服务器 4.配置项目tomcat依赖 1.Servlet(Server Applet)服务端小程序 用户通过浏览器发送一个请求&#xff0c;服务器tomcat接收到后&…

python 练习 在列表元素中合适的位置插入 输入值

目的&#xff1a; 有一列从小到大排好的数字元素列表&#xff0c; 现在想往其插入一个值&#xff0c;要求&#xff1a; 大于右边数字小于左边数字 列表元素&#xff1a; [1,4,6,13,16,19,28,40,100] # 方法&#xff1a; 往列表中添加一个数值&#xff0c;其目的方便元素位置往后…