4.19作业 驱动开发

一、编程要求

  • 在内[[核中不支持浮点类型打印
  • 将si7006硬件数据读取到内核空间,拷贝到用户空间
  • 在i2c子系统驱动中,需要编写读取温湿度传感器函数
  • 在probe函数中
    • 注册字符设备驱动(分步注册)
    • 自动创建设备节点
  • 通过ioctl函数判断应用层发送命令码,是读取温度的数据还是湿度的数据
  • 编写应用层程序 公式
#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/fs.h>
#include <linux/device.h>struct i2c_client *gclient;
unsigned int major = 0;
#define CNAME "myled"
struct class *cls;
struct device *device;int myled_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}ssize_t myled_read(struct file *file, char __user *ubuf, size_t size, loff_t *loff)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0; 
}ssize_t myled_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loff)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;     
}int myled_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;     
}//操作方法结构体
const struct file_operations fops = {.open = myled_open,.read = myled_read,.write = myled_write,.release = myled_close,};//函数功能:读取电子串号和固件版本号的函数
int read_serial_firmware(unsigned short reg)
{char r_buf[] = {(reg >> 8 & 0xff),reg & 0xff};char value;int num;struct i2c_msg r_msg[2] = {[0] = {.addr = gclient->addr,  //从机地址.flags = 0, //写标志位.len = 2,  //消息长度.buf = r_buf,  //从reg寄存器中读取数据          },[1] = {.addr = gclient->addr,  //从机地址.flags = 1,//读标志位.len = 1,  //消息长度.buf = &value,  //读取到的数据内容            },};//发送数据num = i2c_transfer(gclient->adapter,r_msg,ARRAY_SIZE(r_msg));if(num != ARRAY_SIZE(r_msg)){printk("i2c transfer is error\n");return -EIO;}return value;
}//当设备驱动层和总线驱动层匹配成功执行probe函数
int si7006_probe(struct i2c_client *client, const struct i2c_device_id *id)
{int ret;gclient = client;printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);//读取电子串号ret = read_serial_firmware(0xFCC9);printk("serial(0x06) = %#x\n",ret);//读取固件版本号ret = read_serial_firmware(0x84B8);printk("fireware(0xff/0x20) = %#x\n",ret);//读取温湿度传感器协议版本号ret = read_serial_firmware(0xE340);printk("temperature(0xff/0x20)  = %#x\n",ret);ret = read_serial_firmware(0xE540);printk("Relative Humidity(0xff/0x20) = %#x\n",ret);//注册字符设备驱动major = register_chrdev(0,CNAME,&fops);if(major < 0){printk("register chrdev is error\n");return -EIO;}//向上层提交目录信息cls = class_create(THIS_MODULE,CNAME);if(IS_ERR(cls)){return PTR_ERR(cls);}//向上层提交设备节点信息device = device_create(cls,NULL,MKDEV(major,0),NULL,CNAME);if(IS_ERR(device)){return PTR_ERR(device);}printk("major = %d\n",major);//打印主设备号的值//判断读取的是温度还是湿度的数据,此处不会if(gclient->flags==1 && gclient->flags){;}return 0;
}//当任意一方卸载,执行remove函数
int si7006_remove(struct i2c_client *client)
{//注销字符设备驱动unregister_chrdev(major,CNAME);printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}const struct of_device_id si7006_tabble[] = {{.compatible = "hqyj,si7006",},{},//防止数组越界
};//初始化i2c_driver结构体
struct  i2c_driver si7006 ={.probe = si7006_probe,.remove = si7006_remove,.driver = {.name = "hello",.of_match_table = si7006_tabble,}
};module_i2c_driver(si7006);
MODULE_LICENSE("GPL");

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

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

相关文章

Linux管道共享内存

前言 进程虽然是独立运行的个体&#xff0c;但它们之间有时候需要协作才能完成一项工作&#xff0c;比如有两个进程需要同步数据&#xff0c;进程 A 把数据准备好后&#xff0c;想把数据发往进程 B&#xff0c;进程 B 必须被提前通知有数据即将到来&#xff0c;或者进程 A 想发…

项目七:学会使用python爬虫解析库(小白大成级)

前期我们学会了怎么使用python爬虫请求库和解析库的简单应用和了解&#xff0c;同时能够对爬虫有一个较为清晰的体系&#xff0c;毕竟简单的爬虫基本上都是请求数据——解析数据——存储数据的大概流程。 那么回忆一下&#xff0c;请求库我们学的是requests模块&#xff0c;解…

项目管理-项目开发计划介绍

目录 一、内容总览 二、项目开发计划概述 2.1 概述 2.2 项自开发计划的目的和作用 2.3 项目开发计划的内容 2.3.1 工作计划 2.3.2 人员组织计划 2.3.3 设备采购和资源供应计划 2.3.4 配置管理计划 2.3.5 进度安排计划 2.3.6 成本投资计划 2.3.7 质量保证计划 2.3.8…

Linux 磁盘分区详解以及知识点分解

Linux 磁盘分区 主要命令解释 lsblk&#xff1a;查看磁盘信息&#xff0c;这个命令后面可以直接跟设备名 blkid&#xff1a;查看UUID&#xff08;全局单一标识符&#xff09;和查看文件系统&#xff0c;这个命令后面要跟分区号 fdisk&#xff1a;fdisk命令工具默认将磁盘划分…

实现I.MX6ULL开发板与Windows和Ubuntu系统之间的通信

虚拟机与主机之间的连接方式确实包括桥接模式、NAT模式和仅主机模式。 桥接模式&#xff08;Bridged&#xff09;&#xff1a;在桥接模式下&#xff0c;虚拟机通过虚拟交换机直接连接到主机的物理网络上&#xff0c;就像一台独立的物理机器一样&#xff0c;拥有自己的IP地址&a…

[阅读笔记23][JAM]JOINTLY TRAINING LARGE AUTOREGRESSIVE MULTIMODAL MODELS

这篇论文是24年1月发表的&#xff0c;然后是基于的RA-CM3和CM3Leon这两篇论文。它所提出的JAM结构系统地融合了现有的文本模型和图像生成模型。 主要有两点贡献&#xff0c;第一点是提出了融合两个模型的方法&#xff0c;第二点是为混合模型精心设计的指令微调策略。 下图是一个…

Unity射击游戏开发教程:(1)玩家控制

玩家的移动 玩家控制和移动是视频游戏中最酷的事情之一,因为你正在控制游戏中的某些东西 现在游戏中的玩家是我们的蓝色方块英雄。我在游戏开发中了解到,游戏是用简单的对象制作原型,然后添加所有漂亮的艺术和声音。代码… 我们要做的第一件事是在游戏开始时为玩家提供一个…

MATLAB 体素滤波(62)

MATLAB 体素滤波(62) 一、算法介绍二、算法实现1.代码(已验证,直接运行)一、算法介绍 这里的代码完成文件读入,体素滤波,效果显示,结果输出的操作,下面是效果截图,后面是代码。 体素滤波(Voxel Filtering)是一种用于三维点云数据处理的方法,其原理类似于二维图像…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

广西建筑模版厂家批发供应,当天发货全国可达

近年来&#xff0c;建筑行业蓬勃发展&#xff0c;对高质量的建筑模板需求量逐渐增加。在这个竞争激烈的市场中&#xff0c;贵港市能强优品木业有限公司以其出色的产品和卓越的服务迅速崭露头角&#xff0c;成为知名的建筑模板生产厂家。 作为一家拥有25年生产经验的公司&#x…

(SpringBoot)第十二章第一节:Spring事务和@Transactioal

文章目录 一:回顾事务的基本概念(1)事务A:定义B:事务的定义(2)事务的四个特性——ACIDA:数据库的ACID①:原子性(Atomicity)②:一致性(Consistency)③:隔离性(Isolation)④:持续性(Durability)B:破坏ACID的因素二:Spring

用FRP配置toml文件搭建内网穿透

需求场景 1、一台外网可访问的有固定ip的云服务器&#xff0c;Ubuntu系统 2、一台外网无法访问的无固定ip的本地家用电脑&#xff0c;Ubuntu系统 需求&#xff1a;将云服务器搭建为一台内网穿透服务器&#xff0c;实现通过外网访问家用电脑&#xff08;网页&#xff09;的功能。…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域&#xff0c;了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术&#xff0c;我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库&#xff0c;构建了两个常用的分类模型&#xff…

服务器使用-三丰云

网址&#xff1a;https://www.sanfengyun.com 部署bot使用&#xff1a;三丰云免费云服务器 bot&#xff1a;tx官方bot&#xff0c;使用 python 的 sdk 服务器体验&#xff1a;部署在云服务器上可以长期运行&#xff0c;使用宝塔面板操作方便&#xff0c;流畅&#xff0c;未出…

视频号的7个引流方式

一、账号简介引流 1、获客场景&#xff1a;账号简介相当于一张名片&#xff0c;几乎所有用户进入你的账号后&#xff0c;必然先要看简介 2、优势&#xff1a;相比于抖音、快手等短视频平台&#xff0c;视频号引流私域的路径更短&#xff0c;而且在微信端内有着得天独厚的优势…

Android JNI使用dlopen动态链接库

dlopen 是一个用于在系统中动态加载共享库&#xff08;动态链接库&#xff09;的函数。它的主要作用是在程序运行时动态地加载共享库&#xff0c;使得程序可以在不重新编译的情况下加载并使用库中的函数和变量。 具体来说&#xff0c;dlopen 函数可以接受一个共享库的路径作为…

Ardupilot无人船(车)自动调参

无人船&#xff08;车&#xff09;快速调参脚本简化了为无人船&#xff08;车&#xff09;角速率和速度控制器调参的过程。 该脚本应该在无人船&#xff08;车&#xff09;在Circle模式下循环绕圈时运行。它记录转向和油门输出以及由此产生的响应(例如无人船&#xff08;车&am…

高精度算法(2)

前言 延续上次所讲的内容再对乘法和除法进行说明&#xff0c;希望有所帮助 注意这里的乘除法都是针对于整数如果要是涉及到小数&#xff0c;我们得使用二分法 通过二分同样可以解决小数精度问题 高精度乘法 思路 我们只能用字符串来读取一个很大很大的数&#xff0c;所以…

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前&#xff0c;必须先介绍一下旧版本的粒子系统。   在UE4的时候&#xff0c;虚幻引擎的粒子系统叫做Cascade&#x…

淘宝交易API,修改交易备注taobao.trade.memo.update

淘宝交易API&#xff0c;修改交易备注taobao.trade.memo.update 需要商家或以上权限才可调用此接口&#xff0c;可重复调用本接口更新交易备注&#xff0c;本接口同时具有添加备注的功能 公共请求参数: 公共请求参数: 名称 类型 必须 描述 method String 是 API接口名…