驱动day10作业

基于platform驱动模型完成LED驱动的编写

驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include<linux/platform_device.h>
#include<linux/mod_devicetable.h>
#include<linux/of.h>
#include<linux/of_gpio.h>
#include<linux/gpio.h>
#include <linux/timer.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <linux/device.h>
#include "head.h"int major;   //字符设备驱动注册主设备号
struct class *cls;    //向上提交目录
struct device *dev;   //向上提交设备节点
struct gpio_desc* gpiono[3];//封装操作方法
int mycdev_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__,__func__,__LINE__);return 0;
}
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{int which;int ret = copy_from_user(&which, (void*)arg,4); if(ret){printk("copy_from_user failed\n");return -EIO;}switch(cmd){case LED_ON:switch(which){case 1:gpiod_set_value(gpiono[0],1);break;case 2:gpiod_set_value(gpiono[1], 1);break;case 3:gpiod_set_value(gpiono[2], 1);break;}break;case LED_OFF:switch(which){case 1:gpiod_set_value(gpiono[0],0);break;case 2:gpiod_set_value(gpiono[1], 0);break;case 3:gpiod_set_value(gpiono[2], 0);break;} break;}printk("%s:%s:%d\n", __FILE__,__func__,__LINE__);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,.unlocked_ioctl = mycdev_ioctl,.release = mycdev_close,
};int pdrv_probe(struct platform_device *pdev)//当驱动和设备匹配成功之后执行
{//字符设备驱动注册major = register_chrdev(0, "mycdev",&fops);if(major < 0){printk("字符设备驱动注册失败\n");return major;}/****************************udev创建设备节点的原************************///向上提交目录cls = class_create(THIS_MODULE, "mycdev");if(IS_ERR(cls)){printk("向上提交目录失败\n");return -PTR_ERR(cls); }//向上提交设备节点信息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");//解析LED设备树节点获取三个节点的gpio信息for(i=0; i<3; i++){gpiono[i]=gpiod_get_from_of_node(pdev->dev.of_node,"led-gpios", i, GPIOD_OUT_HIGH, NULL);if(IS_ERR(gpiono[i])){printk("解析GPIO信息失败\n");return -PTR_ERR(gpiono[i]);}printk("解析GPIO信息成功\n");}return 0;
}int pdrv_remove(struct platform_device *pdev)
{int i;for(i=0; i<3; i++){gpiod_set_value(gpiono[i], 0);//释放gpio编号gpiod_put(gpiono[i]);//销毁设备节点信息device_destroy(cls, MKDEV(major, i));}//销毁目录class_destroy(cls);//注销字符设备驱动unregister_chrdev(major, "mycdev");return 0;
}
//构建设备树匹配表
struct of_device_id oftable[] = {{.compatible="hqyj,myplatform",},{.compatible="hqyj,myplatform1",},{},   //防止数组越界
};
//1分配驱动信息对象
struct platform_driver pdrv= {.probe=pdrv_probe,.remove=pdrv_remove,.driver={.name="bbbbb",   //驱动名.of_match_table=oftable,},
};//驱动端一键注册宏
module_platform_driver(pdrv);
MODULE_LICENSE("GPL");

应用程序

#include<stdlib.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include<unistd.h>
#include<string.h>
#include "head.h"int main(int argc, char const *argv[])
{int fd = open("/dev/myled0", O_RDWR);if(fd < 0){printf("打开设备文件失败\n");exit(-1);}while(1){int a;printf("请输入1(开灯)0(关灯)>>");scanf("%d", &a);int b;printf("请输入 1(LED1) 2(LED2) 3(LED3)>>");scanf("%d", &b);switch(a){case 1:ioctl(fd, LED_ON,&b);break;case 0:ioctl(fd, LED_OFF,&b);break; }}close(fd);return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#define LED_ON _IOW('l', 1, int)
#define LED_OFF _IOW('l',0, int)
#endif

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

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

相关文章

ChatGPT扩展系列之ChatExcel

文章目录 ChatGPT扩展系列之ChatExcel对某一列的文字进行处理对数据进行排序对数据进行计算微软官方又推出Excel AI插件ChatGPT扩展系列之ChatExcel 自从ChatGPT很空出世之后,很多基于ChatGPT的应用便如雨后春笋般应用而生,这些应用的底层本质就是利用了ChatGPT对自然语言的…

mysql---DCL(用户创建及限制)

DCL: 权限控制语句 grant revoke 数据库用户管理: 创建用户 修改用户的权限 删除用户 grant 要在终端执行。 用户创建语句注释 create user ky32localhost identified by 123456; create user 创建用户的开头 ky32localhost ky32 表示用户的主机名 localhost 新建的…

kafka为什么如此之快?

天下武功&#xff0c;唯快不破。同样的&#xff0c;kafka在消息队列领域&#xff0c;也是非常快的&#xff0c;这里的块指的是kafka在单位时间搬运的数据量大小&#xff0c;也就是吞吐量&#xff0c;下图是搬运网上的一个性能测试结果&#xff0c;在同步发送场景下&#xff0c;…

3D RPG Course | Core 学习日记一:初识URP

前言 最近开始学习Unity中文课堂M_Studio&#xff08;麦大&#xff09;的3D RPG Course&#xff0c;学习一下3D RPG游戏核心功能的实现&#xff0c;第一课我们学习到的是地图场景的编辑&#xff0c;其中涉及到了URP渲染。 我们首先进入Unity资源商店把地图素材和人物素材导入好…

毛发渲染方案实现

一、毛发材质概述 以前毛发只能用离线来做 现在实时毛发逐渐可能。长毛渲染和短毛渲染采用的是不同的方案。 二、长毛类制作分析 各向异性 kajiya算法 # 三、短毛类制作分析 四、制作心得及技巧

汽车贴膜店展示服务预约小程序的作用是什么

很多家庭都有车辆&#xff0c;除了车身自带颜色或外观&#xff0c;部分消费者会选择贴车衣、改色膜以及其它装饰类服务&#xff1b;而市场高需求下也促进了商家生意增长。 但随着线上化程度加深&#xff0c;传统线下门店也面临多重困境&#xff0c;品牌需要线上发展获得生意及…

python基于VGG19实现图像风格迁移

目录 1、原理 2、代码实现 1、原理 图像风格迁移是一种将一张图片的内容与另一张图片的风格进行合成的技术。 风格&#xff08;style&#xff09;是指图像中不同空间尺度的纹理、颜色和视觉图案&#xff0c;内容&#xff08;content&#xff09;是指图像的高级宏观结构。 实…

Redis 哨兵

目录 ​编辑 一、哨兵原理 1、集群结构和作用 2、集群监控原理 3、集群故障恢复原理 二、搭建哨兵集群 1、集群结构 2、准备实例和配置 3、启动 三、RedisTemplate 的哨兵模式 一、哨兵原理 1、集群结构和作用 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制…

华为NAT配置实例(含dhcp、ospf配置)

一、网络拓朴如下&#xff1a; 二、要求&#xff1a;PC1 能访问到Server1 三、思路&#xff1a; R2配置DHCP&#xff0c;R2和R1配OSPF&#xff0c;R1出NAT 四、主要配置&#xff1a; R2的DHCP和OSPF&#xff1a; ip pool 1gateway-list 10.1.1.1 network 10.1.1.0 mask 25…

RabbitMQ消费者的可靠性

目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#x…

Python构造代理IP池提高访问量

目录 前言 一、代理IP是什么 二、代理IP池是什么 三、如何构建代理 IP 池 1. 从网上获取代理 IP 地址 2. 对 IP 地址进行筛选 3. 使用筛选出来的 IP 地址进行数据的爬取 四、总结 前言 爬虫程序是批量获取互联网上的信息的重要工具&#xff0c;在访问目标网站时需要频…

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

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