当前位置: 首页 > article >正文

3.23-3.25笔记

这期实现温湿度采集、光照强度监测、智能设备控制加湿器、PWM 调光 LED、PWM 调速风扇确定引脚根据原理图找出可以使用的引脚开关。根据手册信息PWM口GPIO0_D0和GPIO0_C6把设备树GPIO0_D0做5G的复位disable再加入pwm5 {pinctrl-0 pwm5m1_pins;status okay;};pwm7 {pinctrl-0 pwm7m1_pins;status okay;};因为pinctrl.dtsi都定义好了io口做PWM是PWM几。所以只要打开 status okay;。系统就会自动的在/sys/class/pwm/下去生成pwmchip5直接去写入设置PWM。echo 0 /sys/class/pwm/pwmchip2/export echo 50000 /sys/class/pwm/pwmchip2/pwm0/period echo 10000 /sys/class/pwm/pwmchip2/pwm0/duty_cycle echo normal /sys/class/pwm/pwmchip2/pwm0/polarity echo 1 /sys/class/pwm/pwmchip2/pwm0/enablepwmchip2是PWM5pwmchip5是PWM7。通过示波器正常显示PWM波形图LED 亮度调节GPIO0_C6PWM5风扇调速 GPIO1_D0 PWM7加湿器开关GPIO1_D3DHT11 温湿度GPIO1_D2光敏传感器SARADC_VIN4需要GPIOPWMADC驱动。所以设备树加入以下代码humidifier { compatible rzroomi,humidifier; gpios gpio1 RK_PD3 GPIO_ACTIVE_HIGH; status okay; }; dht11 { compatible rzroomi,dht11; gpios gpio1 RK_PD2 GPIO_ACTIVE_HIGH; status okay; }; pwm5 { pinctrl-0 pwm5m1_pins; status okay; }; pwm6 { pinctrl-0 pwm6m1_pins; status okay; }; pwm7 { pinctrl-0 pwm7m1_pins; status okay; };经过编译编译是成功了烧写到开发版结果usb识别不了设备了。把之前的代码烧录进去加入PWM和GPIO正常可能是ADC设备驱动的原因把。在驱动代码使用platform miscdevice gpiod devm ioctl进行编写驱动代码会更精简。与之前的驱动代码相比有以下优点1使用miscdevice替代了下面的代码alloc_chrdev_region(...) cdev_init(...) cdev_add(...) class_create(...) device_create(...)申请主设备号固定 10自动分配次设备号自动创建 /dev/xxx自动绑定 fops自动实现 open/close2使用platform替代了下面的代码dev-nd of_find_node_by_path(...); of_property_read_string(...); of_get_named_gpio_flags(...); gpio_request(...); gpio_direction_output(...);找设备树节点检查 compatible解析 gpios 属性申请 GPIO初始化输出模式默认输出低电平3用了 ioctl 而不是 writeioctl可传入更多的常数来控制设备以下就是humidifier_gpio_driver.c#include linux/module.h #include linux/platform_device.h #include linux/miscdevice.h #include linux/fs.h #include linux/uaccess.h #include linux/gpio/consumer.h #include linux/of.h /* _IOW 写命令 H 幻数随便写 0 命令号 int 要传递的数据类型 用途应用程序发这个命令就能控制 GPIO 高低电平。 */ #define IOCTL_HUMI_SET _IOW(H, 0, int) static struct gpio_desc *humi_gpio; //ioctl 函数应用层控制硬件的入口 //把应用层数据传入内核并操作io static long humi_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int value; if (copy_from_user(value, (int __user *)arg, sizeof(int))) return -EFAULT; gpiod_set_value(humi_gpio, !!value); return 0; } /* unlocked_ioctl compat_ioctl */ static const struct file_operations humi_fops { .owner THIS_MODULE, .unlocked_ioctl humi_ioctl, .compat_ioctl humi_ioctl, }; static struct miscdevice humi_misc { .minor MISC_DYNAMIC_MINOR, // 自动分配次设备号 .name humidifier, // 设备名 /dev/humidifier .fops humi_fops, // 关联操作函数 }; //Platform 驱动的探测函数 static int humi_probe(struct platform_device *pdev) { humi_gpio devm_gpiod_get(pdev-dev, NULL, GPIOD_OUT_LOW); if (IS_ERR(humi_gpio)) return PTR_ERR(humi_gpio); misc_register(humi_misc); dev_info(pdev-dev, HUMI probe ok\n); return 0; } //设备树匹配表 static const struct of_device_id humi_of_match[] { { .compatible rzroomi,humidifier }, {}, }; //告诉内核这个驱动支持的设备。 MODULE_DEVICE_TABLE(of, humi_of_match); //把 probe 函数和匹配表绑定到 Platform 驱动。 static struct platform_driver humi_driver { .probe humi_probe, .driver { .name humidifier, .of_match_table humi_of_match, }, }; // 给 main.c 调用 int humi_probe_register(void) { return platform_driver_register(humi_driver); } void humi_probe_unregister(void) { platform_driver_unregister(humi_driver); }另外两个打开PWM的代码自动创建设备了似乎也不需要写驱动了。以下就是main.c#include linux/module.h extern int led_probe_register(void); extern void led_probe_unregister(void); extern int fan_probe_register(void); extern void fan_probe_unregister(void); extern int humi_probe_register(void); extern void humi_probe_unregister(void); static int __init smart_driver_init(void) { led_probe_register(); fan_probe_register(); humi_probe_register(); return 0; } // 总出口唯一 static void __exit smart_driver_exit(void) { humi_probe_unregister(); fan_probe_unregister(); led_probe_unregister(); } module_init(smart_driver_init); module_exit(smart_driver_exit); MODULE_LICENSE(GPL);这次的代码使用了四个.c文件主程序是main.c。然后通过Makefile结合在一起进行编译生成ko文件。代码的思路是这样的insmod main.ko后驱动代码里先会去匹配设备比如先匹配humi_probe_registerPlatform 驱动根据所给的namecompatible对应设备树内容获取gpios然后就会执行humi_probe函数在里面执行devm_gpiod_get申请gpio的使用权然后设置默认默认输出低电平然后执行misc_register(humi_misc);作用就是创建字符设备也就是上期代码里的cdevinitclass_createdevice_create.当应用对其控制就可以执行命令iocrt(H, 1, int)设置gpio为高就可以打开这个加湿器比上一期的wirte更加灵活因为可以修改参数。三天的笔记到这了如有错误请大佬指正

