基于Dragonboard 410c的燃气烟雾检测器(四)

2024-03-09 10:48

本文主要是介绍基于Dragonboard 410c的燃气烟雾检测器(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  前面已经简单的将燃气烟雾检测模块MQ-2和温湿度检测模块dht11的底层驱动实现了,下面再加一个简单的红灯的驱动,用于报警:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/sysfs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/input.h>
#include <linux/mutex.h>
#include <linux/ctype.h>
#include <linux/pm_runtime.h>
#include <linux/device.h>
#include <linux/irq.h>
#include <linux/of_gpio.h>
 
#include <linux/wait.h>
#include <asm/uaccess.h>  
 
struct red_data{
    int pin;    
    int d;
    struct mutex data_lock;
};
 
static int parse_dt(struct platform_device* pdev,struct red_data* data){
    int rc;
    struct device_node* node = pdev->dev.of_node;
    data->pin = of_get_named_gpio(node,"thunder,pin",0);
    if(gpio_is_valid(data->pin)){
        rc = gpio_request(data->pin,"red_pin");
        if(rc < 0){
            pr_err("Unable to request pin gpio\n");
        }
        gpio_direction_output(data->pin, 1);
        data->d = 1;
    }
    return 0;
}
 
static ssize_t red_store_value(struct device *dev,                                                                                                                                                   
                struct device_attribute *attr,
                const char *buf, size_t size){
    struct red_data* data = dev_get_drvdata(dev);
    int da = simple_strtoul(buf,NULL,10);
    if(da == 1){
        gpio_set_value(data->pin, 1);
    }else{
        gpio_set_value(data->pin, 0);
    }
    data->d = da;
    return size;
}
 
static ssize_t red_show_value(struct device *dev,
                                  struct device_attribute* attr,char* buf){
    struct red_data* data = dev_get_drvdata(dev);
    ssize_t da;
    mutex_lock(&data->data_lock);
    da = sprintf(buf, "%d\n", data->d);
    mutex_unlock(&data->data_lock);
    return da;
}
 
static DEVICE_ATTR(value,0644,red_show_value,red_store_value);
 
static int red_probe(struct platform_device *pdev){
    struct red_data* data;
    int result;
    data = kmalloc(sizeof(struct red_data),GFP_KERNEL);
    if(!data){
        pr_err("%s kmalloc error\n",__FUNCTION__);
        return -ENOMEM;   
    }
    dev_set_drvdata(&pdev->dev,data);
    result = parse_dt(pdev,data);
    if(result<0){
        pr_err("%s error when parse dt\n",__FUNCTION__);
        result = -EINVAL;
        goto err_parse_dt;
    }
 
    mutex_init(&data->data_lock);
    
    result=sysfs_create_file(&pdev->dev.kobj,&dev_attr_value.attr);
    printk("red probe success\n");
    return 0;
err_parse_dt:
    kfree(data);
    printk("red probe failed\n");
    return result;
}
static int red_remove(struct platform_device *pdev){
    return 0;
}
 
 
static struct of_device_id red_match_table[] = {
    { .compatible = "thunder,red",},
    { },
};
 
 
 
static struct platform_driver red_driver = {
    .probe = red_probe,
    .remove = red_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = "red",
        .of_match_table = red_match_table,
    },
};
 
 
module_platform_driver(red_driver);
MODULE_AUTHOR("RED");
MODULE_LICENSE("GPL v2");


节点路径:/sys/bus/platform/drivers/red/rgb_red.64/value

这个节点是可读可写的,当节点值为0,灯亮报警;当节点值为1等灭,正常。

到此大部分底层需要的驱动都准备好了,节点也都有了,接下来就是向上走,大致流程:driver->hal->jni->app


