2024/6/20 驱动day7GPIO子系统

GPIO子系统点六盏灯

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
struct device_node* node;
struct device_node* child_node1;
struct device_node* child_node2;
unsigned int gpionumb1[3];
unsigned int gpionumb2[3];
char *name[3]={"led1","led2","led3"};//字符指针数组
int i=0;
static int __init my_init(void)
{//解析设备树myled节点node=of_find_node_by_path("/myled");if(node==NULL){printk("node error:");return -EIO;}child_node1 = of_get_child_by_name(node,"extend-led");if(child_node1==NULL){printk("node error:");return -EIO;}child_node2 = of_get_child_by_name(node,"core-led");if(child_node2==NULL){printk("node error:");return -EIO;}for(i=0;i<3;i++){//从设备树中读取gpio编号gpionumb1[i]=of_get_named_gpio(child_node1,name[i],0);if(gpionumb1[i]<0){printk("of get name gpio is error:");return -EIO;}//申请gpio编号gpio_request(gpionumb1[i],NULL);//设置gpio编号输出高电平gpio_direction_output(gpionumb1[i],1);//从设备树中读取gpio编号gpionumb2[i]=of_get_named_gpio(child_node2,"led",i);if(gpionumb2[i]<0){printk("of get name gpio is error:");return -EIO;}//申请gpio编号gpio_request(gpionumb2[i],NULL);//设置gpio编号输出高电平gpio_direction_output(gpionumb2[i],1);}return 0;
} static void __exit my_exit(void)
{for(i=0;i<3;i++){//设置gpio编号输出低电平gpio_direction_output(gpionumb1[i],0);//释放gpio编号gpio_free(gpionumb1[i]);//设置gpio编号输出低电平gpio_direction_output(gpionumb2[i],0);//释放gpio编号gpio_free(gpionumb2[i]);}
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");

GPIOD子系统点六盏灯

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
struct device_node* node;
struct device_node* child_node1_expend;
struct device_node* child_node2_core;
unsigned int gpionumb1[3];
unsigned int gpionumb2[3];
struct gpio_desc* edesc[3];
struct gpio_desc* cdesc[3];
char *name[3]={"led1","led2","led3"};//字符指针数组
int i=0;
/*
myled{ //添加基于gpio子系统设备树节点core-led{ //核心板子节点led = <&gpioz 5 0>,<&gpioz 6 0>,<&gpioz 7 0>;};extend-led{ //扩展板子节点led1 = <&gpioe 10 0>; //led1 PE10led2 = <&gpiof 10 0>; //led2 PF10led3 = <&gpioe 8 0>; //led3 PE8};
};  
*/
static int __init my_init(void)
{//解析设备树myled节点node=of_find_node_by_path("/myled");if(node==NULL){printk("node error:");return -EIO;}//扩展板LED子节点child_node1_expend = of_get_child_by_name(node,"extend-led");if(child_node1_expend==NULL){printk("node error:");return -EIO;}//核心板LED子节点child_node2_core = of_get_child_by_name(node,"core-led");if(child_node2_core==NULL){printk("node error:");return -EIO;}for(i=0;i<3;i++){//直接从设备中获取struct gpio_desc*结构体指针edesc[i]=gpiod_get_from_of_node(child_node1_expend,name[i],0,GPIOD_OUT_LOW,NULL);if(IS_ERR(edesc[i])){//判断地址是否在4K空间内printk("gpiod get from node is error\n");return PTR_ERR(edesc[i]);//将地址转换成错误码}gpiod_direction_output(edesc[i],1);//设置gpio引脚输出高电平cdesc[i]=gpiod_get_from_of_node(child_node2_core,"led",i,GPIOD_OUT_LOW,NULL);if(IS_ERR(cdesc[i])){//判断地址是否在4K空间内printk("gpiod get from node is error\n");return PTR_ERR(cdesc[i]);//将地址转换成错误码}gpiod_direction_output(cdesc[i],1);//设置gpio引脚输出高电平}return 0;
} static void __exit my_exit(void)
{for(i=0;i<3;i++){//设置gpio编号输出低电平gpiod_set_value(edesc[i],0);//释放gpio编号gpiod_put(edesc[i]);//设置gpio编号输出低电平gpiod_set_value(cdesc[i],0);//释放gpio编号gpiod_put(cdesc[i]);}
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现俄罗斯方块——文本域组件

技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 2.初始化游戏界面&#xff1b; 3.初始化游戏的说明面板&#xff1b; 4.随机生成下落方块&#xff1b; 5.绘制方块&#xff1b; 6.清除方块&#xff1b; 7.清楚某一行方块&#xff0c;上方方块掉落&#xff1b; 8.刷新…

复分析——第5章——整函数(复可积函数)(E.M. Stein R. Shakarchi)

第5章 整函数(复可积函数)(Entire Functions) ...but after the 15th of October I felt myself a free man, with such longing for mathematical work, that the last two months flew by quickly, and that only today I found the letter of the 19th of October that…

STM32单片机-FLASH闪存

STM32单片机-FLASH闪存 一、FLASH简介二、FLASH工作原理三、读写内部FLASH四、读取芯片ID 一、FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途&…

ReF:斯坦福提出的新型语言模型微调方法

随着预训练语言模型&#xff08;LMs&#xff09;在各种自然语言处理&#xff08;NLP&#xff09;任务中的广泛应用&#xff0c;模型微调成为了一个重要的研究方向。传统的全参数微调方法虽然有效&#xff0c;但计算成本高昂&#xff0c;尤其是在大型模型上。为了解决这一问题&a…

解读代理 IP差异:ISP 代理与住宅代理

独立IP作为跨境必备工具&#xff0c;代理类型五花八门&#xff0c;今天IPFoxy全球代理将为搭建科普&#xff1a;ISP代理与住宅代理在理论上与使用上的区别。代理充当用户和互联网之间的中介&#xff0c;提供各种功能以增强安全性、隐私性和可访问性。在众多代理类型中&#xff…

嵌入式实验---实验四 DMA传输实验

一、实验目的 1、掌握STM32F103DMA传输程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、利用外部按键KEY1来控制DMA的传送&#xff0c;每按一次KEY1&#xff0c;DMA就传送一次数据到USART1&#xff08;串口1&#xff09;&#xff1b; 2、该串口…

win10 安装PowerShell

总结: 直接下一步,下一步… 下载链接 https://download.csdn.net/download/qq_43071699/89462517

Qt扩展-轻量数学公式计算

轻量数学公式计算 一、概述二、代码结构三、简单使用四、解析支持1. 操作数2. 运算符3. 括号 一、概述 这个是我写得简单的一个数学计算公式工具。easy-math-parser 是一个用C编写的简单工具包&#xff0c;支持四个操作字符串的计算工具&#xff0c;灵感来自Muparser。 在这个…

Linux守护进程简介、创建流程、关闭和实例演示

1、什么是守护进程&#xff1f; 守护进程是一个后台运行的进程&#xff0c;是随着系统的启动而启动&#xff0c;随着系统的终止而终止&#xff0c;类似于windows上的各种服务&#xff0c;比如ubuntu上的ssh服务&#xff0c;网络管理服务等都是守护进程。 2、守护进程的创建流…

如何为自己的项目生成changelog

背景 在github上看到人家的更新日志感觉很cool&#xff0c;怎么能给自己项目来一套呢 环境信息 tdstdsdeMacBook-Pro demo-doc % node -v v14.18.1 tdstdsdeMacBook-Pro demo-doc % npm -v 6.14.15硬件信息 型号名称&#xff1a;MacBook Pro版本&#xff1a; 12.6.9芯片&…

QT自定义标题栏窗口其二:实现拖动及可拉伸效果 + 顶部全屏/侧边半屏

1、效果 2、核心代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent<

yolov10训练自己的数据集(没有显卡的替代方案)

1.没有显卡的替代方案 robflow https://github.com/tensorflow/models/tree/master/official 模型训练替代方案&#xff1a;嘉楠开发者社区

基于鲸鱼优化的DSN弱栅栏覆盖算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 for t1:Itersfor i1:Num%目标函数更新[pa(i),fgai] fitness(xwoa(…

全网最全!25届最近5年上海大学自动化考研院校分析

上海大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目…

Linux计划任务与日志

计划任务 主要用于完成一些周期性任务及定时任务&#xff0c;Windows中也有该功能&#xff1a; 单次调度执行 yum install -y at安装at工具&#xff0c;systemctl start atd启动服务&#xff0c;使用方法为at 选项 时间 执行内容时间可以自由设置&#xff0c;开启的栏目中输…

【SpringBoot + Vue 尚庭公寓实战】地区信息管理接口实现(九)

【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现&#xff08;九&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现&#xff08;九&#xff09;1、业务说明2、数据逻辑模型3、接口实现3.1、查询省份信息列表3.2、根据省份ID查询城市信息列表3…

AGI|以ChatGPT为例,浅析AI究竟能干什么?

目录 一、前言 二、ChatGPT 三、Prompt Engineering 四、神经网络 五、后记 一、前言 当一个新事物的出现&#xff0c;最好的办法就是了解它出现的背景&#xff0c;发展的历史。 当ChatGPT出现在我们面前&#xff0c;多轮对话能力让人震惊&#xff0c;仿佛机器真的可以&qu…

ASP .Net Core创建一个httppost请求并添加证书

ASP .Net Core创建一个httppost请求并添加证书 创建.net Core程序&#xff0c;使用自签名证书&#xff0c;可以处理https的get和post请求。 创建证书 创建自签名证书的流程可以在这里查看&#xff1a; https://blog.csdn.net/GoodCooking/article/details/139815278创建完毕…

充电学习— 9、Typec Pd

GND&#xff1a;线缆接地 TX RX&#xff1a;数据流data传输&#xff0c;支持2.0 3.0 speed兼容 VBUS&#xff1a;线缆cable电源&#xff0c;bus power CC&#xff1a;电缆cable的连接、方向、角色检测和当前模式的配置通道&#xff1b; 有emark时&#xff0c; 一个成为VCONN&am…

易基因:MeRIP-seq等揭示RNA m6A去甲基化酶调控植物雄性不育的分子机制 | 科研速递

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 水稻是全球重要的农作物&#xff0c;也是单子叶植物模型。在水稻中&#xff0c;N6-甲基腺苷&#xff08;m6A&#xff09;mRNA修饰对植物的发育和胁迫响应至关重要。OsFIP37作为m6A甲基化…