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 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");

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式实验---实验三 定时器实验

一、实验目的 1、掌握STM32F103定时器程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、使用SysTick定时方式控制LED闪烁&#xff1b; 2、使用通用定时器产生PWM脉冲&#xff0c;通过调整占空比实现两个目标&#xff1a; &#xff08;1&#xf…

户外LED显示屏的发展历程

户外LED显示屏自其问世以来&#xff0c;经历了显著的发展与变革。其技术不断进步&#xff0c;应用场景逐步扩大&#xff0c;并在广告、信息传播等领域发挥了重要作用。本文将梳理户外LED显示屏的发展历程&#xff0c;重点介绍其技术演进和应用拓展。 早期发展&#xff1a;直插式…

React+TS 从零开始教程(1)

源码链接&#xff1a;https://pan.quark.cn/s/c6fbc31dcb02 创建项目 直接通过以下命令&#xff0c;我们来创建一个reactts的项目。 npx create-react-app myapp --template typescript这样就创建好了,然后我们导入vscode. npx是npm里面的一个库&#xff0c;可以让你自动使用…

运算放大器(运放)输入偏置电流、失调电流

输入偏置电流定义 理想情况下&#xff0c;并无电流进入运算放大器的输入端。而实际操作中&#xff0c;始终存在两个输入偏置电流&#xff0c;即IB和IB-(参见图1)。 I B I_B IB​的值大小不一&#xff0c;在静电计AD549中低至60 fA(每三微秒通过一个电子)&#xff0c;而在某些高…

/usr/bin/ld: 当搜索用于 /lib/i386-linux-gnu/libcuda.so 时跳过不兼容的 -lcuda

/usr/bin/ld: 当搜索用于 /lib/i386-linux-gnu/libcuda.so 时跳过不兼容的 -lcuda ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/023dbdeb215b4b4580f7f54706e32af9.pn当使用unsloth做微调时&#xff0c;发现找不到libcuda&#xff0c;很自然想到需要软链接到最新…

食品快消品进销存+门店批发+零售商城整体代码输出

食品快消品行业在当今信息化和数字化浪潮中&#xff0c;建立批发零售的信息化系统已成为一种迫切的必要性。通过信息化&#xff0c;食品快消品企业能够实现从生产到销售的全面优化&#xff0c;提高供应链效率&#xff0c;降低运营成本&#xff0c;增强市场竞争力。通过有效的信…

Redis持久化主从哨兵分片集群

文章目录 1. 单点Redis的问题数据丢失问题并发能力问题故障恢复问题存储能力问题 2. Redis持久化 -> 数据丢失问题RDB持久化linux单机安装Redis步骤RDB持久化与恢复示例RDB机制RDB配置示例RDB的fork原理总结 AOF持久化AOF配置示例AOF文件重写RDB与AOF对比 3. Redis主从 ->…

虚拟机配置桥接模式

背景 因为要打一些awd比赛,一些扫描工具什么的,要用到kali,就想着换成一个桥接模式 但是我看网上的一些文章任然没弄好,遇到了一些问题 前置小问题 每次点开虚拟网络编辑器的时候都没有vmnet0,但是点击更改的时候却有vmnet0 第一步: 点击更改设置 第二步: 把wmnet0删掉 …

【车载开发系列】CAN通信总线再理解(中篇)

【车载开发系列】CAN通信总线再理解&#xff08;中篇&#xff09; 九. CAN总线标准十. CAN物理层十一. CAN数据链路层1&#xff09;CAN的通信帧类型2&#xff09;CAN的标准帧格式1. CAN ID2. 数据场 3&#xff09;CAN总线仲裁 十二. CAN应用层1&#xff09;CANopen2&#xff09…

傅里叶级数在不连续点会怎么样???

文章目录 一、前言背景二、用狄利克雷核表达傅里叶级数三、狄利克雷核与狄拉克函数四、傅里叶级数在不连续点的表示五、吉伯斯现象的解释六、总结参考资料 一、前言背景 笔者最近在撸《信号与系统》&#xff0c;写下此博客用作记录和分享学习笔记。由于是笔者为电子爱好者&…

前端锚点 点击 滑动双向绑定

一. 页面样式 二. 代码 <div class"flexBox"><div class"mdDiv" v-for"(item,index) in tabList" :key"index" :class"nowChooseindex?choosed:" click"jumpMD(index, item.id)">{{item.name}}&l…

简单分析一下地产行业使用堡垒机的必要性-行云管家

地产行业&#xff0c;一个关系民生的行业&#xff0c;一个与大家生活密不可分的行业。随着信息技术的快速发展&#xff0c;以及数字化转型的要求&#xff0c;以及地产行业业务迅猛发展&#xff0c;如何保障数据安全以及网络安全至关重要。在这种背景下&#xff0c;使用堡垒机就…

VBA基础知识点总结

VBA教程 VBScript教程 数据类型 数字数据类型 非数字数据类型 变量&常量 可以通过Dim、Public或Private语句声明变量。 变量语法&#xff1a;Dim <<variable_name>> As <<variable_type>>&#xff08;需要在使用它们之前声明&#xff09; 常量语…

全球AI新闻速递6.20

1.国家药监局综合司&#xff1a;关于印发药品监管人工智能典型应用场景清单的通知。 2.Canalys&#xff1a;预计今年全球 AI 手机市场份额达 16%。 3.Adobe Acrobat 升级 AI 技能&#xff1a;文生图、梳理信息等。 4.中国科大人形机器人研究院揭牌。 5.华为官方预告&#x…

对30年国债利率破2.5%的复盘反思

短期看&#xff0c;以月为维度&#xff0c;长端和超长端利率依然具有较强的向下突破的惯性&#xff1b;中期看&#xff0c;以季为维度&#xff0c;长端依然面临向下赔率不足的约束&#xff0c;但调整需要多重利空共振的契机。 短期看多&#xff0c;逢高配置”的四点逻辑 逻辑一…

四川赤橙宏海商务信息咨询有限公司引领抖音电商潮流

在当今数字化浪潮下&#xff0c;电商行业蓬勃发展&#xff0c;抖音电商作为新兴力量&#xff0c;正以其独特的魅力吸引着越来越多的商家和消费者。四川赤橙宏海商务信息咨询有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;凭借其专业的团队和丰富的经验&#xf…

基于SpringBoot+Vue北部湾地区助农平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

系统学习PLC

1.OB组织块 程序循环 PC ob1执行一次 ob123也执行一次 是 statup是程序启动的是第一个周期先执行starup&#xff08;0b100&#xff09;然后在执行ob1和0b123.这二个循环&#xff0c;周期执行这二个循环。1000是1s 2.DB块 建立指定数据块可以直接建立自己喜欢的类型 3.FB与…

【维护服务器安全,如何应对恶意的威胁行为?】

随着互联网的迅猛发展&#xff0c;网络服务器成为现代社会中不可或缺的基础设施。然而&#xff0c;恶意攻击行为也日益猖獗&#xff0c;技术不断升级&#xff0c;给网络服务器的安全带来了严峻挑战。下面德迅云安全就分享一些常见的危害服务器安全的行为&#xff0c;和相应的应…

什么是嵌入式,单片机又是什么,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;从科普的角度&#xff0c;…