2024/6/20 驱动day7GPIO子系统

news2024/10/23 18:28:18

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 PE10
        led2 = <&gpiof 10 0>; //led2 PF10
        led3 = <&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.coloradmin.cn/o/1843157.html

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

相关文章

CRMEB多商户阿里云集群部署流程

注意: 1.所有服务创建时地域一定要选择一致,这里我用的是杭州K区 2.文件/图片上传一定要用类似oss的云文件服务, 本文不做演示 一、 创建容器镜像服务&#xff0c;容器镜像服务(aliyun.com) ,个人版本就可以 先创建一个命名空间然后创建一个镜像仓库查看并记录镜像公网地址创建…

基于功率谱密度的旋转机械故障诊断方法(MATLAB R2021b)

关于功率谱密度&#xff0c;可以参考如下文章&#xff1a; https://zhuanlan.zhihu.com/p/417454806 在实际应用中&#xff0c;一个信号我们不可能获得无穷长时间段内的点&#xff0c;对于数字信号&#xff0c;只能通过采样的方式获得N个离散的点。实际信号基本上是随机信号&…

机器学习——RNN、LSTM

RNN 特点&#xff1a;输入层是层层相关联的&#xff0c;输入包括上一个隐藏层的输出h1和外界输入x2&#xff0c;然后融合一个张量&#xff0c;通过全连接得到h2&#xff0c;重复 优点&#xff1a;结构简单&#xff0c;参数总量少&#xff0c;在短序列任务上性能好 缺点&#x…

当游戏遭遇安全问题,我们应该怎么做?

在游戏安全领域&#xff0c;专业性最差、但最常见的案例类型是DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;。出于它的特性&#xff0c;中小厂商、独立开发者较容易遭受这类攻击。 例如&#xff0c;今年2月29日上线的手游《雷索纳斯》就遭受了名为ACCN组织发起的DDoS攻…

Windows反截屏开发实现

文章目录 Windows反截屏开发实现1. SetWindowDisplayAffinity2. 反截屏系统3. 总结 Windows反截屏开发实现 最近在我们云桌面中需要做到反截屏能力&#xff0c;所谓反截屏就是我们无法通过截图软件&#xff08;微信&#xff0c;QQ&#xff0c;截图等程序&#xff09;截取桌面的…

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了的解决方法

安防视频监控汇聚EasyNVR智能安防视频监控平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括&#xff1a;…

FLEXPART拉格朗日粒子扩散模式建模技术及研究大气污染物源-汇关系

原文链接&#xff1a;FLEXPART拉格朗日粒子扩散模式建模技术及研究大气污染物源-汇关系 当前&#xff0c;大气污染是我国重要的环境问题之一。为了高效、精准地治理区域大气污染&#xff0c;需要弄清污染物的来源。拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放…

RocketMQ快速入门:如何保证消息不丢失|保证消息可靠性(九)

0. 引言 在金融、电商等对数据完整性要求极高的行业&#xff0c;消息的丢失可能会导致数据不一致&#xff0c;严重影响业务逻辑和数据统计&#xff0c;也影响客户体验&#xff0c;所以在很多业务场景下&#xff0c;我们都要求数据不能丢失。而rocketmq中&#xff0c;如何对消息…

jar包运行脚本

start&#xff1a; # 启动项目 #!/bin/bash nohup java -jar audit-2.1.0.jar > app.log 2>&1 & quit&#xff1a; # 关闭程序 #!/bin/bash PID$(pgrep -f audit-2.1.0.jar) # 根据应用程序名称查找进程ID kill -9 $PID # 结束进程使用 sh命令运行

泛微开发修炼之旅--22泛微实现免登陆得解决方案之一

文章链接&#xff1a;22泛微实现免登陆得解决方案之一

SSM旅游系统

摘要 旅游业正处于快速发展阶段&#xff0c;旅游系统的建设已经成为了旅游业发展的重要核心问题。在这样的背景下&#xff0c;SSM框架正逐步发展为一种主要的架构。但目前青海省旅游业信息化的发展仍面临诸多问题&#xff0c;包括系统功能不完善、用户体验不佳、数据管理不规范…

【记录】使用远程SSH配置d2l环境(含装pytorch,同时适用于本地anaconda)

文章目录 前言一、从创建新环境开始二、使用步骤1.安装pytorch2.安装 d2l 包3.安装其他包4.使用jupyter notebook 前言 记录一下如何利用使用命令行进行anaconda配置 d2l环境、pytorch并进行训练深度学习模型。 一、从创建新环境开始 如果是本地直接装一个 anaconda 软件就行…

Matlab数学建模实战应用:案例4 - 图像处理

目录 前言 一、图像处理基础 二、Matlab图像处理工具箱 三、案例&#xff1a;图像锐化、去噪和分割 步骤 1&#xff1a;读取和显示图像 步骤 2&#xff1a;图像锐化 步骤 3&#xff1a;图像去噪 步骤 4&#xff1a;图像分割 完整代码示例 四、实际应用 实例总结 总…

多路输出调光无频闪36V48V60V/300W恒流舞台灯调光芯片FP7126 LED舞台帕灯/激光灯控制IC,无频闪无噪音,多路共阳,调光深度0.1%

方案背景 在舞台演出中&#xff0c;灯光扮演着非常重要的角色&#xff0c;它不仅可以烘托氛围&#xff0c;营造氛围&#xff0c;更能够为表演者增添光彩&#xff0c;塑造形象。在博物馆场所中&#xff0c;突出展品细节。根据灯光用途和适用类型&#xff0c;舞台灯可以细分为聚光…

软硬件节水“组合拳”,助力智慧灌区信息化建设!

水资源短缺已成为全球共同面临的挑战&#xff0c;尤其在农业灌溉领域&#xff0c;其影响尤为显著。农业作为水资源消耗的主要行业之一&#xff0c;在日益严峻的水资源形势下&#xff0c;构建节水型灌区的紧迫性日益凸显。 节水型灌区的建设&#xff0c;旨在通过优化灌溉方式、减…

第三期【Demo教程】教你使用SeaTunnel把数据从MySQL导到Hive

随着数据技术的快速发展&#xff0c;了解并掌握各种工具和技术变得尤为重要。为此&#xff0c;我们准备在Apache SeaTunnel社区发起如何使用连接器的Demo演示计划&#xff0c;邀请所有热爱数据同步技术的同学分享他们的知识和实操经验! 我们第三期主题是&#xff1a;如何使用Se…

Python和OpenCV图像分块之图像边长缩小比率是2

import cv2 import numpy as npimg cv2.imread("F:\\mytupian\\xihuduanqiao.jpg") # 低反光 cv2.imshow(image, img) # # 图像分块 # dst np.zeros(img.shape, img.dtype) ratio 2 #图像边长缩小比率是2&#xff0c;也就是一张图片被分割成四份 height, wi…

Python学习笔记6:pychram相关知识及安装教程,后续需要学习的入门知识

上篇文章说了&#xff0c;今天去公司重新装一下IDE&#xff0c;最后也是把过程这边再记录一下&#xff0c;有需要的可以参考一下。 关于pychram pychram是什么&#xff1f; PyCharm是由JetBrains公司开发的一款流行的Python集成开发环境&#xff08;IDE&#xff09;。它专为…

[创业之路-120] :全程图解:软件研发人员如何从企业的顶层看软件产品研发?

目录 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