Regmap子系统之六轴传感器驱动-编写icm20607.c驱动
(一)在驱动中要操作很多芯片相关的寄存器,所以需要先新建一个icm20607.h的头文件,用来定义相关寄存器值。
#ifndef ICM20607_H #define ICM20607_H /*************************************************************** 文件名 : icm20607.h 描述 : ICM20607寄存器地址描述头文件 ***************************************************************/ #define ICM20608G_ID 0XAF /* ID值 */ #define ICM20608D_ID 0XAE /* ID值 */ #define ICM20607_ID 0X05 /* ICM20607寄存器 *复位后所有寄存器地址都为0,除了 *Register 107(0x41) Power Management 1 *Register 117(0x05) WHO_AM_I *Register 26(0x80) CONFIG */ /* 陀螺仪和加速度自测(出产时设置,用于与用户的自检输出值比较) */ /* ICM20607 SELF TEST GYRO Modify 0x ->5x */ #define ICM20_SELF_TEST_X_GYRO 0x50 #define ICM20_SELF_TEST_Y_GYRO 0x51 #define ICM20_SELF_TEST_Z_GYRO 0x52 #define ICM20_SELF_TEST_X_ACCEL 0x0D #define ICM20_SELF_TEST_Y_ACCEL 0x0E #define ICM20_SELF_TEST_Z_ACCEL 0x0F /* 陀螺仪静态偏移 */ #define ICM20_XG_OFFS_USRH 0x13 #define ICM20_XG_OFFS_USRL 0x14 #define ICM20_YG_OFFS_USRH 0x15 #define ICM20_YG_OFFS_USRL 0x16 #define ICM20_ZG_OFFS_USRH 0x17 #define ICM20_ZG_OFFS_USRL 0x18 #define ICM20_SMPLRT_DIV 0x19 #define ICM20_CONFIG 0x1A #define ICM20_GYRO_CONFIG 0x1B #define ICM20_ACCEL_CONFIG 0x1C #define ICM20_ACCEL_CONFIG2 0x1D #define ICM20_LP_MODE_CFG 0x1E #define ICM20_ACCEL_WOM_THR 0x1F #define ICM20_FIFO_EN 0x23 #define ICM20_FSYNC_INT 0x36 #define ICM20_INT_PIN_CFG 0x37 #define ICM20_INT_ENABLE 0x38 #define ICM20_INT_STATUS 0x3A /* 加速度输出 */ #define ICM20_ACCEL_XOUT_H 0x3B #define ICM20_ACCEL_XOUT_L 0x3C #define ICM20_ACCEL_YOUT_H 0x3D #define ICM20_ACCEL_YOUT_L 0x3E #define ICM20_ACCEL_ZOUT_H 0x3F #define ICM20_ACCEL_ZOUT_L 0x40 /* 温度输出 */ #define ICM20_TEMP_OUT_H 0x41 #define ICM20_TEMP_OUT_L 0x42 /* 陀螺仪输出 */ #define ICM20_GYRO_XOUT_H 0x43 #define ICM20_GYRO_XOUT_L 0x44 #define ICM20_GYRO_YOUT_H 0x45 #define ICM20_GYRO_YOUT_L 0x46 #define ICM20_GYRO_ZOUT_H 0x47 #define ICM20_GYRO_ZOUT_L 0x48 #define ICM20_SIGNAL_PATH_RESET 0x68 #define ICM20_ACCEL_INTEL_CTRL 0x69 #define ICM20_USER_CTRL 0x6A #define ICM20_PWR_MGMT_1 0x6B #define ICM20_PWR_MGMT_2 0x6C #define ICM20_FIFO_COUNTH 0x72 #define ICM20_FIFO_COUNTL 0x73 #define ICM20_FIFO_R_W 0x74 #define ICM20_WHO_AM_I 0x75 /* 加速度静态偏移 */ #define ICM20_XA_OFFSET_H 0x77 #define ICM20_XA_OFFSET_L 0x78 #define ICM20_YA_OFFSET_H 0x7A #define ICM20_YA_OFFSET_L 0x7B #define ICM20_ZA_OFFSET_H 0x7D #define ICM20_ZA_OFFSET_L 0x7E #endif |
(二)icm20607.c文件编写
(1)头文件引用
#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> // 包含文件系统相关函数的头文件 #include <linux/uaccess.h> // 包含用户空间数据访问函数的头文件 #include <linux/cdev.h> //包含字符设备头文件 #include <linux/device.h> #include <linux/delay.h> #include <linux/spi/spi.h> #include <linux/regmap.h> #include <linux/of.h> #include <linux/of_address.h> #include <linux/of_gpio.h> #include "icm20607.h" |
(2)创建相关宏定义和变量
#define ICM20607_REG_WHOAMI 0x75 #define ICM20607_WHOAMI_VALUE 0xAF #define DEVICE_NAME "icm20607" // 设备名称 static dev_t dev_num; //分配的设备号 int major; //主设备号 int minor; //次设备号 struct icm20607_dev { struct spi_device *spi_dev; /* spi设备 */ dev_t dev_num; /* 设备号 */ struct cdev cdev; /* cdev */ struct class *class; /* 类 */ struct device *device; /* 设备 */ struct device_node *nd; /* 设备节点 */ int cs_gpio; /* 片选所使用的GPIO编号 */ signed int gyro_x_adc; /* 陀螺仪X轴原始值 */ signed int gyro_y_adc; /* 陀螺仪Y轴原始值 */ signed int gyro_z_adc; /* 陀螺仪Z轴原始值 */ signed int accel_x_adc; /* 加速度计X轴原始值 */ signed int accel_y_adc; /* 加速度计Y轴原始值 */ signed int accel_z_adc; /* 加速度计Z轴原始值 */ signed int temp_adc; /* 温度原始值 */ struct regmap *spi_regmap; /* regmap */ struct regmap_config regmap_config; }; |
(3)驱动模块的入口和出口
module_init(icm20607_init); module_exit(icm20607_exit); |
(4)icm20607_init和icm20607_exit实现
static int __init icm20607_init(void) { int ret; ret = spi_register_driver(&icm20607_driver); if (ret < 0) { pr_err("Failed to register ICM20607 driver: %d\n", ret); return ret; } pr_info("ICM20607 SPI device driver loaded\n"); return 0; } static void __exit icm20607_exit(void) { spi_unregister_driver(&icm20607_driver); pr_info("ICM20607 SPI device driver unloaded\n"); } |
在入口函数中调用了spi_register_driver函数,来注册SPI总线驱动程序。在出口函数中调用了spi_unregister_driver函数,来注销驱动程序。
spi_register_driver函数原型如下:
int spi_register_driver(struct spi_driver *drv); |
该函数接受一个指向struct spi_driver结构体的指针作为参数,并返回一个整数值,表示注册是否成功。struct spi_driver结构体定义了SPI总线驱动程序的属性和回调函数。
以下是struct spi_driver结构体的常见成员:
driver:struct device_driver类型的成员,描述了驱动程序的基本信息,如名称、总线类型等。
probe:指向驱动程序的探测函数的指针。探测函数在与设备匹配时被调用,用于初始化设备并注册相关资源。
remove:指向驱动程序的移除函数的指针。移除函数在设备被卸载时被调用,用于清理和释放相关资源。
id_table:指向struct spi_device_id数组的指针,用于匹配驱动程序和设备之间的关联关系。
probe_new:指向新版的探测函数的指针。新版探测函数支持更多功能,并可以替代旧版的probe函数。
remove_new:指向新版的移除函数的指针。新版移除函数支持更多功能,并可以替代旧版的remove函数。
通过调用spi_register_driver函数并传入正确配置的struct spi_driver结构体,可以将SPI总线驱动程序注册到Linux内核,使其能够接收和处理SPI设备的相关操作。
(5)spi_driver类型结构体定义
static struct spi_driver icm20607_driver = { .driver = { .name = "icm20607", .owner = THIS_MODULE, .of_match_table = icm20607_of__match, }, .probe = icm20607_probe, .remove = icm20607_remove, }; |
(6)icm20607_of__match实现,用来与设备树中的compatible匹配
static const struct of_device_id icm20608_of_match[] = { { .compatible = "icm20607" }, { /* Sentinel */ } }; |
(7)remove函数实现,执行icm20607设备的清理操作
static int icm20607_remove(struct spi_device *spi) { struct icm20607_dev *icm20607dev = spi_get_drvdata(spi); // 在此处执行 ICM20607 设备的清理操作 //删除cdev cdev_del(&icm20607dev->cdev); //注销设备号 unregister_chrdev_region(icm20607dev->dev_num, 1); //注销设备 device_destroy(icm20607dev->class, icm20608dev->dev_num); //注销类 class_destroy(icm20607dev->class); //删除regmap regmap_exit(icm20607dev->spi_regmap); pr_info("ICM20607 SPI device removed successfully\n"); return 0; } |
(8)probe函数实现,此处简略描述regmap注册的过程:
static int icm20607_probe(struct spi_device *spi) { int ret; unsigned int whoami; struct icm20607_dev *icm20607dev; //分配icm20607dev对象的空间 icm20607dev = devm_kzalloc(&spi->dev, sizeof(*icm20607dev), GFP_KERNEL); if(!icm20607dev) return -ENOMEM; // 创建 ICM20607 设备的 regmap icm20608dev->spi_regmap = regmap_init_spi(spi, &spi_regmap_config); if (IS_ERR(icm20607dev->spi_regmap)) { dev_err(&spi->dev, "Failed to initialize regmap: %ld\n", PTR_ERR(icm20607dev->spi_regmap)); return PTR_ERR(icm20607dev->spi_regmap); } ...... /*初始化spi_device */ icm20607dev->spi_dev = spi; spi->mode = SPI_MODE_0; spi_setup(spi); /* 初始化ICM20607内部寄存器 */ icm20607_reginit(icm20607dev); /* 保存icm20607dev结构体 */ spi_set_drvdata(spi, icm20607dev); pr_info("ICM20607 SPI device probed successfully\n"); return 0; } |
probe函数中首先使用devm_kzalloc函数分配了icm20607dev的结构体空间,然后使用regmap_init_spi函数创建regmap实例,再进行spi控制器的初始化和配置,最后对ICM20607的内部寄存器进行配置。
其中regmap_init_spi函数中传入了“&spi_regmap_config”参数,前边有提到这个是用来配置regmap对象的,下边我们看这个参数是如何定义的。
(9)spi_regmap_config的定义
static const struct regmap_config spi_regmap_config = { .reg_bits = 8, .val_bits = 8, .read_flag_mask = 0x80, .reg_read = icm20607_spi_read, .reg_write = icm20607_spi_write, .max_register = ICM20607_REG_WHOAMI, }; |
可以看到这其中规定了寄存器地址的位数,存储寄存器的位数,读寄存器掩码,读寄存器函数,写寄存器函数,最大寄存器地址。
(10)读写寄存器函数实现
static int icm20607_spi_read(struct icm20608_dev *dev, unsigned int reg, unsigned int *val) { return regmap_read(dev->spi_regmap, reg, val); } static int icm20607_spi_write(struct icm20608_dev *dev, unsigned int reg, unsigned int val) { return regmap_write(dev->spi_regmap, reg, val); } |
可以看出读写函数非常简单明了,直接使用regmap_read和regmap_write函数即可。
①regmap_read函数原型如下:
int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val); |
该函数用于从给定的寄存器地址(reg)读取数据,并将读取的值存储在val指向的变量中。map参数是一个指向struct regmap的指针,表示寄存器映射对象。返回值为0表示读取成功,否则表示读取失败。
②regmap_write函数原型如下:
int regmap_write(struct regmap *map, unsigned int reg, unsigned int val); |
该函数用于向给定的寄存器地址(reg)写入数据(val)。map参数是一个指向struct regmap的指针,表示寄存器映射对象。返回值为0表示写入成功,否则表示写入失败。
相关文章:
Regmap子系统之六轴传感器驱动-编写icm20607.c驱动
(一)在驱动中要操作很多芯片相关的寄存器,所以需要先新建一个icm20607.h的头文件,用来定义相关寄存器值。 #ifndef ICM20607_H #define ICM20607_H /*************************************************************** 文件名 : i…...
计算机网络-HTTP与HTTPS
文章目录 计算机网络网络模型网络OSITCP/IP 应用层常用协议HTTP报文HTTP状态码HTTP请求类型HTTP握手过程HTTP连接HTTP断点续传HTTPSHTTPS握手过程 计算机网络 网络模型 为了解决多种设备能够通过网络相互通信,解决网络互联兼容性问题。 网络模型是计算机网络中用于…...
Text2SQL在Spark NLP中的实现与应用:将自然语言问题转换为SQL查询的技术解析
概述 SQL 仍然是当前行业中最受欢迎的技能之一 免责声明:Spark NLP 中的 Text2SQL 注释器在 v3.x(2021 年 3 月)中已被弃用,不再使用。如果您想测试该模块,请使用 Spark NLP for Healthcare 的早期版本。 自新千年伊…...
Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法
Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法 说明方法 说明 Ubuntu20.04下使用dpkg方式安装WPS后,打开WPS后,发现界面是英文的,如有需要可以按照下面的方法将其改为中文界面。 方法 cd /opt/kingsoft/wps-offic…...
OpenCV CUDA 模块中的矩阵算术运算-----在频域(复数频谱)中执行逐元素乘法并缩放的函数mulAndScaleSpectrums()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 mulAndScaleSpectrums()是OpenCV CUDA模块中用于在频域(复数频谱)中执行逐元素乘法并缩放 的函数。 这个函数主要用于在…...
批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM
在互联网内容生态蓬勃发展的当下,企业与创作者对内容生产与传播效率的要求日益增长。批量剪辑、矩阵分发和数字人分身技术的融合,成为提升内容创作与运营效能的关键方案。从源码层面实现三者的搭建与整合,需要深入理解各功能技术原理…...
Spring Boot 与 RabbitMQ 的深度集成实践(三)
高级特性实现 消息持久化 在实际的生产环境中,消息的可靠性是至关重要的。消息持久化是确保 RabbitMQ 在发生故障或重启后,消息不会丢失的关键机制。它涉及到消息、队列和交换机的持久化配置。 首先,配置队列持久化。在创建队列时…...
部署java项目
1.编写shell脚本部署服务 restart.sh #!/bin/bash # # start the user program # echo "-------------------- start jk service --------------------" LOG_DIR"/home/joy/usr/app/ers-log" LOG_FILE"$LOG_DIR/log_$(date "%Y%m%d").txt&…...
中国城市间交通驾车距离矩阵(2024)
中国城市间交通驾车距离矩阵(2024) 1852 数据简介 中国城市中心的交通驾车距离,该数据为通过审图号GS(2024)0650的中国城市地图得其城市中心距离,再通过高德地图api计算得出其交通驾车最短距离矩阵,单位为KM,方便大家研究使用。…...
物联网数据湖架构
物联网海量数据湖分析架构(推荐实践) ┌──────────────┐ │ IoT设备端 │ └──────┬───────┘│(MQTT/HTTP)▼ ┌──────────────┐ │ EMQX等 │ 可选(也可…...
Python将Excel单元格某一范围生成—截图(进阶版—带样式+批量+多级表头)
目录 专栏导读1、库的介绍2、库的安装3、核心代码4、通用版——带样式5、进阶版(可筛选+自动截图)多级表头版总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该…...
使用Python将 Excel 中的图表、形状和其他元素导出为图片
目录 为什么将 Excel 中的图表、形状和其他元素导出为图片? 工具与设置 Python 将 Excel 图表导出为图片 将图表导出为图片 将图表工作表导出为图片 Python 将 Excel 中的形状和其他元素导出为图片 微软 Excel 是一个功能强大的数据分析和可视化工具ÿ…...
从编程助手到AI工程师:Trae插件Builder模式实战Excel合并工具开发
Trae插件下载链接:https://www.trae.com.cn/plugin 引言:AI编程工具的新纪元 在软件开发领域,AI辅助编程正在经历一场革命性的变革。Trae插件(原MarsCode编程助手)最新推出的Builder模式,标志着AI编程工具…...
AI大模型从0到1记录学习numpy pandas day25
第 3 章 Pandas 3.1 什么是Pandas Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)…...
【云实验】Excel文件转存到RDS数据库
实验名称:Excel文件转存到RDS数据库 说明:把Excel的数据通过数据管理服务DMS(Data Management Service)导入到RDS MySQL数据库中。 流程:创建一个RDS for MySQL的实例,再创建数据库和账号,通过D…...
用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践
本文将介绍如何使用Python构建一个自动化工具,实现从MySQL数据库提取员工数据,并为每位员工生成包含定制化表格的PDF报告。通过该方案,可显著提升数据导出效率,避免手动操作误差,同时支持灵活的格式定制。 需求&#…...
深入理解 ZAB:ZooKeeper 原子广播协议的工作原理
目录 ZAB 协议:ZooKeeper 如何做到高可用和强一致?🔒ZAB 协议的核心目标 🎯ZAB 协议的关键概念 💡ZAB 协议的运行阶段 🎬阶段一:Leader 选举 (Leader Election) 🗳️阶段二ÿ…...
Javascript本地存储的方式有哪些?区别及应用场景?(含Deep Seek讲解)
JavaScript本地存储方式的区别与适用场景 1. Cookie 特点: Cookie是一种较早的本地存储技术,主要通过HTTP协议在客户端和服务器之间传递数据。它的大小通常被限制为4KB以内,并且每次HTTP请求都会携带Cookie信息。缺点: 数据量有限制(最多4K…...
二元Logistic回归
二元Logistic回归 在机器学习领域,二元Logistic回归是一种非常经典的分类模型,广泛用于解决具有两类标签的分类问题。Logistic回归通过逻辑函数(Sigmoid函数)将预测结果映射到概率值,并进行分类。 一、Logistic回归 …...
Android framework 问题记录
一、休眠唤醒,很快熄屏 1.1 问题描述 机器休眠唤醒后,没有按照约定的熄屏timeout 进行熄屏,很快就熄屏(约2s~3s左右) 1.2 原因分析: 抓取相关log,打印休眠背光 相关调用栈 //具体打印调用栈…...
企业网站架构部署与优化 --web技术与nginx网站环境部署
一、Web 基础 本节将介绍Web 基础知识,包括域名的概念、DNS 原理、静态网页和动态网页的 相关知识。 1、域名和DNS 1.1、域名的概念 网络是基于TCP/IP 协议进行通信和连接的,每一台主机都有一个唯一的标识(固定的IP 地址),用以区别在网络上成千上万个用户和计算机。…...
Scala与Spark:原理、实践与技术全景详解
Scala与Spark:原理、实践与技术全景详解 一、引言 在大数据与分布式计算领域,Apache Spark 已成为事实标准的计算引擎,而 Scala 作为其主要开发语言,也逐渐成为数据工程师和后端开发者的必备技能。本文将系统梳理 Scala 语言基础…...
【聚类】层次聚类
层次聚类 文章目录 层次聚类1. 算法介绍2. 公式及原理3. 伪代码 1. 算法介绍 背景与目标 层次聚类(Hierarchical Clustering)是一类无需事先指定簇数的聚类方法,通过构造一棵“树状图”(dendrogram)来呈现数据的多层次…...
Windows环境安装LibreOffice实现word转pdf
前言:最近在工作中遇到了一个需求要实现word转pdf,本来我在上一个公司使用aspose.words工具使用的得心应手,都已经把功能点实现了,两句代码轻轻松松,但是被告知不能用商业版的东西,公司要求只能用开源的&am…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit (3)
1.问题描述: 通过CardRecognition识别身份证拍照拿到的照片地址,使用该方法获取不到图片文件,请问如何解决? 解决方案: //卡证识别实现页,文件名为CardDemoPage,需被引入至入口页 import { …...
【聚类】K-means++
K-means 文章目录 K-means1. 算法介绍2. 公式及原理3. 伪代码 1. 算法介绍 背景与目标 k-means 是 David Arthur 和 Sergei Vassilvitskii 于2007年提出的改进 k-means 初始化方法,其核心目标是: 在保证聚类质量的前提下,通过更合理地选择初始…...
Java实现PDF加水印功能:技术解析与实践指南
Java实现PDF加水印功能:技术解析与实践指南 在当今数字化办公环境中,PDF文件因其跨平台兼容性和格式稳定性而被广泛应用。然而,为了保护文档的版权、标记文档状态(如“草稿”“机密”等)或增加文档的可追溯性…...
【C#】用 DevExpress 创建带“下拉子表”的参数表格视图
展示如何用 DevExpress 创建带“下拉子表”的参数表格视图。主表为 参数行 ParamRow,子表为 子项 ChildParam。 一、创建模型类 public class ParamRow {public string Pn { get; set; }public string DisplayName { get; set; }public string Value { get; set; }…...
Go语言八股文之Mysql优化
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
学习记录:DAY29
项目开发日志:技术实践与成长之路 前言 回顾这几天的状态,热情总是比我想象中更快被消耗完。比起茫然徘徊的小丑,我更希望自己是对着风车冲锋的疯子。 今天继续深入项目的实际业务。 状态好点的时候,再看自己EMO时写的东西&…...
LLaMA-Factory:了解webUI参数
Finetuning method参数 full(全量微调) 更新模型全部参数,完全适配新任务 效果最好,但资源消耗最大适用于计算资源充足的场景存在过拟合的风险,需要大量数据支持 freeze(冻结微调) 固定底层参…...
【实战】GPT-SoVITS+内网穿透:3分钟搭建可公网访问的语音克隆系统
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
HTML向四周扩散背景
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>扩散背景效果</title><style>body {…...
React 个人笔记 Hooks编程
作用 配合函数式编程,保证在不产生类的时候完成一个整体的组件 常用组件 useStateuseContextuseReduceruseEffectuseMemouseCallback 前三个值为自变量 后三者为因变量 前三者相当于其他编程函数的变量声明,而后三者相当于对变量进行了(if now ! pr…...
CSS- 4.6 radiu、shadow、animation动画
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…...
ngx_http_scgi_module 技术指南
一、快速上手示例 http {# 定义 SCGI 参数(标准 CGI 环境变量)include /etc/nginx/scgi_params;server {listen 80;location /app/ {# 将请求转发到本地 9000 端口的 SCGI 服务器scgi_pass localhost:9000;# 只转发非空的 HTTPS 参数scgi…...
NFT市场开发技术全解析:从架构设计到实现
NFT(非同质化代币)市场已成为区块链领域的热门应用场景,涵盖艺术品、游戏资产、虚拟地产等多个领域。本文将从技术栈选择、核心功能实现、开发流程、挑战与优化等方面,系统梳理NFT市场的开发要点,并结合实际案例与代码…...
第六十一篇 Java反射解析:用咖啡调配理解动态编程的艺术
引言:一杯咖啡引发的技术思考 在星巴克的收银台前,我们总能看到店员熟练地根据顾客需求调配不同口味的咖啡:美式、拿铁、卡布奇诺… 这让我联想到编程世界中的对象创建。如果每新增一种咖啡就要修改收银系统,这样的设计显然不够优…...
【android bluetooth 协议分析 01】【HCI 层介绍 7】【ReadLocalName命令介绍】
1. HCI_Read_Local_Name Read Local Name 是 HCI(Host Controller Interface)命令之一,属于 BR/EDR 控制器的 HCI Command 类别,其主要功能是 读取本地设备(Controller)的人类可读名称(Local N…...
window xampp apache使用腾讯云ssl证书配置https
下载腾讯云ssl证书: 编辑Apache根目录下 conf/httpd.conf 文件: #LoadModule ssl_module modules/mod_ssl.so和#Include conf/extra/httpd-ssl.conf,去掉前面的#号注释。 编辑Apache根目录下 conf/httpd-ssl.conf 文件: <Vi…...
企业开发工具git的使用:从入门到高效团队协作
前言:本文介绍了Git的安装、本地仓库的创建与配置,以及工作区、暂存区和版本库的区分。详细讲解了版本回退、撤销修改等操作,并深入探讨了分支管理,包括分支的创建、切换、合并、删除及冲突解决。此外,还介绍了远程操作…...
【git config --global alias | Git分支操作效率提升实践指南】
git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中,Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中,我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …...
VR 互动实训与展示,借科技开启沉浸式体验新篇
对于企业而言,产品设计与展示是极为关键的环节,这直接关系到能否成功吸引客户,以及精准获取市场反馈。在当下科技飞速发展的时代,VR 互动实训为这一至关重要的环节注入了全新活力,带来了前所未有的体验。以某智能家居企…...
一文了解VR拍摄制作
虚拟现实(VR)技术通过计算机技术模拟环境,使用户能够身临其境地沉浸在虚拟世界中进行交互体验。 在VR拍摄中,主要利用这一技术来创建360度全景视频或图片,让观众能够全方位地感受拍摄场景。这种拍摄方式不仅改变了我们…...
【内测征集】LarkVR 播控系统上新:VR 应用一站式专业播控与管理工具
Paraverse平行云自主研发的LarkXR实时云渲染平台,作为行业领先的企业级云渲染解决方案,在国际市场占据重要地位。公司自2016年创立以来,始终引领3D/XR云化技术的创新发展,目前已在全球范围内为超过10,000名开发者和1,000家企业客户…...
Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 十六进制查看工具 应用于逆向工程的知识点 编辑 二进制对比工具 应用于逆向工程的知识点 十六进制查看工具 十六进制查看器是逆向工程的基础工具,它可以以十六进制格式…...
电脑A和电脑B都无法ping通电脑C网络,电脑C可以ping通电脑A和B,使用新系统测试正常,排除硬件问题。
主要硬件:研华AIMB-705主板、i5-6500 C机在防火墙高级设置里启用以下两项规则后,A/B机可正常访问C机网络。(直接关闭防火墙也可解决此问题) 文件和打印机共享 (回显请求 - ICMPv4-In) 核心网络诊断 - ICMP 回显请求 (ICMPv4-In)…...
【VMware】虚拟机运行 Linux Ubuntu、MAC 安装和配置
文章目录 一、VMware Workstation Pro 下载二、VMware Workstation Pro 安装三、Ubuntu Linux虚拟机镜像下载安装与配置 1、Ubuntu系统镜像下载 2、创建虚拟机(VMware)及硬件配置 3、编辑虚拟机设置 4、安装Ubuntu系统及系统…...
遨游科普:三防平板是什么?有什么作用?
在数字化与智能化浪潮席卷全球的今天,电子设备的可靠性已成为衡量其价值的核心标准之一。三防平板,这一“硬核”的工业设备,正凭借其卓越的环境适应能力,从专业领域走向大众视野,成为极端场景下不可或缺的数字化工具。…...
电脑闪屏可能的原因
1. 显示器 / 屏幕故障 屏幕排线接触不良:笔记本电脑屏幕排线(屏线)松动或磨损,导致信号传输不稳定,常见于频繁开合屏幕的设备。屏幕面板损坏:液晶屏内部灯管老化、背光模块故障或面板本身损坏,…...