Linux驱动学习之点灯(五,设备树没用平台设备总线)

news2024/10/1 1:21:58

创建一个设备树节点

/{

    led:led{
                compatible="led";
                led_pin=<&gpio0 22 GPIO_ACTIVE_HIGH &gpio0 21 GPIO_ACTIVE_HIGH>;
                status="okay";
            }
}

OF函数介绍

查找属性 

of_gpio_named_count

of_gpio_named_count 函数用于获取设备树某个属性里面定义了几个 GPIO 信息,要注意的是空的 GPIO 信息也会被统计到。函数原型如下

int of_gpio_named_count(struct device_node *np, const char *propname)

参数一:设备节点

参数二:属性名字

of_gpio_count

和 of_gpio_named_count 函数一样,但是不同的地方在于,此函数统计的是 gpios 这个属性的 GPIO 数量,而 of_gpio_named_count 函数可以统计任意属性的 GPIO 信息,函数原型如下所示:

int of_gpio_count(struct device_node *np)

参数一:设备节点

of_get_named_gpio
此函数获取 GPIO 编号,因为 Linux 内核中关于 GPIO 的 API 函数都要使用 GPIO 编号,此函数会将设备树中类似 <&gpio5 7 GPIO_ACTIVE_LOW> 的属性信息转换为对应的 GPIO 编号,此函数在驱动中使用很频繁!函数原型如下:

int of_get_named_gpio(struct device_node *np, const char *propname, int index)

参数1:设备节点

参数2:属性名

参数3:gpio下标

of_get_named_gpio_flag

此函数获取GPIO的描述,可以通过设备树传出高低电平

int of_get_named_gpio_flags(struct device_node *np,
		const char *list_name, int index, enum of_gpio_flags *flags);

参数1:设备节点

参数2:属性名字

参数3:下标

参数4:传出参数

 

property *of_find_property(const struct device_node *np,const char *name,int*lenp)

参数1:设备节点。

参数2:节点名儿

参数3:传出参数,属性长度。

返回值返回一个结构体如下图

value就是属性值

int of_property_read_u32_index(const struct device_node *np,const char *propname,u32 index,u32 *out_value)

 参数1:设备节点

参数2:属性名

参数3:下标

参数3:传出参数,我们想要的值

返回值:成功0,失败非零

int of_property_read_string(struct device_node *np,const char*propname,const char**out_string)

参数1:设备节点

参数2:属性名儿

参数3:传出参数

返回值:成功0 失败非零

查找节点

struct device_node  * of_find_node_by_name(struct device_node *from,const char *name)

参数一:从哪里开始查找,一般填null,从根节点查找

参数二:节点名字

返回值:成功返回设备节点,

struct device_node * of_find_compatible_node (struct device_node*from,const char *type,const char *compatible)
参数1:从哪里开始查找,一般填null,从根节点查找
参数2:类型,没有类型填null
参数3:compatible属性的值
返回值,成功返回设备节点
struct device_node  * of_find_node_by_path(cons tchar *path)

根据路径查找,填入路径即可 

LED驱动实现 

所有函数专栏都有说到,不明的可以返回前面看看

#include "linux/cdev.h"
#include "linux/device.h"
#include "linux/device/class.h"
#include "linux/export.h"
#include "linux/fs.h"
#include "linux/gpio.h"
#include "linux/module.h"
#include "linux/of.h"
#include "linux/of_gpio.h"
#include "linux/printk.h"

static dev_t dev_num;
static struct cdev *cdev;
static struct class * cls;
uint32_t pin1,pin2;

static int open (struct inode *i, struct file *f)
{
    gpio_set_value(pin1,0);
    gpio_set_value(pin2,0);
    return 0;
}
static int close (struct inode *i, struct file *f)
{
    gpio_set_value(pin1,1);
    gpio_set_value(pin2,1);
    return 0;
}
struct file_operations fops={
    .owner=THIS_MODULE,
    .open=open,
    .release=close,
};
static int __init start(void)
{
    
    //of_find_property(0,0, 0);
    //struct device_node * node=of_find_node_by_name(NULL,"led");
    struct device_node * node=of_find_compatible_node(NULL,NULL,"led");
    if(node==NULL)
    {
        printk("66666\r\n");
        return -EINVAL;  
    }
    printk("%s\r\n",node->name);
    const char * status=NULL;
    of_property_read_string(node,"status",&status);
    if(strcmp("okay",status))
    {
        printk("66666\r\n");
        return -EINVAL;
    }
    printk("%s\r\n",status);
    uint32_t gpio_pin1=of_get_named_gpio(node,"led_pin",0);
    uint32_t gpio_pin2=of_get_named_gpio(node,"led_pin",1);
    printk("%x\r\n",gpio_pin1);
    printk("%X\r\n",gpio_pin2);
    pin1=gpio_pin1;
    pin2=gpio_pin2;
    enum of_gpio_flags flag=0;
    of_get_named_gpio_flags(node,"led",0,&flag);
    if(flag==OF_GPIO_ACTIVE_LOW)
    {
        gpio_request(gpio_pin1,"led");
        gpio_direction_output(gpio_pin1,0);

    }
    else
    {
        gpio_request(gpio_pin1,"led");
        gpio_direction_output(gpio_pin1,0);
    
    }
    of_get_named_gpio_flags(node,"led",1,&flag);
    if(flag==OF_GPIO_ACTIVE_LOW)
    {
         gpio_request(gpio_pin2,"led");

        gpio_direction_output(gpio_pin2,0);
    }
    else
    {
           gpio_request(gpio_pin2,"led");

        gpio_direction_output(gpio_pin2,0);
    }
    alloc_chrdev_region(&dev_num, 0, 1, "led");
    cdev= cdev_alloc();
    cdev->ops=&fops;
    cdev_add(cdev, dev_num,1);
   cls= class_create(THIS_MODULE, "led");
    device_create(cls,NULL,dev_num,NULL,"led");
    printk(KERN_INFO "Hello, world!\n");
    return 0;
}

static void __exit stop(void)
{
    device_destroy(cls, dev_num);
    class_destroy(cls);
    unregister_chrdev_region(dev_num,1);
    gpio_free(pin1);
    gpio_free(pin2);
    printk(KERN_INFO "Goodbye, world!\n");
}

module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");

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

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

相关文章

Calendar 控件 自定义重汇效果

自定义样式代码&#xff1a; <UserControl.Resources><c:MarginWithScheduleConverter x:Key"MarginWithScheduleConverter"/><Style TargetType"GroupBox" BasedOn"{StaticResource GroupBoxStyle}"/><Style x:Key"C…

Linux系统管理体系-服务管理

1、管理命令 systemctl 管理服务 开机自启动管理正在运行的服务 1&#xff09;检查sshd远程连接服务状态 systemctl status sshd systemctl status 单个或者多个服务名2&#xff09;如何设置服务开启 #运行服务 systemctl start sshd #开机自启动 systemctl enable sshd #…

【opencv】SIFT(尺度不变特征变换)算法?

关键词&#xff1a;SIFT Algorithm 文章目录 一、介绍二、什么是 SIFT 算法&#xff1f;三、人类与机器识别3.1 SIFT 在计算机视觉中的应用3.2 SIFT 关键点的优势3.3 示例演示 四、关键点定位关键点选择 五、入学指导任务5.1 计算大小和方向5.2 创建震级和方向的直方图5.3 关键…

【LLM大模型论文日更】| QAEA-DR:一个用于密集检索的统一文本增强框架

论文&#xff1a;https://arxiv.org/pdf/2407.20207代码&#xff1a;未开源机构&#xff1a;鹏城实验室领域&#xff1a;稠密检索发表&#xff1a;arXiv 研究背景 研究问题&#xff1a;这篇文章要解决的问题是密集检索&#xff08;Dense Retrieval&#xff09;中&#xff0c;将…

Windows:Node.js下载与安装教程

1、进入nodejs官网&#xff1a;https://nodejs.org/en 2、配置系统参数 3、运行cmd&#xff0c;输入 node -v 出现安装版本即安装成功

Keil C51 插件 检测所有if语句

此插件解决的问题 Keil 插件 -- Python 代码 import chardet, sys, glob, re from pathlib import Pathfrom collections import deque# 变量名字典 key--数据名 value--数据s类型 variable_dic {}# 初始化一个空的二维数组 matrix [] # 列表的头数据 header_list [] # 列表…

Tina5 Linux开发

准备开发环境 首先准备一台 Ubuntu 20.04 / Ubuntu 18.04 / Ubuntu 16.04 / Ubuntu 14.04 的虚拟机或实体机&#xff0c;其他系统没有测试过出 BUG 不管。 更新系统&#xff0c;安装基础软件包 sudo apt-get update sudo apt-get upgrade -y sudo apt-get install build-ess…

保护网站安全,了解常见的几种网络攻击

随着互联网技术的迅猛发展&#xff0c;网站作为信息展示和交互的重要平台&#xff0c;面临着日益复杂的网络攻击威胁。从简单的口令入侵到复杂的分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;网络攻击手段层出不穷&#xff0c;给网站所有者带来了巨大的挑战。今…

sqlilabs less21-25关手工注入

第21关 一.登录页面 二 .Burp Suite 抓包&#xff0c;进入重放器 三.查询数据库 先进行编码 )and updatexml(1,concat(1,database()),1)# 四.查表&#xff0c;先进行编码 )and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where…

王老师 linux c++ 通信架构 笔记(五)编译后生成的 nginx 可执行程序的启动与 nginx 选项

&#xff08;22&#xff09; 启动 nginx &#xff1a; 上网测试一下&#xff1a; 端口号 介绍&#xff1a; &#xff08;23&#xff09; 因为 nginx 监听知名端口号 80 &#xff0c;http 服务。也可以知名端口号&#xff0c;格式如下&#xff1a; 生产环境下可以设置 ngi…

扬中网站建设创建网站

扬中网站建设&#xff1a;打造企业更强大的数字名片 随着互联网的发展&#xff0c;网站已经成为企业不可或缺的一部分。对于扬中市的企业而言&#xff0c;建设一个专业的网站不仅能提升品牌形象&#xff0c;更能拓展市场&#xff0c;提高竞争力。本文将为您介绍扬中网站建设的重…

【jetson交叉编译(1)】nvidia jetson 系列开发板交叉编译方法,CUDA依赖程序

资源 Toolchain Information jetson-linux jetpack 文章目录 资源1 方案1 qemu-aarch64-static和docker 容器编译jetson2 方案2 模拟器交叉编译器2.1 应对库缺失的情况&#xff0c;进行环境准备2.1.1 模拟器(方案1)2.1.2 在jetson上面进行安装&#xff08;方案2&#xff09; 2…

yolov8行人车辆检测与计数系统

yolov8行人车辆检测与计数系统&#xff08;PythonYOLOv8deepsort车辆追踪深度学习模型清新界面&#xff09; &#xff08;1&#xff09;YOL v8算法实现&#xff0c;模型一键切换更新&#xff1b; &#xff08;2&#xff09;检测图片、视频等图像中的各目标数目&#xff1b; &am…

2024数学建模国赛水奖攻略(也可适用其他比赛)

很多同学私信我&#xff0c;问学校要求参加数模比赛&#xff0c;但对建模和编程不太擅长&#xff0c;又不想浪费时间&#xff0c;该怎么办。今天我想和大家分享一些关于数学建模比赛的经验&#xff0c;特别是如何水奖的攻略。 一、选题技巧 有句话说得好&#xff0c;选择比努力…

彻底解决win7系统文件夹选项高级设置是空白

需求背景 win7系统的文件夹选项-高级设置里面是空白的,效果图如下。 解决方法 1、新建txt文本文档 2、文档内容 复制下面的内容到txt文件中,然后保存。 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Ad…

第七届强网杯-PWN-【WTOA】

文章目录 参考WebAssemblyWasmtime调试逆向源码exp 参考 WebAssembly实践指南——C和Rust通过wasmtime实现相互调用实例 WebAssembly WebAssembly是一种可移植的二进制指令集格式&#xff0c;其本身与平台无关&#xff0c;类似于Java的class文件字节码。 WebAssembly本来的…

Springsecurity中的Eureka报错:Cannot execute request on any known server

完整报错信息&#xff1a; com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错体现&#xff1a; 访问eureka控制面板&#xff1a; 访问测试地址&#xff1a; 控制台报错&#xff1a; 可能的报错原因&#xff…

Python之列表解析和用matplotlib模块绘制图形

列表解析用matplotlib模块绘制成图形导入模块numpy阵列将列表转为阵列arrange函数创建阵列广播 使用matplotilib将阵列绘制成图 列表解析 列表解析式用紧凑的方式来构造列表。 语法&#xff1a; [表达式 for循环 条件] 例如&#xff1a;要得到0-20的偶数列表。需要在0-20中循环…

CyberScraper-2077+simple-one-api:使用大模型爬虫

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 swift与Internvl下的多模态大模型分布式微调指南&#xff08;附代码和数据&#xff…

IT6113: 高速MIPI DSI 4通道转8通道转接芯片资料

1、产品概述&#xff1a; 芯片将 SOC输出的4通道高速 Mipi DSI 视频转换为8通道半速 DSI 显示器&#xff0c;用于平板电脑、智能手机、笔记本电脑、 VR、智能手表等应用&#xff0c;分割器模式也可用。 2、产品说明 &#xff1a; IT6113 MIPI DSI 视频桥是一个4通道进、8通道出…