蚂蚁S9矿板PS 蜂鸣器驱动
参考蚂蚁S9矿板引脚定义.csdn蚂蚁S9矿板PS led驱动的四个实验-第1课 字符设备驱动.csdn蚂蚁S9矿板PS led驱动的四个实验-第2课 设备树下的led驱动.csdn蚂蚁S9矿板PS led驱动的四个实验-第3课 gpio子系统下的led驱动.csdn蚂蚁S9矿板PS led驱动的四个实验-第4课 设备驱动框架下的led驱动.csdn设备树system-user.dtsi#include dt-bindings/gpio/gpio.h#include dt-bindings/input/input.h#include dt-bindings/media/xilinx-vip.h#include dt-bindings/phy/phy.h/{modelz7 Board ant111;compatiblexlnx,zynq-zc702,xlnx,zynq-7000;chosen{bootargsconsolettyPS0,115200 earlyconcdns,mmio,0xe0000000,115200n8 keep_bootcon earlyprintk root/dev/mmcblk0p2 rw rootwait;stdout-pathserial0:115200n8;};beeper{compatibleming,beeper;statusokay;default-stateoff;beeper-gpiogpio037GPIO_ACTIVE_HIGH;};};驱动 beeper.kobeeper.c#includelinux/types.h#includelinux/kernel.h#includelinux/delay.h#includelinux/ide.h#includelinux/init.h#includelinux/module.h#includelinux/errno.h#includelinux/gpio.h#includeasm/mach/map.h#includeasm/uaccess.h#includeasm/io.h#includelinux/cdev.h#includelinux/of.h#includelinux/of_address.h#includelinux/of_gpio.h#defineBEEPER_CNT1/* 设备号个数 */#defineBEEPER_NAMEbeeper/* 名字 *//* dtsled设备结构体 */structbeeper_dev{dev_tdevid;/* 设备号 */structcdevcdev;/* cdev */structclass*class;/* 类 */structdevice*device;/* 设备 */intmajor;/* 主设备号 */intminor;/* 次设备号 */structdevice_node*nd;/* 设备节点 */intgpio;/* LED所使用的GPIO编号 */};staticstructbeeper_devbeeper;/* led设备 *//* * description : 打开设备 * param – inode : 传递给驱动的inode * param – filp : 设备文件file结构体有个叫做private_data的成员变量 * 一般在open的时候将private_data指向设备结构体。 * return : 0 成功;其他 失败 */staticintbeeper_open(structinode*inode,structfile*filp){return0;}/* * description : 从设备读取数据 * param – filp : 要打开的设备文件(文件描述符) * param – buf : 返回给用户空间的数据缓冲区 * param – cnt : 要读取的数据长度 * param – offt : 相对于文件首地址的偏移 * return : 读取的字节数如果为负值表示读取失败 */staticssize_tbeeper_read(structfile*filp,char__user*buf,size_tcnt,loff_t*offt){return0;}/* * description : 向设备写数据 * param – filp : 设备文件表示打开的文件描述符 * param – buf : 要写给设备写入的数据 * param – cnt : 要写入的数据长度 * param – offt : 相对于文件首地址的偏移 * return : 写入的字节数如果为负值表示写入失败 */staticssize_tbeeper_write(structfile*filp,constchar__user*buf,size_tcnt,loff_t*offt){charvalue;printk(KERN_INFObeeper_write: cnt%zu\n,cnt);/* 只接受 1 个字节 */if(cnt!1){printk(KERN_ERRinvalid count%zu\n,cnt);return-EINVAL;}/* 从用户空间读取 1 字节 */if(copy_from_user(value,buf,1)){printk(KERN_ERRcopy_from_user failed\n);return-EFAULT;}printk(KERN_INFObeeper_write: value%d\n,value);gpio_set_value(beeper.gpio,value?1:0);/* 返回实际写入的字节数 */return1;}/* * description : 关闭/释放设备 * param – filp : 要关闭的设备文件(文件描述符) * return : 0 成功;其他 失败 */staticintbeeper_release(structinode*inode,structfile*filp){return0;}/* 设备操作函数 */staticstructfile_operationsbeeper_fops{.ownerTHIS_MODULE,.openbeeper_open,.readbeeper_read,.writebeeper_write,.releasebeeper_release,};staticint__initbeeper_init(void){constchar*str;intret;/* 1.获取beeper设备节点 */beeper.ndof_find_node_by_path(/beeper);if(NULLbeeper.nd){printk(KERN_ERRbeeper: Failed to get beeper node\n);return-EINVAL;}/* 2.读取status属性 */retof_property_read_string(beeper.nd,status,str);if(!ret){if(strcmp(str,okay))return-EINVAL;}/* 2、获取compatible属性值并进行匹配 */retof_property_read_string(beeper.nd,compatible,str);if(0ret){printk(KERN_ERRbeeper: Failed to get compatible property\n);returnret;}if(strcmp(str,ming,beeper)){printk(KERN_ERRbeeper: Compatible match failed\n);return-EINVAL;}printk(KERN_INFObeeper: device matching successful!\r\n);/* 4.获取设备树中的beeper-gpio属性得到蜂鸣器所使用的GPIO编号 */beeper.gpioof_get_named_gpio(beeper.nd,beeper-gpio,0);if(!gpio_is_valid(beeper.gpio)){printk(KERN_ERRbeeper: Failed to get beeper-gpio\n);return-EINVAL;}printk(KERN_INFObeeper: beeper-gpio num %d\r\n,beeper.gpio);/* 5.向gpio子系统申请使用GPIO */retgpio_request(beeper.gpio,Beeper gpio);if(ret){printk(KERN_ERRbeeper: Failed to request gpio num %d\n,beeper.gpio);returnret;}/* 6.将gpio管脚设置为输出模式 */gpio_direction_output(beeper.gpio,0);/* 7.设置蜂鸣器的初始状态 */retof_property_read_string(beeper.nd,default-state,str);if(!ret){if(!strcmp(str,on))gpio_set_value(beeper.gpio,1);elsegpio_set_value(beeper.gpio,0);}elsegpio_set_value(beeper.gpio,0);/* 8.注册字符设备驱动 *//* 创建设备号 */if(beeper.major){beeper.devidMKDEV(beeper.major,0);retregister_chrdev_region(beeper.devid,BEEPER_CNT,BEEPER_NAME);if(ret)gotoout1;}else{retalloc_chrdev_region(beeper.devid,0,BEEPER_CNT,BEEPER_NAME);if(ret)gotoout1;beeper.majorMAJOR(beeper.devid);beeper.minorMINOR(beeper.devid);}printk(beeper: major%d,minor%d\r\n,beeper.major,beeper.minor);/* 初始化cdev */beeper.cdev.ownerTHIS_MODULE;cdev_init(beeper.cdev,beeper_fops);/* 添加一个cdev */retcdev_add(beeper.cdev,beeper.devid,BEEPER_CNT);if(ret)gotoout2;/* 创建类 */beeper.classclass_create(THIS_MODULE,BEEPER_NAME);if(IS_ERR(beeper.class)){retPTR_ERR(beeper.class);gotoout3;}/* 创建设备 */beeper.devicedevice_create(beeper.class,NULL,beeper.devid,NULL,BEEPER_NAME);if(IS_ERR(beeper.device)){retPTR_ERR(beeper.device);gotoout4;}return0;out4:class_destroy(beeper.class);out3:cdev_del(beeper.cdev);out2:unregister_chrdev_region(beeper.devid,BEEPER_CNT);out1:gpio_free(beeper.gpio);returnret;}staticvoid__exitbeeper_exit(void){/* 注销设备 */device_destroy(beeper.class,beeper.devid);/* 注销类 */class_destroy(beeper.class);/* 删除cdev */cdev_del(beeper.cdev);/* 注销设备号 */unregister_chrdev_region(beeper.devid,BEEPER_CNT);/* 释放GPIO */gpio_free(beeper.gpio);}/* 驱动模块入口和出口函数注册 */module_init(beeper_init);module_exit(beeper_exit);MODULE_AUTHOR(ming);MODULE_DESCRIPTION(ZYNQ GPIO LED Driver);MODULE_LICENSE(GPL);测试rootant:~# insmod beeper.kobeeper: loading out-of-tree module taints kernel. beeper: device matching successful!beeper: beeper-gpio num943beeper:major244,minor0rootant:~# ls /dev/beeper/dev/beeper rootant:~# printf \x01 /dev/beeperbeeper_write:cnt1beeper_write:value1rootant:~# printf \x00 /dev/beeperbeeper_write:cnt1rootant:~# rmmod beeperrootant:~# ls /dev/beeperls: /dev/beeper: No suchfileor directory

