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

本文介绍了一种用于嵌入式系统的红灯报警模块驱动程序的实现方法,该驱动支持通过sysfs接口进行交互,便于上层软件进行状态设置与获取。

  前面已经简单的将燃气烟雾检测模块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


当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛或科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值