相关文章:

3.23-3.25笔记

这期实现温湿度采集、光照强度监测、智能设备控制(加湿器、PWM 调光 LED、PWM 调速风扇)确定引脚,根据原理图找出可以使用的引脚开关。根据手册信息PWM口GPIO0_D0和GPIO0_C6,把设备树GPIO0_D0做5G的复位disable,再加入…...

2024具身智能技术全景解析:从人形机器人到AGI的硬件与算法协同进化

1. 具身智能:当机器人学会"思考"和"行动" 想象一下,你家的扫地机器人不仅能自动规划路线清洁地板,还能在你做饭时递调料瓶、在你工作疲惫时泡一杯咖啡——这不是科幻电影,而是具身智能技术正在实现的场景。具…...

关于腾讯广告算法大赛2025项目分析1 - dataset.py

把原始 jsonl 用户行为序列,转成模型能直接吃的张量tensor和特征字典 一、整体定位 MyDataset 读取训练数据,产出: 用户序列 seq正样本 pos负样本 negtoken 类型各类特征时间特征相关原始时间戳 MyTestDataset 读取测试/推理数据,产出 用户序…...

5大核心功能重塑Sketch效率:RenameIt批量命名工具的流程优化实践

5大核心功能重塑Sketch效率:RenameIt批量命名工具的流程优化实践 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 在现代UI/UX设计工作流中&#x…...

【adb端口5555】烽火hg680系列安卓9线刷全攻略:告别强制升级与花屏困扰

1. 烽火HG680系列机顶盒的痛点与解决方案 最近在折腾烽火HG680-GY和HG680-GC这两款机顶盒的朋友应该都深有体会,官方系统用着用着就会弹出强制升级提示,有时候还会莫名其妙出现花屏问题。作为一个折腾过不下20台烽火盒子的老玩家,我太理解这种…...

OpenClaw多模型切换指南:ollama-QwQ-32B与本地小模型协同工作

OpenClaw多模型切换指南:ollama-QwQ-32B与本地小模型协同工作 1. 为什么需要多模型协同 去年冬天,当我第一次尝试用OpenClaw自动整理电脑里堆积如山的论文时,发现一个尴尬的问题:简单的文件分类任务消耗了过多token。每次让大模…...

避免这些坑!Unity2D界面转换中常见的动画事件处理问题及解决方案

避免这些坑!Unity2D界面转换中常见的动画事件处理问题及解决方案 在Unity2D游戏开发中,界面转换是提升用户体验的关键环节。一个流畅的淡入淡出效果能让场景切换更加自然,但很多开发者在实际操作中常会遇到动画事件不触发、协程执行异常等问题…...

终极指南:使用compressorjs实现专业级前端图片压缩与编辑功能

终极指南:使用compressorjs实现专业级前端图片压缩与编辑功能 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库,使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs…...

5分钟完成Axure RP界面本地化:从英文障碍到高效操作的蜕变指南

5分钟完成Axure RP界面本地化:从英文障碍到高效操作的蜕变指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-c…...

从松到深:解析组合导航三大模式的演进路径与实战选型

1. 组合导航的底层逻辑与技术演进 第一次接触组合导航系统时,我被这个看似简单的概念惊艳到了——把两种完全不同的定位技术融合在一起,竟然能产生11>2的效果。这就像做菜时的黄金搭档,比如西红柿和鸡蛋单独吃都不错,但炒在一起…...

CasRel开源大模型部署教程:一键拉取镜像+5分钟完成SPO推理

CasRel开源大模型部署教程:一键拉取镜像5分钟完成SPO推理 1. 什么是CasRel关系抽取模型 如果你需要从大段文字中自动找出"谁做了什么"、"谁是什么"这样的信息,CasRel模型就是你的得力助手。这个模型专门用来从文本中提取主体-谓语…...

西门子S7-1200 PLC如何通过EtherCat转Profinet网关实现高效IO控制?5步搞定配置

西门子S7-1200 PLC与EtherCat设备的高效集成:5步实现Profinet网关配置 在工业自动化领域,不同协议设备之间的无缝通信一直是工程师面临的挑战。当您需要将EtherCat设备接入西门子S7-1200 PLC的Profinet网络时,协议转换网关成为关键桥梁。本文…...

贝叶斯岭回归实战:用Python搞定金融数据预测(附完整代码)

贝叶斯岭回归实战:用Python搞定金融数据预测(附完整代码) 金融市场的波动性一直是投资者和分析师关注的焦点。在瞬息万变的股票市场中,能够准确预测价格走势意味着巨大的商业价值。传统的时间序列分析方法如ARIMA虽然经典&#xf…...

STC15W4K32S4寄存器操作避坑指南:为什么你的PWM输出异常?(附完整初始化流程图)

STC15W4K32S4寄存器操作避坑指南:为什么你的PWM输出异常? 最近在调试STC15W4K32S4的PWM功能时,发现不少开发者都会遇到一些共性问题:明明按照手册配置了寄存器,PWM输出就是不稳定或者干脆没有波形。这些问题往往源于几…...

黑马点评技术汇总(一)验证码登录

一、session实现验证码登录总思路: 前端提交手机号发起code请求,服务端校验手机号是否符合格式,成功后生成验证码存入session并发送给用户。 用户提交手机号和验证码验证手机是否符合格式(这里有个bug)验证码是否和ses…...

本地部署 Ollama + DeepSeek 完整指南:免费跑大模型,数据不出本地

本地部署 Ollama DeepSeek 完整指南:免费跑大模型,数据不出本地不花一分钱,不用科学上网,在自己电脑上跑 DeepSeek 大模型,这篇教程手把手带你搞定一、为什么要本地部署? 很多人用 AI 工具都是调用云端 AP…...

MinerU本地部署安全吗?数据隐私保护实战配置

MinerU本地部署安全吗?数据隐私保护实战配置 1. 引言:当AI遇见你的敏感文档 想象一下这个场景:你有一份包含商业机密的合同PDF,或者一份涉及个人隐私的医疗报告扫描件。你想用AI快速提取里面的关键信息,但又担心把文…...

从 POST 到落库回写:彻底讲透 SAP Gateway 中 Create Operation 的实现

在经典的 SAP Gateway 开发里,Create Operation 看上去只是一次新增动作,真正落到运行时,却牵涉到一条非常完整的链路:客户端发起 HTTP POST 请求,请求体里的 OData 数据被 Gateway 运行时反序列化成 ABAP 结构,开发者在对应的 <Entity Set>_CREATE_ENTITY 方法里接…...

论文检测「生死局」破局指南:Paperxie 四大降重方案,精准对抗知网 / 维普 AIGC 检测

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述https://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 凌晨三点的电脑屏幕前&#xff0c;你盯着知网 AIGC 检测报告上刺眼的「99.8% 疑似度」&#xff0c;指尖冰凉 —— 刚写完的毕…...

DAC高速线缆市场洞察:预计到2032年将增长至180.8亿元