这篇关于基于Dragonboard 410c的燃气烟雾检测器(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/790451

相关文章

C# WPF燃气报警器记录读取串口工具

C# WPF燃气报警器记录读取串口工具 概要串口帧数据布局文件代码文件运行效果源码下载 概要 符合国标文件《GB+15322.2-2019.pdf》串口通信协议定义;可读取燃气报警器家用版设备历史记录信息等信息; 串口帧数据 串口通信如何确定一帧数据接收完成是个麻烦事,本文采用最后一次数据接收完成后再过多少毫秒认为一帧数据接收完成,开始解析出来。每次接收到数据更新一次re

可以进行非机动车违停、人员聚集、临街摆摊、垃圾满溢、烟雾火情等城市治理场景的智能识别的智慧城管开源了

智慧城管视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于深度学习技术及强大的专家团队,针对多个工业垂类场景进行算法优化,打造最优的工业AI算法模型,提供更加精准的工业AI模型库,客户可直接选择适合自己业务场景的模型,快速实现业务落地

算法/编程练习:强密码检测器

强密码检测器 1. 题目 题目来自LeetCode: https://leetcode-cn.com/problems/strong-password-checker/ 题目: 一个强密码应满足3个条件:1)由至少6个,至多20个字符组成;2)至少包含一个小写字母,一个大写字母,和一个数字;3)同一字符不能连续出现三次 (比如'.aaa.'不可以,但'.aa.a.'是可以的)。编写函

七. 部署YOLOv8检测器-load-save-tensor

目录 前言0. 简述1. 案例运行2. 补充说明3. 代码分析3.1 main.cpp3.2 create_data.py 结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习课程第六章—部署分类器,一起来学习利用 cnpy 库加载和保存 tensor 课程大纲可以看下面的思维导图

yolov8训练野火烟雾识别检测模型

1.数据集下载 数据集下载链接:https://hyper.ai/datasets/33096 2. 数据集格式转换 需要将json中的标注信息转换为yolo格式的标注文件数据 import jsonimport osimport shutilimport cv2import matplotlib.pyplot as plttarget = "./data/val"def con

基于HTML5的燃气3D培训仿真系统

最近上线了的基于HTML5的燃气3D培训仿真系统,以前的老系统是采用基于C++和OpenGL的OpenSceneGraph引擎设计的,OSG引擎性能和渲染效果各方面还是不错的,但因为这次新产品需求要求能运行多移动终端,多年前基于MFC封装OSG的老系统架构也实在该退休了,这年头找能维护MFC这种古董级GUI的靠谱人也非易事。 系统最终采用HT for Web的3D框架实现,项目中的程序员也很高

原来用电热水器想换成燃气热水器可行吗?

有位网友在后台留言,问电热水器能改成燃气热水器吗?      感觉这个问题挺有意思的,和大家聊聊。      先分析一下,电热水器一般会放到卫生间里边,而燃气热水器必须要放到厨房里边。      如果是同一个位置去互换,那是不可能的。      想换燃气热水器,就必须把燃气热水器安到厨房里,这样就会出现一个问题,燃气热水器的水从哪来通到哪里去?      正常厨房洗菜盆的下边会有冷水和热水,安

城乡燃气安全监管平台 打造城市安全防护网

随着城市化进程的不断加快,燃气已成为现代生活中不可或缺的重要能源。然而,传统燃气管理方式的局限性逐渐显现,难以应对日益增长的安全监管需求。为此,旭华智能基于其在智慧城市领域的深厚积累,推出了燃气安全监管物联网平台,旨在通过数字化、可视化和智慧化的手段,全面提升燃气安全管理的效能。 一、燃气管理面临的挑战 传统的燃气管理主要依赖人工巡检和事后应急处理,这种方式存在着明显的不足。人工巡检受

9,DMA可以获取光照烟雾值

ADC多通道问题需要用到DMA,与ADC相比,省去了获取AD转换数值(转换后数据存储在数据寄存器中,需要把数据拿出来)的步骤 DMA:数据传输高速通道 DMA概述:直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 两个DMA 控制器有12个通道(DMA1有7个通道,DMA2有5

基于YOLOv5s的野火烟雾检测(附数据集与Coovally操作步骤)

本文主要内容:详细介绍了野火烟雾检测的整个过程,从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式,请先看检测效果 现状 近几年火灾频发,随着社会对火灾防控的重视程度不断提高,对野火烟雾预测的需求也日益增加。传统的人工检测通常依赖于巡查人员,其覆盖范围和效率受限于人员数量和体能,难以实现大面积、实时的烟雾检测。为了应对这一难题,应用野火烟雾检测算法显得很重