相关新闻

SpringBoot整合Mybatis-Plus实现高效分页查询实战

SpringBoot整合Mybatis-Plus实现高效分页查询实战

1. 项目概述在Web应用开发中,分页查询是最基础也最常用的功能之一。最近接手一个后台管理系统项目时,我发现很多新人对SpringBoot整合Mybatis-Plus实现分页存在不少困惑。本文将分享我在电商平台开发中总结的分页实现方案,从配置到实战完整走…

2026/7/28 22:21:13阅读更多 →
iMetaOmics:叶绿体基因组自动化分析流程解析

iMetaOmics:叶绿体基因组自动化分析流程解析

1. 项目背景与核心价值叶绿体基因组分析在植物系统发育、物种鉴定和功能基因研究中具有不可替代的作用。传统分析方法通常需要研究人员手动执行多个独立软件工具,不仅效率低下,还容易引入人为错误。天津中医药大学田晓轩课题组开发的iMetaOmics自动化流程…

2026/7/28 22:21:13阅读更多 →
汽车电子ASIC评估模块(EVM)硬件拆解与GUI软件实战指南

汽车电子ASIC评估模块(EVM)硬件拆解与GUI软件实战指南

1. 项目概述:为什么我们需要评估模块?在芯片设计,尤其是汽车电子这类高可靠性领域,把一颗全新的ASIC(专用集成电路)直接焊到客户的最终产品板子上进行测试,无异于一场豪赌。赌输了,轻…