据恒州诚思调研统计&#xff0c;2025年全球DAC高速线缆市场规模达66.60亿元&#xff0c;预计到2032年将增长至180.8亿元&#xff0c;2026-2032年复合增长率&#xff08;CAGR&#xff09;为14.7%。作为数据中心短距离互连的核心组件&#xff0c;DAC高速线缆凭借其低延迟、高可靠…...

Motorcad外转子式永磁同步电机设计案例:高效能42极36槽直流无刷电机,功率密度出众,转...

Motorcad 外转子式42极36槽 永磁同步电机&#xff0c;直流无刷电机设计案例&#xff0c;。 该电机55kw,220rpm,功率密度较高这个外转子永磁同步电机的设计有点意思。55kW的功率硬是塞进不到0.3立方米的体积里&#xff0c;220转的低转速下要输出2500牛米的扭矩&#xff0c;活脱脱…...

用MobaXterm替代传统终端的完整指南

Windows远程运维革命&#xff1a;用MobaXterm替代传统终端的完整指南 每次打开 PuTTY 时&#xff0c;你是否会对着那个灰暗的界面叹气&#xff1f;当需要在Xshell中频繁切换标签时&#xff0c;是否感到效率低下&#xff1f;作为Windows系统管理员或开发者&#xff0c;我们长期忍…...

如何通过3个步骤快速掌握BetaFlight黑匣子日志分析

如何通过3个步骤快速掌握BetaFlight黑匣子日志分析 【免费下载链接】blackbox-log-viewer Interactive log viewer for flight logs recorded with blackbox 项目地址: https://gitcode.com/gh_mirrors/bl/blackbox-log-viewer 你是否曾经在调试无人机飞行问题时感到束手…...

5分钟掌握ViGEmBus虚拟手柄驱动:Windows游戏控制器模拟终极指南

5分钟掌握ViGEmBus虚拟手柄驱动&#xff1a;Windows游戏控制器模拟终极指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows电脑上体验专业级的…...

OpenClaw+Qwen3-32B双剑合璧:个人知识库的智能维护方案

OpenClawQwen3-32B双剑合璧&#xff1a;个人知识库的智能维护方案 1. 为什么需要自动化知识管理 作为一个长期依赖个人知识库的内容创作者&#xff0c;我发现自己正陷入"信息过载"的困境。每天需要处理的网页文章、PDF报告、会议录音等碎片化内容超过20份&#xff…...

OpenClaw任务编排技巧:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF复杂流程分解策略

OpenClaw任务编排技巧&#xff1a;Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF复杂流程分解策略 1. 为什么需要任务编排 上周我尝试用OpenClaw自动完成一篇技术博客的写作和发布&#xff0c;结果遭遇了连环翻车&#xff1a;模型先花20分钟生成了偏离主题的初稿&…...

JavaWeb Listener 监听器详解:三大域对象监听 + 在线人数统计实战

前言Listener&#xff08;监听器&#xff09;是 JavaWeb 三大组件最后一个&#xff0c;专门用于监听 Web 域对象的创建、销毁、属性变化&#xff0c;在事件触发时自动执行逻辑。它是基于观察者模式实现&#xff0c;常用于&#xff1a;服务器初始化、在线用户统计、Session 监听…...

手把手推导NCP1380准谐振反激公式:用Mathcad复现ON官方计算书(附推导过程)

从零推导NCP1380准谐振反激公式&#xff1a;Mathcad实战全解析 当电源工程师第一次打开NCP1380官方计算书时&#xff0c;那些看似魔术般直接呈现的公式往往让人既兴奋又困惑。兴奋的是有了现成的设计工具&#xff0c;困惑的是这些公式背后的物理本质和数学逻辑被隐藏在技术文档…...

浏览器兼容性问题汇总

1.IE10版本以上浏览器input标签后面自带一个X问题IE10&#xff0c;IE11浏览器当点击input text文本框时&#xff0c;输入文本后出现一个删除功能的X按钮IE浏览器效果&#xff0c;而谷歌浏览器没有解决方案&#xff1a;给input添加如下CSS样式 input::-ms-clear{display:none;}2…...

基于单周期控制的交错并联无桥Boost PFC变换器:宽电压范围与高效率转换技术实现高效电源管理

基于单周期控制的两相交错并联无桥Boost型 PFC 变换器 采用两路 Boost PFC 交错并联实现的&#xff0c;每一路的控制方式和结构都是相同的&#xff0c;由此推出控制方法相同&#xff0c;都为单周期控制&#xff0c;所以只分析一路的结果就可以类比 1、输入电压&#xff1a;150V…...