参考蚂蚁S9矿板引脚定义.csdnPS GPIO 测试# 内核配置CONFIG_GPIO_SYSFSyCONFIG_GPIO_ZYNQygpio子系统测试Zynq Linux GPIO 编号计算GPIO编号GPIO_BASE MIO编号 当前 GPIO_BASE906所以LEDMIOLinux GPIOREDMIO37943GREENMIO38944# 查看 GPIO 控制器rootantbase:~# cat /sys/class/gpio/gpiochip906/labelzynq_gpio# 导出红灯rootantbase:~# echo 943 /sys/class/gpio/exportrootantbase:~# ls /sys/class/gpio/exportgpio943 gpio953 gpio957 gpiochip906 unexport rootantbase:~# echo out /sys/class/gpio/gpio943/direction# 红灯亮rootantbase:~# echo 1 /sys/class/gpio/gpio943/value# 红灯灭rootantbase:~# echo 0 /sys/class/gpio/gpio943/value# 导出绿灯rootantbase:~# echo 944 /sys/class/gpio/exportrootantbase:~# echo out /sys/class/gpio/gpio944/direction# 绿灯亮rootantbase:~# echo 1 /sys/class/gpio/gpio944/value# 绿灯灭rootantbase:~# echo 0 /sys/class/gpio/gpio944/valueled.ko 驱动测试led.c#includelinux/types.h#includelinux/kernel.h#includelinux/init.h#includelinux/module.h#includelinux/fs.h#includelinux/uaccess.h#includeasm/io.h/* * 字符设备 */#defineLED_MAJOR200#defineLED_NAMEled/* * Zynq-7000 PS GPIO寄存器 * * GPIO: * * Bank0: * MIO0 ~ MIO31 * * Bank1: * MIO32 ~ MIO53 * */#defineZYNQ_GPIO_REG_BASE0xE000A000/* * Bank1 GPIO寄存器偏移 * * DATA: * Bank0 0x40 * Bank1 0x44 * * DIRM: * Bank0 0x204 * Bank1 0x244 * * OUTEN: * Bank0 0x208 * Bank1 0x248 * * INTDIS: * Bank0 0x214 * Bank1 0x254 */#defineDATA_OFFSET0x44// GPIO 数据寄存器偏移地址#defineDIRM_OFFSET0x244// GPIO 方向控制寄存器偏移地址#defineOUTEN_OFFSET0x248// GPIO 输出使能寄存器偏移地址#defineINTDIS_OFFSET0x254// GPIO 中断禁止寄存器偏移地址/* * PS GPIO时钟 * * APER_CLK_CTRL bit22 */#defineAPER_CLK_CTRL0xF800012C/* * LED GPIO定义 * * 注意: * * MIO编号 ! GPIO寄存器bit * * Bank1: * * MIO32 - bit0 * MIO33 - bit1 * ... * * MIO37 - bit5 * MIO38 - bit6 * */#defineRED_PIN5// MIO37#defineGREEN_PIN6// MIO38/* * GPIO虚拟地址 */staticvoid__iomem*data_addr;staticvoid__iomem*dirm_addr;staticvoid__iomem*outen_addr;staticvoid__iomem*intdis_addr;staticvoid__iomem*aper_clk_addr;/* * 打开设备 */staticintled_open(structinode*inode,structfile*filp){printk(KERN_INFOled open\n);return0;}/* * 读取 * * 未实现 */staticssize_tled_read(structfile*filp,char__user*buf,size_tcnt,loff_t*offt){return0;}/* * 写LED控制 * * 命令: * * 0x01 RED ON * 0x02 RED OFF * * 0x03 GREEN ON * 0x04 GREEN OFF * */staticssize_tled_write(structfile*filp,constchar__user*buf,size_tcnt,loff_t*offt){charcmd;u32 val;printk(KERN_INFOled_write cnt%ld\n,cnt);/* * 只接受一个字节 */if(cnt!1){printk(KERN_ERRinvalid count%ld\n,cnt);return-EINVAL;}/* * 用户空间复制到内核 */if(copy_from_user(cmd,buf,1)){printk(KERN_ERRcopy_from_user failed\n);return-EFAULT;}printk(KERN_INFOLED cmd0x%02x\n,(unsignedchar)cmd);/* * 读取当前GPIO状态 */valreadl(data_addr);switch(cmd){/* * RED ON * * MIO37 1 */case0x01:val|(1URED_PIN);printk(KERN_INFORED ON\n);break;/* * RED OFF * * MIO37 0 */case0x02:val~(1URED_PIN);printk(KERN_INFORED OFF\n);break;/* * GREEN ON * * MIO38 1 */case0x03:val|(1UGREEN_PIN);printk(KERN_INFOGREEN ON\n);break;/* * GREEN OFF * * MIO38 0 */case0x04:val~(1UGREEN_PIN);printk(KERN_INFOGREEN OFF\n);break;default:printk(KERN_WARNINGunknown cmd0x%02x\n,(unsignedchar)cmd);return-EINVAL;}/* * 更新GPIO输出 */writel(val,data_addr);/* * 等待写入完成 */readl(data_addr);returncnt;}/* * 关闭设备 */staticintled_release(structinode*inode,structfile*filp){printk(KERN_INFOled release\n);return0;}staticstructfile_operationsled_fops{.ownerTHIS_MODULE,.openled_open,.readled_read,.writeled_write,.releaseled_release,};staticint__initled_init(void){u32 val;intret;/* * 映射GPIO寄存器 */data_addrioremap(ZYNQ_GPIO_REG_BASEDATA_OFFSET,4);dirm_addrioremap(ZYNQ_GPIO_REG_BASEDIRM_OFFSET,4);outen_addrioremap(ZYNQ_GPIO_REG_BASEOUTEN_OFFSET,4);intdis_addrioremap(ZYNQ_GPIO_REG_BASEINTDIS_OFFSET,4);aper_clk_addrioremap(APER_CLK_CTRL,4);if(!data_addr||!dirm_addr||!outen_addr||!intdis_addr||!aper_clk_addr){printk(KERN_ERRioremap failed\n);return-ENOMEM;}/* * 开启GPIO时钟 */valreadl(aper_clk_addr);val|(122);writel(val,aper_clk_addr);/* * 禁止GPIO中断 * * Bank1: * * MIO37 bit5 * MIO38 bit6 */valreadl(intdis_addr);val|(1RED_PIN)|(1GREEN_PIN);writel(val,intdis_addr);/* * 设置输出方向 * * 1 输出 */valreadl(dirm_addr);val|(1RED_PIN)|(1GREEN_PIN);writel(val,dirm_addr);/* * 开启输出 */valreadl(outen_addr);val|(1RED_PIN)|(1GREEN_PIN);writel(val,outen_addr);/* * 默认关闭LED * * 当前假设: * * GPIO0 灭 * * 如果硬件低有效 * 这里需要改成置1 */valreadl(data_addr);val~((1RED_PIN)|(1GREEN_PIN));writel(val,data_addr);/* * 注册字符设备 */retregister_chrdev(LED_MAJOR,LED_NAME,led_fops);if(ret0){printk(KERN_ERRregister_chrdev failed\n);iounmap(data_addr);iounmap(dirm_addr);iounmap(outen_addr);iounmap(intdis_addr);iounmap(aper_clk_addr);returnret;}printk(KERN_INFOZynq PS GPIO LED driver loaded\n);printk(KERN_INFOREDMIO37(GPIO943) GREENMIO38(GPIO944)\n);return0;}staticvoid__exitled_exit(void){u32 val;/* * 关闭LED */valreadl(data_addr);val~((1RED_PIN)|(1GREEN_PIN));writel(val,data_addr);unregister_chrdev(LED_MAJOR,LED_NAME);iounmap(data_addr);iounmap(dirm_addr);iounmap(outen_addr);iounmap(intdis_addr);iounmap(aper_clk_addr);printk(KERN_INFOLED driver unloaded\n);}module_init(led_init);module_exit(led_exit);MODULE_AUTHOR(ming);MODULE_DESCRIPTION(Zynq7010 PS GPIO MIO37 MIO38 LED Driver);MODULE_LICENSE(GPL);test_led.py#!/usr/bin/env python# -*- coding: utf-8 -*-importtimeimportos DEV_PATH/dev/leddefled_write(cmd):try:withopen(DEV_PATH,wb)asf:f.write(chr(cmd))exceptExceptionase:print(LED write error:,e)defred_on():print(RED ON)led_write(0x01)defred_off():print(RED OFF)led_write(0x02)defgreen_on():print(GREEN ON)led_write(0x03)defgreen_off():print(GREEN OFF)led_write(0x04)if__name____main__:red_on()time.sleep(2)red_off()green_on()time.sleep(2)green_off()测试rootantbase:~# insmod led.koZynq PS GPIO LED driver loadedREDMIO37GREENMIO38# 红灯亮rootantbase:~# printf \x01 /dev/ledledopenled_writecnt1LEDcmd0x01 RED ON led release# 红灯灭rootantbase:~# printf \x02 /dev/ledledopenled_writecnt1LEDcmd0x02 RED OFF led release# 绿灯亮rootantbase:~# printf \x03 /dev/ledledopenled_writecnt1LEDcmd0x03 GREEN ON led release# 绿灯灭rootantbase:~# printf \x04 /dev/ledledopenled_writecnt1LEDcmd0x04 GREEN OFF led release# python 测试rootantbase:~# python test_led.pyRED ON ledopenled_writecnt1LEDcmd0x01 RED ON led release RED OFF ledopenled_writecnt1LEDcmd0x02 RED OFF led release GREEN ON ledopenled_writecnt1LEDcmd0x03 GREEN ON led release GREEN OFF ledopenled_writecnt1LEDcmd0x04 GREEN OFF led release
企业数字化 ERP 产品动态
相关推荐
3步轻松玩转Switch游戏:Ryujinx模拟器完整免费教程 3步轻松玩转Switch游戏:Ryujinx模拟器完整免费教程 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx
想在电脑上畅玩《塞尔达传说:旷野之息》却不想购买Switch主机… · 2026/11/5 13:13:26
终极指南:如何在Among Us中实现沉浸式近距离语音聊天 终极指南:如何在Among Us中实现沉浸式近距离语音聊天 【免费下载链接】CrewLink Free, open, Among Us Proximity Chat 项目地址: https://gitcode.com/gh_mirrors/cr/CrewLink
CrewLink是一款革命性的免费开源工具,专为《Among Us》玩家设计&… · 2026/11/5 13:13:27
PubMedBERT语义嵌入模型:生物医学文本处理的终极指南 PubMedBERT语义嵌入模型:生物医学文本处理的终极指南 【免费下载链接】pubmedbert-base-embeddings 项目地址: https://ai.gitcode.com/hf_mirrors/NeuML/pubmedbert-base-embeddings
在生物医学研究领域,海量文献的高效处理一直是科研人员面临的… · 2026/11/2 0:08:21
PIPE4.3.0安装排错:JDK版本、JAVA_HOME与Petri验证 简介:PIPE 4.3.0 是一款基于 Petri 网的图形化建模与仿真软件,面向软件工程、系统分析与教学实验场景,帮助读者完成并发、同步与竞争等系统行为的建模、动态仿真及性质分析。压缩包共 2391 个文件,约 28.43MB,包含大量… · 2026/11/5 13:12:45
用栈实现队列:双栈结构与工程实践 1. 栈与队列的相爱相杀第一次看到这个题目时,我正坐在星巴克啃着牛角包。用栈实现队列?这就像用筷子喝汤——不是不行,但总觉得哪里怪怪的。栈和队列这对数据结构里的欢喜冤家,一个后进先出(LIFO)ÿ… · 2026/11/5 13:12:45
锂电池PACK生产数字孪生平台架构与实现 1. 锂电池PACK生产数字孪生平台建设背景 在新能源行业快速发展的当下,锂电池PACK生产面临着前所未有的质量管控挑战。传统生产模式下,工艺参数分散在各个设备中,质量数据追溯困难,设备之间缺乏有效协同,这些问题直接影… · 2026/11/5 13:10:43
C++数字三角形问题与dp算法 前言
数字三角形是一道经典的动态规划(dynamic programming, DP)入门题:给定一个由数字组成的三角形,从顶部出发,每次只能走到下一行相邻的两个位置之一,求到达底部时路径上数字之和的最大值。它的规模不大… · 2026/11/5 12:59:38
美赛C题Wordle建模:ARIMA预测、PLS回归与K-means分档 简介:这份2023年美赛C题M奖论文以Wordle游戏数据为研究对象,面向美赛参赛者、数据分析学习者及需要毕业设计参考的读者,提供一套从数据预处理到建模评估的完整研究范例。全文围绕时间序列预测、不同尝试次数得分百分比预测、单词词性与难度分… · 2026/11/5 12:59:38
多因变量无标签小样本:ARIMA、PLS与K-means建模 简介:面向美赛参赛者与数据分析学习者的2023年美赛C题M论文,聚焦Wordle游戏数据的分析与预测,可作为竞赛论文写作、时间序列与多变量建模的学习参考,也适合毕业设计中的案例借鉴。全文围绕数据清洗与标准化、基于9个单词属性的Spe… · 2026/11/5 12:59:38
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07