2026/7/28 22:19:12阅读更多 →
NSGAII算法在无人机3D路径规划中的应用与实践

NSGAII算法在无人机3D路径规划中的应用与实践

1. 项目背景与核心挑战无人机3D路径规划是当前智能飞行器领域的关键技术难题。与传统2D路径规划相比,3D空间中的路径搜索需要考虑更多维度的约束条件,包括地形起伏、障碍物分布、飞行器动力学特性等。我在实际无人机项目中经常遇到这样的场景&#xff1a…

2026/7/28 23:39:41阅读更多 →
Zephyr学习 第四章 - 1:从 DEVICE_DT_DEFINE 到 struct device

Zephyr学习 第四章 - 1:从 DEVICE_DT_DEFINE 到 struct device

04-1:从 DEVICE_DT_DEFINE 到 struct device 验证方式:Zephyr 源码、ELF/map、native_sim/native/64 验证结论:源码确认 编译确认 模拟确认 1. 本节目标 本节建立 Zephyr Device Model 的第一条完整链路: Devicetree node-> …

2026/7/28 23:39:41阅读更多 →
大模型应用开发工程师:学习路线与职业发展指南

大模型应用开发工程师:学习路线与职业发展指南

1. 大模型应用开发工程师的职业前景 大模型应用开发工程师是当前AI领域最炙手可热的岗位之一。随着大模型技术的快速发展,各行各业都在积极探索如何将大模型能力整合到实际业务场景中。从智能客服到内容创作,从数据分析到决策支持,大模型正在…

2026/7/28 23:39:41阅读更多 →
MySQL数据库开发实战:从SQL语法到索引优化与性能调优

MySQL数据库开发实战:从SQL语法到索引优化与性能调优

在实际数据库开发中,很多开发者都经历过从只会写简单增删改查,到需要面对复杂查询、性能瓶颈和线上问题的阶段。MySQL作为最流行的开源关系型数据库,其核心在于如何高效、正确地使用SQL,并理解其背后的执行逻辑。本文旨在为希望系…

2026/7/28 23:39:41阅读更多 →
无人驾驶安全验证:方法论与实践挑战

无人驾驶安全验证:方法论与实践挑战

1. 无人驾驶安全验证的行业现状与挑战 2023年全球自动驾驶技术投资规模突破850亿美元,但美国IIHS数据显示,L2级自动驾驶系统每百万英里仍会发生9.1起可避免的碰撞事故。这个矛盾揭示了行业核心痛点:如何建立可信赖的安全验证体系。我在参与某…

2026/7/28 23:39:41阅读更多 →
AU-60全功能AI语音模块:内置Codec替代分立音频链路的设计架构分析

AU-60全功能AI语音模块:内置Codec替代分立音频链路的设计架构分析

背景:分立音频Codec方案的系统成本问题在嵌入式语音处理系统中,传统的音频信号链路通常由多个分立芯片构成:ADC负责麦克风信号的模数转换,DSP或Codec执行降噪和回音消除算法,DAC负责处理后音频的数模转换,最…

2026/7/28 23:37:40阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →