蚂蚁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/10/3 6:22:20 阅读更多 →
卡美德生物科普|SLT-IIE(志贺样毒素IIE型)靶点结构与科研应用探析

卡美德生物科普|SLT-IIE(志贺样毒素IIE型)靶点结构与科研应用探析

SLT-IIE是微生物科研领域极具研究意义的经典功能性蛋白靶点,属于志贺样毒素家族的重要亚型,广泛存在于致病性大肠杆菌等微生物中。该蛋白具备典型的AB型毒素结构特征,依靠独特的结构构型实现宿主细胞识别、结合与内化调控,是研究微…

2026/10/6 17:22:43 阅读更多 →
卡美德生物科普|SLITRK6(神经跨膜调控蛋白)靶点功能与科研应用详解

卡美德生物科普|SLITRK6(神经跨膜调控蛋白)靶点功能与科研应用详解

在神经发育生物学与膜蛋白分子调控研究领域,SLITRK6是具备高研究价值的特异性功能靶点。作为SLITRK家族的经典跨膜蛋白,其依托独特的蛋白结构,深度参与神经细胞黏附、细胞分化、神经微环境稳态调控等多项核心生命活动。相较于普通膜蛋白&…

2026/10/10 14:22:18 阅读更多 →

最新新闻

PAM认证模块源码编译与升级实战:从1.3.0到1.3.1

PAM认证模块源码编译与升级实战:从1.3.0到1.3.1

简介:Linux-PAM(Pluggable Authentication Modules)1.3.0源代码包,面向Linux系统管理员、安全运维人员及开发者,用于理解并定制登录、服务访问等场景下的模块化认证机制。PAM以插件方式将认证逻辑从服务程序中解耦&…

2026/10/11 12:56:41 阅读更多 →
Linux-PAM 1.3.x编译安装全攻略:从认证架构到账户锁定实战

Linux-PAM 1.3.x编译安装全攻略:从认证架构到账户锁定实战

简介:这份 Linux-PAM 1.3.0 源码包面向系统管理员、运维工程师与安全方向学习者,用于在 Linux 上部署和定制可插拔认证模块(PAM),解决多服务统一认证、密码策略、访问控制等场景需求,也适合需要深入理解认证…

2026/10/11 12:56:41 阅读更多 →
diffpdf 实战:PDF 内容比对原理、模式选型与自动化核对流水线

diffpdf 实战:PDF 内容比对原理、模式选型与自动化核对流水线

简介:diffpdf是一款面向文档审阅、校对与版本核对场景的PDF比较工具,适合软件开发、学术论文校对、法律合同审查及出版校样等需要快速定位两版文档差异的用户。它提供格式比对与文本比对两种模式,前者兼顾字体、字号、颜色与排版差异&#xf…

2026/10/11 12:56:41 阅读更多 →
LangAlpha 架构深度解析:多 Worker 后端、SSE 流式与沙箱文件持久化如何支撑 AI 金融研究助手

LangAlpha 架构深度解析:多 Worker 后端、SSE 流式与沙箱文件持久化如何支撑 AI 金融研究助手

【免费下载链接】LangAlpha Claude Code for Financial Market 项目地址: https://gitcode.com/gh_mirrors/la/LangAlpha 点击查看 免费下载 LangAlpha 是一款面向金融市场的开源 AI Agent 研究助手(Claude Code for Financial Market)&…

2026/10/11 12:56:41 阅读更多 →
基于UDP的Linux Socket编程:简单聊天室实现与踩坑指南

基于UDP的Linux Socket编程:简单聊天室实现与踩坑指南

最近在折腾一个内网消息推送的小工具:一台服务端要往十几个终端上发状态通知,每条消息撑死几十个字节,频率也不算高。一开始我用 TCP 写,结果发现每个终端都要维护一个 socket、处理重连、还要考虑半包粘包,代码越写越…

2026/10/11 12:56:41 阅读更多 →
深度学习交通流量预测与可视化:从LSTM时序模型到FastAPI+ECharts部署

深度学习交通流量预测与可视化:从LSTM时序模型到FastAPI+ECharts部署

简介:基于深度学习的交通流量预测可视化网站完整源码包,面向计算机、数学、电子信息等专业学生的课程设计、期末大作业与毕业设计场景,也适合深度学习入门者作为项目实战参考。包体共2007个文件,压缩包大小约102.37MB,…

2026/10/11 12:55:40 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →